Информатика.ЛБ
.pdf1.Слова в тексті розділені проміжками. Підрахувати кількість слів , які починаються з літер ―Do‖ і ―dо‖.
2.З тексту вивести слова, що починаються і закінчуються на однакові літери(літеру).
3.З речення вивести саме довге слово.
4. З списку прізвищ вивести прізвища, що починаються і закінчуються на однакові літери(літеру).
5.Визначити, скільки разів літера ―а‖ повторюється у введеному тексті.
6.Ввести текст зі свідомо великою кількістю проміжків між словами. Програмним шляхом видалити з нього зайві проміжки.
7.Вивести слова тексту: ―Мед у лісі ведмідь знайшов — мало меду, багато бджіл‖, що починаються з літери ―м‖.
8.В списку з 10 прізвищ визначити саме коротке прізвище.
9.В списку з 10 прізвищ визначити саме найдовше прізвище. .
10.Визначити, на якому місці записане саме довге слово в реченні.
11.Віддрукувати слово, що складається з останніх літер усіх слів тексту.
12.З введеного тексту вивести слова, у яких немає цифр
13.З введеного тексту вивести слова, у яких немає літер ―о‖ і ―у‖.
14.З введеного тексту вивести саме коротке слово.
15.Ввести список з 10 прізвищ, розташованих у довільному порядку й упорядкувати їх за алфавітом.
16.Віддрукувати слово, що складається з перших літер усіх слів тексту.
17. Виділити частину тексту між словами, що вводяться в рядку запиту.
18.Підрахувати скільки разів у вихідному тексті повторюється поєднання літер ТСМ ( або ІМЗ ).
19.Вибрати у вихідному тексті саме довге слово, що не містить сполучення ―pro‖.
20.Ввести невелику програму на С++. Підрахувати скільки у ній операторів ―cоut‖.
21.Ввести текст:
―Слава світу на Землі! Слава хлібу на столі!
От він хлібець запашний.‖ Віддрукувати окличні речення.
22.Вибрати з уведеного тексту саме коротке слово, що не містить задану приголосну.
23.Ввести текст:
―Не дозволяй душі лінуватися, Щоб воду в ступі не товкти, Душа зобов'язана трудитися , І день і ніч, і день і ніч! ‖
61
Вивести слова, що містять літеру ―о‖.
24.Вибрати з вихідного тексту (див. варіант 23 ) саме довге слово, що містить голосну ―і‖.
25.У невеликій програмі на С++ підрахувати кількість операторів циклу
for.
62
4 ВИРІШУВННЯ ЗАДАЧ З ВИКОРИСТАННЯМ ДАНИХ ТИПУ СТРУКТУРА
4.1 Ціль роботи
Освоєння заходів розробки і налагодження програм з використанням даних типу структура
4.2 Методичні рекомендації з організації самостійної роботи студентів
При підготовці до даної лабораторної роботи рекомендується повторити дані типу структура і застосування структурних типів для вирішування практичних задач.
Структура — це сукупність різнотипних елементів, яким привласнюється одне ім'я ( воно може бути відсутнім), що займає одну область пам'яті. Елементи структури називаються полями.
Як і будь-яка змінна, структурна змінна повинна бути описана. Цей опис складається з двох кроків: опис шаблона (тобто складу ) або типу структури й опису змінних структурного типу.
Синтаксис опису структури має вигляд:
struct < ім'я структури >
{<тип 1 > ім'я поля 1;
<тип 2 > ім'я поля 2. . . . . . . .;
} [ р1, р2. . . .];
де struct — службове слово;
< ім'я структури > — ім'я типу структури ; <тип 1>, <тип 2> — імена стандартних або визначених типів;
ім'я поля 1, ім'я поля 2, … — імена полів структури; р1, р2. . . .; — імена перемінних типу структура.
Приклад 4.1. Обробити дані про здачу студентами сесії по предметах: математиці, фізиці і програмуванні, підрахувати середній бал, отриманий студентами по цим курсам.
Визначимо структуру: struct stud
{
char fam [25]; |
// прізвище і ініціали |
|
int mat, fiz, prg; |
// |
предмети |
float sb; |
// |
середній бал |
63
} st1,st2;
Змінні st1 і st2 можна оголосити окремим оператором, наприклад: stud st1 st2;
Ініціалізація полів структури може проводитися або при її описі, або в тілі програми. При описі структури ініціалізація полів може виглядати так:
struct stud
{char fam [25]; int mat,fiz, prg; float sb;
}
st1 = { " Кравченко И.С.", 4, 5, 5}, st2 = { "Тесленко А.М.", 3, 4, 5};
Якщо ініціалізація полів буде проведена в тілі програми, то для звертання до імен полів треба спочатку записати ім'я структурної змінної, а потім ім'я поля, що відокремлюється крапкою ( складені поля). Отже, у випадку , коли змінна st1 з'являється в програмі, для її ініціалізації можна записати
stud st1 = {"Кравченко И.С.",4 ,5 ,5); або ініціалізація здійснюється за допомогою складених полів, як представлено в наступній програмі:
//Р 4_1. СPP — визначення середнього бала
//використання складених полів
#include < string.h > #include < stdio.h > #include < iostream> using namespace std;
struct stud
{char fam [20]; int mat, fiz, prg; float sb;
}st1, st2;
main ( )
{
strcpy (st1. fam, "Кравченко И.С."); st1 . mat = 4;
st1. fiz = 5; st1. prg = 5;
st1. sb = (st1. fiz + st1. mat + st1. prg) / 3;
st2 = st1; |
|
|
puts (st2. fam); |
// |
Виведення прізвища st2; |
cout << st2. mat |
<< |
st2. fiz << st2. prg << st2. sb << endl; |
return 0; |
|
|
}
64
У цій програмі всім полям структури st1 привласнені відповідні значення. Треба звернути увагу, що поле st1.fam одержує значення шляхом використання функції strcpy (st1.fam, "Кравченко И.С.");. Структурна змінна st2 має ту ж структуру, що і st1, тому справедлива операція st2 = st1; . Якщо в одній функції використовується тільки один структурний тип, то цей тип можна повідомляти без імені. Наприклад, раніше розглянуту структуру можна оголосити в такий засіб:
struct
{char fam [25]; int mat, fiz, prg; float sb;
}st1, st2;
Якщо при описі структур у деякій функції або в межах "видимості" змінних у різних функціях мається багато (але не усі) однакових полів, то ці однакові поля можна об'єднати в окрему структуру і використовувати її при описі інших структур, тобто поля структури можуть самі мати тип "структура". Це називається вкладеністю структур. Наприклад, якщо треба обробляти списки студентів і викладачів університету, причому в студентських списках містяться дані: прізвище і иниціали, дата ( день, місяць, рік) народження, група і середній бал успішності, а в списках викладачів обробляються такі дані: прізвище і ініціали, дата народження, кафедра, посада.
Для обробки списку студентів і викладачів можна оголосити наступні структури:
struct stud
{char fio [25]; int den,god; char mes [10]; char grup; float sb;
}
і
struct prep
{ char fio [25]; int den, god; char mes [10]; char kaf, dolg;
}
65
В оголошених типах однакові поля має сенс включити в окрему структуру і використовувати її при описі інших типів. Поетапно це виглядає так:
— загальна структура:
struct spd
{char fio [25]; int den,god; char mes[10];
};
— структура для опису інформації про студентів: struct stud
{spd dr; char grup;
float sb
}st1,st2;
—структура для опису інформації про викладачів:
struct prep { spd dr;
char kaf [10] ; char dolg [15];
}pr1,pr2;
Уструктурах stud і prep для оголошення поля, що містить дані про прізвище і дату народження використовується раніше описаний тип spd. Тепер до поля fio, den, god, mes можна звернутися, використовуючи запис наступного вигляду:
st1 . dr . fio
Наприклад, при записі функції введення — gets (st1 . dr . fio); або pr1 . dr . fio .
Після оголошення структурного типу перемінних, для роботи з їх полями можна використовувати і покажчики, тоді опис структури буде мати вигляд:
struct stud
{char fam [25]; int mat, fiz, prg; float sb;
}st1, *pst;
Тепер доступ до полів може здійснюватися двома способами :
— використовуючи оператор (*) , наприклад, gets ((*pst) . fam); (*pst) . fiz = 5;
використовуючи спеціальний покажчик на структуру "->", наприклад, gets ( pst -> fam); pst -> fiz = 5; і т.д.
66
Крім того до змінної st1 можна звертатися, указуючи поля через символ крапка, як це робилося раніше.
Дані структурного типу можна об'єднати в масиви, наприклад, використовуючи раніше розглянуту структуру можна записати:
struct stud
{char fam [25]; int mat, fiz, prg; float sb;
}spis[15], *sp = &spis[0];
або, якщо масив описується не при описі структури, то його можна оголосити у вигляді:
stud spis [15]; |
. |
Доступ до елементів масиву може виконуватися з використанням індексу або через покажчик — константу, яким є ім'я масиву:
strcpy( spis [1] . fam, " "); spis [1] . fiz = 5;
або
strcpy ((sp +1) -> fam, " "); (sp + 1) -> fiz = 5;
Це можна записати також у вигляді:
strcpy ((* (spis +1 )) . fam, " "); (*(spis+1)) . fiz = 5;
Тут потрібно зовнішня пара дужок, тому що операція (.) — " крапка" має пріоритет вище, ніж операція за адресою (*).
Розглянемо використання даних структурного типу на наступному прикладі.
Приклад 4.2. Ввести в комп'ютер відомість успішності студентів групи з 25 чоловік, які сдають сесію по предметах: фізиці, математиці, і програмуванню
іпідрахувати:
—середній бал, отриманий кожним студентом;
—середній бал групи за кожним предметом;
—вивести на екран відмінників по програмуванню. Програма буде мати вигляд:
67
//P4_2. CPP обробка відомості успішності
//Використання даних типу структура
#include < string.h > #include < stdio.h > #include < iomanip > #include < iostream > using namespace std;
struct stud
{char fam[25]; int mat, fiz, prg; float sb;
};
void main(void)
{
const k = 5; int n = 1, i; float sm, sf, sp;
stud ved[k];
sm = sf = sp = 0;
cout << "Введіть прізвище й оцінки mat, fiz, prg \n " ;
for ( i = 0; i < k; |
i++) |
|
|
|
{ |
|
|
|
|
gets ( |
ved[i]. fam |
); |
|
|
cin >> ved[i]. mat >> |
ved[i]. fiz |
>> ved[i]. prg ; |
||
ved[i]. sb = ( ved[i]. mat + ved[i]. fiz + ved[i]. prg) / 3; |
||||
sm += ved[i]. mat; |
|
|
||
sf += |
ved[i]. fiz; |
|
|
|
sp += |
ved[і]. prg; |
|
|
|
} |
|
|
|
|
cout << "\t |
Відомість успішності групи \n\n"; |
|||
cout << "\t"; |
|
|
|
|
for ( i = 0; i < 47; i++) |
cout |
<< "-"; |
// Верхня риса |
cout << "\n"; |
|
|
|
cout << "\t \t прізвище\t |
мат фіз прогр порівн.бал \n"; |
||
for ( i = 0; i |
< |
47; i++) |
cout << "-"; // Верхня риса |
for ( i = 0; i |
< |
k; i++) |
|
{
cout << "\t" << i + 1 << " " << setw(17)
<< setiosflags ( ios :: left ) << ved[i]. fam; cout << ved[i]. mat << " " << ved[i]. fiz <<
68
|
" |
" << ved[i]. prg << " |
" << ved[i]. sb << "\n"; |
|
} |
|
|
|
|
cout << "\t"; |
|
|
||
for ( i = 0; i < 47; |
i++) cout << |
"-"; // Нижня риса |
||
cout |
<< "\n\t" << |
setw(16) << setiosflags ( ios :: right ) |
||
|
<< "Порівн. бал"; |
|
||
cout |
<< |
" " << sm / k << " " << sf / k << " " << sp / k << "\n\n"; |
||
cout |
<< "\t Відмінники по програмуванню: \n\n"; |
|||
for ( i = 0; i < k; i++) |
|
if ( ved[i]. prg == 5)
{
cout << "\t" << n << " " << ved[i]. fam << "\n"; n++;
}
}
Результат роботи програми буде мати вигляд:
Відомість успішності студентів
_______________________________________________
прізвище мат фіз прогр порівн.бал
_______________________________________________
Авдєєв И.М. |
3 |
4 |
4 |
3.7 |
Биків Т.Б. |
5 |
5 |
4 |
4.6 |
Волков А.П. |
4 |
5 |
5 |
4.6 |
_______________________________________________
Порівн. бал |
3.8 |
4.6 4.8 |
Відмінники по програмуванню:
Волков А.П.
Поля структури можуть також бути масивами, наприклад, у раніше розглянутій структурі stud можна оцінки по різних предметах об'єднати в масив. Тоді таку структуру можна описати у вигляді:
struct stud1
{char fam [25]; int pr [3];
69
|
|
float sb |
|
|
|
} |
st1 [10], *pst = &st1 [0]; |
, |
|||
тепер до полів можна звертатися одним з наступних способів: |
|
||||
((*pst). fam) |
// |
gets (( *pst) .fam); |
|
||
( pst -> pr [0] ) |
// |
cin >> |
pst |
-> pr[0] >> pst -> |
pr[1]; |
|
// |
або cin |
>> |
pst -> * (pr +1). |
|
У бібліотеці <stdlib.h> для пошуку і сортування структурних змінних маються спеціальні функції. Так , функція швидкого сортування структурних елементів масиву по заданому полю має вигляд :
#include < stdlib.h > |
|
void qsort (void *base , n , width, |
|
int (* fcmp ) (const void *elem 1, const void -> elem2)) |
, |
де base — покажчик на перший елемент масиву; |
|
n — кількість елементів масиву; |
|
width -довжина елементів масиву в бітах. |
|
При виконанні сортування функція qsort ( ) звертається до заданого користувачем функції.
Функція задається покажчиком на функцію:
int (*fcmp) ( const void *elem1, |
const void *elem2) |
. |
||
Функція, на яку вказує fcmp , виконує порівняння двох елементів масиву, |
||||
на які вказує |
elem1 і elem2. |
|
|
|
Функція повинна повертати значення: |
|
|||
|
< 0, |
якщо *elem1 < *elem2; |
|
|
|
= 0, |
якщо *elem1 = *elem2; |
|
|
|
> 0, |
якщо *elem1 > *elem2; |
|
|
Якщо |
*elem1 |
> *elem2 , то |
елемент, на який |
указує elem1 |
розташовується в масиві раніш; "колишній" елемент розташовується в упорядкованому масиві пізніше.
Користувач задає порівнювані поля структурних змінних. Він також може змінити порядок, у якому будуть упорядковуватися елементи, що досягається зміною знака значень, що повертаються з функції, на протилежні; може змінити поля, по яких виконується сортування.
70