Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика.ЛБ

.pdf
Скачиваний:
15
Добавлен:
14.04.2015
Размер:
950.97 Кб
Скачать

1.Слова в тексті розділені проміжками. Підрахувати кількість слів , які починаються з літер ―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