Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб_Гриф.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
2.81 Mб
Скачать

Питання для контролю і самостійної роботи

  1. Приведіть приклади оголошення масивів з різною розмірністю. Поясніть організацію розміщення елементів масиву у пам’яті.

  2. Як відбувається масштабування при послідовному разіменуванні покажчика-імені масиву у процесі доступу до елементів ? Які синтаксичні конструкції можна використовувати для доступу до елементів масиву ?

  3. Приведіть загальну формулу для масиву Тип Ім'я [N][M][K] при доступі до заданого елемента Ім'я [ i ][ j ][ k ] і поясніть її.

  4. Як здійснюється ініціалізація багатомірних масивів ?

  5. Чи залежить ініціалізація масиву від класу пам'яті при оголошенні ?

  6. Як використовувати засіб typedef для оголошення типу масиву ?

  7. Який з індексів можна не вказувати при явній ініціалізації масивів ?

  8. Чи можна вказувати не всі елементи при ініціалізації ? Як можна використовувати дужки при ініціалізації ?

  9. Який індекс масиву не використовується при розрахунку переміщення покажчика в процесі доступу до елемента масиву ?

  10. Для чого використовується зазначений індекс ?

Заняття № 14 Розробка програм зі складеними типами даних

(2години)

Ціль роботи: виробити практичні навички в написанні програм з використанням комбінованих типів даних.

Теоретичні відомості

Структури

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

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

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

Представимо загальний синтаксис для оголошення структур і приведемо кілька прикладів структур.

Таблиця 14.2 - Загальний синтаксис і приклади оголошення структур

Загальний синтаксис оголошення структури

Приклади оголошення структур

struct <Тип_структури>

