Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-1 Программирование С++ / метод_лб_ пз_Інформатика.doc
Скачиваний:
5
Добавлен:
31.01.2021
Размер:
699.9 Кб
Скачать

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; // середній бал

} 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;

}

У цій програмі всім полям структури 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;

}

В оголошених типах однакові поля має сенс включити в окрему структуру і використовувати її при описі інших типів. Поетапно це виглядає так:

— загальна структура:

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; і т.д.

Крім того до змінної 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 чоловік, які сдають сесію по предметах: фізиці, математиці, і програмуванню і підрахувати:

— середній бал, отриманий кожним студентом;

— середній бал групи за кожним предметом;

— вивести на екран відмінників по програмуванню.

Програма буде мати вигляд:

// 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;

};