Лабораторна робота № 28. Структури

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися зі структурами, здобути навички написання програм.

Короткі теоретичні відомості до роботи.

Масиви об’єднують дані одного типу, а структури –різних типів. Розглянемо конструкцію структури на прикладі набору відомостей банківського клієнта.

struct client{int number; //номір

STRING name[11]; //прізвище

float balance; /* баланс */ }c1, c2;

Тут: struct – ключове слове,

сlient – ім’я структурного типу,

number, name, balance – елементи структури,

c1, c2 – об’єкти структурного типу client.

Перелік елементів структури закнуті у фігурні дужки. Об’ява структури, як і змінної, закінчується знаком;. Об’єкти можна об’явити окремо від об’яви структури:

сlient с3; – об’ява об’єкта типу сlient,

сlient *сР; – об’ява показника на об’єкт типу сlient.

Структура – похідний тип даних, визначений програмістом. Ім ’я структури – спеціфікатор типу.

Кожний об’єкт є конкретна реалізація змінної конкретного структурного типу зі своїм набором даних.

Доступ до елементів структури здійснюється через об ’єкти структурного типу.

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

с3.number=13; cP=&c3;

i=c3.number;

або

i=cP => number;

або

i=(*cP).number

Обидва останіх вираза еквівалентні. Ініціалізація елементів при об’яві структури заборонена, так як виділена пам’ять виконується тільки при об’яві об’єкту.

Розглянемо програму, що ілюструє можливості структур.

//файл PART4\4_01.ccp

// структура

#include <string.h> //функція обробки рядків

#include “c:\CPP\SUBPROG\\roll.h”

#include “c:\CPP\SUBPROG\\roll_txt.h”

typedef char STRING;

struct client //об’ява структури client

{int number; //з елементами: number

STRING name[11]; //name і balance

float balance; }c1, c2; //і двох об’єктів c1 і c2

main () { clrscr();

client c3; //об’ява об’єкту типа client

client *cP; //об’ява показника на об’єкт типа client

//елементи об’єктів

c1.number=3; strcpy(c1.name, “суліма”);

с1.balance=0.18;

c2.number=1; strcpy(c2.name, “романенко”);

с2.balance=-4.83;

c3=c1; strcpy(c3.name, “сидоров”); //присвоєння даних (значень елементів)

//одного об’єкта іншому

сP=&c3; //адресація

//вивід значень елементів об’єктів

cout<<” об’єкт c1: number=”<<c1.number

<<” name ”<<c1.name

<<” balance= ”<<c1.balance<<end1;

cout<<” об’єкт c2: number=”<<c2.number

<<” name ”<<c2.name

<<” balance= ”<<c2.balance<<end1;

cout<<” об’єкт c3: number=”<<c3.number

<<” name ”<<c3.name

<<” balance= ”<<c3.balance<<end1;

cout<<” показник сР на об’єкт: number=”

<<(*cР).number

<<” name ”<<cР->name

<<” balance= ”<< cР->balance<<end1;

cout<<”\n *** кінець задачі *** ”;

pause(0); return 0; }

об’єкт c1: number=3 name суліма balance=0.18 об’єкт c2: number=1 name романенко balance=-4.83 об’єкт c3: number=3 name сидоров balance=0.18 показник сР на об’єкт: number=3 name суліма balance=0.18 *** кінець задачі ***
РЕЗУЛЬТАТ ВИКОНАННЯ ПРОГРАМИ

Область дії структури і її об’єктів визначається так, як і для змінних базових типів. У програмі структура і об’єкти c1 і c2 об’явленіна глобальному рівні, об’єкт c3 та показник – це локальні змінні.

Структурні об’єкти і показники на них можуть бути зібрані у масиви.

Наприклад:

client m[N]; – об’ява масива об’єктів типуclient.

сlient *mP[N]; – об’ява масива показників на об’єкти типуclient

Структурні об’єкти і показники на них можуть бути аргументами функцій, а також повертаємими значеннями.

Розглянемо наступну програму, яка реалізує сортування масиву об’єктів структурного типу сlient.

//файл PART4\4_02.ccp

// Масив структурних об’єктів

//передача об’єкта функції

#include <string.h> //функція обробки рядків

#include “c:\CPP\SUBPROG\\roll.h”

#include “c:\CPP\SUBPROG\\roll_txt.h”

typedef char STRING;

#include <iomanip.h>

#define N 4

struct client //об’ява структури client

{int number; //з елементами: number

STRING name[11]; //name і balance

float balance; }

void enter(client &); //функція вводу даних

