Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB_ZI.doc
Скачиваний:
5
Добавлен:
13.11.2019
Размер:
1.85 Mб
Скачать

4 Приклад виконання лабораторної роботи

Постановка задачі. Написати програму, яка вводить масив записів про країни Європи (назва, столиця, кількість населення, площа, кількість міст).

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

Текст програми мовою С

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

int main()

{int i, j;

struct dani

{char nazva[20];

char stol[20];

int nasel;

int plos;

int mist; } infor[3], a;

for(i=0;i<3;i++)

{puts("Vvedit nazvy krajinu");

scanf("%s",infor[i].nazva);

puts("Vvedit nazvy stoluci");

scanf("%s",infor[i].stol);

puts("Vvedit kilkist naselennya");

scanf("%d",&infor[i].nasel);

puts("Vvedit ploschy");

scanf("%d",&infor[i].plos);

puts("Vvedit kilkist mist");

scanf("%s",&infor[i].mist);}

for(j=0;j<3;j++)

for(i=j;i<3;i++)

{

if(infor[i].nasel>infor[i+1].nasel)

{

a=infor[i];

infor[i]=infor[i+1];

infor[i+1]=a;

}

}

puts("Vuvid sortonanogo spusky");

for(i=0;i<3;i++)

printf("%s\n %s\n %d\n %d\n %d\n ", infor[i].nazva, infor[i].stol, infor[i].nasel,

infor[i].plos, infor[i].mist);

}

Тестовий приклад

Якщо ми введемо:

Poland Warchava 34 789 5600

France Paris 87 565 8400

Ukraine Kiyv 52 988 24000

То на екрані ми маємо отримати відсортований масив:

Poland Warchava 34 789 5600

Ukraine Kiyv 52 988 2400

France Paris 87 565 84000

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

1. Які способи ініціалізації структур даних Ви знаєте?

2. Яка різниця між структурою та об’єднанням?

3. Як оголосити масив структур?

4. Як можна отримати доступ до поля елемента структури?

5. Який тип структури називається бітовим полем?

6. Чому в бітових полях не можна використовувати елементи типу float чи double?

7. Яка різниця між масивом структур і звичайним масивом?

8. Чому структури називають типом даних користувача?

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

Тема: Складання програм з використанням бібліотечних функцій для роботи з динамічною пам’яттю

Мета: Навчитись описувати та задавати динамічні масиви, виділяти і звільняти динамічну пам’ять, заносити дані в динамічні масиви

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

1.1 Динамічний розподіл пам’яті. Змінні, якими оперує програм, розташовуються в одній перервній області оперативної пам’яті, що називають сегментом даних. Такі змінні не змінюють свого розміру в ході виконання програми й називаються статичними. Розміру сегмента даних може бути недостатньо для розміщення великих масивів інформації.

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

Перевага динамічного виділення пам’яті для даних програми полягає в тому, що виділенням і звільненням динамічної пам’яті керує програма і пам’ять для даних можна виділяти на час їх опрацювання, а потім звільняти пам’ять для інших потреб. Розмір виділеної динамічної пам’яті, який також задається в процесі виконання програми, можна змінювати в процесі роботи програми.

Динамічне виділення пам’яті дає можливість створювати динамічні структури даних. В багатьох задачах кількість даних наперед не встановлена, а розв'язування задач передбачає введення нових елементів у вже сформований набір даних, видалення окремих елементів чи інші зміни складу й конфігурації набору даних. У цих випадках вищої гнучкості та ефективності в програмуванні й реалізації задач можна досягти, застосовуючи динамічні інформаційні структури, найбільш поширеними формами яких є лінійні і розгалужені списки.

Для роботи з динамічною пам’яттю використовуються вказівники. З їхньою допомогою здійснюється доступ до ділянок динамічної пам'яті, які називаються динамічними змінними. Динамічні змінні створюються за допомогою спеціальних функцій й операцій. Вони існують або до кінця роботи програм, або доти, поки не будуть знищені за допомогою спеціальних функцій або операцій. Наявність вільної пам’яті і її розподіл залежить від операційної системи, але це не справа програміста. Операційна система або виділяє ділянку пам’яті, або ні, механізми залишаються за кадром

При статичному розподілі пам’яті треба знати об’єм пам’яті до написання програми. Статичні дані і текст програм займають певний об’єм пам’яті. Решту об’єму пам’яті можна розподіляти динамічно. Якщо велика програма працює в системі з невеликим об’ємом оперативної пам’яті, то для динамічних операцій залишається мало пам’яті. Бібліотека містить функції для розподілу динамічної пам’яті в процесі виконання програми і роботи з нею.

