images.jpg

 

 

Попередня сторінка          Зміст           Наступна сторінка          Електронні посібники ВНТУ

 

 

 

 

 

 

ЛАБОРАТОРНА РОБОТА № 7

СТРУКТУРИ.  МАСИВИ СТРУКТУР

images (36).jpg
 

Мета роботи

  • Оволодіти практичними навичками зі створення та використання структур, передавання структур у функції в якості параметрів. 
  • Навчитись використовувати масиви структур та здійснювати операції з полями структур.
  • Навчитися складати програми з використанням структур.

 

 

 
 images (47).jpg
        

       ТЕОРЕТИЧНІ ВІДОМОСТІ

 

 

 

Оголошення структури

Структури дозволяють об'єднувати в єдиному об'єкті сукупність значень, які можуть мати різні типи. Оголошення структури здійснюється за допомогою ключового слова struct. Синтаксис опису структури :

  struct [ім'я_структури] {      

       тип1 елемент1;
        ............. 
        типN елементN;
    }  [список описів];

Приклад структури – представлення поняття "дата", що складається з декількох частин: число (день, місяць, рік), назва тижня та місяця:

  struct date {
     int day ; 
     int month ;
     int year;
     char day_name[15];
     char mon_name[14];
  } arr[100],*pd, data, new_data;

Тут datanew_data – змінні типу date;  pd – покажчик на тип datе; arr – масив зі 100 елементів, кожний з яких має тип date.

 

Доступ до полів структури

Доступ до полів структури забезпечується операторами вибору: . (прямий селектор) та -> (непрямий селектор), наприклад,

     struct mystruct {
          int i;
          char str[21];
          double d;
     } s,*sptr=&s;
     s.i =3; 
     sptr->d = 1.23;

 

Зауваження

Для змінних одного і того ж самого структурного типу визначена операція присвоювання, при цьому здійснюється поелементне копіювання значень полів.

    data=new_data;

Для порівняння структур необхідно перевіряти рівність відповідних полів цих структур.

     struct point {
          float x,y;
          char c;
   } point1,point2;
     if (point1.x==point2.x&&point1.y==point2.y&&point1.c==point2.c){ 
          /* … */ 
     };

 

Масиви структур

Масивами структур, елементи якого мають структурований тип, можна оперувати, як звичайними масивами простих типів. Приклад:

     typedef struct Date
   {      

          int d; /* день */
          int m; /* мiсяць */
          int y; /* рiк */
   } Date;
   Date arr[100];

Доступ до полів структури аналогічний доступу до звичайних змінних, при цьому  у квадратних дужках вказують індекс номеру елемента:

   arr[25].d=24; arr[12].m=12;

 

Об'єднання (union)

Об'єднання дозволяють в різні моменти часу зберігати в одному об'єкті значення різного типу. В кожний момент часу об'єднання може зберігати значення тільки одного типу з набору. Контроль за тим, значення якого типу зберігається в даний момент, покладається на програміста.

union sign
{   int svar;
    unsigned uvar;
} number;
union 
{   char *a,b;
    float f[20];
} var;

 

Бітові поля

Бітові поля (bit fields) – особливий вид полів структури. Вони дають можливість задавати кількість бітів, в яких зберігаються елементи цілих типів.  При оголошенні бітового поля вслід за типом елемента ставиться двокрапка (:) і вказується цілочисельна константа, яка задає розмір поля (кількість бітів). Розмір поля – константа в діапазоні між 0 і числом бітів, яке використовується для зберігання даного типу даних.

   struct bit_field {
          int bit_1   : 1;
          int bits2_5 : 4;
          int bit_6   : 1;
          int bits7_16: 10;
   } bit_var;

 

Приклади програм з використанням структур

Приклад 1. Сформувати список про зареєстровані перездачі заборго­ваностей студентів: ПІБ, предмет, кількість перездач. Роздрукувати список за заданою ознакою і видати його на екран дисплея.