{ <Тип1> <Ім'я_даного1>;

[<Тип2 > <Ім'я_даного2>;]

[ //Інші дані-члени ]

} [Ім'я_структури1,

Ім'я_структури2, …];

//Оголошення типу структури і необов'язкове оголошення об'єктів-структур

struct Point

{ float x;

float y;

} Apoint, Bpoint, *Ppoint, Mpt[10]; //Оголошення типу й об'єктів:

дві структури, покажчик і масив

struct Person

{char firstn[12];

char lastn[15];

int birthday;

float weight;

}; //Оголошення

типу структури

Після оголошення типу (<Тип_структури>), його можна використовувати для оголошення об'єктів, наприклад

Point Astr, Mstr[5], *pstr;

Оголошено об'єкти структурного типу Point: Astr- структура; Mstr[5]- масив з 5-ти структур; pstr- покажчик на структуру даного типу.

Структура типу Point має два даних - членів типу float.

Структура типу Person - містить дані-члени, які є масивами: firstn[ ]- масив з 12 символів, у якому зберігається ім'я; lastn[ ]- масив з 15 символів, у якому зберігається прізвище; birthday – перемінна типу int, у якій зберігається рік народження; weight - перемінна типу float, у якій зберігається вага.

Оголошення структур-перемінних (об'єктів структурного типу) не відрізняється від оголошення перемінних з базовими чи попередньо визначеними типами. Приклади оголошення об'єктів (перемінних) структурного типу:

sttype structVar; //Оголошення перемінної типу sttype

sttype stArray[Kol_elem]; //Оголошення масиву структур sttype

Point Origin, StartPoint, Points[10]; //Оголошення об'єктів (перемінних)

Person You, Me, Us[30], *PYou; //структурних типів

У цьому прикладі оголошені перемінні-структури: structVar , Origin, StartPoint типу Point, масив Points [10], що має 10 елементів - структур типу Point, перемінні Me і You типу Person, масив Us [30], що має 30 елементів- структур типу Person і покажчик на тип Person.

С дозволяє виконувати явну ініціалізацію даних-членів структур. Ініціалізація здійснюється подібно ініціалізації масивів і відповідає тим же правилам. Загальний синтаксис для ініціалізації даних-членів структури

<Тип_структури> Ім'я_структури = { <Значення1>, <Значення2>, };

Компілятор привласнює <Значення1> першому даному-члену структури Ім'я_структури, <Значення2> - другому даному-члену цієї структури і т.д. С вимагає дотримання наступних правил :

  1. Значення, що привласнюються, повинні бути сумісні з відповідними їм даними-членами по типу, діапазону і кількості (для масивів).

  2. Можна повідомляти меншу кількість значень, що привласнюються, ніж кількість даних в структурі. Компілятор привласнює нулі іншим даним- членам структури.

  3. Не можна вказувати більше значень, що привласнюються, ніж кількість даних-членів.

  4. Значення зі списку ініціалізації послідовно привласнюються даним-членам вкладених структур і масивів.

Приклад ініціалізації структури

Point fPoint = {12.4, 34.5};

У цьому прикладі оголошена перемінна fPoint типу Point і ініціалізовані її дані-члени х = 12.4, у = 34.5 відповідними значеннями.

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

Таблиця 14.2 - Загальний синтаксис і приклади доступу до даних-членів структури

Загальний синтаксис для доступу до даних-членів структури

Приклади доступу до даних - членів структури

<Ім'я_структури> . <Дане_член>;

Point MyPt, mp[5]; //Оголошення

MyPt . x = 10.9; //Доступ до х

MyPt . y = 21.89; //Доступ до y

mp[2] . x = 2.96; //Доступ до х

mp[2] . y = 1.89; //Доступ до y

Оголошена структурна перемінна MyPt типу Point, доступ до її даних-членів х, у здійснюється за допомогою виражень ( MyPt . x ) і ( MyPt . y ) відповідно; mp[5] – масив з 5-ти структур також типу Point. Доступ до даних-членів х, у структури у масиві здійснюється за допомогою виражень ( mp[2] . x) і ( mp[2] . y ) відповідно.

Приклад

/* ЗАНЯТТЯ N 14

Розробив Петров О.Д.

Оголосити складені типи даних: структуру, масиву структур, виконати їхню ініціалізацію. Ініціалізацію масиву структур виконати з

використанням операторів організації циклу. Одержати доступ

до елементів структур. Вивести значення елементів масиву

структур на екран із застосуванням спеціальної функції. */

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <alloc.h>

#define N 20

#define M 5

typedef struct Adr //Adr -тип структури

{ char town[N]; char *country;

char region; float indeks; int kolvo;

} adr; //adr - теж тип структури (синонім Adr)

//input_st( ) - функція для ініціалізації структури типу adr

adr input_st(char *town, char *coun, char reg, float ind, int kol);

void print_st(adr adr3); //Функція виведення елементів структури

int main(void)

{ clrscr( ); int a; float f1;

char str[125]; //Буфер для введення рядка символів

adr adress[M]; //Масив структур

adr adr1, adr2 = {"Kiev", "Ukr", 'r', 12.3, 15}; //Явна ініціалізація

adr1 = adr2; //Ініціалізація adr1 присвоюванням

printf("Виведення елементів структури ");

print_st( adr1 ); //Виведення adr1

adr1= input_st( "Kr", "Ukr", 't', 134.5, 2); //Ініціалізація adr1

printf("Виведення елементів структури ");

print_st( adr1 ); //Виведення adr1

int і = 0, j;

while (a && і < M) //Введення елементів масиву структур

{ printf("Введення міста (char array[N]) ");

scanf("%s", &adress[ і ] . town); fflush(stdin);

printf("Введення країни (char *) ");

scanf("%s", str); fflush(stdin);

adress[ i ] . country = (char *)malloc(strlen( str ) + 1);

strcpy(adress[ i] . country, str);

//adress[ і ] . country = strdup( str ); //Можливий варіант ініціалізації.

printf("Введення коду регіону (char) ");

scanf("%c", &adress[ і ] . region); fflush(stdin);

printf("Введення цифрового коду (float) ");

scanf("%f", &f1); fflush(stdin);

adress[і].indeks=f1;

printf("Введення кількості (int) ");

scanf("%і", &adress[ і ] . kolvo); fflush(stdin);

printf("\n\t\t\t Продовжити введення ? y/n : ");

char c = getche( ); printf("\n");

if (c = = 'n' || c = = 'N' ) a = 0;

і ++;

} //end while

printf("Виведення елементів структур \n ");

j = i;

for(i = 0; i < j; i ++) print_st( adress[ i ] );

getche( );

return 0;

} //end main( )

adr input_st(char *t, char *c, char r, float f, int k)

{ adr ad; //Оголошення локальної структури

strcpy(ad . town, t); //Копіювання "t" у "ad . town"

ad . country = (char *)malloc( strlen( c ) + 1 ); //Виділення пам'яті

strcpy(ad . country, c); //Копіювання "c" у "ad . country"

// ad . country = strdup( c ); //Можливий варіант ініціалізації

ad . region = r; ad . indeks = f; ad . kolvo = k;

return ad; //Повернення структури з функції

} //end input_st( )

void print_st(adr adr3) //Функція виведення елементів структури

{ printf("| %s ", adr3 . town);

printf("| %s ", adr3 . country);

printf("| %4c | %10f | %6i | \n", adr3 . region, adr3 . indeks, adr3 . kolvo);

} //end print_st( )

/*Виведення елементів структури | Kiev | Ukr | r | 12.300000 | 15|

Виведення елементів структури | Kr | Ukr | t | 134.500000| 2|

Введення міста (char array[N]) Don

Введення країни (char *) Ukr

Введення коду регіону (char) t

Введення цифрового коду (float) 45.67

Введення кількості (int) 8

Продовжити введення ? y/n : y

Введення міста (char array[N]) Khar

Введення країни (char *) Ukr

Введення коду регіону (char) g

Введення цифрового коду (float) 67.84

Введення кількості (int) 4

Продовжити введення ? y/n : n

Виведення елементів структур | Don | Ukr | t | 45.669998 | 8 |

| Khar | Ukr | g | 67.839996 | 4 | */