МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
СТРУКТУРИ ТА ОБ’ЄДНАННЯ В МОВІ ПРОГРАМУВАННЯ С
Інструкція
до лабораторної роботи № 7
з курсу “Проблемно-орієнтовані мови програмування”
для студентів базового напрямку 6.08.04
"Комп’ютерні науки"
ЗАТВЕРДЖЕНО
на засіданні кафедри
Системи автоматизованого проектування
Протокол № від р.
ЛЬВІВ 2007
Структури та об’єднання в мові програмування С. Інструкції до лабораторної роботи № 7 з курсу “Проблемно-орієнтовані мови програмування” для студентів базового напрямку 6.08.04 "Комп’ютерні науки“ /Укл. С. І. Бобало, В. І. Каркульовський, І. І. Чура, -Львів: ДУ “ЛП”, 1999 р.- с.
Укладачі С. І. Бобало, доц.,
В. І. Каркульовський, канд.техн.наук, доц.
І. І. Чура, канд.техн.наук, доц.
М. І. Андрійчук, канд. ііз.-мат. наук, доц.
Відповідальний за випуск С. П. Ткаченко, канд.техн.наук, доц.
Рецензенти М. В. Лобур, доктор техн.наук,
І. І. Мотика, канд.техн.наук
1. МЕТА РОБОТИ
Мета роботи - навчитися використовувати структури та об’єднання для програмування на мові С.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
Структура.
Структура - це набір з однієї або більше змінних, можливо різних типів, згрупованих під одним ім'ям для зручності обробки. (У деяких мовах, наприклад Паскаль, структури називаються “записами”).
Розглянемо приклад. Уявіть собі, що на календарі сьогодні 1 січня 2007 року. Дата складається з складових таких, як день, рік та назва місяця. Ці три змінні можна об’єднати в одну структуру вигляду:
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);
Структури широко використовуються при побудові різноманітних дерев та списків.
Об'єднання
Об’єднання подібне структурі, але в кожен момент часу може використовуватись (або є активним) тільки один з його компонентів. Тип об’єднання може задаватися записом виду
union МІТКА {
опис компонента а1;
опис компонента а2;
…………………….
опис компонента аn;
};
Для кожного з цих компонентів виділяється одна і та ж область пам’яті, тобто вони перекриваються. Хоча доступ до цієї області пам’яті можливий через використання будь-якого з компонентів. Компонент для цієї мети повинен вибиратися так, щоб отриманий результат не був беззмістовним.
Як вже зазначалось, об’єднання подібні структурам. Доступ до компонент об’єднання відбувається цим самим способом, що і для структур.
Об’єднання застосовуються:
для мінімізації об’єму пам’яті, що використовується, якщо в кожний момент часу тільки один об’єкт з багатьох є активним;
для інтерпретації основного представлення об’єкта одного типу, так ніби цьому об’єкту був присвоєний другий тип.
Роль об’єднання аналогічна ролі опису еквівалентності (equivalence) в Фортрані. Компоненти в об’єднанні взаємозв’язані точно так, як два об’єкта, зв’язані відношенням еквівалентності в Фортрані.
В якості прикладу визначення об’єкта типу union розглянемо об’єднання shape, яке визначається наступним чином:
struct position {
int x; // 2 байти
int y; // 2 байти
};
union {
float radius; // коло 4 байти
float a[2]; // прямокутник 4*2=8 байт
int b[3]; // трикутник 2*3=6 байт
struct position p; // координата точки 2+2=4 байти
} shape;
Розмір об’єднання shape дорівнює не суммі всіх байтів, як у випадку структури, а розміру найбільшого поля (компоненти), тобто 8 байт.
В цьому прикладі є сенс використовувати тільки той компонент, який отримав останнім своє значення.
3. КОНТРОЛЬНІ ЗАПИТАННЯ
Який загальний вигляд структури ?
Як обчислити розмір структури ?
Що таке мітка ?
Як доступитись до полів структури з змінної типу структура ?
Як доступитись до полів структури з вказівником на змінну типу структура ?
Який загальний вигляд об’єднання ?
Яка принципова різниця між структурою та об’єднанням ?
4. КОНТРОЛЬНЕ ЗАВДАННЯ
Ознайомитись із особливостями використання структур та об’єднання у мові С.
Навчитися використувати структури та об’єднання для створення даних.
Одержати індивідуальне завдання.
Скласти програму на С, що дозволяє із використанням структур та об'єднань реалізувати розв’язок поставленої задачі.
Виконати обчислення по програмі.
5. ЗМІСТ ЗВІТУ
Мета роботи.
Короткий опис особливостей застосування структур та об'єднань у С.
Індивідуальне завдання.
Текст програми на С.
Результати обчислень по програмі.
Аналіз результатів, висновки.
6. СПИСОК ЛІТЕРАТУРИ
Керниган Б., Ритчи Д. Язык программирования С. - М. - Финансы и статистика. - 1992. – 272 с.
Уэйт М., Прата С., Мартин Д. Язык С. Руководство для начинающих. - М. - Мир. - 1988. –512 с.
Глинський Я. М., Анохін В. Є., Ряжська В. А. C++ i C++ Builder. – Львів: Деол. – 2003. – 192 с.
Герберт Шилдт. Полный справочник по C++. М. – С.-П.-К., Вильямс. – 2003. – 800 с.
Демидович Е. М. Основы алгоритмизации и программирования. Язык Си. (Учебное пособие). – Санкт-Петербург: “БХВ Петербург”. – 2006. – 439 с.
ВАРІАНТИ ІНДИВІДУАЛЬНИХ ЗАВДАНЬ
Задано 4 складні математичні вирази. Перевірити чи правильно записані дужки. Якщо якоїсь дужки не вистачає видати повідомлення про некоректність виразу.
В телефонному довіднику де задано прізвище абонента, його адреса і номер телефону знайти кілька абонентів, що належать до однієї ж АТС.
В бібліографічному каталозі знайти книги по алгоритмічній мові С. В каталог заноситься шифр книги, прізвище автора, назва, рік видання і кількість сторінок.
При обробці інформації про стан здоров’я студентів Вашої групи знайти найвищого і найважчого. В медичну карточку входить інформація: прізвище, рік народження, ріст, вага, артеріальний тиск.
В списку студентів Вашої групи обчислити кількість студентів з іменами: Наталя, Володимир, Роман.
Знайти найхолодніший і найтепліший день квітня. В метеорологічній інформації міститься: день місяця, температура, опади.
Привести гістограму числа входжень всіх букв латинського алфавіту у такий віршик:
The owl and the pussy - cat wont to sea
In a beautiful pea-green boot.
They took honey and a plenty of money
Wrapped up in five - pound note.
В файлі записана інформація про студентів груп Вашого бакалаврату КН-11, КН-12, КН-13, КН-14, КН-15, яка складається з прізвища, імені, статі і віку. Вивести на друк шифр групи в якій найбільший процент чоловіків.
В файлі записано результати модульного контролю студентів Вашої групи. Скласти програму, яка по кількості набраних балів буде визначати оцінку кожного студента. Рахувати що: 100-88 балів це 5; 87-71 балів - 4; 70-51 - 3; менше 50 - 2.
В файлі записано прізвище студента і його оцінки за останню сесію. Вивести на друк прізвище і середній бал студентів, як мають середній бал вищий за середній бал групи.
Скласти програму, яка буде перевіряти чи правильно введена дата, тобто щоб не було 30 лютого або 31 червня.
Скласти програму для визначення дня тижня. Задано рік, число і місяць.
Скласти програму знаходження прізвища двох осіб, що проживають за однією адресою в різних місцях. В списку приведено: прізвище, місто, вулиця, номер будинку і номер квартири.
По результатах метеорологічних досліджень за січень місяць 1990-1999 років, визначити в якому році було найбільше сонячних днів, в якому році січень був найбільш похмурий. Інформація записана у вхідному файлі у наступній формі: рік, число, середньодобова температура, хмарно або сонячно.
Передбачити запис нових абонентів у телефонний довідник сортуючи їх по номеру АТС (дві перші цифри номера) і по прізвищу.
У вхідному файлі записаний текст:
A swarm of bees in May
Is worth a load hey;
A swarm of bees in June
Is worth a silver spoon;
A swarm of bees in July
Is hot a worth a fly.
Скласти програму, що визначить кількість назв місяців і виведе їх на друк.
17. У відомості студентів Вашої групи записано: Прізвище і ініціали, адреса і телефон. В разі відсутності телефону в графі, що відповідає цій інформації стоять пробіли. Скласти програму яка буде друкувати номер телефону потрібного студента, а в разі відсутності телефону його адресу.
18. По результатах метеорологічних досліджень за січень місяць 1993 року, які наберете у вхідному файлі у слідуючий формі: число, місяць, рік, середньодобова температура, опади (дощ, сніг), визначити найтепліший день місяця.
19. Передбачити запис нових абонентів у телефонний довідник, якщо вже записані абоненти розміщені там по алфавіту.
20.В каталозі записано 10 назв книг в алфавітному порядку. В інформацію про книгу входять. Прізвище автора, назва книги, рік видання. Скласти програму яка дозволить доповнювати каталог новими назвами і буде розміщати їх а алфавітному порядку враховуючи і вже існуючі назви.
Видрукувати 5 студентів Вашої групи, які мають найвищий бал по результатах зимової сесії. На друк вивести середній бал групи, прізвище студента і його оцінки.
У одній відомості записано прізвище, ім’я і по-батькові студентів Вашої групи і рік вступу до інституту. У другий – прізвище і оцінки, що він одержав під час зимової сесії. Об’єднати ці відомості в одну і навести на друк прізвище, ім’я, по-батькові студента, рік вступу до інституту і оцінки останньої сесії.
У вхідний файл записати анкетні дані Ваших студентів. Скласти програму, що розсортує Ваші записи по алфавіту.
У вхідний файл записати анкетні дані Ваших студентів. Визначити найстаршого і наймолодшого студента групи.
У вхідному файлі записати 25 прізвищ Ваших студентів і їх адреси. Скласти програму що виведе на друк прізвище тих студентів, що живуть на одній вулиці.
У вхідному файлі записати відомість на стипендію студентів Вашої групи, де входить прізвище, ім’я, по-батькові і розмір стипендії. Скласти програму що виведе інформацію про стипендію будь-якого заданого студента.
Визначити статистику оцінок, одержаних студентами Вашої групи (кількість п’ятірок, четвірок, трійок, двійок) під час зимової сесії.
У вхідному файлі записана відомість по здачі першого модуля, де входить прізвище, ініціали, кількість набраних балів.
Провести редагування тексту варіанту №16 так щоб всі рядки закінчувались в одній і тій же ж позиції. Недостатню кількість позицій у рядку доповнити пробілами, розподіливши їх рівномірно між словами рядка.
У вхідному файлі записано телефонний довідник (з 20 абонентів) скласти програму, яка по заданому прізвищу буде виводити номер телефону абонента.
У тексті варіанту №16 визначити скільки разів зустрічається літера 0 і вивести номер рядка для цих літер найбільше.
Для фрагменту тексту варіанту №16 визначити скільки разів туди входить слово ’bees’.