void print(const int, const client &); //функція виводу даних

void swop(client &, client &); //обмін даними

void sort(client [ ], unsigned, int); //сортування масиву

main() {clrsxr();

client m[N]; //масив об’єктів типу client

for (i=0; i<N; i++)enter(m[i]); //ввід значень елементів об’єктів типу client

for (i=0; i<N; i++) print (i, m[i]); //вивід значень елементів об’єктів типу client

pause(1);

for (j=0; j<=4; j++){sort(m, N, j); //сортування масиву client m[N]

for (i=0; i<N; i++) print (i, m[i]); cout<<end1;}; //вивід відсортованого значення

pause(1); return 0; }

void enter(client &c); //функція вводу даних

{cout<<” ввести номір “; cin>>c, number;

cout<<” ввести прізвище “; cin>>c, name;

cout<<” ввести баланс “; cin>>c, balance; }

void print(const int i, const client &c); //функція виводу даних

{cout<<” об’єкт о “<<setw(3) <<i+1

<<” number= “<<setw(4) <<c.number

<<” name = “<<setw(11) <<c.name

<<” balance = “<<setw(8)

<<setprecision(2)<< c.balance<<end1;

void swop(client &a, client &b);

{ client c=a; a=b; b=c;}

void sort(client c[ ], unsigned K, int ind);

{ for (int i=0; i<K-1, i++) { for (int j=i+1; j<K, j++)

{ switch (ind) { //вибір вигляду сортування

Case 1

if (c[i].number> c[j].number)

swap(c[i], c[j]); break;

Case 2

if (strcmp(c[i].name, c[j].name)>0)

swap(c[i], c[j]); break;

Case 3

if (c[i].balance > c[j].balance)

swap(c[i], c[j]); break;

default; cout<<”\nвведана помилкова мітка”<<end1;

goto mm; /* оператор переходу до мітки mm*/}; }; };

mm; /*мітка для goto*/; }

Введення даних здійснюється з клавіатури при виклику підпрограми enter. Структурний об’єкт передається функції по посиланню, так як дані визначаються після виклику функції. Коли потрібно, гарантувати незміність даних при виклику функції, змінну структурного типу можна постачати атрибутом const, як це зроблено у підпрограмі виводу даних на екран ptint, або передати у функцію по значенню. Результат введення даних і виводу їх на екран продемонструємо нижче.

 
 
ввести номір 3 ввести прізвище чичко ввести баланс 99 ввести номір 15 ввести прізвище юхно ввести баланс -55 ввести номір 13 ввести прізвище юхновський ввести баланс 68 ввести номір 6 ввести прізвище голубко ввести баланс -23 об’єкт # 1 number= 3 name чичко balance= 99 об’єкт # 2 number= 15 name юхно balance= -55 об’єкт # 3 number= 13 name юхновський balance= 68 об’єкт # 4 number= 6 name голубко balance= -23


Власно сортування масиву об’єктів типу client, реалізує підпрограма sort. Обмін значеннями здійснюється функцією swop – аналог функції swap. В ангіської мови слово «обмін» має подвійне значення: swap і swop. Назва функції змінена для того, щоб не ставити комп’ютер перед вибором між функціями – підпрограмою для визначення структурних об’єктів і бібліотечною функцією для базових типів.

Вибір параметрів, по якому здійснюється сортування, робиться за допомогою показника з цілою міткою ind: 1 – сортування по збільшенню номера number, 2 – по прізвищу клієнта name в алфавітному порядку, 3 – по зростанню величини балансу balance.

Тому що показник розміщується всередині циклу, для того щоб уникнути непотрібних повторень при введенні помилкової мітки застосовується оператор безумовного переходу goto, який після першої дії мітки default зупиняється виконання циклу переходом до мітки mm.

Оглядові запитання

1. Що дозволяють структури?

2. Яку структуру має її конструкція? Навести приклади.

3. Чим відокремлюється об’єкт від структури?

4. Чи можна об’явити об’єкт окремо від об’яви структури?

5. Що таке структура?

6. Яким є кожний об’єкт?

7. Як здійснюється доступ до елементів структури?

8. Чи можлива ініціалізація елементів при об’яві структури?

9. Як визначається область дії структури та її об’єктів?

10. Чи можна зібрати у масиви структурні об’єкти і показники?

11. Чи можуть бути аргументами функцій структурні об’єкти і показники?

12. При виклику якої підпрограми здійснюється ввід даних з клавіатури?

13. Чи є різниці у діях функцій swap і swop?

14. Який перехід визначає goto?



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: