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

2.15 Структури даних

Структури - це один з складених типів даних. Структурні змінні, або просто структури, це об'єднання однієї або більш змінних, можливо різних типів, в одну область пам'яті, що має для простоти одне ім'я. Окремі складові частини структурної змінної називаються полями.

Поняття структури в мові З відповідає двом різним поняттям. По-перше, це позначення місця в пам'яті, де розташовується інформація. Це місце називається структурною змінною. По-друге, це правило формування структурної змінної, використовуване для виділення їй місця в пам'яті і організації доступу до її полів. Далі таке правило називатимемо шаблоном структури.

Опис структурної змінної складається з двох кроків:

  • завдання шаблону структури;

  • опис структурної змінної.

Кожен шаблон має унікальне ім'я, яке підкоряється правилам формування імен змінних в мові С.

Синтаксис шаблону:

struct name {

type1 fieldname1;

type2 fieldname2;

typen fieldnamen;

};

де:

name - ім'я шаблону;

typen - будь-які типи змінних;

fieldname - імена полів.

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

Приклад шаблону приведений нижче:

struct student {

char name[32];

char lastname[32];

int kurs;

int years;

float stypendiya;

};

На даний момент визначена тільки форми даних, що «описують» студента. Після завдання шаблону можна описати структурну змінну, наприклад:

struct student first_student, second_student;

Існує ще один варіант опису структурної змінної - оголошення її безпосередньо після оператора опису шаблону, наприклад:

struct student {

char name[32];

char lastname[32];

int kurs;

int years;

float stypendiya;

} first_student, second_student;

Існує два способи звернення до структурної змінної:

  • з використанням оператора .

  • з використанням оператора ->

Оператор . формує посилання на потрібне поле з імені структурної змінної і імені поля, наприклад:

first_student.stypendiya=500;

Якщо дані прочитуються з клавіатури, то це можна зробити так6

scanf(“%f”,&first student);

При описі структурної змінної дозволяється виконувати ініціалізацію полів змінних, наприклад:

struct student first_student{

“Іванов”,

“Іван”,

2,

19,

500,

};

За заданим шаблоном структури можна описувати масиви структур і покажчики на структури. Наприклад:

struct student gr1[40];

Доступ до елементів масиву може виконуватися через індекс елементу або через покажчик-константу, яким є ім'я масиву:

gr1[i].stypendiya=500;

*(gr1+i).stypendiya=500;

(gr1+i)->stypendiya=500;

Як приклад використання даних типу структура розглянемо програму, в якій у файлі даних car.dat (передбачається, що файл існує і зберігає дані типу структура car) шукається автомобіль за номером oi8413t.

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

void main(void)

{

struct car {

char nomer[15];

char type[15];

char mark[15];

} car_current;

char nomer[ ]=”oi8413t”;

char work[80];

unsigned int flag=0;

FILE *fp;

if((fp=fopen(“car.dat”,”rt”))==NULL)

{

printf((“n Cannot open file”);

exit(1);

}

while(fgets(work,80,fp)!=NULL)

{

sscanf(work,”%s %s %s”, car_current.nomer, car_current.type, car_current.mark);

if(strstr(car_current.nomer,nomer)==0)

{

continue;

}

else

{

printf(“%s”,work);

flag=1;

break;

}

if(flag==0)

{

printf(“ Автомобіль не знайдений”);

}

fclose(fp);

}

Тут файл car.dat відкривається на читання. На кожному кроці циклу з файлу в буфер (масив work) прочитується рядок і порівнюється з шуканого за допомогою функції пошуку підрядка в рядку strstr(). Функція strstr() у разі невдачі повертає 0, інакше повертає 1.

Функція sscanf() прочитує дані з work і розносить їх по рядку, формату, по трьох структурованих змінних.

Контрольні запитання і завдання

  1. Які оператори дозволяють організовувати розгалуження в програмі?

  2. Яких операторів циклів ви знаєте? Сформулюйте рекомендації щодо їх використовування.

  3. Яке призначення оператора break?

  4. Яке призначення оператора continue?

  5. Яке призначення оператора return?

  6. Що є описом масиву?

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

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

  9. Складіть фрагмент програми для сортування елементів двовимірного масиву дійсних чисел за збільшенням величин елементів.

  10. складіть фрагмент програми пошуку числа у відсортованому одновимірному масиві цілих чисел. Треба використовувати факт сортування для прискорення процесу пошуку.