Лабораторна робота
Тема: “Структури”
Мета роботи: вивчення засобів мови Сі для обробки структур, оволодіння прийомами складання алгоритмів і програм з використанням структур.
Завдання: Визначити якість оцінювання студентів: підрахувати загальну кількість 0, 1, 2, 3, 4, 5 у кожній з двох груп в яких є по п’ять студентів, і які мають по дві оцінки з трьох дисциплін.
Теоретичні відомості: Структури – це складений об’єкт, в який входять елементи будь-яких типів, за винятком функцій. На відміну відмасиву, який є однорідним об’єктом, структура може бути неоднорідною. Тип структури визначається записом вигляду:
struct { список визначень }
У структурі обов’язково має бути вказаний хоч один би компонент. Визначення структур має наступний вигляд:
тип-даних описувач;
де тип-даних указує тип структури для об’єктів, визначуваних в описувачах. У простій формі описувачі є ідентифікаторами або масивами.
Приклад:
struct { double x,y; } s1, s2, sm[9];
struct { int year;
char moth, day; } date1, date2;
Змінні s1, s2 визначаються як структури, кожна з яких складається з двох компонент x і y. Змінна sm визначається як масив з дев’яти структур. Кожна з двох змінних date1, date2 складається з трьох компонентів year, moth, day. Існує і інший спосіб асоціювання імені з типом структури. Він заснований на використанні тега структури. Тег структури аналогічний тегу типу, що перераховує. Тег структури визначається таким чином:
struct тег { список описів; };
де тег є ідентифікатором.
У приведеному нижче прикладі ідентифікатор student описується як тег структури:
struct student { char name[25];
int id, age;
char prp; };
Тег структури використовується для подальшого оголошення структур даного вигляду у формі:
struct тег список-ідентифікаторів:
Приклад:
struct studeut st1, st2;
Використання тегів структури необхідне для опису рекурсивних структур. Нижче розглядається використання рекурсивних тегів структури.
struct node { int data;
struct node * next; } st1_node;
Тег структури node дійсно є рекурсивним, оскільки він використовується в своєму власному описі, тобто у формалізації покажчика next. Структури не можуть бути прямо рекурсивними, тобто структура node не може містити компоненту, що є структурою node, але будь-яка структура може мати компоненту, що є покажчиком на свій тип, як і зроблено в приведеному прикладі.
Доступ до компонентів структури здійснюється за допомогою вказівки імені структури і наступного через крапку імені виділеного компоненту, наприклад:
st1.name=”ОЛЕГ”
st2.id=st1.id;
st1_node.data=st1.age;.
Графічний алгоритм.
Програма складена мовою програмування Сі:
#include <stdio.h>
#include <math.h>
int o[6]={0,0,0,0,0,0};
void otsin(int *l)
{
int i;
for(i=0;i<60;i++)
switch(*(l+i))
{
case 0:o[0]++;break;
case 1:o[1]++;break;
case 2:o[2]++;break;
case 3:o[3]++;break;
case 4:o[4]++;break;
case 5:o[5]++;break;
default:printf("perevirte korektnist' vvedenux danux\n");
};
}
void main()
{
int q,w;
struct
{
struct
{
int p[2];
int m[2];
int f[2];
} s[5];
} g[2];
clrscr();
for(q=0;q<2;q++)
{
printf("grypa %i\n",q+1);
for(w=0;w<5;w++)
{
printf("%i student\n",w+1);
printf("vvedit' 2 otsinku z prog:");
scanf("%i%i",&g[q].s[w].p[0],&g[q].s[w].p[1]);
printf("vvedit' 2 otsinku z matem:");
scanf("%i%i",&g[q].s[w].m[0],&g[q].s[w].m[1]);
printf("vvedit' 2 otsinku z fiz:");
scanf("%i%i",&g[q].s[w].f[0],&g[q].s[w].f[1]);
}
}
otsin(&g[0].s[0].p[0]);
for(w=0;w<6;w++)
{
printf("%i:%i\n",w,o[w]);
};
o[0]=0;
o[1]=0;
o[2]=0;
o[3]=0;
o[4]=0;
o[5]=0;
otsin(&g[1].s[0].p[0]);
for(w=0;w<6;w++)
{
printf("%i:%i\n",w,o[w]);
};
getch();
}
Таблиця ідентифікаторів:
Змінна | Ідентифікатор
Група | q
Студенти | w
Оцінки з програмування | p
Оцінки з фізики | f
Оцінки з математики | m
Результат виконання програми:
0: 0
1: 7
2: 12
3: 16
4: 16
5: 9
Висновок: виконавши цю лабораторну роботу я вивчив засоби мови Сі для обробки структур, а також оволодів прийомами складання алгоритмів і програм з використанням структур.