Лістинг програми

   #include <stdio.h>

   #include <conio.h>

   #define n 3

   void main()

   {   int i,f=0,obrz;

       struct

       {    char FIO[20];

            char predmet[20];

            int kol_peresdach;

       } dolg[n];

       for(i=0;i<n;i++)

        {    printf("\nBedite FIO           ");

             scanf("%s",&dolg[i].FIO);

             printf("Bedite predmet       ");

             scanf("%s",&dolg[i].predmet);

             printf("Bedite kol_peresdach ");

             scanf("%d",&dolg[i].kol_peresdach);

        }

       printf("\nBedite obrz      ");

       scanf("%d",&obrz);

       for(i=0;i<n;i++)

       {  if(dolg[i].kol_peresdach==obrz)

          {  f++;

            printf("\n%15s\t%15s\t%3i ",

                  dolg[i].FIO,dolg[i].predmet,dolg[i].kol_peresdach);

          }

       }

       if(f==0)printf("\n Error");

       getch();

     }

 

Результати роботи  програми:

 

 

 

 

images (37).jpg

 

Порядок виконання роботи

 

 

 

  1. Ознайомитись з теоретичним матеріалом, з функціями стандартних бібліотек для роботи з рядками і символами.
  2. Дослідити процес реалізації завдань прикладів, відлагодити наведені програми на своєму комп’ютері.
  3. Розробити власні програми, які реалізують індивідуальне завдання.
  4. Підготувати загальний звіт для всіх задач, який включатиме:
    •  варіант і текст індивідуального завдання;
    •  загальну схему роботи програми (лише для задачі 1);
    •  лістинг програми;
    •  роздруківку результатів роботи програми у різних режимах;
    •  висновки.

 

 

images (60).jpg

 

Варіанти індивідуальних завдань

 

 

Задача 1.

 

1. Описати структуру з іменем  STUD, яка містить поля: NAME – прі­звище та ініціали; GROUP – група; SES – оцінки з п'яти предметів (масив з п'яти елементів). Написати програму, що реалізує наступні дії окремими функціями:
–      введення з клавіатури даних в масив ST, що складається з N змінних типу STUD;
–      виведення на екран прізвищ і номерів груп для всіх студентів, середній бал яких більший за 4.0; якщо таких немає, то вивести повідомлення.
2. Описати структуру з іменем  ABIT, яка містить поля: NAME – прізвище, ініціали; GENDER – стать; SPEC – назва спеціальності; EXAM – результати вступних іспити з трьох предметів (масив з трьох елементів). Написати програму, що окремими функціями реалізує  наступні дії:
–      введення з клавіатури даних в масив AB, що складається з N змінних типу ABIT;
–      виведення на екран прізвищ та назв спеціальностей для всіх абітурієнтів, що мають бал нижче, ніж прохідний, який визначається користувачем програми; якщо таких студентів немає, то вивести повідомлення про це.
3. Описати структуру з іменем  NOTE, яка містить поля:  NAME – прізвище, ім'я; TEL – номер телефону; BDAY – день народження (масив із трьох чисел). Написати програму, що окремими функціями виконує наступні дії:

–      введення з клавіатури даних в масив BLOCKNOTE, що складається з N змінних типу NOTE;

–      виведення на екран інформації про людей, чиї дні народження припадають на місяць, значення якого введено з клавіатури; якщо таких людей немає, то вивести відповідне повідомлення.

4. Описати структуру з іменем  AEROFLOT, яка містить поля: CITY – назва населеного пункту призначення; NUM – номер рейса; TYPE – тип літака. Написати програму, що окремими функціями реалізує  наступні дії:
–      введення з клавіатури даних в масив AIR, що складається з N змінних типу AEROFLOT;
–      виведення на екран номерів рейсів і типів літаків, що вилетіли в пункт призначення, назва якого співпала з назвою, введеною з клавіатури; якщо таких рейсів немає, то вивести відповідне повідомлення.
5. Описати структуру з іменем  SKLAD, яка містить поля:  NAME – назва товару; TYPE – одиниця виміру; COST – ціна одиниці товару; QUANTITY – кількість.  Написати програму, що окремими функціями вико­нує дії:
–      введення з клавіатури даних в масив SHOP, що складається з N змінних типу SKLAD;
–      виведення на екран інформації про товар, його кількість, ціну одиниці та обчислену загальну суму на складі, назва якого вводиться з клавіатури; якщо такого немає, то вивести відповідне повідомлення.
6. Описати структуру з іменем  WORK, яка містить поля: NAME – прізвище та ініціали працівника; POS – назва посади; YEAR, MONTH – рік і місяць прийняття на роботу. Написати програму, що окремими функціями виконує наступні дії:
–      введення з клавіатури даних в масив TABL, що складається з N змінних типу WORK;
–      виведення прізвища працівників, стаж роботи яких перевищує значен­ня, введене з клавіатури; якщо таких немає, то вивести повідомлення.
7.

 

 

 

 

