- •З дисципліни “Системне програмування”
- •Мета виконання лабораторно-практичних робіт
- •Порядок виконання лабораторно-практичних робіт
- •Оформлення звітів про виконання лабораторно-практичних робіт
- •Лабораторна робота № 1
- •1 Короткі теоретичні відомості
- •1.4 Основні типи даних. Основні типи даних наведено в таблиці.
- •1.5 Операції.
- •Int printf (фороматний рядок, [, argument, ...]);
- •2 Питання вхідного контролю
- •3 Постановка завдання
- •4 Варіанти індивідуальних завдань
- •5 Методичні вказівки
- •6 Приклад розв’язку завдання
- •7 Питання вихідного контролю
- •Лабораторна робота № 2
- •1 Короткі теоретичні відомості Умовний оператор if. Уморвний оператор – це оператор, який виконується в залежності від виконання деякої умови.
- •2 Варіанти індивідуальних завдань
- •3 Методичні вказівки
- •4 Контрольні запитання
- •Лабораторна робота № 3
- •Оператор циклу while. Цикл while – це ітераційний цикл із передумовою. Це оператор циклу, який працює до тих пір, поки деяка умова буде істинною.
- •2 Варіанти індивідуальних завдань
- •3 Методичні вказівки
- •4 Приклад виконання лабораторної роботи
- •5 Контрольні запитання
- •Лабораторна робота № 4
- •1 Короткі теоретичні відомості
- •1.2 Опис масивів. Ім’я масиву це звичайний ідентифікатор. Він має бути унікальним, за ним іде розмірність. Розмір масиву може бути як літеральна константа, так і символьна.
- •Int array[a];
- •Int array[12];
- •Int array[a];
- •1.5 Одновимірні масиви. Одномірні масиви. Одномірний масив має один індекс.. Індекс – це номер в квадратних дужках після імені масиву.
- •2 Питання вхідного контролю
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад розв’язку завдання
- •5 Питання вихідного контролю
- •Лабораторна робота № 5
- •1 Короткі теоретичні відомості
- •2 Постановка завдання.
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад виконання лабораторної роботи
- •6 Контрольні запитання
- •Лабораторна робота № 6
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад розв’язку завдання
- •6 Питання вихідного контролю
- •Лабораторна робота № 7
- •1 Короткі теоретичні відомості
- •Int putchar(int c);
- •2 Варіанти індивідуальних завдань
- •3 Методичні вказівки
- •4 Контрольні запитання
- •Лабораторна робота № 8
- •1 Короткі теоретичні відомості
- •2 Постановка задачі
- •3 Варіанти індивідуальних завдань
- •4 Приклад виконання лабораторної роботи
- •5 Контрольні запитання
- •Лабораторна робота № 9
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Постановка завдання
- •4 Варіанти індивідуальних завдань
- •5 Методичні вказівки
- •6 Приклад розв’язку завдання
- •7 Питання вихідного контролю
- •Лабораторна робота № 10
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад розв’язку завдання
- •6 Питання вихідного контролю
- •Лабораторна робота № 11
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Постановка завдання
- •4 Варіанти індивідуальних завдань
- •5 Методичні вказівки
- •6 Приклад розв’язку завдання
- •7 Питання вихідного контролю
- •Практична робота № 1
- •1 Короткі теоретичні відомості
- •1.1 Умовний оператор if. Уморвний оператор – це оператор, який виконується в залежності від виконання деякої умови.
- •Оператор виконує наступні дії:
- •Приклад: Написати програму, яка виводить на екран числа від 1 до 7.
- •Оператор while виконує наступні дії:
- •Приклад: Вивести на екран додатні числа менші від 10.
- •Оператор виконує наступні дії:
- •2 Питання вхідного контролю
- •3 Постановка завдання на використання оператора switch
- •4 Варіанти індивідуальних завдань на використання оператора switch
- •5 Варіанти індивідуальних завдань на оператори циклів
- •6 Методичні вказівки
- •7 Приклад розв’язку завдання
- •8 Питання вихідного контролю
- •Практична робота № 2
- •1 Короткі теоретичні відомості
- •Void func( ) /*нічого не повертає*/
- •2 Варіанти індивідуальних завдань:
- •3 Методичні вказівки
- •4 Приклад виконання практичної роботи
- •5 Контрольні запитання
- •Практична робота № 3
- •1 Короткі теоретичні відомості
- •Int putchar(int c);
- •2 Питання вхідного контролю
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад розв’язку завдання
- •6 Питання вихідного контролю
- •Практична робота № 4
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Постановка завдання
- •4 Варіанти індивідуальних завдань
- •5 Методичні вказівки
- •6 Приклад розв’язку завдання
- •7 Питання вихідного контролю
- •Список рекомендованої літератури
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*/ }