1.2 Функція для динамічного виділення пам’яті malloc().Прототип функції malloc() знаходиться в бібліотечному файлі stdlib.h і має вигляд:

void *malloc(unsigned s);

Функція повертає вказівник на початок області динамічної пам’яті довжиною s байт. Якщо потрібний об’єм пам’яті функція не може виділити, то вона повертає NULL, або аргумент її =0, тобто s=0.

Приклад:

int *u;

u=(int*)malloc(sizeof(int)); // у функцію передається кількість необхідної пам'яті в байтах. Оскільки функція повертає значення типу void*, то його необхідно перетворити до типу вказівника (int*).

Приклад виділення пам’яті функцією malloc().

#include <stdio.h>

#include <stdlib.h>

int k, m, int *ptr1;

void main() { /*Виділяється 4*k байт памяті, одержуємо адресу виділеного блоку */

for (k=1; k<=6; k=k+1) {ptr1= malloc(4*k);

m=(ptr1+k-1); Додається розмір, кратний байтам

printf("k=%d %d %d\n", k, ptr1, m+3); }

1.3 Функція динамічного виділення пам’яті calloc(). Прототип функції знаходиться в бібліотечному файлі stdlib.h і має вигляд:

void *calloc(unsigned n, unsigned m);

Функція повертає вказівник на початок області динамічної пам’яті для розміщення n елементів довжиною m байт кожний. Якщо потрібний об’єм пам’яті функція не може виділити, то вона повертає NULL, або аргументи її =0, тобто n =0 або m=0.

Приклад програми використання функції calloc():

#include <stdio.h>

#include <stdlib.h>

int k, m, int *ptr1;

void main() / Виділяється 4*16 байт памяті, одержуємо адресу виділеного блоку */

ptr1= calloc(4,16);

printf("%d %d \n", current, current+1 );} Початок кінець

Результат 40240672 40240676

1.4 Розширення динамічної пам’яті за допомогою функції realloc(). Прототип функції знаходиться в бібліотечному файлі stdlib.h і має вигляд:

void *realloc (void *p, unsigned s)

Функція змінює розмір блоку раніше виділеної динамічної пам’яті до розміру s байт, р - адреса початку змінюваного блоку, при невдалому завершенні повертає NULL;

Аргумент ptr вказує на ново виділений блок пам’яті. Новий розмір в байтах вказується параметром s. При виклику realloc() можливі такі випадки.

  • Якщо для розширення блоку, який знаходиться за адресою ptr є достатня кількість пам’яті, то вона виконується і функція повертає ptr.

  • Якщо пам’яті не досить, щоб розширити існуючий блок по його текучій адресі, то створюється новий блок потрібного розміру s і дані копіюються з старого блоку в початок нового. Старий блок звільняється і функція повертає вказівник на новий блок пам’яті.

  • Якщо аргумент = NULL, то функція діє так як і malloc(), виділяючи блок пам’яті розміром s байт і повертаючи вказівник на нього.

  • Якщо аргумент size=0, блок пам’яті по адресі ptr звільняється і функція повертає NULL.

  • Якщо для перерозподілу недосить пам’яті (тобто не можна ні розширити старий блок, ні розмістити новий), функція повертає NULL, а початковий блок стає незмінним.

1.5 Звільнення пам’яті з допомогою функції free(). Пам’ять розподіляється з динамічної області. При розподілу памяті за допомогою функцій malloc() і calloc() ця память береться з динамічної області, яка доступна програмі. Але вона має межі. Коли програма закінчила роботу з блоком динамічно виділеної пам’яті, її треба звільнити. Звільнену пам’ять можна далі динамічно розподіляти. Для звільнення динамічно розподіленої пам’яті використовується функція free().

Прототип функції знаходиться в бібліотечному файлі stdlib.h і має вигляд:

void free(void *ptr);

Функція звільняє раніше виділену ділянку динамічної пам'яті, на яку вказує адреса р. Цей блок повинен бути раніше виділений однією з функцій malloc(), realloc() і calloc(). Якщо вказівник рівний NULL функція нічого не дає. Приклад звільнення динамічного розподілу пам’яті.

int int *ptr1;

void main() { /*Виділяється 4*k байт памяті, одержуємо адресу

ptr1= malloc(100);

free(ptr1); /* Звільнення блоку памяті по адресу ptr1*/ }

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