Описати структуру з іменем  TRAIN, яка містить поля: NAZV – наз­ва пункту призначення; NUMR – номер потягу; DATE, TIME – дата і час відправлення. Написати програму, що окремими функціями виконує дії:
–      введення з клавіатури даних в масив RASP, що складається з N змінних типу TRAIN;
–      виведення на екран інформації про поїзди, що відправляються після введеного з кла­віатури дня та часу; якщо таких поїздів немає, то вивести відповідне повідомлення.
8. Описати структуру з іменем  TABLE, яка містить поля: NAZV – назва пунк­ту призначення; NUMR – номер поїзда; DATE, TIME – дата і час від­правлен­ня. Написати програму, що окремими функціями виконує дії:
–      введення з клавіатури даних в масив TRAIN, що складається з N змінних типу TABLE;
–      виведення на екран інформації про поїзди, що направляються в пункт призначення, назва якого введена з клавіатури; якщо таких немає, то вивести повідомлення про це.
9. Описати структуру з іменем  ZNAK, яка містить поля: NAME – прізвище, ім'я; ZODIAC – знак Зодіаку; BDAY – день народження (масив із трьох чисел). Написати програму, що окремими функціями виконує наступні дії:
–  введення з клавіатури даних в масив BOOK, що містить N змінних типу ZNAK;
–  виведення на екран інформації про людину, чиє прізвище введене з клавіатури; якщо таких людей немає, то вивести відповідне повідомлення.
10. Описати структуру з іменем  ITNR, яка містить наступні поля: FIRST – назва початкового пункту маршруту; FINAL – назва кінцевого пункту маршруту; NUM – номер маршруту; DISTANCE – відстань у кіло­метрах. Написати програму, що окремими функціями виконує наступні дії:
–      введення з клавіатури даних в масив RT, що складається з N змінних типу ITNR;
–      виведення на екран інформації про маршрут, номер якого введений з клавіатури; якщо таких маршрутів немає, то вивести відповідне повідомлення.
11. Описати структуру з іменем  ITIN, яка містить поля: BEG, END – назви початкового і кінцевого пунктів маршруту; NUM – номер маршруту; DIST – відстань у кілометрах. Написати програму, що окремими функціями виконує дії:
–      введення з клавіатури даних в масив RT, що складається з N змінних типу ITIN;
–      виведення на екран інформацію про маршрути, які починаються або закінчуються в пункті, назва якого введена з клавіатури; якщо таких немає, то вивести повідомлення.
12. Описати структуру з іменем  SCHL, яка містить поля: NAME – прізвище та ім'я учня; GROUP – номер групи; SUBJ – успішність з п'яти предметів (масив з п'яти елементів). Написати програму, що окремими функціями виконує дії:
–      введення з клавіатури даних в масив LEARN, що складається з N змінних типу SCHL;
–      виведення на екран прізвищ і номерів груп для всіх студентів, що мають хоча б одну оцінку "2"; якщо таких немає, то вивести відповідне повідомлення.
13. Описати структуру з іменем  TBL, яка містить поля: NAZV – назва пунк­ту призна­чен­ня; NUMR – номер поїзда; DATE – дата відправлення; TIME – час відправлення. Напи­са­ти програму, що окремими функціями виконує наступні дії:
–      введення з клавіатури даних в масив TRAIN, що складається з N структур типу TBL;
–      виведення на екран інформацію про поїзди, дата відправлення яких введена з клавіатури; якщо таких поїздів немає, то вивести відповідне повідомлення.
14. Описати структуру з іменем  ABIT, яка містить поля: NAME – прізвище, ініціали; GENDER – стать; SPEC – назва спеціальності; EXAM – результати вступних іспитів з трьох предметів (масив з трьох елементів). Написати програму, що окремими функціями виконує наступні дії:
–      введення з клавіатури даних в масив ABIT, що складається з N змінних типу ABIT;
–      виведення на екран прізвищ та назв спеціальностей для всіх абітурієнтів, що набрали прохідний бал, який визначається користувачем програми; якщо таких студентів немає, то вивести відповідне повідомлення.
15. Описати структуру з іменем  TOVAR, яка містить наступні поля: NAME – назва товару; TYPE – одиниця виміру товару; SORT – сорт товару;  QUANTITY – кількість одиниць товару; COST – ціна. Написати програму, що окремими функціями виконує наступні дії:
–      введення з клавіатури даних в масив SHOP, що складається з N змінних типу TOVAR;
–      виведення на екран інформації про товар, його кількість, ціну одиниці та обчислену загальну суму товару на складі; назва товару вводиться з клавіатури, якщо його немає, то вивести відповідне повідомлення.

 

Задача 2.  Розробити програму, використовуючи функції, розмішені всередині структури, що описує відповідний об’єкт.

1. Інформація по N заводах міста задається рядком такого вигляду: прізвище, середній вік, спе­ціальність, середній оклад. Ввести інформацію по заводах, порахувати кількість слюсарів та токарів. Надрукувати значення та номери заводів, де середній вік вище 35 років.
2. Багаж пасажира характеризується кількістю речей і загальною вагою. Ввести інформацію про N пасажирів і визначити, чи є серед пасажирів такий, у якого найбільший багаж по кількості і за вагою.
3. Інформація по N заводах міста задається рядком такого вигляду: прізвище, середній вік, спеціальність, середній оклад. Ввести інформацію по заводах, порахувати середній оклад по всіха заводах. Порахувати кількість заводів, де середній оклад по заводу вище серед­нього по всіх заводам. Надрукувати це значення і вивести інформацію по цих заводах.  
4. Є інформація за підсумками іспитів в інституті, всього в списку N чоловік. По кож­но­му з студентів є такі відомості: прізвище, оцінка з математики, оцінка з інформа­тики та оцінка з фізики. Ввести інформацію про іспити і надрукувати кількість і прі­звища відмінників та кількість і прізвища студентів, які мають хоча б одну двійку.
5. Є інформація за підсумками іспитів в інституті, всього в списку N чоловік. По кожному із студентів є такі відомості: прізвище, оцінка з математики, оцінка з інформатики та оцінка з фізики. Ввести інформацію про іспити, обчислити і надрукувати середній бал з кожної дисципліни. Надрукувати прізвища студентів, у яких бал по кожному з предметів вище середнього по цьому предмету.
6. У населеному пункті проживає N чоловік. Про кожного відомі прізвище, вік, стать. Ввести інформацію про жителів даного пункту і порахувати кількість жінок і чоловіків, вивести інформацію про тих, кого більше.
7. У населеному пункті проживає N чоловік. Про кожного відомі прізвище, вік, стать. Ввести інформацію про жителів даного пункту і порахувати кількість жінок і чоловіків, вивести інформацію про середній вік чоловіків, надрукувати прізвища тих чоловіків, чий вік нижче середнього.
8. Картотека відеотеки організована у вигляді масиву структур з полями: назва фільму, вартість, режисер. Ввести інформацію по відеотеці і вивести інформацію про фільми одного режисера. Вивести інформацію про всі фільми за зростанням вартості.
9. Картотека відеотеки організована у вигляді масиву структур з полями: назва фільму, вартість, режисер. Ввести інформацію по відеотеці і вивести інформацію про фільми, вартість яких більша, ніж середня, максимальна і мінімальна вартість.
10. Є інформація про N членів спортивної секції: прізвище, вік, зріст. Ввести інформацію про кожного. Надрукувати прізвище найвищого. Надрукувати інформацію про тих, чий вік нижче середнього, а зріст вище середнього по секції.
11. Є інформація про N членів спортивної секції: прізвище, вік, зріст. Ввести інформацію про кожного. Вивести інформацію про всіх спортсменів у таблиці. Надрукувати прізвища та вік тих, чий вік вище середнього.
12. Є інформація за підсумками іспитів в інституті всього в списку N чоловік. По кожному із студентів є такі відомості: прізвище, оцінка з математики, оцінка з інформатики та оцінка з фізики. Ввести інформацію про іспити і надрукувати кількість і прізвища студентів, які отримали на іспиті дві п'ятірки і одну четвірку.
13. Є інформація про N учасників спортивних змагань з п'ятиборства. Про кожного учасника відома наступна інформація: прізвище, місце, зайняте по кожному з видів. Ввести інформацію про учасників змагань і вивести інформацію про переможця у п'ятиборстві.
14. Є інформація про N учасників спортивних змагань з п'ятиборства. Про кожного учасника відомо: прізвище, місце, зайняте по кожному з видів. Ввести інформацію про учасників змагань і вивести інформацію про переможця у кожному виді спорту.
15. Є інформація за підсумками іспитів в інституті, всього в списку N чоловік. По кожному із студентів є такі відомості: прізвище, оцінка з математики, оцінка з ін­фор­матики та оцінка з фізики. Ввести інформацію про іспити і надрукувати кіль­кість і прізвища студентів, які склали іспити тільки з однією четвіркою. Надру­кувати кількість і прізвища студентів, які здали інформатику з оцінкою відмінно.

 

Задача 3.

1,
5,
10,
15
Завершення першого семестру навчання поставило перед Алісою складну задачу, а саме вирішення того, що робити зі старими конспектами. Гуляючи набережною Пів­денного Бугу вона вирішила їх збирати, а для зруч­ності каталогізувати, позначаючи назву дисципліни, напрям (технічна, марема­тична або гуманітарна), відомості про лек­тора та кількість сторінок. Остерігаю­чись вірусів, Аліса вирішила створити кон­троль­ну суму каталогу, побайтно додаючи вміст всього каталогу, а також позначати дату, коли створена ця контрольна сума. Напишіть програму, яка допоможе Алісі у її прагненні до систематизації набутих знань.
2,
6,
11
Аліса любить шоколадки і знає, що це корисно для мозку, однак водночас шкідливо для зубів та фігури. Намагаючись слідкувати за кількістю спожитого нею шоко­ладу, Аліса записує назву шоколаду, частку какао в ньому, спожиту кількість за день.
Напишіть програму, яка обробляючи дані Аліси, зібрані за місяць, зможе визначити середню кількість шоколаду на добу, яку споживає Аліса та її улюблений вид шоколадок, щоб Боб з Карлом знали, як їй краще віддячити у випадку, коли вони будуть користуватись її конспектом.
3,
7,
12
Боб у своєму марному прагненні дізнатись, що він більше полюбляє – поезію чи музику, збирав дані про вірші, які він читав, записуючи час читання, назву збірки, автора, а також збирав дані про музику, яку він слухав, а саме час, який він витрачав на прослуховування, жанр музики, виконавця, композитора, автора слів у випадку пісень. Після трьох місяців записів, він збагнув, що його бажання читати вірші або слухати музику обумовлюється більше його настроєм, ніж вподобаннями. А ще він усвідомив, що пісні поєднують як музику, так і поезію. Однак Боб завжди був оптимістом, тому вирішив не засмучуватись з приводу виконаної роботи щодо каталогізації, а використати її результати для того, щоб дізнатися який жанр музики він найчастіше слухає та вірші якого з авторів найчастіше манять його. Крім того, він вирішив дізнатися чи є автори слів пісень серед його улюблених поетів, а також скільки в середньому часу він витрачав на дозвілля протягом цих трьох місяців.
Напишіть програму, яка позбавить Боба від "ручного" обчислення та пошуку.
4,
9,
14
Одного дня Карл усвідомив, що його жарти подобаються не всім. Вирішивши, що він найбільше дружить з Алісою та Бобом, Карл почав записувати, які жарти вони полюбляють, які не викликають в них посмішок, а які викликають осуд. Карл згрупу­вав всі жарти на такі категорії: програмістські, студентські, загальнолюдські. Під час спостережень Карл занотовував тип жарту, реакцію Аліси, реакцію Боба та опис самого жарту. Напишіть програму, що на основі п’ятдесятиденних спостережень Карла допоможе йому визначити улюблені жанри жартів для своїх друзів.

 

ask5-1

 

Контрольні питання

 
  1. Що таке структури? Який синтаксис опису структур?
  2. Чим відрізняється оголошенн структур в мовах С і С++?
  3. Як можна оголосити статичний та динамічний масив структур?
  4. Наведіть приклад оголошення масиву змінних типу структура.
  5. Як можна звернутись до полів структури? Наведіть приклади .
  6. Як здійснити присвоєння структур та порівняння структур? В чому особливість цих операцій над структурами?
  7. Що являють собою об’єднання? Наведіть приклади об’єднань.
  8. Що таке бітові множини? Для чого їх використовують?
  9. Наведіть приклади використання бітових множин.
  10. Наведіть фрагмент коду для отримання двійкового представлення деякої змінної?