Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab3.doc
Скачиваний:
16
Добавлен:
12.02.2016
Размер:
205.31 Кб
Скачать

Лабораторна робота № 3

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Національний університет “Львівська політехніка”

Структури та об’єднання в мові програмування с

Інструкція

до лабораторної роботи № 3

з курсу “Проблемно-орієнтоване програмування”

для студентів базового напрямку 6.050101

"Комп’ютерні науки"

ЗАТВЕРДЖЕНО

на засіданні кафедри

Системи автоматизованого проектування

Протокол № 1 від 11.09.2014 р.

ЛЬВІВ 2014

1. МЕТА РОБОТИ

Мета роботи - навчитися використовувати структури та об’єднання для програмування на мові С.

2. ТЕОРЕТИЧНІ ВІДОМОСТІ

Структури

Структура - це набір з однієї або більше змінних, можливо різних типів, згрупованих під одним ім'ям для зручності обробки. (У деяких мовах, наприклад Паскаль, структури називаються “записами”).

Розглянемо приклад. Уявіть собі, що на календарі сьогодні 1 січня 2009 року. Дата складається з складових таких, як день, рік та назва місяця. Ці три змінні можна об’єднати в одну структуру вигляду:

struct DATE {

int day;

int year;

char mon_name[4];

};

Опис структури, що складається з взятого в фігурні дужки списку полів, починається з ключового слова struct. Після слова struct пишеться ім'я, так звана Мітка структури (тут це DATE). Ім’я може бути відсутнє. Така мітка іменує структури цього виду і може використовуватися надалі як скорочений запис детального опису. Елементи або змінні, згадані в структурі, називаються членами (полями, компонентами). Мітки і члени структур можуть мати такі ж імена, що і звичайні змінні (тобто ті, що не є членами структур), оскільки їх імена завжди можна розрізнити по контексту. Звичайно однакові імена присвоюють тільки тісно пов'язаним об'єктам.

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

Оператор

struct { } x, y, z; // описує struct { }

синтаксично аналогічний

Int X, y, z; // описує int

в тому сенсі, що кожен з операторів описує x, y та z в якості змінних відповідних типів і приводить до виділення для них пам’яті.

Опис структури, за яким не має списку змінних, не приводить до виділення пам'яті (немає змінної); він тільки визначає шаблон або форму структури. Але, якщо в такому опису є мітка, то ця мітка може бути використана пізніше при визначенні фактичних примірників структур. Наприклад, якщо дано приведений вище опис Date, то struct DATE d; визначає змінну d як структура типу Date.

Операція вказівника на член структури "." зв'язує ім'я структури та ім'я члена. Наприклад:

d.day = 1;

d.year = 2000;

d.mon_name = “січ”;

В програмі це може бути реалізовано наступним чином.

#include <stdio.h>

#include <string.h> // для strcpy()

struct DATE {

int day;

int year;

char mon_name[4];

};

int main(void)

{

struct DATE d;

// заповнимо структуру датою 1 січня 2000 року

d.day = 1;

d.year = 2000;

strcpy(d.mon_name, “січ”);

// виведемо на екран монітора цю дату

printf(“\nDate - %d %s %d\n”, d.day, d.mon_name, d.year);

return 0;

}

Результатом виконання програми буде напис : Date - 1 січ 2000.

Структури можуть бути вкладеними. Для прикладу наведемо структуру STUDENT:

struct STUDENT {

char name[25];

char address[40];

long int zipcode; // поштовий индекс

long int st_number; // номер студ. квитка

double scholarship; // стипендія

int course; // курс

char group[7]; // група

struct DATE birthdate; // дата народження

struct DATE heredate; // дата вступу в університет

};

Структура STUDENT містить дві структури типа DATE . Якщо ми визначимо person як struct  STUDENT person, то запис person.birthdate.year буде зсилатися на рік народження студента.

Над змінною структури можна виконати операції взяття адреси змінної та присвоєння її вказівнику.

struct DATE d1, *d2; //оголошено змінну типу DATE d1,та вказівник на тип DATE d2

d2 = &d1; // &d1 - взяття адреси змінної d1 та присвоєння його змінній d2

Для демонстрації прикладу використання цих операцій над структурами перепишемо наведену вище програму так, щоб ввід даних про дату відбувався в фунrції input_date(), а вивід в процедурі print_date(). В такому випадку наша програма набире наступного вигляду:

#include <stdio.h>

#include <string.h> // для strcpy()

struct DATE {

int day;

int year;

char mon_name[4];

};

struct DATE * input_date(int day, int year, char *month)

{

struct DATE tmp;

tmp.day = day;

tmp.year = year;

strcpy(tmp.mon_name, month); // копіювання стрічки

return &tmp; // взяття адресу змінної

}

void print_date(struct DATE *d)

{

printf(“\nDate - %d %s %d\n”, d->day, d->mon_name, d->year);

}

int main(void)

{

struct DATE d;

d = *(input_date(1, 2000,”січ”));

print_date(&d);

return 0;

}

// або елегантніше

int main(void)

{

print_date(input_date(1, 2000,”січ”));

return 0;

}

Розглянемо детальніше функцію void print_date(struct DATE * d). Як видно з оголошення функції, як формальний параметр використано вказівник на структуру. В такому випадку для звертання до полів структури використовується оператор “->. Для наочної різниці між звертанням змінної типу DATE та вказівником на змінну типу DATE наведено таблицю 1.

Таблиця 1.

struct DATE d;

struct DATE d,*d1;

d1 = &d;

d.date = 1;

d.year = 2000;

strcpy(d.mon_name, “січ”);

d1->date = 1;

d1->year = 2000;

strcpy(d1->mon_name, “січ”);

Структури можна об'єднувати в масив. Тоді запис struct DATE d[5]; відображає масив з п’яти елементів типу DATE. Доступ до полів структури відбувається наступним чином:

d[0].year;

d[0].date;

Розмір структури можна взнати використавши стандартну операцію. Справа в тому що в мові "C" передбачена унарна операція sizeof, яка виконується під час компіляції, дозволяючи обчислити розмір будь-якого об’єкта. Вираз

sizeof (object)

видає ціле число, що дорівнює розміру вказаного об’єкта. (Розмір визначається в неспецифіцикованних одиницях "байти", які мають той же розмір, що і змінні типу char). Об’єкт може бути фактичною змінною, масивом і структурою, або іменем основного типу, як int або double, або іменем похідного типу, як структура. В нашому випадку

int size;

struct DATE d;

size = sizeof(d);

Структури широко використовуються при побудові різноманітних дерев та списків.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]