Лабораторна робота № 6
"Робота зі структурами в мові програмування Сі + +"
Мета роботи: познайомитись з поняттям структури і структурної змінної. Навчитися створювати масиви структур і працювати з вкладеними структурами.
Теоретичні відомості
Структура - це об'єднання одного або більше об'єктів (змінних, масивів, покажчиків, інших структур). Як і масив, вона являє собою сукупність даних, але відрізняється від нього тим, що до її елементів необхідно звертатися на ім'я, а її різні елементи не обов'язково має належати до одного типу.
Структури зручно використовувати там, де різноманітні дані, що відносяться до одного і того ж об'єкту, необхідно об'єднувати. Наприклад, учня середньої школи характеризують такі дані: прізвище, ім'я, дата народження, клас, вік.
Оголошення структури здійснюється за допомогою ключового слова struct, за яким слід її тип, список елементів, укладених у фігурні дужки. Її можна представити в наступному загальному вигляді:
struct тип {тип елемента 1 ім'я елемента 1;
тип елемента n ім'я елемента n;};
Іменем елемента може бути будь-який ідентифікатор. В одному рядку можна записувати через кому кілька ідентифікаторів одного типу.
Наприклад:
struct date {int day;
int month;
int year;};
Російські букви використовувати в ідентифікатор у мові СІ не можна.
Слідом за фігурною дужкою, що закінчує список елементів, можуть записуватися змінні даного типу, наприклад:
struct date {...} a, b, c;
При цьому виділяється відповідна пам'ять.
Виведене ім'я типу можна використовувати для оголошення запису, наприклад: struct date day;. Тепер мінлива day має тип date.
Дозволяється вкладати структури одна на іншу. Для кращого сприйняття структури використовуємо російські букви в ідентифікаторах, в мові СІ цього робити не можна.
Наприклад:
struct УЧЕНЬ {char Прізвище [15];
ім'я [15];
struct DATA ДАТА НАРОДЖЕННЯ;
int клас, вік;};
Певний вище тип DATA включає три елементи: День, Місяць, Рік, що містять цілі значення (int). Запис УЧЕНЬ включає елементи: ПРІЗВИЩЕ [15]; ІМ'Я [15]; ДАТА НАРОДЖЕННЯ, КЛАС, ВІК. ПРІЗВИЩЕ [15] і ІМ'Я [15] - це символьні масиви з 15 компонент кожен. Змінна ДАТА НАРОДЖЕННЯ представлена складовим елементом (вкладеної структурою) ДАТА. Будь-яку дату народження відповідають день місяця, місяць і рік. Елементи КЛАС і ВІК містять значення цілого типу (int). Після введення типів ДАТА і УЧЕНЬ можна оголосити змінні, значення яких належать цим типам.
Наприклад:
struct УЧЕНЬ УЧНІ [50];
масив УЧНІ складається з 50 елементів типу УЧЕНЬ.
У мові СІ дозволено використовувати масиви структури; записи можуть складатися з масивів та інших записів.
Щоб звернутися до окремого компоненту структури, необхідно вказати її ім'я, поставити крапку і відразу за нею написати ім'я потрібного елемента.
Наприклад:
Учні [1]. КЛАС = 3;
Учні [1]. ДАТА НАРОДЖЕННЯ. ДЕНЬ = 5;
Учні [1]. ДАТА НАРОДЖЕННЯ. МІСЯЦЬ = 4;
Учні [1]. ДАТА НАРОДЖЕННЯ. РІК = 1979;
Перший рядок вказує, що 1-й учень навчається в третьому класі, а наступні рядки - його дату народження: 5.04.79.
Кожен тип елемента структури визначається відповідним рядком оголошення в фігурних дужках. Наприклад, масив УЧНІ має тип УЧЕНЬ, рік є цілим числом. Оскільки кожен елемент запису відноситься до певного типу, його складене ім'я може з'являтися скрізь, де дозволено використовувати значення цього типу. Розглянемо приклад програми:
/ * Демонстрація запису * /
# Include <stdio.h>
struct computer {int mem;
int sp;
char model [20];};
/ * Оголошення записи типу computer, що складається з трьох елементів: mem, sp, model * /
struct computer pibm =
{512, 1, "ПЕОМ ЄС 1840.05 "}
/ * Оголошення і ініціалізація змінної pibm типу computer * /
main ()
{Printf ("персональна ЕОМ% s \ n \ n", pibm.model);
printf ("обсяг оперативної пам'яті -% d До байт \ n", pibm.mem);
printf ("продуктивність -% d млн. операцій в секунду \ n", pibm.sp);
/ * Висновок на екран значень елементів структури * /
}
У даній програмі оголошується запис computer, яка складається з трьох елементів: mem (пам'ять ЕОМ), sp (швидкодія), model [20] (модель ПЕОМ). Змінна pibm має тип computer і є глобальною. Рядки pibm.model, pibm.mem, pibm. sp в операторі printf викликають звернення до відповідних елементів запису pibm типу computer, яким раніше були присвоєні певні значення.
Результат роботи програми має вигляд:
персональна ЕОМ ПЕОМ ЄС 1840.05
обсяг оперативної пам'яті - 512 До байт
продуктивність - 1 млн. операцій у секунду
Розглянемо використання в програмі вкладених структур:
/ * Демонстрація вкладених структур * /
# Include <stdio.h>
struct date {int day;
int month;
int year;};
/ * Оголошення записи типу date * /
struct person {char fam [20];
char im [20];
char ot [20];
struct date f1;};
/ * Оголошення структури типу person; одним з елементів запису person є запис f1
типу date * /
main ()
{Struct person ind1;
/ * Оголошення змінної ind1 типу person * /
printf ("Вкажіть прізвище, ім'я, по батькові, день, \ n місяць"
"І рік народження громадянина ind1 \ n");
scanf ("% S% S% S% d% d", & ind1.fam, & ind1.im, & ind1.ot,
& Ind1.f1.day, & ind1.f1.month, & ind1.f1.year);
/ * Введення відомостей про громадянина ind1 * /
printf ("Прізвище, ім'я, по батькові:% S% S% S \ n", ind1.fam, ind1.im, ind1.ot);
printf ("Рік народження -% d \ n ", ind1.f1.year);
printf ("Місяць народження -% d - й \ n ", ind1.f1.month);
printf ("День народження -% d-й \ n", ind1.f1.day);
/ * Висновок відомостей про громадянина ind1 * /
}
Структура типу date (дата) містить три елементи: day (день), month (місяць), year (рік). Структура типу person (чоловік) містить чотири елементи: fam [20] (прізвище), im [20] (ім'я), ot [20] (по батькові), f1 (дата народження). Останній з них (f1) - це вкладена запис типу date.
Результати роботи програми:
Вкажіть прізвище, ім'я, по батькові, день, місяць і рік народження громадянина ind1
Алексєєв
Сергій
Петрович
3
5
1978
Підкреслена інформація вводиться користувачем.
Відомості про громадянина ind1
Прізвище, ім'я, по батькові: Алексєєв Сергій Петрович
Рік народження - 1978
Місяць народження - 5-й
День народження - 3-й
У наступній програмі розглянемо використання структури у вигляді елементів масиву pibm. Кожен елемент складається з наступних компонентів: mem (пам'ять), sp (обсяг вінчестера), model [20] (модель ПЕОМ):
/ * Масиви записів * /
# Include <stdio.h>
struct computer {int mem, sp;
char model [20];
pibm [10];};
/ * Оголошення запису типу computer;
оголошення масиву pibm типу computer * /
main ()
{Int i, j, k, priz;
for (i = 0; i <10; i + +)
{Printf ("Введіть відомості про ПЕОМ% d і ознака (0-кінець;
\ N інша цифра-продовження) \ n ", i);
printf ("модель ПЕОМ - ");
scanf ("% S", & pibm [i]. model);
printf ("обсяг оперативної пам'яті - ");
scanf ("% d", & pibm [i]. mem);
printf ("обсяг вінчестера - ");
scanf ("% d, & pibm [i]. sp");
printf ("ознака -");
scanf ("% d", & priz);
k = i;
if (! priz) break;}
/ * Тут! Priz - операція заперечення priz; break - вихід з циклу for, якщо priz = 0 * /
for (i = 0; i <10, i + +);
{
printf ("\ n Про яку ПЕОМ Ви хочете отримати відомості? \ n (Введіть номер від 0 до 9) \ n");
scanf ("% d", & j);
if (j> k)
{Printf ("Немає відомостей про цю ПЕОМ \ n");
continue;}
printf ("персональна ЕОМ% s \ n ", pibm [j]. Model);
printf ("обсяг оперативної пам'яті -% d Мб \ n", pibm [j]. mem);
printf ("обсяг вінчестера -% d Мб \ n", pibm [j]. sp);
printf ("ознака -");
scanf ("% d", & priz);
if (! priz) break;}
/ * Введення відомостей про ПЕОМ та занесення в масив pibm записів типу computer (перший цикл for); висновок на екран відомостей про ПЕОМ (другий цикл for) * /
}
Результати роботи програми:
Введіть відомості про ПЕОМ та ознака (0-кінець; інша цифра - продовження)
модель ПЕОМ - АТ 486 SX
обсяг оперативної пам'яті - 32
обсяг вінчестера - 4 Гбайта
ознака - 1
Введіть відомості про ПЕОМ та ознака (0-кінець; інша цифра - продовження)
модель ПЕОМ - АТ 386 DX
обсяг оперативної пам'яті - 64
обсяг вінчестера - 14 Гбайт
ознака - 0
Про яку ПЕОМ Ви хочете отримати відомості? (Введітн номер від 0 до 9)
1
модель ПЕОМ - АТ 386 DX
обсяг оперативної пам'яті - 16 Мб
обсяг вінчестера - 2,5 Гбайт
ознака - 0
Завдання
З таблиці взяти завдання за варіантом і написати програму.
Зміст звіту
Звіт повинен містити:
завдання до роботи;
програму;
результати розрахунків.
№ вар. | Завдання |
1 | Опишіть запис СТУДЕНТ і помістіть в неї наступну інформацію: П.І.Б., оцінки (математика, фізика, креслення, хімія, опір матеріалів). Визначте, скільки студентів мають незадовільну оцінку з математики. |
2 | Скориставшись записом СТУДЕНТ з варіанту № 1, визначте, скільки студентів мають незадовільну оцінку хоча б з одного предмета. |
3 | Скориставшись записом СТУДЕНТ з варіанту № 1, визначте, скільки студентів склали всі іспити на 5. |
4 | Скориставшись записом СТУДЕНТ з варіанту № 1, визначте середній бал групи з фізики. |
5 | Скориставшись записом СТУДЕНТ з варіанту № 1, визначте кількість відмінних оцінок, отриманих групою з усіх предметів. |
6 | Скориставшись записом СТУДЕНТ з варіанту № 1, визначте, скільки студентів мають середній бал від 4 до 5. |
7 | Скориставшись записом СТУДЕНТ з варіанту № 1, визначте, яка кількість незадовільних оцінок отримано з усіх предметів. |
8 | Скориставшись записом СТУДЕНТ з варіанту № 1, визначте, який з предметів був зданий групою найкраще. |
9 | Скориставшись записом СТУДЕНТ з варіанту № 1, визначте, скільки студентів не мають заборгованостей. |
10 | Опишіть запис АНКЕТА і помістіть в неї наступну інформацію: П.І.Б. (прізвище, ім'я, по батькові), адресу (вулиця, номер будинку, номер квартири), стать, вік. Визначте, скільки осіб жіночої та скільки чоловічої статі проживають в одному будинку. |
11 | Скориставшись записом АНКЕТА з варіанту № 10, визначте, скільки осіб чоловічої статі у віці старше 18 років і молодше 60 проживають на одній вулиці. |
12 | Скориставшись записом АНКЕТА з варіанту № 10, визначте, скільки осіб жіночої статі у віці старше 30 років проживають в одному будинку. |
13 | Скориставшись записом АНКЕТА з варіанту № 10, визначте, скільки дітей до 7 років проживають на одній вулиці. |
14 | Скориставшись записом АНКЕТА з варіанту № 10, визначте, скільки осіб чоловічої статі та жіночого у віці до 50 років проживають на одній вулиці. |
15 | Скориставшись записом АНКЕТА з варіанту № 10, визначте, скільки дітей від 1 року до 5 проживають в одному будинку. |
16 | Опишіть запис ТРАНСПОРТ і помістіть в неї наступну інформацію: П.І.Б. (Прізвище, ім'я, по батькові пасажира), багаж (кількість речей, вага в кг). Визначити кількість пасажирів, вага багажу яких перевищує 30 кг. |
17 | Скориставшись записом ТРАНСПОРТ з варіанту № 16, визначте, чи є пасажир, багаж якого складається з однієї речі вагою в 20 кг. |
18 | Скориставшись записом ТРАНСПОРТ з варіанту № 16, визначте середню вагу багажу. |
19 | Скориставшись записом ТРАНСПОРТ з варіанту № 16, визначте кількість пасажирів, вага багажу яких перевершує середній. |
20 | Скориставшись записом ТРАНСПОРТ з варіанту № 16, визначте кількість пасажирів, що мають більше трьох речей. |
Література
Подбельський В.В. Мова Cu + +: Навчальний посібник. - М.: Фінанси і статистика, 1995, - 560 с.
Страуструп Б. Мова програмування Сг + +. - М.: Радіо і зв'язок, 1991. - 352 стор
Собоцінскій В.В. Практичний курс Turbo Cu + +. Основи об'ктно-орієнтованого програмування. - М.: Світ, 1993. - 236 с.
Романов В.Ю. Програмування на мові Cu + +. Практичний підхід. - М.: компьтер, 1993. - 160 с.
Уінер Р. Мова турбо Cu. - М.: Світ, 1991. - 384 с.
Юлін В.А., Булатова І.Р. Запрошення до Cu. - Мн.: Вищ. Шк., 1990, - 224 с.
Котлинського Г.П., Галиновський О.І. Програмування на мові Cu. -Мн.: Вищ. Шк., 1991. - 156 с.