Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB_TO2.doc
Скачиваний:
15
Добавлен:
19.02.2016
Размер:
2.62 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?

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

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

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

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

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

1. Функція для динамічного виділення пам’яті malloc(). Прототип функції malloc():

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); }

2. Функція динамічного виділення пам’яті calloc(). Прототип функції:

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

3. Розширення динамічної пам’яті за допомогою функції realloc(). Прототип функції:

void *realloc (void *p, unsigned s)

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

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

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

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

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

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

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

Приклад використання функції для перерозподілу пам’яті:

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

Прототип функції:

void free(void *ptr);

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

#include <stdio.h>

#include <stdlib.h>

int int *ptr1;

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

ptr1= malloc(100);

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

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