85901

Системне програмування. Інструкції до лабораторних робіт

Лабораторная работа

Информатика, кибернетика и программирование

Результати вивести на екран за допомогою функції printf. Результати вивести на екран за допомогою функції printf. Які фунції форматованого виводу на екран ви знаєте. Варіанти індивідуальних завдань В залежності від значення яке приймає y обчислити значення z результат вивести на екран.

Украинкский

2015-03-31

2.02 MB

1 чел.

PAGE  74

МІНІСТЕРСТВО ТРАНСПОРТУ ТА ЗВ'ЯЗКУ УКРАЇНИ

Львівський коледж

Державного Університету інформаційно–комунікаційних технологій

Затверджую

   Заступник директора  з НВР

  __________Плешівський Я.М.

Інструкції

до лабораторно-практичних робіт

з дисципліни “Системне програмування”

Для студентів денної форми навчання за спеціальністю

5.05090301 Монтаж обслуговування і ремонт станційного обладнання електрозв’язку

Галузь знань 0509 Радіотехніка, радіоелектронні апарати та зв'язок

Львів 2010


Укладач

Л. І. Кужій

Розглянуто та схвалено на

засіданні циклової комісії

обслуговування комп’ютерної техніки

Протокол № __ від __ ______200__ р.

Голова комісії ___________ Кужій Л.І.


З М І С Т

Мета виконання лабораторно-практичних робіт ………………..……

4

Порядок виконання лабораторно-практичних робіт …………..…….

4

Оформлення звітів про виконання лабораторно-практичних робіт ...

5

Лабораторнр робота № 1. Знайомство з інтегрованим середовищем мови програмування С. Введення, відлагодження та виконання програми простої структури ………………………………

6

Лабораторнр робота № 2. Складання програм з використанням розгалужених обчислювальних процесів………………………….…..

12

Лабораторнр робота № 3. Складання програм з використанням циклічних обчислювальних процесів………………………………….

15

Лабораторнр робота № 4. Складання програм для опрацювання масивів……………………………………………………………………

19

Лабораторнр робота № 5. Написання програм для знаходження вказівників на змінні різних типів

23

Лабораторнр робота № 6. Використання адресної арифметики для роботи з вказівниками………………………………………………….…

27

Лабораторнр робота № 7. Передача масивів у функції …………….

31

Лабораторнр робота № 8. Обчислення значень математичних функцій …………………………………………………………………..

37

Лабораторнр робота № 9  Ввід-вивід символьної інформації та її обробка………………………………………………………………….

42

Лабораторнр робота № 10 Використання бібліотечних функцій для обробки символьної інформації ………………………….…....

47

Лабораторнр робота № 11. Складання програм на використання структур даних  …………………………………………………………

50

Лабораторнр робота № 12 Опрацювання масивів, елементами яких є структури………………………………………………………...

54

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

59

Лабораторнр робота № 14 Операції над окремими бітами пам’яті

63

Лабораторнр робота № 15. Складання програм з використанням фор матованого файлового вводу-виводу ……………………….……

67

Лабораторнр робота № 16. Складання програм з використанням символьного файлового вводу-виводу………………………………..

71

Лабораторнр робота № 17 Блочний файловий ввід-вивід структурованих даних…………………………………………………..

74

Лабораторнр робота № 18 Складання програм для організації прямого доступу до файлових даних………………….………………

78

Практична робота № 1. Складання програм з використанням основних операторів мови С …………………………………………...

84

Практична робота № 2. Складання програм для обробки одновимірних масивів ……………………………………..…………..

90

Практична робота № 3. Написання програм з використанням власних функцій ………………………………………………….……

93

Практична робота № 4. Складання програм для опрацювання символьної інформації …………………………………………………

97

Практична робота №5. Використання функцій прямого доступу до даних у файлах…………………………………………………..………

100

Список рекомендованої літератури ……………………………………

104


Мета виконання лабораторно-практичних робіт

Метою виконання лабораторно-практичних робіт є здобуття студентами практичних навичок програмування мовою С для розв’язування задач та створення програмного забезпечення.

В результатi виконання лабораторно-практичних робіт студенти повиннi знати: 

  •  алфавіт мови, синтаксис, семантику та технологiю структурного програмування;
  •  функціональні можливості мови програмування С;
  •  функції стандартних бібліотек;
  •  методи та алгоритми програмування типових задач;

вмiти:

  •  розробляти модулі програм з використанням сучасних методів та ефективних алгоритмів засобами мови С;
  •  виконувати модифікацію програм;
  •  здійснювати відлагодження програм з метою виявлення та виправлення помилок;
  •  створювати працюючі програми шляхом встановлення їх достовірності за допомогою тестування.

Порядок виконання лабораторно-практичних робіт

Для виконання лабораторно-практичних робіт необхідно:

  •  використовуючи конспект лекцій та літературні джерела, вивчити теоретичний матеріал по тематиці роботи;
  •  отримати допуск до роботи шляхом відповідей на контрольні запитання за темою лабораторної роботи;
  •  написати програму мовою С згідно індивідуального завдання;
  •  використовуючи засоби iнтегрованого середовища мови С, записати та відлагодити програму з метою виявлення синтаксичних посмилок;
  •  запустити програму на виконання та записати отримані результати;
  •  перевірити правильність виконання програми шляхом її тестування, при необхідності внести зміни у програму та виконати її повторний запуск;
  •  оформити та захистити звіт про виконану роботу.


О
формлення звітів про виконання лабораторно-практичних робіт

Звіти про виконання лабораторно-прктичних робіт оформляються на бланках формату А4. Після завершення семестру звіти здаються викладачу. Кожен звіт повинен починатись з нової сторінки та містити такі розділи:

  •  Номер роботи;
  •  Тема роботи;
  •  Мета виконання роботи;
  •  Постановка задачі згідно індивідуального завдання
  •  Текст програми мовою С розв’язку завдання. Програма повинна контролювати правильність введення вхідни даних та мати коментарі до її основних операторів;
  •  Результати роботи програми;
  •  Пояснення отриманих результатів і аналіз їх правильності;
  •  Відповіді на контрольні запитання;
  •  Висновки, в яких вказується призначення програми, можливості її застосування, а також навики і знання, які отримано в ході виконання роботи.

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


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

Тема: Знайомство з інтегрованим середовищем мови програмування С. Введення, відлагодження та виконання програми простої структури.

Мета роботи: Ознайомитись з функціональними можливостями інтегрованого середовища мови C, навчитись вводити, відлагоджувати і виконувати програми простої структури, використовуючи засоби середовища C.

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

Мова СІ створена в 1972 р. Денісом Річі при розробці ОС Unix. Вона проектувалася як інструмент системного програмування з орієнтацією на розробку добре структурованих програм. Мова поєднує в собі, з одного боку, засоби мови програмування високого рівня: опис типів даних, оператори for, while, if і т.ін., а з іншого боку, містить засоби мови типу Асемблер: адресну арифметику, можливість роботи з полями бітів і т.ін.

Структура програми. Програма мовою С має таку структуру:

#директиви препроцесора

. . . . . . . . .

#директиви препроцесора

функція а ( )

оператори

функція в ( )

оператори

void main ( )  {    //функція, з якої починається виконання програми

оператори;  функція   { оператори;}

}

Директиви препроцесора - управляють перетворенням тексту програми до її компіляції. Початкова програма, підготована мовою СІ у вигляді текстового файлу проходить 3 етапи обробки:

  1.  препроцесорне перетворення тексту;
  2.  компіляція;
  3.  компонування (редагування зв'язків або зборка).

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

Директива починається з #. Наприклад,

1) #define - вказує правила заміни в тексті. #define ZERO 0.0

Означає, що кожне використання в програмі імені ZERO буде замінятися на 0.0.

2) #include< ім'я заголовкового файлу> - призначена для включення в текст програми тексту з каталогу «Заголовкових файлів», що надходять разом зі стандартними бібліотеками. Кожна бібліотечна функція СІ має відповідний опис в одному із заголовкових файлів. Список заголовкових файлів визначений стандартом мови. Вживання директиви include не підключає відповідну стандартну бібліотеку, а тільки дозволяє вставити в текст програми описи із зазначеного заголовкового файлу. Підключення кодів бібліотеки здійснюється на етапі компонування.. Хоча в заголовкових файлах містяться всі описи стандартних функцій, у код програми включаються тільки ті функції, які використовуються в програмі.

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

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

Визначення - вводять об'єкти (об'єкт - це іменована область пам'яті, окремий випадок об'єкту - змінна), необхідні для представлення в програмі даних, що обробляються. Прикладом є

int y = 10 ; //іменована константа

float x ;   //змінна

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

Оператори  - визначають дії програми на кожному кроці її виконання.

Константи й змінні. Константа - це значення, яке не може бути змінене в процесі виконання програми.

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

тип список_імен_змінних;

Основні типи даних. Основні типи даних наведено в таблиці.

Назва типу даних

Ключове слово

Розмір б

Діапазон значень

символьний

char

1

0. . 255

беззнаковий цілий

unsigned int

2

0. . 65535

короткий цілий

short int

2

-32768  . . 32767

беззнаковий короткий цілий

unsigned short

2

0. . 65535

цілий

int

2

-32768  . . 32767

беззнаковий довгий цілий

unsigned long

4

0. . 4294967295

довгий цілий

long

4

-214748348 . . 2147483647

дійсний одинарної точності

float

4

3.4Е-38 . . 3.4Е+38

дійсний подвійної точності

double

8

1.7Е-308 . . 1.7Е+308

дійсний максимальної точності

long double

10

3.4Е-4932 . . 1.1Е+4932

Відповідно до синтаксису мови змінні після визначення за замовчуванням мають невизначені значення. Змінним можна присвоювати початкові значення, явно вказуючи їх у визначеннях:

тип ім'я_змінної = початкове_значення;

Цей прийом називається ініціалізацією.

Приклади:

float pi = 3.14 , cc=1.3456;

unsigned int year = 1999;

Операції.

Унарні операції

++

збільшення на одиницю: (інкременту)

префіксна операція - збільшує операнд до його використання,

постфіксна операція збільшує операнд після його використання.

--

зменшення на одиницю: (декременту)

префіксна операція - зменшує операнд до його використання,

постфіксна операція зменшує операнд після його використання.

Бінарні операції.

+

бінарний плюс (додавання арифметичних операндів)

-

бінарний мінус (віднімання арифметичних операндів)

*

множення операндів арифметичного типу

/

ділення операндів арифметичного типу (якщо операнди цілочисельні, то виконується цілочисельне ділення)

%

отримання залишку від ділення цілочисельних операндів

Вирази. З констант, змінних, розділювачів і знаків операцій можна конструювати вирази. Кожен вираз складається з одного або декількох операндів, символів операцій й обмежувачів, в ролі яких зазвичай виступають квадратні дужки. Якщо вираз формує ціле або дійсне число, то це арифметичний вираз. В арифметичних виразах можливі операції: + - * /  %.

Вирази мови С записуються з використанням множини операцій та з врахуванням їх пріоритетів

Ввід і вивід у мові С. Обмін даними із зовнішнім середовищем програма на стандартному СІ реалізує за допомогою бібліотеки функцій вводу-виводу

#include <stdіo.h>

  1.  printf ( <форматний рядок>,<список аргументів>);

<форматний рядок> - рядок символів, взятих в лапки, що показує, як повинні бути надруковані аргументи. Наприклад:

printf ( “Значення числа Пі дорівнює  %f\n”, pi);

Форматний рядок може містити

  1.  символи, що будуть надруковані текстуально;
  2.  специфікації перетворення
  3.  керуючі символи.

Кожному аргументу відповідає своя специфікація перетворення:

%d - десяткове ціле число;

%f -  число із плаваючою крапкою;

%c -  символ;

%s -  рядок.

\n - керуючий символ новий рядок.

2) scanf ( <форматний рядок>,<список аргументів>);

В ролі аргументів використовуються вказівники. Наприклад:

scanf(“ %d%f ”, &x,&y);

2 Постановка завдання

  •  Обчислити значення виразу при різних дійсних типах даних (float й double). Обчислення варто виконувати з використанням проміжних змінних. Порівняти й пояснити отримані результати. Результати вивести на екран за допомогою функції  printf().
  •  Обчислити значення виразів. Пояснити отримані результати.

3 Варіанти індивідуальних завдань

№ п/п

Завдання 1

Завдання 2

1

, при а=1000, b=0.0001

  1.  n+(++m)
  2.  m-- *n

2

, при а=1000, b=0.0001

  1.  ++n*++m
  2.  --n -m

3

, при а=1000, b=0.0001

  1.  n---m
  2.  m--*n

4

, при а=1000, b=0.0001

  1.  n++*m
  2.  n++/m

5

, при а=1000, b=0.0001

  1.  - -m-++n
  2.  m*n/n++

6

, при а=1000, b=0.0001

  1.  m-++n
  2.  ++m*--n

7

, при а=1000, b=0.0001

  1.  m+--n
  2.  m++-(++n)

8

,при а=100, b=0.001

  1.  n++-m
  2.  m-- *n

9

, при а=100, b=0.001

  1.  ++n*++m
  2.  m++-n

10

, при а=100, b=0.001

  1.  n---m
  2.  m--*n

11

, при а=100, b=0.001

  1.  n++*m
  2.  n++-m

12

, при а=1000, b=0.0001

  1.  - -m-++n
  2.  m*--n

13

, при а=1000, b=0.0001

  1.  m-++n
  2.  ++m*--n

14

, при а=1000, b=0.0001

  1.  m+--n
  2.  m++*++n

4 Методичні вказівки

  1.  Для вводу й виводу даних використати бібліотеку функцій #include <stdіo.h>.
  2.  Для обчислення степеня можна використати багатократну операцію множення.
  3.  При виконанні завдання 1 треба використати допоміжні змінні для зберігання проміжних результатів:  наприклад: c=a*a*a; d=3*a*a*b;e=3*a*b*b;f=b*b*b;

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

Обчислити значення виразу при різних дійсних типах даних (float й double). Обчислення варто виконувати з використанням проміжних змінних. Порівняти й пояснити отримані результати. Результати вивести на екран за допомогою функції  printf().

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

#include <stdio.h>

void main()

{ 

float a,b,y; 

printf ("Programa Lab_1");

printf("vvedit a\n"); 

scanf("%d",&a); 

printf("vvedit b\n");

scanf("%d",&b);

y=((a-b)*(a-b)-(a*a-2*a*b))/(b*b);

printf ("y=%f\n",y);

}

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

1. Запустити мова C.

2. Вивчити розділи головного меню інтегрованого середовища, ознайомитись з пунктами і підпунктами кожного з вертикальних меню.

3. Вивчити “гарячі” клавіші швидкого виконання відповідних команд,

4. Створити новий файл. Для цього послідовно вибрати меню: FILE→NEW

5. Після появи вікна набрати текст програми згідно варіанту. Оволодіти засобами вбудованого редактора тексту для введення та редагування програм. Для цього використати команди меню Правка (Edit) та команди вбудованого редактора.

6. Відкомпілювати програму (меню COMPILE→COMPILE) і при необхідності виправити помилки.

7. Виконати програму (меню RUN →RUN), ввести дані та отримати результат.

8. Оформити звіт з лабораторної роботи. У звіті описати послідовність створення, редагування, компіляції та виконання програми.

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

1. Які фунції форматованого вводу з клавіатури ви знаєте?

2. Які фунції форматованого виводу на екран ви знаєте?

3. Приведіть синтаксис функції scanf()?

4. Приведіть синтаксис функції printf()?

5. Що називається специфікацією формату?

6. Для чого призначена послідовність символів \n в функції printf()?

7. Чому перед іменем змінної у функції scanf() ставиться знак &?

8. Яке призначення директиви #include?

9. Які три етапи обробки проходить початкова програма, підготована мовою С?

10. Що таке директиви препроцесора?

11. Чим відрізняються типи даних: float й double?

12. Навести приклади унарних та бінарних операцій?

8 Зміст звіту

  1.  Постановка завдання.
  2.  Програма розв’язку завдання1.
  3.  Результати  роботи програми для даних типу float.
  4.  Результати  роботи програми для даних типу double.
  5.  Пояснення результатів.
  6.  Програма розв’язку завдання2.
  7.  Результати  роботи програми.
  8.  Пояснення результатів.
  9.  Відповіді на контрольні запитання
  10.   Висновки.


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

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

Мета роботи: Навчитись розробляти алгоритми розв'язку задач, що потребують розгалужених обчислень та писати програми реалізації таких задач, використовуючи відповідні оператори мови C.

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

Умовний оператор if. Уморвний оператор – це оператор, який виконується в залежності від виконання деякої умови.

Ключове слово умовного оператора – if. Умовний оператор має повну й скорочену форми.

1. Скорочена форма оператора if  

if (вираз-умова ){оператор; оператори;}  /*  скорочена форма  */

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

Наприклад,

    if ((x<y)&&(x<z))  min=x;

2. Повна форма оператора if  

if ( вираз-умова ) {оператор1; оператори1;}  /* повна форма */

else  {оператор2;  ; оператори2;}

Якщо значення виразу-умови відрізняється від нуля (тобто істинне), то виконуються оператори1, при нульовому значенні виразу-умови виконуються оператори2. Наприклад,

if (d>=0)

{ x1=(-b-sqrt(d))/(2*a);

x2=(-b+sqrt(d))/(2*a); }

else {оператор виводу повідомлення про відсутність дійсних коренів; }

Оператор вибору варіантів switch. Це найбільш гнучкий керуючий оператор. Він виконує різні блоки програми, в залежності від значень деякого виразу і цих значень може бути більше двох. Синтаксис оператора switch:

switch (вираз)

{ case шаблон1:  оператор(и);

case шаблон2: оператор(и);

case шаблонn: оператор(и);

default:   оператор(и);    }

При виконанні оператора switch обчислюється вираз, записаний після switch, він повинен бути цілочисельним. Отримане значення послідовно порівнюється з константами, які записані відразу за службовим словом case.

При першому ж співпаданні виконуються оператори позначені даною міткою-шаблоном. Якщо виконувані оператори не містять оператора переходу, то далі виконуються оператори всіх наступних варіантів, поки не з'явиться оператор переходу або не закінчиться оператор switch. Якщо значення виразу, записаного після switch, не співпало з жодною константою-шаблоном, то виконуються оператори, які розташовані за міткою default. Мітка default може бути відсутньою.

Вираз після switch повинен приймати цілочисельне значення типу int, long або char. Обчислений вираз порівнюється з шаблонами константами, які задані після ключового слова case . Потім виконується одна з наступних операцій

  •  Якщо значення виразу співпало з одним із заданих шаблонів, то виконується оператори, які стоять після відповідної мітки  case .
  •  Якщо значення виразу не співпало ні з одним із заданих шаблонів, то виконується оператори, які стоять після ключового слова default. Наявність його в операторі не обов’язкова.
  •  Якщо значення виразу не співпало ні з одним із шаблонів і відсутній блок default, то виконується оператори, які стоять після дужок блоку switch .

Оператор break При зустрічі оператора break управління передається в кінець оператора switch.

Програма розгалужується в залежності від значення виразу. ((вираз)). Оператор switch обчислює вираз і передає управління на мітку case , шаблонне значення якої співпало зі значенням виразу Якщо вираз не приймає ні одного шаблонного значення, то управління передається оператору defalt: Якщо немає оператора break, то управління передається оператору, який слідує за switch.

2 Варіанти індивідуальних завдань

В залежності від значення, яке приймає y, обчислити значення z, результат вивести на екран. Якщо значення y не прийме ні одного з перерахованих значень, то на екран вивести повідомлення “default”. Значення a, b, c та d ввести з клавіатури. Результат вивести на екран.

№ віріанту

Завдання

№ віріанту

Завдання

  1.  

  1.  

,

  1.  

  1.  

  

  1.  

  1.  

  

  1.  

  1.  
  1.     
  1.  

  1.  
  1.     
  1.  

  1.  
  1.     

3 Методичні вказівки

  1.  Розробити алгоритм розв'язку задачі, дати короткий опис (роз'яснення) основних кроків алгоритму.  
    1.  Для вводу й виводу даних використати бібліотеку функцій    <stdіo.h>.
    2.  Використати оператор switch, який обчислює деякий вираз і направляє обчислення програми  в залежності значення, які він приймає.
    3.  Запустити програму на компіляцію. У випадку необхідності виправити синтаксичні помилки.
    4.  Результати роботи програми вивести на екран.

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

1. Синтаксис оператора switch ?

2. Вирази яких типів використовуються в операторі switch ?

3. Які ключові слова має оператор switch ?

4. Для чого призначений оператор default?

5. Для чого призначений оператор break?

6. Чи обов’язкова присутність мітки default в операторі switch ?

7. Скільки варіантів може мати оператор switch?

8. Що таке умовний оператор.

9. Яка повна форма оператора if.


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

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

Мета роботи: Навчитись розробляти алгоритми розв'язку задач, що потребують циклічних обчислень, та писати програми реалізації таких задач, використовуючи відповідні оператори мови C.

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

Оператор циклу for. Група дій, що повторюються в циклі, називається його тілом. Тіло циклу являє собою оператор або блок операторів. Однократне виконання циклу називається його кроком. Розрізняють ітераційні і арифметичні цикли. В арифметичних циклах відоме число кроків циклу. В ітераційних циклах відома умова виконання або невиконання циклу.

Арифметичний цикл – це цикл із параметром. Він виконується визначене число раз. Синтаксис арифметичного циклу for:

for (ініціалізація; вираз-умова; приріст)

{оператор; або оператори;}

Оператор виконує наступні дії:

  1.  Обчислюється вираз ініціалізація, звичайно це оператор присвоєння, який деякій змінній присвоює початкове значення.
  2.  Обчислюється вираз-умова, який є логічним виразом. Він визначає відношення між величинами.
  3.  Якщо умова хибна, тобто = 0, то управління передається оператору, який слідує за оператором циклу.
  4.  Якщо умова істинна, тобто >0, то виконуються  оператори в циклі.
  5.  Обчислюється вирах приріст і переходимо до п. 2.

Ініціалізація і  приріст - це вирази. Вони можуть складатися з декількох виразів, розділених комами. Вираз_1 - задає початкові умови для циклу (ініціалізація). Вираз-умова>  визначає умову виконання циклу, якщо вона не дорівнює 0, цикл виконується. Потім обчислюється значення  вираз_3. Вираз_3 - задає зміну параметра циклу або інших змінних (корекція). Цикл триває доти, поки вираз-умова не стане дорівнювати 0. Будь-який вираз може бути відсутній, але розділяючі їх « ; » повинні бути обов'язково.

Приклад

for  (а=0; a<10; a++)

{Оператор або блок операторів виконується 10 разів}

Приклади використання циклу з параметром.

  1.  Зменшення параметра:

for ( n=10; n>0; n--)

{ оператор};

  1.  Зміна кроку коректування:

for ( n=2; n>60; n=n+13)

{ цикл не виконається ні разу};

  1.  Можливість перевіряти умову відмінну від умови, що накладена на кількість ітерацій:

for ( num=1;num*num*num<216; num++)

{ оператор };

Оператор циклу while. Цикл while – це ітераційний цикл із передумовою. Це оператор циклу, який працює до тих пір, поки деяка умова буде істинною.

Синтаксис оператора циклу while

while (умова)

{Оператор; оператори;}

Оператор виконує наступні дії:

  1.  Обчислюється вираз-умова. Це логічний вираз, який визначає відношення між величинами.
  2.  Якщо умова хибна, тобто = 0, то виконання припиняється і управління передається оператору, який слідує за оператором циклу while.
  3.  Якщо умова істинна, тобто >0, то виконується  блок операторів в фігурних дужках.
  4.  Переходимо до п. 1.

Розглянемо приклад:

while (a<10) {Оператор або блок операторів}

Якщо умова хибна на початку, то оператор не виконується ні одного разу.

В ролі <вираз-умови> найчастіше використовується відношення або логічний вираз. Якщо воно істинне, тобто не дорівнює 0, то тіло циклу виконується доти, поки вираз-умова не стане хибною.

Приклад

а=10;

while (a!=0)

{ s= s +a; }

Даний оператор буде виконуватися безмежне число разів, бо нема зміни змінної а. Змінна а завжди буде не рівною нулю.

Оператор циклу do   while. Цикл while – це ітераційний цикл із постумовою. Це оператор циклу, який працює до тих пір, поки деяка умова буде істинною.

Синтаксис оператора циклу do while

do {Оператор; оператори;}

while (умова);

Оператор циклу do …while виконує наступні дії:

  1.  Виконується оператор або оператори в фігурних дужках..
  2.  Обчислюється вираз-умова, це логічний вираз, який визначає відношення між величинами.
  3.  Якщо умова хибна, тобто = 0, то цикл припиняє роботу.
  4.  Якщо умова істинна, тобто >0, то переходимо до п. 1

Цей оператор завжди виконується хоча б один раз, на відміну від попередніх, бо в ньому умова перевіряється після виконання операторів в циклі.

Приклад

do {оператори;} while (умова);

do

{ s+=a; }

while(a!=0);

Всі цикли можуть бути вкладеними.

Тіло циклу виконується доти, поки вираз-умови істинний.

2 Варіанти індивідуальних завдань

№ віріанту

Завдання

  1.  

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

  1.  

Написати програму для обчислення суми чисел кратних 7. Числа і суму вивести на екран.

  1.  

Написати програму для обчислення добутку непарних чисел від 1 до 9. Числа і добуток вивести на екран.

  1.  

Написати програму, яка виводить парні числа, менші за 24,  і їх квадрати на екран.

  1.  

Написати програму для обчислення добутку і суми чисел від 3 до 7. Результати вивести на екран.

  1.  

Написати програму для обчислення суми парних чисел від 17 до 500. Числа і суму вивести на екран.

  1.  

Написати програму для обчислення суми квадратів непарних чисел від 1 до 20. Числа і суму вивести на екран.

  1.  

Написати програму, яка виводить числа від -13 до 15 і їх квадрати на екран.

  1.  

Написати програму для обчислення суми непарних чисел від 4 до 20. Числа і суму вивести на екран.

  1.  

Написати програму для обчислення добутку непарних чисел від 1 до 10. Числа і добуток вивести на екран.

  1.  

Написати програму, яка виводить перші 10 непарних чисел і їх квадрати на екран.

  1.  

Написати програму для обчислення суми непарних чисел від 1 до 18, кратних 3. Числа і суму вивести на екран.

  1.  

Написати програму, яка виводить на екран числа від 6 до 30 кратні 7, а також знаходить їх суму, яку вивести на екран.

  1.  

Написати програму для обчислення суми квадратів парних чисел від 1 до 20. Числа і суму вивести на екран

  1.  

Написати програму для обчислення суми чисел від 1 до 110 кратних 11. Числа і суму вивести на екран.

3 Методичні вказівки

  1.  Уважно прочитати умову задачі з індивідуального завдання. Визначити, що має бути отримано в результаті її розв’язку, які дані для цього потрібно ввести.
  2.  Використовуючи  оператори циклу порахувати потрібне значення..
  3.  Розробити алгоритм розв’язку задачі, дати короткий опис (роз’яснення) основних кроків алгоритму.
  4.  Вибрати оператори для запису циклічних і розгалужених процесів;
  5.  Обчислення суми. Під час обчислення суми початкове значення змінної, де нагромаджуватиметься сума, наприклад S, має дорівнювати нулеві. Для цього використовують команду присвоєння S=0
  6.  Обчислення добутку. Під час обчислення добутку початкове значення змінної, де нагромаджуватиметься добуток, наприклад  має дорівнювати одиниці. Для цього використовують команду присвоєння d=1.
  7.  Для вводу й виводу даних використати бібліотеку функцій    <stdіo.h>.
  8.  Запустити програму на компіляцію. У випадку необхідності виправити синтаксичні помилки.
  9.  Запустити програму на виконання. У  випадку необхідності виправити семантичні помилки.
  10.  Реалізувати програму для різних вхідних даних.
  11.  Результати роботи програми вивести на екран.

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

Написати програму для обчислення суми чисел від 1 до 110 кратних 11. Числа і суму вивести на екран.

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

#include <stdio.h>

void main()

{ 

int i, S=0; 

printf («Programa Lab_3\n»);

for (i=11; i<110; i=i+11)

{

printf(“i=%d\n”,i);

S=S+i;  

}

printf («S=%d\n»,S);

}

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

1. В чому різниця між оператором for  і  while ?

2. В чому різниця між оператором while  і  do    while?

3. Які чотири складові частини оператора  for?

4. Які дві складові частини оператора  while?

5. Які дві складові частини оператора  do    while?


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

Тема: Складання програм для опрацювання двовимірних масивів.

Мета: Навчитись описувати, формувати і опрацьовувати двовимірні масиви даних в С-програмах; оволодіти основними способами ід лагодження програми шляхом контролю за ходом її виконання.

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

Масиви. Масив - це група пронумерованих( проіндексованих) однотипних елементів даних під одним загальним іменем. Розрізняють окремі елементи масиву по індексу – числу, яке стоїть після імені масиву в квадратних душках. Масиви необхідно описувати. Опис включає тип елементів масиву і розмір.

Приклад:

Int data[100];   /* масив типу цілий з іменем  data і розміром 100.

Звернення до окремих елементів масиву проводиться по індексу від 0 до 99. Першим елементом є data[0];   а не data[1].

Елемент масиву так само використовується, як проста змінна, і індексом може бути вираз або змінна.

Одномірні масиви. Одномірний масив має один індекс.. Індекс – це номер в квадратних душках після імені масиву.

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

Індекс масиву може бути як літеральною константою, так і виразом. Слід пам’ятати, що індексація починається з нуля. Відповідно, коли дати елемент останній, компілятор помилку не виявить, але програма буде працювати непередбачено.

Багатомірні масиви. Багатомірні масиви мають зразу декілька індексів, кількість індексів необмежена. Є обмеження на загальний розмір масиву.

Синтаксис

Int b[8][8];

Структура двомірного масиву

00 01 02   07

10 11 12    17

…………….

70 71 72…77

Імена і описи масивів. Ім’я масиву це звичайний ідентифікатор. Він має бути унікальним, за ним іде розмірність. Розмір масиву може бути як літеральна константа, так і символьна.

Наприклад

#define A 12

int array[A];

або

int array[12];

Не всі компілятори підтримують інструкцію, Тому так писати не варто

const int A=12

int array[A];

Рекомендують користуватися символьними константами, тому що легко можна змінити потрібну розмірність.

Задання (ініціалізація масивів). 

іnt a[4] = {1, 2, 3, 4}; еквівалентні

іnt a[] = {1, 2, 3, 4]};

Можна задати менше елементів, ніж розмірність масиву, помилки не буде, але робити так не рекомендується. Задання більшого числа елементів, ніж розмірність, дасть помилку.

При багатомірному масиві першим пробігається останній індекс.

Int а[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};

а[0][0]=1

а[0][1]=2

а[0][2]=3

а[1][0]=4

а[1][1]=5

а[1][2]=6

а[2][0]=7

а[2][1]=8

а[2][2]=9

а[3][0]=10

а[3][1]=11

а[3][2]=12

Можна це зробити і за рахунок дужок

іnt а[4][3]={ {1,2,3},  {4,5,6},  {7,8,9}, {10,11,12} };

Обов’язково все треба відділяти комами

Масив – це засіб зберігання однотипних даних під одним іменем. При описі його можна задати, але це не обов’язково.

2 Варіанти індивідуальних завдань

  1.  Задано двовимірний масив з дійсними елементами, розмірності (5x2). Кожний елемент масиву, який менший за 25, збільшити на 10. Новий масив вивести на екран.
  2.  Задано двовимірний масив з цілими елементами, розмірності (3x4), кожен елемент, значення якого лежить на відрізку [25;50], зменшити на вісім, всі інші елементи збільшити на 2. Новий масив вивести на екран.
  3.  Задано двовимірний масив з дійсними елементами, розмірності 53. Кожний елемент масиву, який менший за 5, збільшити в 2 рази. Новий масив вивести на екран.
  4.  Задано двовимірний масив з дійсними елементами, розмірності (2x4). Обчислити суму всіх від’ємних елементів. Одержаний результат вивести на екран.
  5.  Задано двовимірний масив з цілими елементами, розмірності (6x2). Обчислити суму елементів кожного рядка окремо. Одержаний результат вивести на екран
  6.  Задано двовимірний масив з цілими елементами, розмірності (5x6). Обчислити суми ненульових елементів кожного рядка окремо. Одержаний результат вивести на екран
  7.  Задано двовимірний масив з дійсними елементами, розмірності (2x10). Знайти суму додатних елементів. Одержаний результат вивести на екран.
  8.  Задано двовимірний масив з дійсними елементами, розмірності (4x4). Обчислити добуток елементів, по рядках. Одержаний результат вивести на екран.
  9.  Задано двовимірний масив з цілими елементами, розмірності 9x2. знайти суму всіх елементів, менших від 15. Одержаний результат вивести на екран.
  10.  Задано двовимірний масив з цілими елементами, розмірності (2x7). Знайти добуток всіх елементів, які менші від 4. Одержаний результат вивести на екран.
  11.  Задано двовимірний масив з дійсними елементами, розмірності 7x2. Кожний елемент масиву, який менший за 8, збільшити на 128. Новий масив вивести на екран.
  12.  Задано двовимірний масив з дійсними елементами, розмірності 9x2. Від’ємні елементи масиву замінити на 0. Новий масив вивести на екран.
  13.  Задано двовимірний масив з цілими елементами, розмірності 8x3, занулити елементи першого і останнього рядків. Новий масив вивести на екран.
  14.  Задано двовимірний масив з дійсними елементами, розмірності 8x2. Кожний елемент масиву, який менший за 15, збільшити в 2 рази. Новий масив вивести на екран.
  15.  Задано двовимірний масив з цілими елементами, розмірності 10x2. Кожний елемент масиву, який більший за 19, збільшити на 1. Новий масив вивести на екран.

3 Методичні вказівки

  1.  Уважно прочитати умову задачі з індивідуального завдання. Визначити, що має бути отримано в результаті її розв'язку, які дані для цього потрібно ввести.
    1.  Використати оператори  циклів,  опрацювати відповідні масиви.
    2.  :Оголошуючи масиви, враховувати задану максимально можливу кількість елементів. Дійсну кількість елементів, які будуть опрацьовуватись при кожній реалізації програми, вводити з клавіатури.
    3.  Розробити алгоритм розв'язку задачі, дати короткий опис основних кроків алгоритму.  
    4.  Для вводу й виводу даних використати бібліотеку функцій    <stdіo.h>.
    5.  Вибір операторів для запису розгалужених процесів
    6.  Ввести текст програми. Звернути увагу на типи даних, що будуть використані в програмі.
    7.  Запустити програму на компіляцію. У  випадку необхідності виправити синтаксичні помилки.
    8.  Запустити програму на виконання. У  випадку необхідності виправити семантичні помилки.
    9.  Реалізувати програму для різних вхідних даних.
    10.  Результати роботи програми вивести на екран.

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

Задано двовимірний масив з цілими елементами, розмірності (4x4), кожен елемент, значення якого лежить на відрізку [5;10], зменшити на 7, всі інші елементи збільшити на 7. Новий масив вивести на екран.

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

#include <stdio.h>

int i, j:

int A[4][4]={1, 4, 3, 7 -8, 5, 3, 0, 56, 34, -6,45, 45, 12, 0, 46};

int B[4][4];

void main()

{

printf («Programa Lab_4\n»);

for (i=0; i<4; i=i+1)

for (j=0; j<4; j=j+1)

{

if ((A[i][j]>=5) && (A[i][j]<=10)) B[i][j]= A[i][j]-7;

else

B[i][j]= A[i][j]+7;

}

for (i=0; i<4; i=i+1)

{

for (j=0; j<4; j=j+1)

printf(“B[%d][%d]=%d\t”, i, j, B[i][j]);

printf (“\n”);

}

}

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

  1.  Що таке масив?
    1.  Яке значення має індекс 1-го елементу масиву?
      1.  Які типи даних можна використати для опису масивів ?
        1.  Що таке двовимірний масив?
        2.  Яке значення має індекс 1-го елементу двовимірного масиву
        3.  Яке значення має індекс останнього елементу двовимірного масиву (5*5)?
        4.  Як звернутися до елементів масиву?
        5.  Які складові частини опису масивів?


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

Тема: Написання програм для знаходження вказівників на змінні різних типів

Мета роботи: Навчитись описувати і задавати вказівники; оволодіти основними способами роботи з вказівниками в C- програмах.

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

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

Переваги вказівників включають:

  •  Операції, які з допомогою вказівників виконуються легше і зручніше.
  •  Операції, які без вказівників взагалі виконати неможливо.

Коли компілятор обробляє оператор визначення змінної, наприклад, int i=10, то в пам'яті виділяється ділянка  відповідно до типу змінної (int=> 4 байти) і записує в цю ділянку значення змінної. Всі звертання до цієї змінної компілятор замінить на адресу області пам'яті, у якій зберігається ця змінна.

Програміст визначає змінні-вказівники для зберігання адресів області пам'яті. Такі змінні називаються вказівниками. Вказівник не є самостійним типом, він завжди пов'язаний з якимсь іншим типом.

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

2. Створення вказівників. Адреса змінної являє собою число. Тому з ним можна поводитися як з звичайним числом. Знаючи адресу даної змінної, можна ввести іншу змінну і помістити в ній адресу першої. Тому описуємо другу змінну, яка зберігає адресу першої.

Нехай змінна data поміщена в ділянку пам’яті з адресою, яка позначена змінною p_data. Ця змінна описана і в неї нічого не занесено. (Рекомендація, яка не обов’язкова, якщо ім’я data, то вказівник   .p_data ). 

Наступний крок – це помістити адресу змінної data, в змінну p_data. Оскільки змінна p_data тепер містить адресу data, вона вказує на data або є вказівником на змінну data.

3. Опис вказівників. Вказівники є числовими змінними, тому їх треба описати перед використанням. Імена вказівників повинні задовольняти тим умовам, що і інші змінні і бути унікальними. Вказівник не має самостійного типу. Тип вказівника - це тип змінної, на яку вказує вказівник.

Синтаксис опису.

Ім’я типу  *ім’я вказівника

Наприклад: int *i;  double *f, *ff;   char *c;

Вказівник може бути константою або змінною, а також вказувати на константу або змінну.

int i;  //ціла змінна

const int ci=1; //ціла константа

int *pi;  //вказівник на цілу змінну

const int *pci;  //вказівник на цілу константу

Якщо модифікатор const ставиться до вказівника (тобто перебуває між ім'ям вказівника й * ), то він забороняє зміну вказівника, а якщо він перебуває ліворуч від типу (тобто ліворуч від *), то він забороняє зміну значення, на яке вказує вказівник.

Наприклад,

float *p_data, d;

/* *p_data    вказівник на змінну типу  float, а d звичайна змінна типу float */

4. Ініціалізація (задання) вказівників. Використання не заданих вказівників дає непередбачені результати і це небезпечно, хоч і можливо. Якщо вказівник не містить адреси змінної, він не приносить ніякої користі. Адреса в вказівнику сама не з’явиться, її треба там помістити з допомогою операції взяття адреси, яка позначається значком амперсанд (&). Операція поєднання & і імені змінної, перед якою він стоїть, повертає адресу даної змінної. Тому вказівник можна ініціалізувати таким оператором присвоєння.

Вказівник = &змінна;

P_data =&data.;        /*   присвоює адресу data  вказівнику P_data*/

Після ініціалізації вказівник вказує на змінну.

Операція посилання по вказівнику (*).

Коли знак цієї операції стоїть перед іменем вказівника, така конструкція позначає змінну, на яку вказує вказівник. Тому змінна і посилання на вказівник цієї змінної є речі ідентичні.

Наприклад, оператори

printf(“%d”, data);

printf(“%d”, *p_data);

дають однаковий ефект. Ці оператори еквівалентні.

5. Вказівники і типи змінних. Змінні різних типів займають різний об’єм пам’яті. Адреси змінної являє собою адресу першого молодшого байта.

Наприклад,

char  =12252;

short =90;

float t=1200.

Опис і задання вказівників на ці змінні

char  *p_vchar;

short *p_vshor;

float *p_vfloat;

p_vchar=&vchar;

p_vshor=&vshor;   /* додаткові оператори */

p_vfloat=&vfloat;

Кожний вказівник рівний адресі першого байта змінної, на яку він вказує. Тому p_vshor=1000, p_vchar=1003, а p_vfloat=1 006.

2 Індивідуальні завдання

№ вар.

Завдання

  1.  
  •  Описати і задати змінну var цілого типу. Описати і ініціалізувати вказівник на неї. Вивести на екран значення цієї змінної шляхом звертання до неї по імені і через вказівник.
  1.  
  •  Описати і задати змінну data дійсного типу. Описати і ініціалізувати вказівник на неї. Вивести на екран значення цієї змінної шляхом звертання до неї по імені і через вказівник.
  1.  
  •  Описати і задати значення трьох змінних типу char, short і int. Описати і ініціалізувати вказівники на них. Вивести на екран адреси цих змінних і значення змінних за допомогою операції посилання по вказівнику.
  1.  
  •  Описати і задати змінну var цілого типу. Описати і ініціалізувати вказівник на неї. Вивести на екран адресу цієї змінної з допомогою операції  взяття адреси і самої змінної-вказівника
  1.  
  •  Описати і задати змінну data  цілого типу. Описати вказівник p_data на цю змінну і задати її адресу. Вивести на екран адресу цієї змінної з допомогою операції  взяття адреси і самої змінної-вказівника.  
  1.  
  •  Описати і задати змінну var цілого типу. Описати і ініціалізувати вказівник на неї. Вивести значення цієї змінної шляхом звертання до неї по імені і через вказівник.
  1.  
  •  Описати і задати значення трьох змінних типу char, short і int. Описати і ініціалізувати вказівники на них. Вивести на екран адреси цих змінних і значення змінних за допомогою операції посилання по вказівнику
  1.  
  •  Описати і задати змінну data  цілого типу. Описати вказівник p_data на цю змінну і задати її адресу. Вивести на екран адресу цієї змінної з допомогою операції  взяття адреси і самої змінної-вказівника операція посилання по вказівнику).
  1.  
  •  Описати і задати змінну data  дійсного типу. Описати і ініціалізувати вказівник на неї.. Вивести значення змінної шляхом звертання до неї по імені і через вказівник (операція посилання по вказівнику).
  1.  
  •  Описати і задати 3 змінні дійсного, цілого і символьного типів. Описати і ініціалізувати вказівники на них. Вивести на екран значення цих змінних шляхом звертання до них по імені і через вказівник (операція посилання по вказівнику).
  1.  
  •  Описати і задати 2 змінні дійсного і цілого типів. Описати і ініціалізувати вказівники на них. Вивести на екран значення цих змінних шляхом звертання до них по імені і через вказівник (операція посилання по вказівнику).
  1.  
  •  Описати і задати 2 змінні дійсного і символьного типів. Описати і ініціалізувати вказівники на них. Вивести на екран значення цих змінних шляхом звертання до них по імені і через вказівник (операція посилання по вказівнику).
  1.  
  •  Описати і задати змінну var цілого типу. Описати і ініціалізувати вказівник на неї. Вивести адресу змінної з допомогою операції взяття адреси і -вказівника
  1.  
  •  Описати і задати змінну var цілого типу. Описати і ініціалізувати вказівник на неї. Вивести на екран цю змінну шляхом звертання до неї по імені і через вказівник.
  1.  
  •  Описати і задати змінну data  дійсного типу..Описати і ініціалізувати вказівник на неї. Вивести на екран значення цієї змінної шляхом звертання до неї по імені і через вказівник (операція посилання по вказівнику).

3 Методичні вказівки

  1.  Уважно прочитати умову задачі з індивідуального завдання. Визначити, що має бути отримано в результаті її розв'язку, які дані для цього потрібно ввести.
  2.  Використати знання про вказівники, операції над ними.
  3.  Для вводу й виводу даних використати бібліотеку функцій    <stdіo.h>.
  4.  Ввести текст програми. Звернути увагу на типи даних, що будуть використані в програмі.
  5.  Запустити програму на компіляцію. У випадку необхідності виправити синтаксичні помилки.
  6.  Запустити програму на виконання. У випадку необхідності виправити семантичні помилки.
  7.  Реалізувати програму для різних вхідних даних.

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

  1.  Який знак операції використовується для одержання адресу змінної?
  2.  Який знак операції використовується для одержання значення по адресі?
  3.  Що таке посилання по вказівнику?
  4.  Що таке вказівник?
  5.  Які операції можна виконувати над вказівниками.


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

Тема: Використання адресної арифметики для роботи з вказівниками

Мета роботи: Навчитись визначати адреси елементів масиву з використанням адресної арифметики.

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

1 Вказівники і типи змінних. Змінні різних типів займають різний об’єм пам’яті. Адреси змінної являє собою адресу першого молодшого байта.

Наприклад,

char  =12252;

short =90;

float t=1200.

Опис і задання вказівників на ці змінні

char  *p_vchar;

short *p_vshor;

float *p_vfloat;

p_vchar=&vchar;

p_vshor=&vshor;   /* додаткові оператори */

p_vfloat=&vfloat;

Кожний вказівник рівний адресі першого байта змінної, на яку він вказує. Тому p_vshor=1000, p_vchar=1003, а p_vfloat=1 006.

2 Вказівник на массив. Вказівники і масиви тісно пов’язані. Ім’я масиву без квадратних дужок є вказівником на перший елемент масиву. Якщо а ім’я масиву, то а – це адреса першого елементу масиву, тобто еквівалентне співвідношення.

&a[0] = = a

Ім’я масиву є постійним вказівником (адресною константою, яку не можна міняти, тому заборонена операція а++ або а--, якщо а – ім’я масиву), його не можна змінити і воно (ім’я) є фіксованим протягом виконання програми.

3 Адресна арифметика. Адресу першого елементу масиву легко одержати по його вказівнику, тобто його імені. Щоб звернутися до будь-якого елементу масиву, вказівник має одержати приріст, кратний розміру елементів масиву. Для звертання до елементів масиву з допомогою вказівників використовується адресна арифметика. Адресна арифметика проста в використанні і з її допомогою легко працювати з вказівниками. Тут використовується дві унарні операції: інкременту і декременту.

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

Приклад.

Якщо ptr_short є вказівником на  елемент масиву типу short , то оператор  

ptr_short ++;

збільшує значення ptr_short на довжину типу short (2 байти) і вказівник буде вказувати на наступний елемент масиву.

Декрементування вказівників. Все що було сказано по відношенню до операції інкрементування вказівників відноситься і до операції декрементування вказівників, тільки в цьому випадку величина вказівника зменшується.

2 Індивідуальні завдання

№ вар.

Завдання

  1.  
  •  Описати і задати 2 масиви типу short і int розмірністю 10. Вивести на екран адреси всіх елементів обох масивів з використанням адресної арифметики і без її використання.
  1.  
  •  Описати і задати 2 масиви типу int і float розмірністю 7. Вивести на екран значення всіх елементів обох масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати і задати 2 масиви типу float i char розмірністю 5.. Вивести на екран адреси всіх елементів обох масивів з використанням адресної арифметики і без її використання.
  1.  
  •  Описати і задати 3 масиви типу char, int і float розмірністю 4. Вивести значення елементів масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати 3 масиви типу char, short і int розмірністю 8. Вивести на екран адреси всіх елементів трьох масивів з використанням адресної арифметики і без її використання.
  1.  
  •  Описати і задати 2 масиви типу int і float розмірністю 7. Вивести на екран значення всіх елементів обох масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати 3 масиви типу char, short і int розмірністю 8. Вивести на екран адреси всіх елементів трьох масивів.
  1.  
  •  Описати і задати 3 масиви типу char, int і float розмірністю 4. Вивести екран значення всіх елементів обох масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати 3 масиви типу char, short і float розмірністю 6. Вивести на екран адреси всіх елементів 3-х масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати і задати 3 масиви типу int, char і float розмірністю 7. Вивести на екран значення всіх елементів трьох масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати і задати 3 масиви типу char, int і float розмірністю 10. Вивести на екран адреси всіх елементів трьох масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати і задати 3 масиви типу char, int і float розмірністю 9. Вивести на екран адреси всіх елементів трьох масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати і задати 2 масиви типу int і float розмірністю 7. Вивести на екран значення всіх елементів обох масивів з використанням адресної арифметики  і без її використання
  1.  
  •  Описати і задати 2 масиви типу int і float розмірністю 5. Вивести на екран адреси всіх елементів обох масивів з використанням адресної арифметики і без її використання
  1.  
  •  Описати і задати 2 масиви типу int і float розмірністю 7. Вивести на екран значення всіх елементів обох масивів з використанням адресної арифметики і без її використання

3 Методичні вказівки

  1.  Уважно прочитати умову задачі з індивідуального завдання. Визначити, що має бути отримано в результаті її розв'язку, які дані для цього потрібно ввести.
  2.  Використати знання про вказівники, операції над ними.
  3.  Для вводу й виводу даних використати бібліотеку функцій    <stdіo.h>.
  4.  Ввести текст програми. Звернути увагу на типи даних, що будуть використані в програмі.
  5.  Запустити програму на компіляцію. У випадку необхідності виправити синтаксичні помилки.
  6.  Запустити програму на виконання. У випадку необхідності виправити семантичні помилки.
  7.  Реалізувати програму для різних вхідних даних.

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

Описати 3 масиви типу char, short і float розмірністю 6. Вивести на екран адреси всіх елементів 3-х масивів з використанням адресної арифметики.

Текст програми,:

#include <stdio.h>

#define MAX 10

/* Îïèñ ³ çàäàííÿ ìàñèâó òèïó    short  */

short s_array[MAX] = { 0,1,2,3,4,5,6,7,8,9 };

/* Îïèñ ³ çàäàííÿ ìàñèâó òèïó  char */

char c_array[MAX] = { 0,1,2,3,4,5,6,7,8,9 };

/* Îïèñ ³ çàäàííÿ ìàñèâó òèïó float. */

float f_array[MAX] = { .0, .1, .2, .3, .4, .5, .6, .7, .8, .9 };

/* Опис вказівника на  float. */

float *f_ptr;

/* Опис вказівника на int і змінної типу  int */

char *c_ptr, i;

/* Опис вказівника на short */

short *s_ptr;

void main()

{    /* Задання вказівників. */

    c_ptr = c_array;

   s_ptr = s_array;

   f_ptr = f_array;

   /* Вивід адресів елементів масиву p dbrjhb */

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

      { printf("%ld\t", c_ptr++);

        printf("%ld\t", s_ptr++);

        printf("%ld\n", f_ptr++);   }}

Результат роботи програми

4202524  4202504  4202536

4202525  4202506  4202540

4202526  4202508  4202544

4202527  4202510  4202548

4202528  4202512  4202552

4202529  4202514  4202556

4202530  4202516  4202560

4202531  4202518  4202564

4202532  4202520  4202568

4202533  4202522   4202572

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

  1.  Який знак операції використовується для одержання адресу змінної?
  2.  Який знак операції використовується для одержання значення по адресі?
  3.  Що таке посилання по вказівнику?
  4.  Що таке вказівник?
  5.  Які операції можна виконувати над вказівниками.
  6.  Операція зміщення над вказівниками?
  7.  Що таке адресна арифметика?
  8.  Що означає інкрементування вказівників?
  9.  Який зв’язок між елементами масиву і вказівниками.
  10.  Чи можна вказівники описувати разом зі змінними?


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

Тема роботи: Передача масивів у функції

Мета роботи: Навчитись передавати масиви в функції за допомогою вказівників в С-програмах

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

Функції і структурне програмування. Використання функцій сприяє структурному програмуванню. При цьому окремі задачі програми виконуються незалежно. Переваги:

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

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

Функції – це ключ до програмування на С, це ідеологія побудови програм на С. Є функції стандартні (бібліотечні), які входять в комплект поставки компілятора. Ми розглянемо нестандартні функції, які пише сам програміст.

Означення функції. Функцією називається незалежний фрагмент програми, який має ер’я, призначена для виконання конкретної задачі, і повертає значення в ередавань програму (що не обов’язково). Розглянемо складові частини означення функції:

  1.  ер’я. Кожна функція має своє унікальне ер’я, використовуючи яке в іншій частині програми, можна виконати оператори, які містяться в цій функції. Це називається викликом функції. Функцію можна викликати з іншої функції.
  2.  Незалежність. Функція може виконати свою задачу, не вмішуючись в інші функції, і в свою чергу не вмішуватися в їх роботу.
  3.  Спеціалізація. Це зокрема закінчена частина загальної роботи програми, наприклад вивід на екран, добування кубічного кореня.
  4.  Повернення значення. Коли програма викликає функцію, виконуються оператори цієї функції, при необхідності функція може передати певну інформацію назад у ередавань програму.

Опис функції. Функції при використанні потрібно описувати. Опис функції називають прототипом функції. Синтаксис опису: (прототип функції)

Тип функції (значення, яке повертає функція) ер’я функції(тип арг1. імя-арг. 1, тип арг2. імя-арг.2, тип арг3. імя арг.3);

Оператор опису функції повідомляє компілятору функцію, яка буде визначена в програмі пізніше. Опис включає тип значення, яке повертає функція, ер’я функції і типи аргументів, які передаються в функцію. Оператор опису закінчується ;

Приклад float cube(float x);

Для того, щоб до функції можна було звернутися, у тому ж файлі повинно бути опис функції (прототип).

Double line(double x1,double y1,double x2,double y2);

double square(double a, double b, double c);

Це прототипи функцій, описаних вище.

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

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

В описі функції імена аргументів необов’язкові, але в заголовку вони є .

Далі пишемо заголовок функції. Заголовок функції складається з 3-х частин:

  1.  Тип ередаваньго значення, який визначає тип даних, які повертаються з функції в ередавань програму. Типи можуть бути будь-які, які розглядаються в мові. Можна описати функцію, яка не повертає ніякого значення, задавши пустий тип void

void func(   )   /*нічого не повертає*/

  1.  ер’я функції; Це звичайний ідентифікатор, воно має бути унікальне, тобто не співпадати ні з одним іменем змінної чи функції. Бажано давати ер’я таке, щоб воно відповідало виконуваній задачі.
  2.  список параметрів, – це величини, які передаються у функцію. Елементи списку розділяються комами. Для кожного параметра вказується тип й ім’я.

Після заголовку йде тіло функції, яке містить виконувані оператори. Тіло повинно починатися з відкриваючої фігурної душки і закінчуватися закриваючою фігурною душкою. Якщо тип ередаваньго значення – не void, то в тілі повинен бути хоч би один оператор return для повернення значення відповідного типу.

Приклад опису

float cube(float x);

Приклад визначення

float cube(float x)

{ float x_cube;

x_cube=x*x*x;

return x_cube}

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

Параметри функції.В багатьох функцій є аргументи-значення, які передаються в функцію при її виклику. Функції має бути відомий тип даних кожного аргументу. Інформація про типи приводиться в заголовку функції в виді списку параметрів. Для кожного аргументу список параметрів має відповідний пункт, який складається з типу даних і імені параметру. Якщо параметрів декілька, то вони відділяються комами.

Приклад заголовка функції Void. Func(int x, float y, char z). Список параметрів складається з описів int x, float y, char z , які декларують, що функція приймає 3 аргументи відповідних типів, представлені параметрами x, y, z.

Якщо функція не приймає аргументів, то список параметрів складається з одного слова Void, наприклад

int func(Void)

В кінці заголовка функції не ставиться ; , інакше буде помилка.

Передача масивів в функції. Єдиний спосіб передати в функцію масив це вказівники. Аргумент це ередавань в функцію значення. Воно може мати будь-який тип, але повинно бути одиночним значенням. Це може бути окремий елемент масиву, але не весь масив. Треба скористатися вказівником на масив, який являє собою одиничне числове значення – адрес першого елемента масиву. Якщо передати його в функцію, то функція буде знати адресу масиву і може звернутися до нього  з допомогою операції ссилки (посилання) по вказівнику.

Якщо функція може приймати аргумент масив, то хотілось би, щоб вона працювала з масивом різної довжини. Звідки функція повинна знати цю довжину.  Так як значення відповідного аргументу – це лише вказівник на перший елемент масиву, який може бути першим з 10, або першим з 1000-чі. Є два способи повідомити функцію розмір масиву.

  1.  Можна помістити останній елемент масиву, помістивши в нього останнє значення. При обробці масиву функція перевірить всі елементи, і як тільки виявить спеціальне значення, буде знати, що масив закінчився. Недолік той, що треба резервувати певне значення тільки для перевірки кінця масиву.

Передача довжини масиву в явному виді. Це може бути просто аргумент типу int. Таким чином функція одержує мінімум два аргументи: вказівник на перший елемент масиву  і ціле число, яке визначає кількість елементів в масиві.

2 Варіанти індивідуальних завдань:

  1.  Написати функцію, яка визначає кількість від’ємних елементів масиву цілих чисел. Параметрами функції є масив і його розмірність. Використовуючи написану функцію, обчислити і вивести на екран кількість від’ємних елементів масиву цілих чисел розмірністю 9. Елементи масиву задати при його описі.
  2.  Написати функцію, яка знаходить суму додатних чисел масиву. Параметрами функції є масив і його розмірність. Використовуючи написану функцію, обчислити і вивести на екран суму додатних чисел масиву дійсних  чисел (розмірність - 12 елементів). Елементи масиву задати при його описі.
  3.  Написати функцію, яка визначає кількість невід’ємних елементів масиву дійсних чисел. Параметрами функції є масив і його розмірність. Використовуючи написану функцію, обчислити і вивести на екран кількість від’ємних елементів масиву дійсних чисел розмірністю 19. Елементи масиву ввести з клавіатури.
  4.  Написати функцію, яка визначає кількість додатних елементів масиву цілих чисел. Параметрами функції є масив і його розмірність. Використовуючи написану функцію, обчислити і вивести на екран кількість додатних елементів масиву цілих чисел розмірністю 13. Елементи масиву ввести з клавіатури.
  5.  Написати функцію, яка визначає суму додатних елементів масиву цілих чисел. Параметрами функції є масив і його розмірність. Використовуючи написану функцію, обчислити і вивести на екран суму додатних елементів масиву цілих чисел розмірністю 10. Елементи масиву задати з клавіатури.
  6.  Написати функцію, яка визначає кількість елементів масиву цілих чисел, більших від заданого числа. Використовуючи написану функцію, обчислити і вивести на екран кількість елементів масиву цілих чисел розмірністю 13, які більші від 24. Елементи масиву ввести з клавіатури
  7.  Написати функцію, яка знаходить номер першого елементу масиву цілих чисел, більшого від заданого числа. Використовуючи написану функцію, обчислити і вивести на екран номер першого елементу масиву цілих чисел, більшого від 100. Масив розмірністю 12 задати при описі.
  8.  Написати функцію, яка знаходить різницю першого і останнього елементів масиву дійсних чисел. Використовуючи написану функцію, обчислити і вивести на екран різницю першого і останнього елементів масиву дійсних чисел . Масив розмірністю 10 задати при описі.
  9.  Написати функцію, яка знаходить суму другого і передостаннього елементів масиву цілих чисел. Використовуючи написану функцію, обчислити і вивести на екран суму другого і передостаннього елементів масиву цілих чисел. Масив розмірністю 8 задати при описі.
  10.  Написати функцію, яка знаходить номер останнього елементу масиву дійсних чисел, більшого від заданого числа. Використовуючи написану функцію, обчислити і вивести на екран номер останньго елементу масиву дійсних чисел, більшого від 10. Масив розмірністю 12 задати при описі.

Написати функцію, яка обчислює добуток елементів масиву дійсних чисел. Використовуючи написану функцію, обчислити і вивести на екран добуток елементів масиву дійсних чисел розмірністю 3. Елементи масиву ввести з клавіатури.

  1.  Написати функцію, яка обчислює суму елементів масиву цілих чисел, більших від заданого числа. Використовуючи написану функцію, обчислити і вивести на екран суму елементів масиву цілих чисел розмірністю 13, які більші від 24.
  2.  Написати функцію, яка знаходить номер першого елементу масиву дійсних чисел, більшого від заданого числа. Використовуючи написану функцію, обчислити і вивести на екран номер першого елементу масиву дійсних чисел, який біл ьший від 10 і від 19. Масив розмірністю 13 задати при описі.
  3.  Написати функцію, яка знаходить номер першого елементу масиву цілих чисел, меншого від заданого числа. Використовуючи написану функцію, обчислити і вивести на екран номер першого елементу масиву цілих чисел, який менший від 2 або від 9. Масив розмірністю 12 задати при описі.

3 Методичні вказівки

1. Перед написанням програми ще раз переглянути теоретичний матеріал і приклади програм, що ілюструють особливості застосування функцій у С-програмах. Окрему увагу звернути на способи передавання масивів у функції.

  1.  Уважно прочитати умову задачі індивідуального завдання, продумати алгоритм її розв'язку. .
  2.  Обов'язковою для оформлення програми є функція, вказана в  індивідуальному завданні. В програмі можна використати й інші функції, якщо це сприятиме кращій структуризації програми.
  3.  Написати головну частину програми (головну функцію main() ), використовуючи в ній звертання до функцій відповідно до запропонованої структури програми. Визначити: які дані, в якому порядку і яким способом передаються у кожну функцію і як функція повертає у головну програму результати виконання.
  4.  Написати відповідну функцію (чи декілька функцій), звертаючи увагу на типи опису  параметрів і способи передачі масивів.
  5.  Відкомпілювати програму і виконати її. Зафіксувати результати кожної реалізації.
  6.  Оформити звіт з лабораторної роботи, дотримуючись вимог щодо його змісту.

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

Написати функцію, для пошуку максимального елемента в зазначеному рядку двовимірного масиву. З її допомогою знайти максимальні елементи кожного рядка двовимірного масиву розмірністю 45, який задати за допомогою функції вводу з клавіатури scanf(). Максимальні значення вивести на екран.

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

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

int f(int a[5][9],int x,int y,int r)

/*int f(int a[][],int x,int y,int r) */

{int i,m;

m=a[r][0];

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

if(a[r][i]>m) m=a[r][i];

return m; }

int b[5][9],i,j,k,max[5];

void main() { clrscr();

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

for(j=0;j<9;j++) {

printf("b[%d][%d]\n",i,j); scanf("%d",&b[i][j]); }

for(i=0;i<5;i++) {

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

printf("%d\t",b[i][j]);

printf("\n");     }

for(i=0;i<5;i++) {max[i]=f(b,5,9,i);

printf("max[%d]=%d\n",i,max[i]);}

}

Результати:

4 5 6 7 5 3 8 9 7

6 5 4 5 6 7 8 5 4

6 7 5 6 7 6 4 6 5

43 6 6 7 78 8 4 6 7

7 7 5 5 4 4 4 6 7

max[0]=9

max[1]=8

max[2]=7

max[3]=78

max[4]=7

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

  1.  Що називається функцією і чим вона характеризується?
  2.  Чи потрібно описувати функцію?
  3.  Що таке формальні і фактичні параметри?
  4.  Скільки операторів return може бути в функції?
  5.  Складові частини функції?.
  6.  Як передаються масиви у функцію?


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

Тема. Обчислення значень математичних функцій

Мета роботи: Навчитись писати програми на мові С для обчислення значень математичних функцій, які знаходяться в бібліотечному файлі math.h.

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

Бібліотека математичних функцій. Велика частина можливостей мови С міститься в стандартних бібліотечних функціях. Розглядаються наступні класи функцій.

  •  Математичні функції.
  •  Функції роботи з часом і датами.
  •  Функції обробки похибок.
  •  Функції пошуку і сортування даних.

Математичні функції. Велика частина можливостей мови С міститься в стандартних бібліотечних функціях. Розглядаються наступні класи функцій.

  1.  Математичні функції.
  2.  Функції роботи з часом і датами.
  3.  Функції обробки похибок.
  4.  Функції пошуку і сортування даних.

Прототипи математичних функцій знаходяться в бібліотечному файлі math.h. Всі вони повертають значення типу double. (дійсні числа з подвійною точністю). Аргументи тригонометричних функцій задаються в радіанах, а не в градусах.

1 рад. = 57.296

  1.  = 2рі рад.

Прототипи математичних функцій наведено в табл. 1.

Таблиця.1 Прототипи математичних функцій

№ п/п

Функція

Прототип

Значення

2. Тригонометричні функції

1

arccosx

double acos(double x)

Повертає арккосинус x. Аргумент знаходиться в межах , значення функції - в інтервалі .

2

arcsinx

double asin(double x)

Повертає арксинус x. Аргумент знаходиться в межах , значення функції - в інтервалі .

3

arctgx

double atan(double x)

Повертає арктангенс x. Аргумент знаходиться в межах , значення функції - в інтервалі .

4

arctg2x

double atan2(double x, double y)

Повертає арктангенс . Аргумент знаходиться в межах , значення в інтервалі .

5

cosx

double cos(double x)

Повертає косинус x. Значення функції знаходиться в інтервалі

6

sinx

double sin(double x)

Повертає синус x. Значення функції знаходиться в інтервалі

7

tgx

double tan(double x)

Повертає тангенс x. Значення функції знаходиться в інтервалі .

3. Степеневі і логарифмічні функції

8

exp()

double exp(double x)

Повертає експоненту  аргументу

9

log()

double log(double x)

Повертає натуральний логарифм  аргументу , який має бути додатним

10

log10()

double log10(double x)

Повертає логарифм по основі 10 аргументу, який має бути додатним

11

ldexp()

double ldexp(double x, int y)

Повертає

4. Інші математичні функції

12

double sqrt(double x)

Повертає квадратний корінь аргументу x, який має бути додатнім

13

ceil()

double ceil(double x)

Повертає найменше ціле число, яке перевищує аргумент, 4.5=5, а –4.5=-4

14

int abs(int x)

Повертає абсолютне значення аргументу цілого типу

15

long int labs(long int x)

Повертає абсолютне значення аргументу довгого цілого

16

floor()

double floor(double x)

Повертає найбільше ціле число, яке не перевищує аргумент, -4.5=-5, а 4.5=4

17

double pow(double x, double y)

Повертає . Якщо , і у0 або  і у не ціле, то помилка

18

fmod()

double atan2(double x, double y)

Повертає дійсну остачу від ділення , з тим знаком , що в , якщо х=0, функція повертає 0

2 Постановка завдання.

Протабулювати функцію, задану у варіанті на проміжку  з кроком  (b-a)/k, де (k=10). Результати обчислень вивести на екран у вигляді таблиці пар чисел  і . Виконати завдання пошуку і обробки даних відповідно до варіанту. Якщо дані не існують, вивести про це повідомлення.

3 Варіанти індивідуальних завдань

№вар.

Функція

Проміжок

Пошук і обробка даних

  1.  

Обчислити суму першого і останнього значення функції. Визначити кількість всіх значень функції.

  1.  

Обчислити суму всіх значень функції, для яких виконується нерівність  

  1.  

Обчислити добуток всіх значень функції, для яких виконується нерівність

  1.  

Обчислити суму першого і останнього значення функції. Визначити кількість всіх значень функції.

  1.  

Обчислити середнє арифметичне всіх від’ємних значень функції

  1.  

Обчислити середнє арифметичне всіх додатних значень функції

  1.  

Обчислити добуток значень аргументу , для яких досягається мінімальне та максимальне значення функції.

  1.  

Визначити суму додатних значень функції.

  1.  

Обчислити суму значень аргументу , для яких досягається мінімальне та максимальне значення функції.

  1.  

Визначити кількість від’ємних значень функції.

  1.  

Обчислити модуль першого і останнього значення функції.

  1.  

Обчислити суму мінімального та максимального значення функції.

  1.  

Обчислити добуток мінімального та максимального значення функції.

4 Методичні вказівки

1. Перед написанням програми ще раз переглянути теоретичний матеріал і приклади програм, що ілюструють особливості використання математичних функцій у С-програмах. Окрему увагу звернути на область визначення функцій.

  1.  Написати відповідну функцію (чи декілька функцій), звертаючи увагу на типи опису  параметрів.
  2.  Підключити бібліотеку математичних функцій.
  3.  Відкомпілювати програму і виконати її. Зафіксувати результати кожної реалізації.
  4.  Оформити звіт з лабораторної роботи, дотримуючись вимог щодо його змісту.

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

Протабулювати функцію  на проміжку  з кроком  (b-a)/k, де (a=-1, b=1, k=10). Результати обчислень вивести на екран у вигляді таблиці пар чисел  і . Визначити кількість від’ємних значень функції. Якщо дані не існують, вивести про це повідомлення.

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

include <stdio.h>

#include <math.h>

double x, y, a, b, h, z;

int i, k=10, kil=0;

void main()

{

printf ("Programa Lab_5\n");

a=-1;

b=1;

k=10;

h=(b-a)/k;

for (x=a; x<=b; x=x+h)  

{z=2*sin((x-7)/2.);

if (z<0)

printf("x=%lf\targument <0\n", x);

else

{

y=-log( 2*sin((x-7)/2));

if( y<0) kil=kil+1;

printf("x=%lf\ty=%lf\n", x,y);

}

}

printf("kil=%d\n", kil);

printf ("\n");

}

Результати роботи програми

Programa Lab_5

x=-1.000000     y=-0.414494

x=-0.800000     y=-0.318841

x=-0.600000     y=-0.201892

x=-0.400000     y=-0.057960

x=-0.200000     y=0.122121

x=-0.000000     y=0.354440

x=0.200000      y=0.671225

x=0.400000      y=1.153624

x=0.600000      y=2.147735

x=0.800000      argument <0

x=1.000000      argument <0

kil=4

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

  1.  Що таке формальні і фактичні параметри?
  2.  Скільки операторів return може бути в функції?
  3.  Складові частини функції?.
  4.  Напишіть на мові С логарифмічні і степеневі функції?
  5.  Яку бібліотеку необхідно підключити при використанні математичних функцій?
  6.  Як записується функція ?.
  7.  Як записується функція ?.


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

Тема: Ввід-вивід символьної інформації та її обробка

Мета роботи: Навчитись описувати, задавати і обробляти символьну інформацію засобами мови C, а також працювати з символьними даними і текстовою інформацією.

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

1. Поняття символу. Під символом ми розуміємо букву, цифру та інші знаки. Рядок - це послідовність символів. В рядках зберігається текстова інформація.

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

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

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

Сукупність кодів окремих символів утворює код ASCII (American Standard Code for Information interchange - американський стандартний код обміну інформацією). В цьому наборі буквам верхнього і нижнього регістрів, цифрам та іншим символам ставиться у відповідність число від 0 до 255.

Наприклад маленька латинська буква a представлена числом 97. Поміщуючи символ a в змінну типу char, ми фактично поміщаємо  число 97. Оскільки діапазон допустимих значень змінної даного типу від 0 до 255, то цей тип найбільше підходить до зберігання символів. Оскільки змінна типу char зберігає як цілі числа так і символи, то їх розрізняють по контексту.

  •  кщо змінна типу char використовується в програмі, де очікується символьна інформація, то її значення інтерпретується як символ.
  •  Якщо змінна типу char використовується в програмі, де очікується числова інформація, то її значення інтерпретується як число.

2. Опис символів. Змінні символьного типу повинні бути описані до їх використання. Вони описуються за допомогою службового слова char. Синтаксис опису:

char a, b, c;

При описі змінні символьного типу можна задавати. Змінні символьного типу задаються в одиничних лапках.

char d=’x’;  /* при описі */

d=’x’;         /* оператор присвоєння */

Можна створювати іменовані символічні константи

const char a=’z’;

Для задання констант також використовуються одиничні лапки.

Приклад програми для виводу змінної c1 в виді числа і в виді символу

printf(«%с», с1);   /* вивід змінної с1 як символу  */

printf(«%d», с1);   /* вивід змінної с1 як числа  */

3. Масиви символів. Рядки, які є послідовністю символів, задаються масивами символів. Синтаксис опису масиву символів::

char string[10];

В цьому масиві можна зберігати дев’ять  символів можна зберігати і менше символів. Чому в масиві, який містить 10 елементів, можна зберігати 9 символів.? В мові С рядки визначаються як послідовність символів, що закінчується нульовим символом. Нульовий символ - це спеціальний символ, який позначається \0. Хоч він записується в виді двох знаків (оберненої риски і 0) компілятор сприймає його як один символ, що відповідає коду ASCII ‘0’. Це є спеціальний символ мови С. В чому ж різниця між рядками і масивами символів? По означенню рядок –це послідовність символів з завершуючим символом \0  Масив по означенню являє собою послідовність символів. Тому рядок –це масив символів з завершуючим нульовим символом.

Наприклад в рядку

fghhjkg є 7 символів і ще нульовий символ \0  всього вісім.

4. Задання символьних масивів. Масиви можуть задаватися  при описі.

сhar r[10]={‘a’,’b’,’c’,’d’, ‘\0’}; але вигідніше використовувати рядкові літерали, тобто послідовності символів в подвійних лапках.

char r[10]=’’abcd’’;

Кожний раз, коли в програмі використовується рядковий літерал, компілятор автоматично додає нульовий символ в кінець рядка. Якщо при описі і заданні масиву символів опустити його довжину, то компілятор сам порахує довжину масиву по довжині літералу

char r[]=’’abcd’’; Цей рядок – це+ масив з 5-ти елементів.

5. Вивід символів за допомогою функції putchar(). Функція призначена для виводу символів на екран. Прототип функції знаходиться в бібліотечному файлі stdio.h і має вид

int putchar(int c);

Вона записує символ с в потік  stdout. Хоч в прототипі аргумент має цілий тип, в функцію треба посипати аргумент символьного типу. Можна передавати і значення цілого типу, якщо воно не виходить за діапазон 0-255. Функція повертає записаний символ або EOF у випадку помилки.

6. Функція puts(). Бібліотечна функція виводить рядок тексту на екран. Єдиним її аргументом є вказівник на рядок, який треба вивести. Оскільки літеральні рядки інтерпретуються компілятором як вказівники на рядки, функція puts() може виводити як змінні рядкового типу  char r[10]={‘a’,’b’,’c’,’d’, ‘\0’};, так і літерали char r[10]=’’abcd’’; Синтаксис 

int puts(char *r). Аргументом є вказівник на перший символ рядка. Вона виводить весь рядок, крім завершуючого символу, додаючи в кінці символ кінця рядка. Функція повертає додатне значення при успішному виводі, або EOF в випадку помилки EOF – це це символічна константа, яка визначена в файлі stdio.h і рівна  -1.

Після кожного виведеного рядка функція переходить на новий 

7. Функція printf() для виводу символьної інформації. Рядки можна виводити за допомогою функції printf(). Для виводу рядка використовується специфікація формату %s. Аргументом є вказівника на рядок типу char. Рядок виводиться на екран, до тих пір поки не зустрінеться завершуючий нульовий символ. Наприклад

char *str=fghjkl;

printf(%s, str);

Рядки можна виводити разом з числовими змінними.

char *str=begin;

char *name=end;

int var=100;

printf(%s var=%d %s, str, var, name);

Результат

begin  var=100 end

8. Ввід символів за допомогою функції getchar(). Функція getchar() одержує символ з потоку stdin, буферизує ввід і дублює символ на екрані.

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

int  getchar(void)   void - порожній символ

Функція ch= getchar() чекає одержання символу з потоку stdin, символ в потоці появляється після натискання ENTER . Після натискання клавіші всі введені символи попадають в потік. За кожний виклик функція бере з потоку один символ, присвоюючи його по черзі ch.

Функція getсh(), одержує символ з потоку stdin, ,без буферизації і дублювання символ на екрані. Вона не визначена в стандарті ANSI, її нема в багатьох компіляторах, вона міститься в файлі  conio.h і прототип має вигляд  

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

Функція скидає символ кінця рядка, додає нульовий завершаючий символ і передає одержаний рядок в викликаючу програму. Рядок поміщається по адресі, яку передано в функцію gets(). через аргумент вказівник на char.

Для виконання функції gets(). Необхідно включити в програму файл stdio.h з допомогою директиви include. Прототип

сhar *gets(char *str)   Функція має аргументом вказівник на рядок і повертає вказівник того ж типу. Функція зчитує символи з потоку до тих пір, поки не зустріне кінець рядка (\n) або кінець файлу. У випадку помилки функція повертає NULL. Перед викликом функції треба виділити достатньо пам’яті для зберігання рядків.

2 Варіанти індивідуальних завдань

  1.  Вивести на екран символи, які відповідають кодам від 65 до 78.
  2.  З клавіатури ввести символьний рядок. Вилучити з нього всі символи, які рівні K. Надрукувати результуючий рядок. Знайти довжину рядка за допомогою функції strlen(). Результат вивести на екран.
  3.  Ввести символьний рядок за допомогою оператора присвоєння, в якому крім букв повинні бути і цифри. Вилучити з цього рядка всі цифри, рівні 4. Надрукувати результуючий  рядок Знайти довжину рядка за допомогою функції strlen(). Результат вивести на екран
  4.  Задати символьний рядок “qwertyuikjhgfdsaqwerty” за допомогою оператора присвоєння. Поміняти в ньому всі малі літери  “g” на великі “О”. За допомогою функції strcpy() скопіювати заданий рядок в рядок s2. Рядок s2 вивести на екран.
  5.  Вивести на екран символи і їх код ASCII . Задані символи  A, B, H, C, D.
  6.  З клавіатури ввести символьний рядок. Надрукувати рядок, з якого вилучені символи  *.Знайти довжину заданого рядка asddfghjk  за допомогою однієї з функцій роботи з рядками. . Скопіювати 4 символів цього рядка в новий рядок. Кількість символів заданого рядка і новий рядок  вивести на екран.
  7.  Задати символьний рядок “qwertyuikjhgfdsaqwerty” за допомогою операторів присвоєння. Порахувати в ньому кількість літер  “u” . Результат вивести на екран  Скопіювати 10 символів цього рядка в новий рядок. Результат вивести на екран.
  8.  З клавіатури ввести 2 рядки. Вивести на екран номер першого входження літери “t” 1-го рядка.. Порівняти перші 5 символів двох заданих рядків. за допомогою функції strncmp().  Результат порівняння вивести на екран.
  9.  Задати символьний рядок “qwertyuikjhgfdsaqwerty” за допомогою оператора присвоєння. Поміняти в ньому всі малі літери  “g” на великі “R” За допомогою функції strncpy() скопіювати 5 символів заданого рядка  asdfghjkk в рядок а1. Рядок а1 вивести на екран.
  10.  3 клавіатури ввести символьний рядок, який містить символи k. Замінити символи k  на 5.. Надрукувати результатуючий рядок Порівняти перші 5 символів заданого і одержаного рядків. за допомогою функції strncmp().  Результат порівняння вивести на екран
  11.  З клавіатури ввести рядок ss1, кількість символів якого рівна 14. Утворити з нього новий рядок з інверсним (зворотнім) порядком символів. Надрукувати сформований інверсний рядок. За допомогою функції strcpy() скопіювати заданий рядок ss1 в рядок ss2. Рядки ss1 і  ss2 вивести на екран
  12.  . Задати символьний рядок “qwertyuikjhgfdsaqwerty” при описі. Порахувати в ньому кількість літер  “f”. Результат вивести на екран Знайти довжину рядка за допомогою функції strlen(). Результат вивести на екран
  13.  3 клавіатури ввести рядок, кількість символів якого рівна 13. Поміняти місцями два перші символи. Надрукувати результатуючий рядок За допомогою функції strcpy() скопіювати заданий рядок asdfghjkk в рядок ss1. Рядок ss1 вивести на екран.
  14.  З клавіатури ввести 2 рядки. Вивести на екран номер першого входження літери “t” 1-го рядка.. Порівняти перші 5 символів двох заданих рядків. за допомогою функції strncmp().  Результат порівняння вивести на екран.
  15.  Задати символьний рядок “qwertyuikjhgfdsaqwerty” за допомогою оператора присвоєння. Поміняти в ньому всі малі літери  “g” на великі “R” За допомогою функції strncpy() скопіювати 5 символів заданого рядка  asdfghjkk в рядок а1. Рядок а1 вивести на екран.

3 Методичні вказівки

  1.  Перед написанням програми ще раз переглянути теоретичний матеріал і приклади програм, що ілюструють особливості обробки символьної інформації у С-програмах. Окрему увагу звернути на способи задання рядків.
  2.  Для роботи з бібліотечними функціями для обробки символьної інформації підключити бібліотечний файл string.h.
  3.  Уважно прочитати умову задачі індивідуального завдання, продумати алгоритм її розв'язку, вибрати потрібну бібліотечну функцію для роботи з символьними рядками.
  4.  Відкомпілювати програму і виконати її. Зафіксувати результати кожної реалізації.
  5.  Оформити звіт з лабораторної роботи, дотримуючись вимог щодо його змісту.

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

  1.  Що називається символом?
    1.  Що таке рядок в мові С?
      1.  Чи потрібно описувати символи?
        1.  Як вивести на екран числові коди символів F, G, <, g, ?
          1.  Що називається символьною константою?
          2.  Як задаються символьні змінні?
          3.  Чи можна задавати символьні змінні при описі?
          4.  За допомогою якої функції вводяться рядки з клавіатури?
          5.  Який синтаксис функції puts()?
          6.  За допомогою якої функції виводяться рядки на екран?
          7.  За допомогою якої функції вводяться символи з клавіатури?
          8.  За допомогою якої функції виводяться символи на екран?
          9.  Що повертає функція gets()?


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

Тема: Використання бібліотечних функцій для обробки символьної інформації

Мета: Навчитись використовувати бібліотечні функції для роботи з символьними даними і текстовою інформацією.

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

Визначення довжини рядка. Довжина рядка (кількість символів в ньому) визначається функцією strlen(). Прототип функції знаходиться в файлі string.h.

size_t strlen(char *str);

Тип size_t визначений в файлі stdring.h як unsigned. (ціле без знаку). Ця функція повертає ціле число без знаку. Цей тип використовується в багатьох функціях, які призначені для роботи з рядками. Аргумент, який передається в функцію це вказівник на рядок, довжину якого треба визначити. Функція повертає кількість символів. Від початку рядка до першого нульового символу.

Копіювання рядків. Один рядок не можна присвоїти іншому. Треба виконати копіювання даного рядка , який займає певну ділянку памяті в іншу ділянку, де знаходиться рядок-копія.

Є дві функції  strcpy() i strncpy(). Вони описані в файлі string.h, який необхідно підключити для їх використання.

Функція strcpy(). Копіює заданий рядок в ділоянку пам’яті. ЇЇ прототип

char *strcpy(char *destination, const char *sourse);

Функція strcpy() копіює рядок, який знаходиться по адресу sourse (разом з завершаючим символом /0) в ділянку памяті, яка починається по адресу в вказівнику destination. Функція повертає вказівник на новий рядок destination.

До виклику функції необхідно виділити память для нового рядка. Сама функція не перевіряє, чи досить памяті по вказаній їй адресі. Якщо розподілу памяті не виконалося, то функція затре strlen(sourse) байт нової інформації, починаючи з адресу , вказаному в destination.

Функція strncpy().аналогічна функції strcpy(), тільки з її допломогою копіюється задана кількість символів.

Порівняння двох рядків. Функція strcmp() призначена для посимвольного порівняння двох рядків. Вона має прототип:

Int strcmp(const chart *str1, const chart *str2);

Аргументи вказують на порівнювані рядки str1 і str2. Функція повертає від'ємне значення , якщо str1 менше  str2, — нуль, якщо str1 = str2 і додатнє значення, якщо  str1 більше. str2.

Порівняння фрагментів двох рядків. Функція strncmp() призначена для посимвольного порівняння фрагментів двох рядків довжиною n. Прототип:

Int strncmp(const chart *str1, const chart *str2, size_t n);

Функція порівнює n символів рядків str1 і str2. Порівняння виконується до тих пір, поки не вичерпаються n символів, або не буде здосягнутий кінець рядка str1. Результат порівняння такий, як в попередній функції.

Функції для конкатенація (з’єднання) рядків і їх фрагментів. Конкатенація – це приєднання одного рядка до кінця іншого. Для конкатенації є функція strcat(). Прототип знаходиться в файлі string.h.

char *strcat(char *a1, сonst char *a2);

Функція поміщає копію рядка а2 в кінець рядка а1 і ставить завершуючий нульовий символ в кінець нового рядка. Попередньо необхідно виділити для рядка а1 достатньо місця. Функція повертає вказівник на рядок а1.

Функція strncat() виконує конкатенацію рядків з вказівкою кількості символів. Прототип функції: char *strncat(char *a1, Const char *a2, int n);

Якщо а2 має більше, ніж n символів, то до а1 приєднується n символів рядка а2. Якщо а2 має менше, ніж n символів, то до а1 приєднується рядок а2.

2. Варіанти індивідуальних завдань

  1.  За допомогою функції strcpy() скопіювати заданий рядок s1 з семи літер в рядок s2. Рядки s1 і  s2 вивести на екран. Приєднати заданий рядок в кінець рядка-копії, результатуючий рядок вивести на екран.
  2.  Знайти довжину трьох заданих символьних рядків за допомогою функції strlen(). Результати вивести на екран. Приєднати перший рядок в кінець другого, результатуючий рядок вивести на екран.
  3.  За допомогою функції strcpy() скопіювати заданий рядок ss1 з 10-ти літер в рядок ss2. Рядки ss1 і  ss2 вивести на екран.
  4.  За допомогою функції strcpy() скопіювати заданий рядок asdfghjkk в рядок ss1. Рядок ss1 вивести на екран. Приєднати заданий рядок в кінець рядка ss1, результатуючий рядок вивести на екран.
  5.  Порівняти перші 5 символів двох заданих рядків. за допомогою функції strncmp().  Результат порівняння вивести на екран. Приєднати перший рядок в кінець другого, результатуючий рядок вивести на екран.
  6.  За допомогою функції strncpy() скопіювати 5 символів заданого рядка  asdfghjkk в рядок а1. Рядок а1 вивести на екран. Приєднати заданий рядок в кінець рядка а1, результатуючий рядок вивести на екран.
  7.  Задати рядок з 11 символів. Скопіювати 10 символів цього рядка в новий рядок. Результат вивести на екран. Приєднати новий рядок в кінець даного рядка, результатуючий рядок вивести на екран.
  8.  Порівняти два задані рядки за допомогою функції strcmp().  Результат  вивести на екран. Приєднати другий рядок в кінець першого, результатуючий рядок вивести на екран.
  9.  Задати рядок символів. Знайти  і вивести на екран його довжину. Скопіювати 5 символів цього рядка в новий рядок. Кількість символів заданого рядка і новий рядок  вивести на екран.
  10.  Знайти довжину заданого рядка asddfghjk  за допомогою однієї з функцій роботи з рядками. Скопіювати 4 символів цього рядка в новий рядок. Кількість символів заданого рядка і новий рядок  вивести на екран.
  11.  Порівняти перші 5 символів двох заданих рядків. за допомогою функції strncmp().  Результат порівняння, а також рядки вивести на екран. Приєднати перший рядок в кінець другого, результатуючий рядок вивести на екран.
  12.  Знайти довжину двох заданих символьних рядків за допомогою функції strlen(). Результати вивести на екран. Приєднати другий рядок в кінець першого, результатуючий рядок вивести на екран.
  13.  Знайти довжину трьох заданих символьних рядків за допомогою функції strlen(). Результати вивести на екран. Приєднати третій рядок в кінець першого, результатуючий рядок вивести на екран.

3 Методичні вказівки

  1.  Перед написанням програми ще раз переглянути теоретичний матеріал і приклади програм, що ілюструють особливості обробки символьної інформації. Окрему увагу звернути на способи задання рядків.
  2.  Для роботи з бібліотечними функціями для обробки символьної інформації підключити бібліотечний файл string.h.
  3.  Уважно прочитати умову задачі індивідуального завдання, продумати алгоритм її розв'язку, вибрати потрібну бібліотечну функцію для роботи з символьними рядками.
  4.  Відкомпілювати програму і виконати її. Зафіксувати результати кожної реалізації.

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

Знайти довжину трьох заданих символьних рядків за допомогою функції strlen(). Результати вивести на екран. Приєднати другий рядок в кінець першого, а третій - в кінець другого, результатуючі рядки вивести на екран.

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

# include <string.h>

# include <stdio.h>

char a1[]=”qwerett”;

char a2[20]=”qyuwerp[ett”;

char a3[255]=”qwerett”;

int l1,l2,l3;

void main()

{/*  Знаходження  довжин рядків */

l1=strlen(a1);

l2=strlen(a2);

l3=strlen(a3);

/*  Вивід довжин рядків */

printf(“l1=%d\t l2=%d\t l3=%d\n”);

strcat(a1,a2);

strcat(a2,a3);

puts(a1);

puts(a2); }

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

  1.  Що таке довжина рядка і як її можна визначити?
    1.  Що таке рядок в мові С?
      1.  Що необхідно зробити перед  копіюванням рядка?
        1.  В чому різниця між функціями strcmp() і strcnmp()?
        2.  , В чому різниця між функціями strcpy() i strncpy()?.
        3.  За допомогою якої функції порівнюють рядки?


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

Тема: Складання програм на використання структур даних

Мета роботи: Вивчити способи опису і ініціалізації структур та здобути практичні навики роботи з ними.

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

Структури це складні конструкції даних на мові С. Структура являє собою нестандартний об’єкт для зберігання різних даних.

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

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

Struct coord

{   int x;

    iny y;   }

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

  1.  Список імен змінних ставиться після визначення структури

Struct coord

{       int x;

        iny y;    } x1, y1;

В цьому операторі визначається структурний тип coord і описуються дві структури цього типу x1, y1. Ці дві структури є екземплярами типу coord  - кожна з них містьть дві цілочисельні змінні x і y. При такому способі визначення структурного типу суміщається з описом його екземплярів.

  1.  Опис екземплярів поміщається окремо від визначення типу. Приклад

Struct coord

{         int x;

          iny y;     }

оператори;

Struct coord x1, y1;

Звернення до полів структури. Окремі елементи структури можуть використовуватися  як прості змінні. Щоб одержати їх значення з структури, використовується знак операції звернення до елементів структури. (.). , який являє собою крапку між іменем структури і іменем елемента поля. Щоб структура x1 містила координати x=50 і y=100, треба записати.

x1.x=50;   x1.y=100;

Вивід елементів структури  y1:

printf(%d, %d, y1.x, y1.y);

Перевага структур та, що копіювати інформацію з одної структури в іншу можна простим присвоюванням.

х1=y1; Цей оператор еквівалентний двом операторам

x1.x=y1.x;     x1.y=y1.y;

Якщо в програмі використовуються складні структури з великою кількістю елементів, то такий запис може зекономити час.  Приклад

#include <stdio.h>

#include <stdlib.h>

int length, width;

long area;

struct coord{

   int x;   /*   Тіло структури*/

   int y;

} k /*описаний екземпляр структури coord - змінна k типу структури  */;

void main(){

  k.x = 12;

  k.y = 15;

   printf("\Координати точки : (%d, %d).",

          k.x, k.y); }

/* Результат Координати точки : (12, 14).  */

Це можна було записати

struct coord k;

Ключове слово struct. (синтаксис).

Struct мітка  {

елементи структури;

/* Додаткові оператори */  } екземпляр;

З допомогою ключового слова struct визначаються структурні типи і описуються структури. Елементами структури є прості змінні, вказівники і інші структури.

Приклад 1./*Визначення шаблону структури під іменем s1*/

struct s1 {

int a1;

char a2;

short a3;

int a4; }

/* Використання шаблону для опису структури nst1*/

struct s1 nst1;

2 Варіанти індивідуальних завдань

  1.  Визначити структуру DATA, яка має 4 поля типу int, float, char  та int.  Описати  2 змінні структурного типу DATA. Значення 1-ї змінної задати при описі і скопіювати цю інформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.
  2.  Визначити структуру cord, яка має 3 поля типу int, float, та int.  Описати  2 змінні структурного типу cord. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.
  3.  Визначити структуру prog, яка має 5 поля типу int, float, int, та int.  Описати  3 змінні структурного типу prog. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур та в 3-тю змінну простим присвоюванням структур. Значення полів другої та третьої структури вивести на екран.
  4.  Визначити структуру Base, яка має 4 поля типу int, float, char  та int.  Описати  2 змінні структурного типу Base. Значення 1-ї змінної задати при описі і скопіювати цю інформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран після кожного присвоєння.
  5.  Визначити структуру VAR, яка має 3 поля типу int, float, та int. Описати  2 змінні структурного типу VAR. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.
  6.  Визначити структуру DATA, яка має 5 полів типу int, int, float, int, та int.  Описати  3 змінні структурного типу DATA. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур та в 3-тю змінну простим присвоюванням структур. Значення полів другої та третьої структури вивести на екран.
  7.  Визначити структуру cord, яка має 4 поля типу int, float, char  та int.  Описати  2 змінні структурного типу cord. Значення 1-ї змінної задати при описі і скопіювати цю інформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран після кожного присвоєння.
  8.  Визначити структуру prog, яка має 3 поля типу int, float, та int.  Описати  2 змінні структурного типу prog. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.
  9.  Визначити структуру Base, яка має 5 полів типу int, int, float, int, та int.  Описати  3 змінні структурного типу Base. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур та в 3-тю змінну простим присвоюванням структур. Значення полів другої та третьої структури вивести на екран.
  10.  Визначити структуру VAR, яка має 4 поля типу int, float, char  та int.  Описати  2 змінні структурного типу VAR. Значення 1-ї змінної задати при описі і скопіювати цю інформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран після кожного присвоєння.
  11.  Визначити структуру DATA, яка має 3 поля типу int, float, та int.  Описати  2 змінні структурного типу DATA. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.
  12.  Визначити структуру cord, яка має 5 полів типу int, int, float, int, та int.  Описати  3 змінні структурного типу cord. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур та в 3-тю змінну простим присвоюванням структур. Значення полів другої та третьої структури вивести на екран.
  13.  Визначити структуру prog, яка має 4 поля типу int, float, char  та int.  Описати  2 змінні структурного типу prog. Значення 1-ї змінної задати при описі і скопіювати цю іформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран після кожного присвоєння.
  14.  Визначити структуру ABC, яка має 3 поля типу int, float, та int.  Описати  2 змінні структурного типу ABC. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.

3 Методичні вказівки

  1.  Перед написанням програми ще раз переглянути теоретичний матеріал і приклади програм, що ілюструють особливості обробки змінних структурного типу у С-програмах.
  2.  Визначити структуру, задану у варіанті. Описати екземпляри змінних визначеного структурного типу.
  3.  Значення 1-ї змінної структурного типу задати при описі.
  4.  Заповнити 2-у  структуру шляхом копіювання та за допомогою присвоєння полів структур.
  5.  Значення полів другої структури вивести на екран. Кожний варіант заповнення структури вивести окремо.

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

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


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

Тема: Складання програм на використання масивів структур даних

Мета роботи: Вивчити способи опису і ініціалізації масивів структур та здобути практичні навики роботи з ними.

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

Структури, які містять масиви. Структури в ролі елементів(полів) містять масиви. В прикладі визначений структурний тип data, який містить цілочисельний масив з 4-х елементів і символьний масив з 10-ти елементів.

struct data

{ int x[4];

char y[10]; } ;

Опис змінної record  цього типу

struct data record;

На рис. 26.1. елементи мас. х займають вдвоє більше місця, ніж елементи масиву y.

                                                                      record

record.x[0]

record.x[0]

record.x[0]

record.x[0]

Record.x

rd.y[0]

rd.y[1]

rd.y[2]

rd.y[3]

rd.y[4]

rd.y[5]

rd.y[6]

rd.y[7]

Record.y[8]

rd.y[9]

Record.y

Щоб звернутися до окремого елементу масиву, який є полем структури, використовується комбінація крапки і індексу масиву.

record.x[2]=100;        Record.y[1]=’x’;

Оскільки ім’я масиву це вказівник на цей масив, тому вміст масиву y[] в структурі record можна вивести так

puts(record.y);

Масиви структур. Структури можна зберігати в масивах.. Масиви структур є потужним засобом програмування. Наприклад, структура entry

struct entry   {  Визначення структури

char fname[10];

char lname[12];

char phone[8]; }

struct entry list[100]; Опис структури з іменем list, яка є масивом з ста елементів. Кожний елемент являє собою структуру типу entry, в якій міститься три поля, причому ці поля - масиви типу char. Елемент розпізнається по індексу.

Для присвоєння даних з одного елементу масиву в другий можна записати

List[1]=list[5];

Цей оператор присвоює всім полям структури List[1] значення відповідних полів структури List[5]

Strcpy(list[1].phone, list[5].phone);

Копіює рядок list[5].phone в рядок list[1].phone.

Задання (ініціалізація) структур. Структури можна задавати при описі, після опису ставиться знак рівності і список початкових значень. У фігурних дужках. Приклад

  •  struct sale {
  •  char customer[20];
  •  char item[20];
  •  float amount;
  •  } mysale={“aaaaaaaaaaaaaa”,“ssssssssssssssss”,1000.00};

При виконанні цих операторів проходить наступне

  •  Визначається структура з міткою sale (рядки 1-5)
  •  Описується екземпляр структурного типу з іменем mysale (рядок 5)
  •  Поле структури mysale.customer задається літералом “aaaaaaaaaaaaaa” (рядок 5)
  •  Поле структури mysale.item задається літералом “ssssssssssssssss” (рядок 5)
  •  Поле структури mysale.amount задається значенням 1000ю00 (рядок 5).

Вказівники можуть бути елементами структури. Приклад

struct data

{

int *value;

int *rate;

} first;

Обидва елементи структури є вказівниками на int. Вказівники треба ще задати, тобто просвоїти їм адреси змінних, які описані int. Приклад

First.value=&a1;

First.rate=&a2; де a1 і a2 змінні цілого типу.

Тепер вказівники мають конкретне значення і до них можна звернутися з допомогою операції посилання по вказівнику (*)

Вираз

*First.value=значенню змінної a1;

*First.rate=значенню змінної a2;

Вказівники на структури описуються так як і на інші типи змінних. Вони використовуються для передачі структур в функції як аргументи. Як задаються вказівники на структури. Приклад структур:

struct data{

int a1;

char a2[5]; } ;

Визначимо вказівник p_data на змінну типу data

struct data *p_data; * вказує, що p_data є вказівником на змінну типу data, а не екземпляром цього структурного типу.

Задати вказівник ще не можна, бо тільки заданий тип, а не описана ні одна змінна цього типу. Опишемо змінну data1 структурного типу data.

struct data  data1;

Тепер можна ініціалізувати вказівник

p_data=&data1;

Цей оператор присвоює адресу структури  data1 вказівнику p_data.

Вказівник на структуру, вказує на перший байт збережуваних даних. Якщо p_data вказівник на структуру data1, то *p_data – це сама структура. До окремих полів структури можна звертатися за допомогою (.)   (*p_data).a1=100;

Вираз (*p_data) треба брати в дужки, бо операція звернення до елементів структури крапка (.) має вищий пріоритет, ніж операція посилання по вказівнику (*).

2 Постановка задачі

Написати програму, яка здійснює опрацювання масиву структур згідно заданого варіанту. Масив структур повинен містити не менше 5-ти елементів. Масив ввести з клавіатури. Програма повинна видавати підказку користувачу про те який елемент вводити.

3 Варіанти індивідуальних завдань

1. Написати програму, яка вводить масив записів про автомобілі (модель, рік випуску, ціна колір, потужність двигуна). Програма повинна знайти і вивести на екран дані про автомобілі червоного кольору, які випущені після 2002 року і коштують менше 20000 грн.

2. Написати програму, яка вводить масив записів про персональні комп’ютери (Тип процесора, об’єм ОЗП, тип і об’єм жорсткого диску, наявність окремої відеокарти). Програма повинна знайти і вивести на екран дані про комп’ютери, у яких об’єм ОЗП більший 256 МБ і є окрема відеокарта.

3. Написати програму, яка вводить масив записів про мобільні телефони (виробник, модель, об’єм пам’яті, наявність фотокамери, наявність МР3 – плеєра, ціна). Програма повинна знайти і вивести на екран дані про телефони без камери і з МР3 –плеєром.

4. Написати програму, яка вводить масив записів про цифрові фотоапарати (виробник, модель, наявність оптичного збільшення, кратність оптичного збільшення, тип інтерфейсу, об’єм пам’яті, ціна). Програма повинна знайти і вивести на екран дані про фотоапарати у яких об’єм пам’яті перевищує 64 МБ, які мають оптичне збільшення.

5. Написати програму, яка вводить масив записів про студентів (Прізвище, ім’я, рік народження, група, рейтинг, стать). Програма повинна знайти і вивести на екран прізвища та ініціали студентів у яких рейтинг менший 50 балів.

6. Написати програму, яка вводить масив записів про телевізори (модель, діагональ екрана, ціна, наявність супутникового тюнера, кількість систем декодування кольору). Програма повинна знайти і вивести на екран дані про телевізори з діагоналлю екрану менше 54 см і ціною менше 6000 грн.

7. Написати програму, яка вводить масив записів про музичні центри (модель, наявність підтримки МР3 формату, вихідна потужність, ціна, наявність дистанційного керування). Програма шукає і виводить на екран дані про музичні центри які підтримують МР3 і коштують менше 300 грн.

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

9. Написати програму, яка вводить масив записів про ріки України (Назва, басейн, довжина, площа приток, в яке море впадає). Програма повинна знайти і вивести на екран дані про річки , довжина яких більша за 100 км.

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

11. Написати програму, яка вводить масив записів про працівників фірми (Прізвище, ім’я, стать, освіта, стаж роботи, посада). Програма повинна знайти і вивести на екран дані про працівників з вищою освітою і стажем роботи більше 30 років..

12. Написати програму, яка вводить масив записів про цифрові диктофони (модель, кількість годин запису, тип інтерфейсу, ціна, наявність зарядного пристрою). Програма повинна знайти і вивести на екран дані про цифрові диктофони, які мають найбільший та найменший час запису.

13. Написати програму, яка вводить масив записів про наявність носіїв даних в магазині (тип носія, виробник, ціна, ємність, кількість). Програма повинна знайти і вивести на екран дані про носії даних впорядкованих по зростанню ціни.

14. Написати програму, яка вводить масив записів про відеокамери (модель, тип (цифрова/аналогова), ціна, наявність цифрового збільшення, кратність цифрового збільшення, кратність оптичного збільшення). Програма повинна вивести на екран дані про відеокамери, які не мають цифрового збільшення впорядковані по зростанню за ціною.

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. Чому структури називають типом даних користувача?


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

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

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

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*/  }

2 Завдання практичної роботи

Описати масив розмірністю 3, елементами якого є структура, описана у варіанті. Сформувати динамічний масив і заповнити його елементами заданого масиву, вивести новий масив на екран. Звільнити виділену пам'ять за допомогою функції free().

3 Варіанти індивідуальних завдань

  1.  Структура "Абітурієнт":
  •  прізвище, ім'я, по батькові; рік народження; оцінки вступних іспитів (3); середній бал атестата.
  1.  Структура "Співробітник":
  •  прізвище, ім'я, по батькові; посада рік народження; заробітна плата.
  1.  Структура "Держава":
  •  назва; столиця; чисельність населення; займана площа.
  1.  Структура "Людина":
  •  прізвище, ім'я, по батькові; домашня адреса; номер телефону; вік.
  1.  Структура "Людина":
  •  прізвище, ім'я, по батькові; рік народження; ріст; вага.
  1.  Структура "Школяр":
  •  прізвище, ім'я, по батькові; клас; номер телефону; оцінки по предметах (математика, фізика, українська мова, література).
  1.  Структура "Студент":
  •  прізвище, ім'я, по батькові; домашня адреса; група; рейтинг.
  1.  Структура "Покупець":
  •  прізвище, ім'я, по батькові; домашня адреса; номер телефону; номер кредитної картки
  1.  Структура "Пацієнт":
  •  прізвище, ім'я, по батькові; домашня адреса; номер медичної карти; номер страхового поліса.
  1.  Структура "Інформація":
  •  носій; об’єм; назва; автор.
  1.  Структура "Відеокасета":
  •  назва фільму; режисер; тривалість; ціна.
  1.  Структура "Музичний диск":
  •  назва; автор; тривалість; ціна.
  1.  Структура "Спортивна команда":
  •  назва; місто; кількість гравців; кількість набраних очок.
  1.  Структура "Стадіон":
  •  назва; адреса; місткість; види спорту.
  1.  Структура "Автомобіль":
  •  марка; рік випуску; ціна; кольори.
  1.  Структура "Власник автомобіля":
  •  прізвище, ім'я, по батькові; номер автомобіля; телефон; номер техпаспорта.

4 Методичні вказівки

  1.  Перед написанням програми переглянути теоретичний матеріал і приклади програм, що ілюструють масиви структур. Визначити структуру, задану у варіанті. Описати і задати масив, елементами якого є структура визначеного типу.
    1.  Сформувати динамічний масив за допомогою бібліотечних функцій malloc() (calloc()), розмір якого рівний заданому масиву структурного типу.
    2.  Заповнити сформований динамічний масив елементами заданого масиву.
    3.  Елементи сформованого масиву  вивести на екран.
    4.  Звільнити виділену пам'ять функцією free().

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

Описати масив розмірністю 3, елементами якого є структура

Структура "Стадіон":  назва; рік будівлі; кількість площадок; види спорту.

Сформувати динамічний масив і заповнити його елементами заданого масиву, вивести новий масив на екран. Звільнити виділену пам'ять за допомогою функції free().

Текст програми:

#include <stdio.h>

#include <stdlib.h>

int k, m;

void main()  {

 struct stadion {

char nazva[20];

int rik;

int kp;

char vsporty[20];}

*ptr1, nst1[3]= {{ "UKRAINE",1970, 12, "FYTBOL"},

{ "ARENADON",1980, 10, "BOKS"},

{"DNIPRO",1990, 10, "FYTBOL"}};

/*Виділяється 3*sizeof (struct stadion) пам’яті */

ptr1= malloc(3*sizeof (struct stadion));

for (k=0; k<3;  k=k+1)

{ptr1[k]=nst1[k];

printf("k=%s\t%d\t%d\t%s\n", ptr1[k].nazva, ptr1[k].rik , ptr1[k].kp ,

ptr1[k]. vsporty);   }

free (ptr1);

}

Результати роботи програми

k=UKRAINE           1970    12      FYTBOL

k=ARENADON      1980    10      BOKS

k=DNIPRO              1990    10      FYTBOL

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

  1.  В чому різниця між функціями розподілу пам’яті. malloc() і calloc()?
    1.  З допомогою якої функції звільняється пам’ять?
      1.  Що таке динамічний розподіл пам’яті?
        1.  В чому різниця між структурою і масивом. ?
        2.  Яким символом позначається операція звернення до елементу структури?
        3.  З допомогою якого ключового слова описується структура?


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

Тема: Операції над окремими бітами пам’яті.

Мета роботи: Навчитись оперувати з окремими бітами пам’яті і виконувати операції над ними.

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

Елементарною одиницею збереження інформації є біт. Бітові (двійкові, порозрядні) операції дають можливість маніпулювати окремими бітами цілочисельних змінних. Біт може приймати 0 або 1. Порозрядні операції можна виконати тільки над цілочисельними типами int, long i char.

Операції порозрядного зсуву. Існує дві операції для зсуву бітів в цілочисельних змінних на задане число позицій. Операція   <<   зсуває біт вліво, а операція >> - вправо. Синтаксис

x << n ;  x>> n

Кожна з операцій зсуває біти на  n  позицій в вказаному напрямі. При зсуві вправо n старших бітів заповнюється нулями, а при зсуві вліво заповнюються молодші біти. Наприклад,

Двійкове число 00001100 (12) при зсуві вправо на 2 розряди = 00000011 (3)

Двійкове число 00001100 (12) при зсуві вліво на 3 розряди = 01100000 (96)

Двійкове число 00001100 (12) при зсуві вправо на 3 розряди = 00000001 (1)

Двійкове число 00110000 (48) при зсуві вліво на 3 розряди = 10000000 (128)

Операції зсуву можна використати для множення і ділення  цілих чисел на числа, рівні степеням 2.

Зсув на  n позицій вліво еквівалентний множенню на 2n, вправо - ділення на 2n,. Результат множення може бути правильний тільки в тому випадку, коли при зсуві не пройшло переповнення, тобто ні один біт не втратився при зсуві за границі старшого розряду. Ділення шляхом зсуву вправо є цілочисельним, при якому відкидається дробова частина результату. Наприклад, при зсуві вправо число 5 (00000101) на одну позицію з метою розділити його на 2, результат буде рівний 2 (00000010), а не 2.5 Приклад програми.

#include <stdio.h>

int main(  ) {

    unsigned int y, x = 255;

    int i;

    for (i = 1; i < 8; i++)

    { y = x << i;    Множення

    printf("%d\t%d\t%d\n", x, i, y);   }

    for (i = 1; i < 8; i++)

    { y = x >> i;  Ділення

    printf("%d\t%d\t%d\n", x, i, y);  }}

Результат

/*Десяткові         Множення

255     1       510

255     2       1020

255     3       2040

255     4       4080

255     5       8160

255     6       16320

255     7       32640

/*Десяткові         Ділення

255     1       127

255     2       63

255     3       31

255     4       15

255     5       7

255     6       3

255     7       1      */

Порозрядні логічгі операції. Є три логічні операції для роботи з бітами в цілочисельних змінних.

Знак операції

Суть операції

Приклад

&

Побітове логічне і  (AND). Біт результату =1, якщо відповідні біти обох операндів =1 і = 0, коли один з бітів =0. Операція використовується для (відключення) очистки одного або кількох бітів цілої змінної.

11110000

&

01010101

01010000

І

Побітове логічне   включаюче або (OR)

РЕЗУЛЬТАТ =0, КОЛИ ВІДПОВІДНІ БІТИ ОБОХ ОПЕРАНДІВ =0. операція використовується для включення (установки) одного або кількох бітів цілої змінної.

11110000

I     01010101

11110101

^

Побітове логічне  виключаюче або (XOR). Біт результату =1, якщо відповідні біти обох операндів різні. Інакше вона =0.

11110000

^     01010101

10100101

Це порозрядні операції, які роблять біти результату = 0 або 1 в залежності від значень бітів в операндах.

Що ж означає включення-відключення заданих бітів цілої змінної. Нехай є змінна типу char і нам треба очистити (тобто зробити їх нульовими) 0 і 4 біти, залишивши останні незмінними. Виконаємо операцію логічного І нашого числа з двійковим числом 11101110. Тоді в кожній позиції, де в другому числі є одиниця, результат збережеться, позиція , де в другому числі є 0, результат буде нульовим.

Установка (включення) бітів з допомогою операції або виконується аналогічно. В позиції, де 2 число 1 результат буде 1, де в другому числі 0, результат незмінним.

0101

1100

==

1101

Операція доповнення. Це унарна операція, яка полягає в перетворенні бітів операнда на протилежні.

Бітові поля в структурах. Використання бітових полів економить пам’ять при роботі зі структурами. Бітове поле - це елемент структури, який складається з заданої кількості бітів.

Багато полів, особливо в базах даних мають відповіді так або ні. Найкоротший тип є тип char, який займає 8 бітів. Тоді сім бітів буде пропадати. Використання бітових полів дозволить помістити в одну змінну типу char 8 відповідей так або ні. Бітові поля можна використати і там, де нам потрібні числа 1, 2, 3, які представляються 2 бітами. 3 бітами - числа від 0 до 7, 4 бітами - числа від 0 до 15. Задання бітових полів і звертання до них не відрізняється від звичайних змінних.

Бітові поля мають тип unsigned int, а розмір задається після двокрапки, яка стоїть за іменем поля. Наприклад:

struct data

{ unsigned a1:1;

unsigned a2:2;

unsigned a3:3; }

Бітові поля - це невеликі цілі числа без знаку, з заданою кількістю двійкових розрядів, в структурі мають бути спочатку, перед іншими елементами. Бітові поля довжиною n біт можуть містити числа з діапазону від 0 до 2n+1. Якщо в таке поле помістити число, яке не входить в заданий діапазон, то компілятор не видасть помилки, а програма дасть не передбачені результати. Не рекомендується задавати бітові поля довжиною 8 або 16 байт, бо для цього є стандартні типи даних.

2. Варіанти індивідуальних завдань

  1.  Визначити структуру DATA, яка має 4 бітові поля розміром в 1, 2, 3 і 4 біти. Описати  2 змінні структурного типу DATA. Значення 1-ї змінної задати при описі і скопіювати цю інформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.
  2.  Використовуючи операції зсуву, помножити задане ціле число на 2, 4, і 16. Задане число і результати множення вивести на екран.
  3.  Визначити структуру DATA, яка має 4 бітові поля розміром в 1, 2, 3 і 4 біти. Описати  2 змінні структурного типу DATA. Значення 1-ї змінної задати при описі і скопіювати цю інформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.
  4.  Визначити структуру VAR, яка має 3 бітові поля розміром 1, 3 і 4 біти. Описати  2 змінні структурного типу VAR. Значення 1-ї змінної задати за допомогою операторів присвоєння і скопіювати цю інформацію в 2-гу змінну структурного типу за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран.
  5.  Використовуючи операції зсуву, поділити число 526 на 2, 4, і 16. Задане число і результати ділення вивести на екран.
  6.  Використовуючи операції зсуву, помножити ціле число 10 на 2, 4, і 16. Задане число і результати множення вивести на екран
  7.  Визначити структуру VAR, яка має 4 бітові поля розміром 1, 2, 3 і 4 біти..  Описати  2 змінні структурного типу VAR. Значення 1-ї змінної задати при описі і скопіювати цю інформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран після кожного присвоєння.
  8.  Використовуючи операції зсуву, помножити задане ціле число на 8, 4, і 16. Задане число і результати множення вивести на екран.
  9.  Використовуючи операції зсуву, поділити число 512 на 2, 32, і 16.  Задане число і результати ділення вивести на екран.
  10.  Визначити структуру VAR, яка має 4 бітові поля розміром 1, 2, 3 і 4 біти..  Описати  2 змінні структурного типу VAR. Значення 1-ї змінної задати при описі і скопіювати цю інформацію в 2-гу змінну структурного типу простим присвоюванням структур та за допомогою присвоєння полів структур. Значення полів другої структури вивести на екран після кожного присвоєння.
  11.  Використовуючи операції зсуву, помножити задане ціле число на 2, 8, і 16. Задане число і результати множення вивести на екран.
  12.  Використовуючи операції зсуву, помножити задане ціле число на 8, 4, і 16. Задане число і результати множення вивести на екран.

3 Методичні вказівки

  1.  Перед написанням програми ще раз переглянути теоретичний матеріал і приклади програм, що ілюструють особливості обробки змінних структурного типу у С-програмах
  2.  Визначити структуру, яка має бітові поля, задану у варіанті. Описати екземпляри змінних визначеного структурного типу.
  3.  Значення одної змінної структурного типу задати при описі.
  4.  Заповнити 2-у  структуру шляхом копіювання та за допомогою присвоєння полів структур
  5.  Поля другої структури вивести на екран, кожний варіант заповнення вивести окремо.
  6.  Використовуючи операції зсуву помножити або поділити  задані чисел на числа, рівні степеням 2.
  7.  Запустити програму на компіляцію і виконання. У випадку необхідності виправити синтаксичні та інші помилки.

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

  1.  Як працює операція по бітного  додавання?
    1.  Як працює операція по бітного  множення?
    2.  Операція доповнення унарна чи бінарна?


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

Тема: Складання програм з використанням форматованого файлового вводу-виводу

Мета роботи: Навчитись працювати з файлами на зовнішніх носіях, оволодіти основами відкриття файлів в текстовому та двійковому режимах, організувати форматний ввід-вивід інформації на зовнішні носії.

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

Типи дискових файлів. В С є два типи потоків: текстові і двійкові. Потік будь-якого з цих типів необхідно асоціювати з файлом. Текстові потоки асоціюються з текстовими файлами. Текстовий файл складається з текстових рядків. Кожний рядок закінчується символом кінця рядка.

Двійкові потоки асоціюються з двійковими файлами. Всі дані зчитуються і записуються в незмінному вигляді без розподілення на рядки і символів кінця рядка. Нульовий символ  (\0) і символ кінця рядка (\n). не мають ніякого змістовного значення і зберігаються як будь-який інший файл даних.

Імена файлів на диску. Кожний файл на диску має ім’я. Ім’я файлу використовується для доступу до нього і до його даних. В програмах імена файлів представлені у вигляді символьних рядків, як текстові дані.

Кожна операційна система має свої вимоги до імені файлу. Від конкретної операційної системи залежать символи, які дозволені в імені файлу і які не дозволені. При написанні програми необхідно знати вимоги до імен файлів в операційній системі, для якої пишеться програма.

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

C:\data\list.txt.

Це ім’я відноситься до файлу list.txt, який знаходиться в папці data на диску C:. Оскільки в мові С обернена похила коса риска має службове навантаження, то в імені файлу замість одної косої риски використовується дві. Це означає, що вищенаведене ім’я файлу на мові С матиме вигляд:

C:\\data\\list.txt.

Процес відкриття файлів. Для роботи з файлами їх необхідно відкрити. При цьому файловий потік потік зв’язується зі вказівником на структуру складного типу FILE, який визначений в бібліотечному файлі <stdio.h>. При відкритті файлу, повертається вказівник на потік, тобто на об’єкт типу FILE.

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

Для відкриття файлу використовується бібліотечна функція fopen(), прототип якої знаходиться в бібліотечному файлі stdio.h і має вигляд:

FILE *fopen(const char *filename, const char *mode);

Функція повертає вказівник типу FILE * — вказівник на структуру, описану в файлі  stdio.h. Елементи структури FILE використовуються програмою для різних операцій з файлами. При відкритті файлу треба описати вказівник на структуру FILE. Синтаксис опису:

FILE *fp;         /*Опис вказівника на структуру типу  FILE*/

Функції fopen() повертає вказівник (fp) на структуру FILE, який використовується в операціях з файлами. Якщо функція не могла відкрити файл, вона повертає нульовий вказівник NULL. Це може відбутися через збій в пристроях вводу-виводу.

Аргумент  filename — це символьний рядок, який містить шлях до файлу, що відкривається. Цей рядок може бути літералом, тобто послідовністю символів в подвійних лапках, або вказівником на рядкову змінну.

Аргумент mode вказує режим відкриття файлу, тобто, чи є файл двійковий або текстовий, відкривається файл для читання даних чи запису інформації на нього, або для обох цих операцій одночасно. Нижче наведено режими відкриття файлів в текстовому режимі функцією fopen() і їх пояснення.

Режим

Пояснення

r

Відкриття файлу для читання, якщо файл не існує, функція повертає значення  NULL

w

Відкриття файлу для запису, якщо файл не існує, він створюється. Якщо файл існує, він знищується без попередження,

a

Відкриття файлу для додавання даних в кінець, якщо файл не існує, він створюється. Якщо файл  існує, нові дані дописуються в кінець.

r+

Відкриття файлу для читання і запису, якщо файл не існує, він створюється. Якщо файл існує, нові дані записуються спочатку, знищуючи наявну інформацію.

w+

Відкриття файлу для читання і запису, якщо файл не існує, він створюється. Якщо файл існує, він очищається і нові дані записуються в чистий файл.

a+

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

Щоб відкрити файл в двійковому режимі до аргументу mode треба додати букву b. Якщо аргумент mode рівний “a”, то файл відкривається для додавання даних в текстовому режимі, а якщо “ab”, то файл відкривається в двійковому режимі.

Форматований ввід. Форматований ввід виконується бібліотечною функцією fscanf(). Аналогічно до виводу.scanf(). з тією різницею, що ввід проводиться з заданого файлового потоку, а не з стандартного stdin. Прототип цієї функції знаходиться в бібліотеці stdio.h. і має вид

int fscanf(FILE *fp, char *fmt, ...);

Першим аргументом є вказівник структурного типу FILE, повернутий з fopen() . Для зчитування даних з конкретного файлу треба передати в функцію вказівник, який повертає функція fopen() при відкритті файлу.

Другий аргумент - це рядок формату char *fmt. (Рядок формату - це такий самий рядок, що і в функції scanf().  (це то, що береться в подвійні лапки)).

Третій аргумент це багато крапок, що в прототипі означає змінний список аргументів, в які треба помістити введені дані.

Приклад читання форматованих даних з файлу "C:\\lk\\list.txt":

/* Читанняформатованих даних з допомогою функції fscanf(). */

#include <stdlib.h>

#include <stdio.h>

main(){

  int f1, f2, f3, f4, f5;  

  FILE *fp;

fp = fopen("C:\\lk\\list.txt", "r"); /*Відкриття файлу в режимі читання*/

/*Читання з файлу, перший */

fscanf(fp, "%d\n%d\n%d\n%d\n%d\n", &f1, &f2, &f3, &f4, &f5);

   printf("The values are %d, %d, %d, %d, %d \n.",f1, f2, f3, f4, f5);

   fclose(fp);   /* Закриття файлу fp*/} 

2 Варіанти індивідуальних завдань

№ вар.

Умова завдання

  1.  

Задати масив цілих чисел розмірністю 10, записати його в файл на диску, прочитати його з файлу в інший масив,  новий масив вивести на екран..

  1.  

Задати 9 змінних цілого типу, записати їх в файл на диску, прочитати їх з файлу в масив розмірністю 9, масив вивести на екран.  

  1.  

Задати масив цілих чисел розмірністю 12, записати його в файл на диску, прочитати його з файлу в інший масив,  новий масив вивести на екран.

  1.  

Числа від 1 до 14 записати в файл на диску, прочитати їх з файлу в змінні і вивести їх на екран.

  1.  

Задати 6 змінних цілого типу, записати їх в файл на диску, прочитати їх з файлу в змінні і вивести на екран.

  1.  

Задати масив цілих чисел розмірністю 9, записати його в файл на диску, прочитати його з файлу в 9 змінних цілого типу і вивести їх на екран.

  1.  

Задати 6 змінних цілого типу, записати їх в файл на диску, прочитати їх з файлу в масив розмірністю 6, масив вивести на екран.

  1.  

Задати 6 змінних цілого типу, записати їх в файл на диску, прочитати їх з файлу в масив розмірністю 6, масив вивести на екран.

  1.  

Задати масив цілих чисел розмірністю 9, записати його в файл на диску, прочитати його з файлу в 9 змінних цілого типу і вивести їх на екран.

  1.  

Задати 6 змінних цілого типу, записати їх в файл на диску, прочитати їх з файлу в змінні і вивести на екран.

  1.  

Числа від 1 до 9 записати в файл на диску, прочитати їх з файлу в змінні і вивести їх на екран.

  1.  

Задати масив цілих чисел розмірністю 12, записати його в файл на диску, прочитати його з файлу в інший масив,  новий масив вивести на екран.

  1.  

Задати масив цілих чисел розмірністю 10, записати його в файл на диску, прочитати його з файлу в інший масив,  новий масив вивести на екран..

  1.  

Задати 9 змінних цілого типу, записати їх в файл на диску, прочитати їх з файлу в масив розмірністю 9, масив вивести на екран.  

3 Методичні вказівки

  1.  Створити файл з розширенням .TXT на дску C  в папці GxxB (де хх -номер групи), яка міститься в свою чергу в папці lk.
  2.  Відкрити  файл  для запису і передбачити повідомлення при  його відкритті.
  3.  Записати запропоновані дані у файл за допомогою функції fprintf(). Закрити файл за допомогою функції fclose().
  4.  Відкрити файл для читання і записані дані прочитати з файлу в змінні, згідно індивідуального завдання, результати вивести на екран.
  5.  Закінчивши роботу з файлом, закрити його за допомогою функції fclose();

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

Задати масив цілих чисел розмірністю 12, записати його в файл на диску, прочитати його з файлу в інший масив,  новий масив вивести на екран.

Програма розв'язку

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

FILE *fp;

int a[12]={4,7,8,6,8,5,4,3,2,1,6,5},b[12],i;

int k;

void main() {clrscr();

fp=fopen ("C:\\WORK\\A.TXT","w");

if (fp==NULL) {printf ("not open"); exit(1);}

for(i=0;i<12;i++) fprintf (fp,"%d ",a[i]);

fclose(fp);

fp=fopen ("C:\\WORK\\A.TXT","r");

if(fp==NULL) {printf ("not open");

exit(2);  }

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

fscanf(fp,"%d",&b[i]);

for (i=0;i<12;i++) printf ("b[%d]=%d\n",i,b[i]);

fclose(fp);   }

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

  1.  Які функції форматного вводу-виводу?
  2.  За допомогою якої функції відкриваються файли?
  3.  За допомогою якої функції закриваються файли?
  4.  Яку інформацію треба передати в функцію fopen()для відкриття файлу?
  5.  Як здійснюється ввід-вивід на мові С?
  6.  Які є типи потоків?
  7.  Як записуються на мові С імена дискових файлів?
  8.  Які режими відкриття файлів для запису?


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

Тема: Складання програм з використанням символьного файлового вводу-виводу

Мета роботи: Навчитись працювати з файлами на зовнішніх носіях, оволодіти основами відкриття та закриття файлів, організовувати символьний ввід-вивід даних.

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

Символьний ввід. Термін символьний ввід-вивід відноситься до вводу-виводу як символів так і цілих рядків. Символьний ввід-вивід відноситься до текстових файлів (до файлів, відкритих в текстовому режимі). Для символьного вводу з файлів є функції:

fgetc() - Зчитування символів

fgets() - Зчитування рядків

Функція fgetc() ідентичні і вводять один символ з заданого потоку. Прототип функції fgetc()

іnt getc(FILE *fp);

Аргумент fp це вказівник на потік вводу, який повертається з функції fopen() при відкритті файлу. Функція повертає введений символ або EOF в випадку помилки.

Функція fgets() . Використовується для читання рядка і має прототип

char *fgets(char *str, int n, FILE *fp) ;

char *str – адреса, за якою розташовані байти, в які треба помістити (зчитати, ввести) введений рядок

n – максимальне число символів (байтів), які можна  ввести

FILE *fp це вказівник на файл, який повертається з функції fopen() при відкритті файла, з якого відбувається зчитування.

При успішній роботі функція повертає вказівник str. Значення NULL повертається в двох випадках

  1.  перш ніж функція ввела хоч би один символ, зустрівся кінець файлу (EOF). В цьому випадку вмістиме буфера незмінне
  2.  функція вспіла ввести один або декілька символів в буфер str , а потім зустрівся кінець файлу. Тоді після повернення NULL , буфер str містить випадковий набір символів.

Символьний вивід. Для символьного виводу з файлів є три функції

fputc() - Записування символів

fputs() - Записування рядків

Функція fputc()виводить один символ в заданий потік. Прототип функції

іnt fputc(int ch, FILE *fp);

Аргумент ch це символ, який треба вивести, формально він має тип int, фактично використовується тільки його молодший байт, в цій змінній міститься записуваний у файл символ.

Аргумент fp це вказівник на потік виводу, який повертається з функції fopen() при відкритті файлу і у який виконується запис.Функція повертає виведений символ або EOF в випадку помилки. Символічна константа EOF визначена в файлі stdio.h і рівна-1. Оскільки це значення не відповідає реальному символу, то його можна використати, як кінець файлу (але тільки в текстовому режимі).

Функція fputs() . Використовується для запису рядка . В ній треба вказати потік виводу, крім того вона не додає символ кінця рядка автоматично – Якщо він потрібний, то програміст повинен сам це ввести. Вона має прототип

char *fputs(char *str, FILE *fp) ;

str – вказівник на рядок з завершуючим нульовим символом, який треба вивести (записати у файл).

FILE *fp - це вказівник на файл, який повертається з функції fopen() при відкритті файла і у який відбувається запис.

Рядок str записується в файл, причому нульовий завершуючий символ \0 відкидається.

2 Варіанти індивідуальних завдань

№ вар.

Умова завдання

  1.  

Відкрити файл для  запису, записати в нього  символьний рядок, закрити файл, відкрити його для читання і прочитати з нього  символьний рядок довжиною в  14  символів і  вивести його на екран

  1.  

Відкрити файл для  запису, записати в нього символьний рядок, закрити файл, відкрити його для читання і прочитати з нього 7 символів в 7 символьних змінних, які вивести на екран.

  1.  

Відкрити файл для  запису, записати в нього  символьний рядок, закрити файл, відкрити його для читання і прочитати з нього  символьний рядок довжиною в  6 символи і  вивести його на екран.

  1.  

Відкрити файл для  запису, записати в нього символьний рядок, закрити файл, відкрити його для читання і прочитати з нього 10 символів і  вивести на екран.

  1.  

Відкрити файл для  запису, записати в нього  символьний рядок, закрити файл, відкрити його для читання і прочитати з нього  символьний рядок довжиною в  4  символи і  вивести його на екран.

  1.  

Відкрити файл для  запису, записати в нього символьний рядок, закрити файл, відкрити його для читання і прочитати з нього 13 символів , які  вивести на екран.

  1.  

Відкрити файл для  запису, записати в нього  символьний рядок, закрити файл, відкрити його для читання і прочитати з нього  символьний рядок довжиною в  6 символи і  вивести його на екран.

  1.  

Відкрити файл для  запису, записати в нього  символьний рядок, закрити файл, відкрити його для читання і прочитати з нього  символьний рядок довжиною в  14  символів і  вивести його на екран.

  1.  

Відкрити файл для  запису, записати в нього символьний рядок, закрити файл, відкрити його для читання і прочитати з нього 10 символів і  вивести на екран.

  1.  

Відкрити файл для  запису, записати в нього  символьний рядок, закрити файл, відкрити його для читання і прочитати з нього  символьний рядок довжиною в  6 символи і  вивести його на екран..

  1.  

Відкрити файл для  запису, записати в нього символьний рядок, закрити файл, відкрити його для читання і прочитати з нього 7 символів в 7 змінних, які вивести на екран.

  1.  

Відкрити файл для  запису, записати в нього  символьний рядок, закрити файл, відкрити його для читання і прочитати з нього  символьний рядок довжиною в  14  символів і  вивести його на екран.

3 Методичні вказівки

  1.  Створити файл з розширенням .TXT на дску C  в папці GxxB (де хх -номер групи), яка міститься в свою чергу в папці lk.
  2.  Відкрити  файл  для запису і передбачити повідомлення при  його відкритті.
  3.  Записати запропоновані дані у файл за допомогою функції fprintf(). Закрити файл за допомогою функції fclose().
  4.  Відкрити  файл  для читання і записані дані прочитати з файлу в змінні, згідно умови задачі індивідуального завдання,, результати вивести на екран.

Закінчивши роботу з файлом, закрити його за допомогою функції fclose();

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

Написати програму, яка записує рядок str у файл і читає 10 символів цього рядка в рядок str1. Одержаний рядок вивести на екран.

Текст програми:

#include <stdlib.h>

#include <stdio.h>

FILE *fp1, *fp2; /* 1-й  файл для. читання, 2-й для запису*/

char str[]="qwertyuioplkjhgf", str1[40];

main(  )   {

/* Відкриття файлів і перевірка на правильність відкриття. */

fp2 = fopen("C:\\lk\\list2.txt","w" ); /* 2-й для запису*/

   if ( fp2!= NULL )

printf("\nSuccessful opening C:\\lk\\list.txt in mode r.\n");

 else { printf("pomilka\n")  ;   exit(0);  }

fputs(str, fp2) ;    /* запис з рядка   str  в файл fp2*/

fclose(fp2);

  fp2 = fopen("C:\\lk\\list2.txt","r" ); /* 1-й  файл для. читання,*/

   if ( fp2!= NULL )

printf("\nSuccessful opening C:\\lk\\list2.txt in mode w.\n");

 else { printf("pomilka\n")  ;   exit(0)  ;}

fgets(str1, 10, fp2) ; /* читання з файлу fp2  в рядок   str1  10 символів*/

printf("\nstr= %s\n", str1);

      /* Закриття файлів */

      fclose(fp2);

system("pause");

return 0;

}

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

  1.  Які функції без форматного вводу-виводу?
  2.  За допомогою якої функції відкриваються файли?
  3.  За допомогою якої функції закриваються файли?
  4.  В якій бібліотеці знаходяться функції файлового вводу-виводу?
  5.  За допомогою якої функції відкриваються файли?
  6.  За допомогою якої функції закриваються файли?


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

Тема: Блочний файловий ввід-вивід структурованих даних

Мета роботи: Навчитися працювати з двійковими файлами. Організація блокового вводу-виводу даних і їх зберігання на зовнішніх носіях.

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

Блочний вивід. Функція fwrite(). Блочний ввід-вивід використовується при збереженні даних, які буде зчитувати та чи інша програма на С. Цей спосіб використовується тільки для двійкових файлів. В процесі блочного вводу-виводу дані копіюються повністю з пам’яті на диск і навпаки з диску в пам’ять. Наприклад, при одному виклику функції блочного вводу-виводу можна записати цілий масив і навпаки, одним викликом функції зчитати цей масив з диску в пам’ять. Блочний ввід-вивід виконується функціями fread() i fwrite().

Функція fwrite(). Ця бібліотечна функція записує блок даних з пам’яті в двійковий файл. Прототип функції, який знаходиться в файлі  stdio.h 

int fwrite(void *buf, int size,  int count, FILE *fp) ;

Аргумент buf - це вказівник на ділянку пам’яті, в якій є дані для запису в файл. Опис void означає, що аргумент є вказівником на любий тип даних.

Аргумент size - вказує розмір в байтах окремих елементів даних в блоці. 

Аргумент count - вказує загальну кількість елементів даних. Наприклад, якщо треба записати масив з 100 цілочисельних елементів, то size=2, а count=100, бо цілочисельна змінна має 2 байти, кількість елементів рівна 100. Для обчислення аргументу size можна використати операцію sizeof().

Аргумент fp - є вказівником на структуру FILE, який повертається з функції fopen() при відкритті файлу. Функція повертає кількість елементів даних, записаних в файл. Якщо ця кількість менша аргументу count, то запис був помилковим. Перевіряють правильність виводу фрагментом програми

if (  (fwrite(buf, size,  count, fp) != count)

printf("Помилка");

Приклад: Записати одну змінну x типу double

fwrite(&x, sizeof(double),  1, fp);

Приклад: Записати масив data[50]  типу float

float data[50];

fwrite(data, sizeof(float), 50, fp);/*Записує масив 50 елементів довжиною 4 байти*/

або fwrite(data, sizeof(data),  1, fp);    /* Записує масив як 1  елемент */

Блочний вивід. Функція fread(). Функція fread(). Ця бібліотечна функція зчитує блок даних з двійкового файлу в память.

Прототип функції, який знаходиться в файлі  stdio.h 

int fread(void *buf, int size,  int count, FILE *fp) ;

Аргумент buf - це вказівник на ділянку пам’яті, в яку поміщаються дані з файлу. Опис void означає, що аргумент є вказівником на будь-який тип.

Аргумент size - вказує розмір в байтах окремих елементів даних в блоці. 

Аргумент count - вказує загальну кількість елементів даних. Наприклад, якщо треба зчитати масив з 100 цілочисельних елементів, то size=2, а count=100, бо цілочисельна змінна має 2 байти, квлькість елементів рівна 100. Для обчислення аргументу size можна використати операцію sizeof().

Аргумент fp - є вказівником на структуру FILE, який повертається з функції fopen(). Функція повертає кількість елементів даних, зчитаних з файлу. Якщо ця кількість менша аргумента count, то зчитування було помилковим. Перевіряють правильність виводу фрагментом програми

if (  (fread(buf, size,  count, fp) != count)   printf("Помилка");

2 Варіанти індивідуальних завдань

  1.  Задати  2 масиви розмірністю 3,  елементами якого є дійсні і цілі числа. Шляхом введення їх з клавіатури. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів обох масивів і прочитати 4 значення з сформованого файлу в змінні, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.
  2.  Задати при описі 3 масиви розмірністю 2, елементами якого є дійсні, символьні і цілі числа. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів заданих масивів і прочитати 5 значень з сформованого файлу в змінні, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.
  3.  Задати  4 масиви розмірністю 2,  елементами якого є дійсні, символьні, дійсні і цілі числа. Шляхом введення їх з клавіатури. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів обох масивів і прочитати 4 значення з сформованого файлу в змінні, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі
  4.  Задати при описі 3 масиви розмірністю 4, елементами якого є дійсні, символьні, дійсні і цілі числа. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів заданих масивів і прочитати 4 значення з сформованого файлу в новий масив, який вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.
  5.  Задати  масив розмірністю 10,  елементами якого є дійсні числа. Шляхом введення їх з клавіатури. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів обох масивів і прочитати 4 значення з сформованого файлу в новий масив, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.
  6.  Задати при описі 4 масиви розмірністю 3, елементами якого є дійсні, символьні, дійсні і цілі числа. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів заданих масивів і прочитати 3 значення з сформованого файлу в новий масив, який вивести на екран. Передбачити повідомлення про помилки при відкритті файлу, і  при блочному вводі-виводі.
  7.  Задати  3 масиви розмірністю 5,  елементами якого є символьні. Дійсні і цілі числа. Шляхом введення їх з клавіатури. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів обох масивів і прочитати 4 значення з сформованого файлу в новий масив, який вивести на екран. Передбачити повідомлення про помилки при відкритті файлу, а також при блочному вводі-виводі.
  8.  Задати при описі 4 масиви розмірністю 4, елементами якого є дійсні, символьні, дійсні і цілі числа. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів заданих масивів і прочитати 4 значення з сформованого файлу в новий масив, який вивести на екран. Передбачити повідомлення про помилки при відкритті файлу і при блочному вводі-виводі
  9.  Задати  масив розмірністю 10,  елементами якого є дійсні числа. Шляхом введення їх з клавіатури. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів обох масивів і прочитати 4 значення з сформованого файлу в новий масив, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.
  10.  Задати при описі 2 масиви розмірністю 7, елементами якого є дійсні і цілі числа. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів заданих масивів і прочитати 5 значень з сформованого файлу в змінні, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.
  11.  Задати  3 масиви розмірністю 3,  елементами якого є дійсні і цілі числа. Шляхом введення їх з клавіатури. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів обох масивів і прочитати 6 значень з сформованого файлу в змінні, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.
  12.  Задати при описі 4 масиви розмірністю 2, елементами якого є дійсні, символьні і цілі числа. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів заданих масивів і прочитати 7 значень з сформованого файлу в змінні, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.
  13.  Задати  3 масиви розмірністю 2,  елементами якого є дійсні, символьні, дійсні і цілі числа. Шляхом введення їх з клавіатури. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів обох масивів і прочитати 5 значень з сформованого файлу в змінні, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі
  14.  Задати при описі 3 масиви розмірністю 3, елементами якого є дійсні, символьні, дійсні і цілі числа. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів заданих масивів і прочитати 6 значень з сформованого файлу в нові масиви, які вивести на екран. Передбачити повідомлення про помилки при відкритті файлу, а також при блочному вводі-виводі.

3 Методичні вказівки

  1.  Перед написанням програми ще раз переглянути теоретичний матеріал і приклади програм, що ілюструють особливості застосування функцій блочного вводу-виводу у С-програмах.
  2.  Уважно прочитати умову задачі індивідуального завдання, записати запропоновані дані у файл за допомогою функції fwrite(). Закрити файл за допомогою функції fclose().
  3.  Відкрити  цей файл  для  читання і записані дані прочитати з файлу за допомогою функції  fread(). в інші змінні, результати початкових і кінцевих змінних вивести на екран.
  4.  Відкомпілювати програму і зафіксувати результати реалізації.
  5.  Закінчивши роботу з файлом, закрити його .

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

Задати при описі 2 масиви розмірністю 4, елементами якого є дійсні і цілі числа. Використовуючи функції блочного вводу-виводу сформувати двійковий файл із елементів заданих масивів і прочитати 5 значень з сформованого файлу в змінні, які вивести на екран. Передбачити повідомлення про помилки при відкритті і закритті файлу, а також при блочному вводі-виводі.

Текст програми:

#include <stdio.h>

#include <stdlib.h>

void main ()

{

int i, array1[9]={1,4,5,6}, a1,a2,a3,a4;

float array2[9]={6.7,8.9,4.5,3},a5;

FILE  *fp;

/* Відкриття файлу для запису в двійковому режимі */

fp=fopen("C:\\lk\\list.txt", "wb");

/* Збереження (запис) масивів у файл*/

if (  (fwrite(array1, sizeof(int),  4, fp) != 4)

{printf("Помилка запису"); exit(1);}

if (  (fwrite(array2, sizeof(float),  4, fp) != 4)

{printf("Помилка запису");  exit(2);}  

fclose(fp);

/* Відкриття того ж файлу для читання в двійковому режимі */

fp=fopen("("C:\\lk\\list.txt", "rb"");

/*   Зчитування даних в змінні a1,a2,a3,a4,a5*/

if (  (fwrite(&a1, sizeof(int),  1, fp) != 1)

{printf("Помилка запису"); exit(3);}

if (  (fwrite(&a2, sizeof(int),  1, fp) != 1)

{printf("Помилка запису"); exit(4);}

if (  (fwrite(&a3, sizeof(int),  1, fp) != 1)

{printf("Помилка запису"); exit(5);}

if (  (fwrite(&a4, sizeof(int),  1, fp) != 1)

{printf("Помилка запису"); exit(6);}

if (  (fwrite(&a5, sizeof(float),  1, fp) != 1)

{printf("Помилка запису"); exit(7);}

fclose(fp);

/* Вивід прочитаних змінних на екран*/

printf("a1= %d\t a2= %d\t a3= %d\t a4= %d\t a5= %f\n ", a1,a2,a3,a4,a5); }

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

  1.  Яка функція блочного вводу?
    1.  Яка функція блочного виводу?
      1.  Який прототип функції fwrite().?
        1.  Який прототип функції fread()?


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

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

Мета: Навчитися використовувати бібліотечні функції для організації прямого (довільного) доступу до дискових файлів.

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

1. Прямий доступ до даних у файлах. Операції читання даних з файлу і їх запис у файл відбувається, починаючи з поточної позиції в потоці. Початкова позиція встановлюється при відкритті файлу й може відповідати початковому або кінцевому байту потоку залежно від режиму відкриття файлу.

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

При відкритті потоку в режимах “r” й “w” маркер поточної позиції встановлюється на початковий байт потоку, при відкритті в режимі “a” - на останній байт у кінці файлу. При виконанні кожної операції маркер переміщається на нову поточну позицію відповідно до кількості записаних або прочитаних байтів.

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

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

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

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

2. Функція управління маркером у файлі. Для управління маркером у файлі використовується бібліотечна функція fseek(). Вона дає можливості керування положенням маркера у файлі. З її допомогою можна встановити маркер в будь-яку позицію у файлі. Прототип функції fseek() знаходиться в бібліотечному файлі stdio.h і має вигляд:

int fseek(FILE *fp, long a1, int а2).

Аргумент fp є вказівником на структуру FILE, який повертається з функції fopen() при відкритті файлу.

Аргумент a1 задає відстань в байтах, на яку треба сумістити вказівник позиції аргументом a1.

Аргумент а2 задає точку, від якої обчислюється зміщення. Цей аргумент може мати одне з трьох значень — символічні константи, які наведено нижче.

Таблиця . Значення констант, які задають зміщення в функції fseek()

Константа

Значення

Опис

SEEK_SET

0

Встановлення вказівника на байт з порядковим номером a1, починаючи з початку файлу

SEEK_CUR

1

Зміщення вказівника на a1 байт від його текучого положення

SEEK_END

2

Встановлення вказівника на відстань a1 байт, починаючи з кінця файлу

Функція повертає 0, коли встановлення маркера в задану позицію було виконано без помилок і ненульове значення у випадку помилки.

Довільний доступ до даних у файлі з допомогою функції fseek() продемонстровано програмою:

#include <stdlib.h>

#include <stdio.h>

main( ) {

FILE *fp;

int data, i, array[8]={1,5,8,34,56,34,89,100};

long a1;

fp = fopen("c:\\ff.txt", "wb"); /* Відкриття двійкового файлу для запису */

if (fp == NULL)   {printf("\n Помилка відкриття файлу."); exit(1); }

i=fwrite(array, sizeof(int), 8, fp); /* Запис масиву у файл */

if ( i!= 8)    {printf("\n Помилка запису даних  у файл."); exit(1);}

fclose(fp);

fp = fopen("c:\\ff.txt ", "rb"); /* Відкриття файлу для читання */

if (fp == NULL) {printf("\n Помилка відкриття файлу.");  exit(1);}

/* Присвоєння значення змінній а1=4 */

а1=4;

/* Переміщення  вказівника позиції до елементу з індексом а1 */

if ( (fseek(fp, (a1*sizeof(int)), SEEK_SET)) != 0)

{fprintf(stderr, "\nError using fseek().");  exit(1);}

fread(&data, sizeof(int), 1, fp); /*Читання одного цілого числа в змінну data*/

printf("\nElement %ld has value %d.", a1, data);

fclose(fp); }

3. Визначення поточного положення маркера у файлі. Для визначення поточного положення маркера у файлі використовується функція ftell(). Прототип функції знаходиться у бібліотечному файлі stdio.h і має вигляд:

long ftell(FILE *fp) ;

Аргумент fp – є вказівником на структуру FILE, який повертається з функції fopen() при відкритті файлу. Функція повертає значення типу long, яке вказує номер поточного байта у файлі від його початку (початковий номер байта у файлі = 0). У випадку помилки функція повертає -1L (cont -1 типу long).

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

#include <stdlib.h>

#include <stdio.h>

char msg[]="abcdefghijklmnopqrstuvwxyz"; /*присвоєння масиву msg символьних значень*/

main(){

FILE *fp; /* Опис вказівника на структуру  FILE */

char buf[6];   /*  Опис масиву розмірності 6 */

fp = fopen("C:\\ff.TXT", "w")); /* Відкриття файлу для запису  */

   if ( (fp = =NULL)   {  printf( "Помилка відкриття");    exit(1); }

fputs(msg, fp);    /*Запис масиву у файл */

if (fputs(msg, fp) == EOF)    {  printf("Помилка запису.");   exit(1); }

fclose(fp);    /*Закриття файлу для запису */

fp = fopen("C:\\ff.TXT ", "r");  /*Відкриття файлу для читання. */

if ( (fp == NULL)    {   fprintf (".Помилка відкриття ");  exit(1);  }

printf("\n=положення файлівого вказівника%ld", ftell(fp));

/*Результат    Друк ftell(fp)=0 */

fgets(buf, 6, fp); /* Зчитування з файлу fp 5 символів. */

printf("\nAfter reading in %s, position = %ld", buf, ftell(fp));

/*  Друк 5 символів з buf і положення файлового вказівника ftell(fp)=5 */

fgets(buf, BUFLEN, fp);    /* Зчитування наступних 5 символів. */

printf("\n\nThe next 5 characters are %s, and position now = %ld", buf, ftell(fp));

/*Друк наступних 5 символів з buf і положення файлового маркера ftell(fp)=10*/

4. Встановлення положення маркера на початок файлу. Для встановлення положення маркера на початок файлу використовується функція rewind(). Прототип функції знаходиться у бібліотечному файлі stdio.h. і має вигляд:

void rewind(FILE *fp) ;

Аргумент fp - є вказівником на структуру FILE, який повертається з функції fopen() при відкритті файлу. Функція використовується тоді, коли з файлу були вже зчитані дані і знову треба повернутися на початок файлу.

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

#include <stdlib.h>

#include <stdio.h>

char msg[]="abcdefghijklmnopqrstuvwxyz"; /*присвоєння масиву msg символьних значень*/

main(){FILE *fp; /* Опис вказівника на структуру  */

char buf[6];   /*  Опис масиву розмірності 6 */

fp = fopen("C:\\ff.TXT", "w")); /* Відкриття файлу для запису  */

if ( (fp = =NULL)   {  printf( "Помилка відкриття");    exit(1); }

fputs(msg, fp);    /*Запис масиву у файл */

fclose(fp);    /*Закриття файлу для запису*/

fp = fopen("C:\\ff.TXT ", "r");  /*Відкриття файлу для читання. */

if ( (fp == NULL)    {   fprintf (".Помилка відкриття ");  exit(1);  }

fgets(buf, BUFLEN, fp);    /* Зчитування наступних 5 символів. */

rewind(fp); /* Повернення на початок потоку. */

printf("\n   %ld\n", ftell(fp));

fgets(buf, BUFLEN, fp); /* Зчитування з файлу fp 5 символів. */

printf("\n%s\n", buf); /*Друк цих символів */

fclose(fp); }

2 Завдання практичної роботи:

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

3 Варіанти індивідуальних завдань:

  1.  Структура "Фільм": назва; режисер; рік випуску; вартість. Прочитати з масиву в змінні  3-і 2 поле   3-го елементу масиву. Значення полів вивести на екран.
  2.  Структура "Книга": назва; автор; рік видання; кількість сторінок. Прочитати з масиву в змінні  3-і 1 поле   2-го елементу масиву. Значення полів вивести на екран
  3.  Структура "Фільм": назва; режисер; країна; прибуток. Прочитати з масиву в змінні  3-і 2 поле   1-го елементу масиву. Значення полів вивести на екран
  4.  Структура "Держава": назва; державна мова; грошова одиниця; курс валюти відносно $. Прочитати з масиву в змінні  2-і 2 поле   3-го елементу масиву. Значення полів вивести на екран
  5.  Структура "Автомобіль": марка; серійний номер; реєстраційний номер; рік випуску. Прочитати з масиву в змінні  3-і 4 поле   2-го елементу масиву. Значення полів вивести на екран
  6.  Структура "Власник автомобіля": прізвище, ім'я, по батькові; номер автомобіля; номер техпаспорта; відділення реєстрації ДАІ. Прочитати з масиву в змінні  3-і 5 поле   1-го елементу масиву. Значення полів вивести на екран
  7.  Структура "Стадіон": назва; рік будівлі; кількість площадок; види спорту. Прочитати з масиву в змінні  4-і 2 поле   3-го елементу масиву. Значення полів вивести на екран
  8.  Структура "Студент": прізвище, ім'я, по батькові; номер телефону; група; оцінки по 3 основних предметах. Прочитати з масиву в змінні  3-і 5 поле   2-го елементу масиву. Поля вивести на екран
  9.  Структура "Студент": прізвище, ім'я, по батькові; дата народження; домашня адреса; рейтинг. Прочитати з масиву в змінні  3-і 1 поле   1-го елементу масиву. Значення полів вивести на екран
  10.  Структура "Абітурієнт": прізвище, ім'я, по батькові; рік народження; оцінки вступних іспитів (3); середній бал атестата. Прочитати з масиву в змінні  3-і 6 поле   3-го елементу масиву. Значення полів вивести на екран
  11.  Структура "Співробітник": прізвище, ім'я, по батькові; посада рік народження; заробітна плата. Прочитати з масиву в змінні  2-і 4 поле   2-го елементу масиву. Значення полів вивести на екран
  12.  Структура "Держава": назва; столиця; чисельність населення; займана площа. Прочитати з масиву в змінні  1-і 4 поле   1-го елементу масиву. Значення полів вивести на екран
  13.  Структура "Людина": прізвище, ім'я, по батькові; домашня адреса; номер телефону; вік. Прочитати з масиву в змінні  6-і 4 поле   3-го елементу масиву. Значення полів вивести на екран
  14.  Структура "Людина": прізвище, ім'я, по батькові; рік народження; ріст; вага. Прочитати з масиву в змінні  3-і 2 поле   2-го  елементу масиву. Значення полів вивести на екран
  15.  Структура "Книга": назва; автор; рік видання; кількість сторінок. Прочитати з масиву в змінні  3-і 2 поле   1-го елементу масиву. Значення полів вивести на екран

4 Методичні вказівки

  1.  Описати і задати масив згідно умови задачі індивідуального завдання, описати змінні, тип яких співпадає з типом елементів заданого масиву.
  2.  Відкрити в двійковому режимі файл для запису елементів масиву і передбачити повідомлення про його успішне чи не успішне відкриття..
  3.  За допомогою функції  fwrite() заданий масив записати у відкритий файл. Передбачити перевірку на правильність запису масиву в файл.
  4.  Закрити файл за допомогою функції fclose().
  5.  Відкрити в двійковому режимі файл для читання, передбачивши повідомлення про його успішне чи не успішне відкриття.
  6.  Використовуючи функції прямого (довільного доступу) до даних у файлі, (fseek(), rewind((),і ftell() ) встановити положення вказівника у файлі. на відповідні елементи масиву, задані згідно умови задачі індивідуального завдання.
  7.  Прочитати ці елементи масиву в описані змінні використовуючи функцію fread( ), значення яких вивести на екран.

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

Структура "Студент":

прізвище, ім'я, по батькові; дата народження; домашня адреса; рейтинг.

прочитати з масиву в змінні  3-і 1 поле   1-го елементу масиву. Значення полів вивести на екран.

Програма розв'язку

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

FILE *fp;

struct stydent { char pib[30]; char d[11]; char ad[15]; float r;

}st[5]={{"Rybaha Zorjana Igorivna","12.07.1991","Pumonenka 5/8",3.89},

{"Skip Natalija Andriivna","3.11.1992","Melnyka 45", 3.25},

{"Sunjakevuch Roman Romanovuch","8.08.1992","Rjashivska 34/6",4.37},

{"Golovko Bogdan Igorovuch","3.07.1992","Korotka 5/8",4.32},

{"Savuch Taras Andrijovuch","27.09.1992",3.89}};

char A[15],B[30];

int k,m;

void main() { clrscr();

fp=fopen("C:\\B.TXT","wb");

if(fp==NULL) { printf("not open wb"); exit(1); }

k=fwrite(st,sizeof(struct stydent),5,fp);

if(k!=5) { printf("not write"); exit(2); }

k=fclose(fp);

if(k==-1) { printf("not close"); exit(3); }

fp=fopen("C:\\B.TXT","rb");

if(fp==NULL) { printf("not open"); exit(4); }

m=30+11;

fseek(fp,m,0);

k=fread(A,sizeof(char),15,fp);

if(k!=15) { printf("not read"); exit(5); }

rewind(fp);

k=fread(B,sizeof(char),30,fp);

if(k!=30) { printf("not read"); exit(6); }

k=fclose(fp);

if(k==-1) { printf("not close"); exit(7); }

puts(A);

puts(B);

}

Результати:

Pumonenka 5/8

Rybaha Zorjana Igorivna

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

  1.  Яка функція встановлює вказівник на початок файлу?
    1.  Що таке прямий доступ до файлу?
      1.  Який прототип функції ftell()..?
        1.  Який прототип функції fseek() і що вона повертає?
        2.  Яку інформацію треба передати в функцію fopen()для відкриття файлу на диску?


Практична робота № 1

Тема: Складання програм з використанням  основних операторів мови С

Мета: Навчитись розробляти алгоритми розв'язку задач, що потребують розгалужених та циклічних обчислень та записувати програми їх реалізації.

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

Оператор вибору варіантів . Це оператор switch. Це найбільш гнучкий керуючий оператор. Можна виконувати різні блоки програми, в залежності від значень деякого виразу і цих значень може бути більше двох.

Синтаксис оператора switch.

switch (вираз)

{

case шаблон1:  оператор(и);

case шаблон2: оператор(и);

case шаблонn: оператор(и);

default:   оператор(и);

}

Вираз повинен приймати цілочисельне значення типу int, long або char. Обчислений вираз порівнюється з шаблонами константами, які задані після ключового слова case . Потім виконується одна з наступних операцій

Якщо значення виразу співпало з одним із заданих шаблонів, то виконується оператори, які стоять після відповідної мітки  case .

Якщо значення виразу не співпало ні з одним із заданих шаблонів, то виконується оператори, які стоять після ключового слова default. Наявність його в операторі не обов’язкова.

Якщо значення виразу не співпало ні з одним із заданих шаблонів і відсутній блок default, то виконується оператори, які стоять після дужок блоку switch .

При зустрічі оператора break управління передається в кінець оператора switch .

Програма розгалужується в залежності від значення виразу. ((вираз)). Оператор switch обчислює (вираз) і передає управління на мітку case , шаблонне значення якої співпало зі значенням виразу Якщо вираз не приймає ні одного шаблонного значення, то управління передається оператору default: Якщо немає цього оператора, то управління передається оператору, який слідує за switch .

Оператор управління break. Оператор break може знаходитися в операторі switch. Як тільки він зустрічається в switch, виконання switch припиняється. Управління передається оператору, який стоїть після  оператора switch.

Приклад:

switch (вираз)

{

case шаблон1:  оператор(и); break;

case шаблон2: оператор(и); break;

case шаблон_n: оператор(и); break;

default:   оператор(и);

}

Оператор циклу for. Цей оператор (або блок операторів) виконується визначене число раз.

Синтаксис оператора for:

for (ініціалізація; умова; приріст) {Оператор або блок операторів;}

Схематичне представлення оператора for

Оператор виконує наступні дії:

  1.  Обчислюється вираз ініціалізіція, звичайно це оператор присвоєння, який деякій змінній присвоює початкове значення.
  2.  Обчислюється вираз умова –  це логічний вираз, який визначає відношення між величинами.
  3.  Якщо умова хибна, тобто = 0, то управління передається оператору, який слідує за циклом.
  4.  Якщо умова істинна, тобто >0, то виконується  оператор в циклі.
  5.  Обчислюється вирах приріст і переходимо до п. 2.

Приклад: Написати програму, яка виводить на екран числа від 1 до 7.

# include <stdio.h>

void main()

{

int a;

for  (а=1; a<=7; a++)

printf(“a=%d\n “, a);

}

Оператори циклу while. Це ітераційний оператор циклу, який працює до тих пір, поки деяка умова буде істиною.

Синтаксис оператора while:

while (умова) 

{оператор;   [оператори;]]

Схематичне представлення оператора while:

Оператор виконує наступні дії:

  1.  Обчислюється вираз умова це логічний вираз, який визначає відношення між величинами.
  2.  Якщо умова хибна, тобто = 0, то виконання припиняється і управління передається оператору, який слідує за ним
  3.  Якщо умова істинна, тобто >0, то виконується  блок операторів
  4.  Переходимо до п. 1.

Приклад: Вивести на екран додатні числа менші від 10.

# include <stdio.h>

void main()

{

int a=1;

while (a<10)

{printf(“a=%d\n “, a);  a++}

}

Якщо умова хибна на початку, то оператор не виконується жодного разу.

Оператори циклу do while. Синтаксис оператора:

do {блок операторів}    while ( умова-вираз);

Виконується блок операторів, до тих пір поки умова є істинна, на відміну від попередніх операторів циклу, в яких умова перевіряється в кінці циклу, а не на початку. Схематичне представлення оператора do…. while.

Оператор виконує наступні дії:

  1.  Виконується оператор.
  2.  Обчислюється вираз умова це логічний вираз, який визначає відношення між величинами.
  3.  Якщо умова хибна, тобто = 0, то цикл припиняє роботу.
  4.  Якщо умова істинна, тобто >0, то п. 1

Для переривання операторів циклу використовується оператор break. По цьому оператору управління передається в кінець оператора циклу. Цикл виконається тільки 5 разів. Цикл може містити багато операторів break, але виконається тільки один, який зустрінеться перший раз.

2 Варіанти індивідуальних завдань

  1.  

Серед заданого списку студентів вивести на екран прізвище і ініціали студента з заданим номером, який вводиться з клавіатури.

Знайти суму цілих додатних чисел, кратних 3 і менших 200.

  1.  

Серед заданого списку квартир вивести на екран кількість кімнат і мешканців квартири з заданим номером, який вводиться з клавіатури.

Знайти суму цілих додатних парних чисел, менших 100.

  1.  

З діапазону чисел від 6 до 13 вивести на екран значення англійською мовою заданого з клавіатури числа.

Знайти суму цілих додатних непарних чисел, менших 200.

  1.  

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

Знайти суму цілих додатних чисел, кратних 5 і менших 150.

  1.  

Вивести на екран назву дня тижня  англійською мовою з заданим номером дня, який вводиться з клавіатури.

Знайти суму цілих додатних чисел, більших 20, менших 100 і кратних 3.

  1.  

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

Знайти суму цілих додатних парних чисел, більше 10, менше 200.

  1.  

Вивести на екран назву пори року  англійською мовою за заданим номером місяця, який вводиться з клавіатури.

Знайти суму цілих додатних непарних чисел, більше 30, менше 150.

  1.  

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

Знайти суму цілих додатних чисел, кратних 7 і менше 250.

  1.  

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

Знайти суму цілих додатних чисел, більших 30, менших 200 і кратних 5.

  1.  

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

Знайти суму цілих додатних чисел, більших 20, менших 250 і кратних 7.

  1.  

Задати список телефонних кодів райцентрів і їх назву. Вивести на екран назву райцентру з заданим кодом, який вводиться з клавіатури

Знайти суму цілих додатних парних чисел, не менше 16, менше 200.

  1.  

Вивести на екран розклад пар дня тижня , номер якого  вводиться з клавіатури

Знайти суму цілих додатних непарних чисел, більше 10, не більше 101.

  1.  

По номеру місяця, введеного з екрану,  вивести на екран кількість днів у ньому

Знайти суму цілих додатних чисел, не менше 18, менших 100 і кратних 3.

  1.  

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

Знайти суму цілих додатних чисел, не менших 30, менших 100 і кратних 5.

  1.  

З діапазону чисел від 0 до 5 вивести на екран значення англійською мовою заданого з клавіатури числа.

Знайти суму цілих додатних чисел, більших 20, не більших 210 і кратних 7.

3 Методичні вказівки

  1.  Уважно прочитати умову задачі з індивідуального завдання. Визначити, що має бути отримано в результаті її розв'язку, які дані для цього потрібно ввести.
  2.  Розробити алгоритм розв'язку задачі, дати короткий опис (роз'яснення) основних кроків алгоритму.  
  3.  Для вводу й виводу даних використати бібліотеку функцій    <stdіo.h>.
  4.  Використати оператор swtch, який обчислює деякий вираз і направляє обчислення програми  в залежності значення, які він приймає.
  5.  Використовуючи  оператори циклу порахувати потрібне значення..
  6.  Вибрати оператори для запису циклічних і розгалужених процесів;
  7.  Обчислення суми. Під час обчислення суми початкове значення змінної, де нагромаджуватиметься сума, наприклад S, має дорівнювати нулеві. Для цього використовують команду присвоєння S=0
  8.  Обчислення добутку. Під час обчислення добутку початкове значення змінної, де нагромаджуватиметься добуток, наприклад  має дорівнювати одиниці. Для цього використовують команду присвоєння d=1.
  9.  Ввести текст програми. Звернути увагу на типи даних, що будуть використані в програмі.
  10.  Запустити програму на компіляцію. У випадку необхідності виправити синтаксичні помилки.
  11.  Запустити програму на виконання. У  випадку необхідності виправити семантичні помилки.
  12.  Реалізувати програму для різних вхідних даних.
  13.  Результати роботи програми вивести на екран.

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

  1.  Який синтаксис оператора switch ?
  2.  Вирази яких типів використовуються в операторі switch ?
  3.  Які ключові слова має оператор switch ?
  4.  Для чого призначений оператор default?
  5.  В чому різниця між оператором for  і  while ?
  6.  В чому різниця між оператором while  і  do    while?
  7.  Які чотири складові частини оператора  for?
  8.  В чому різниця між оператором while  і  do    while?
  9.  Які дві складові частини оператора  while?
  10.  Які дві складові частини оператора  do    while?
  11.  Які цикли називаються арифметичними?
  12.  Які цикли називаються ітераційними?


Практична робота № 2

Тема: Складання програм для обробки одновимірних масивів

Мета роботи: Навчитись описувати, формувати і опрацьовувати одновимірні масиви даних в С-програмах; оволодіти основними способами відлагодження програми шляхом контролю за ходом її виконання.

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

Масиви. Масив - це група пронумерованих( проіндексованих) однотипних елементів даних під одним загальним іменем. Розрізняють окремі елементи масиву по індексу – числу, яке стоїть після імені масиву в квадратних душках. Масиви необхідно описувати. Опис включає тип елементів масиву і розмір.

Приклад:

іnt data[100];   /* масив типу цілий з іменем data і розміром 100.

Звернення до окремих елементів масиву проводиться по індексу від 0 до 99. Першим елементом є data[0];   а не data[1].

Елемент масиву так само використовується, як проста змінна, і індексом може бути вираз або змінна.

Одномірні масиви. Одномірний масив має один індекс.. Індекс – це номер в квадратних душках після імені масиву.

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

Індекс масиву може бути як літеральною константою, так і виразом. Слід пам’ятати, що індексація починається з нуля. Відповідно, коли дати елемент останній, компілятор помилку не виявить, але програма буде працювати непередбачено.

Імена і описи масивів. Ім’я масиву це звичайний ідентифікатор. Він має бути унікальним, за ним іде розмірність. Розмір масиву може бути як літеральна константа, так і символьна.

Наприклад

#define A 12

int array[A];

або

int array[12];

Не всі компілятори підтримують інструкцію, Тому так писати не варто

const int A=12

int array[A];

Рекомендують користуватися символьними константами, тому що легко можна змінити потрібну розмірність.

Задання (ініціалізація масивів). 

Int a[4] = {1, 2, 3, 4}; еквівалентні

Int a[] = {1, 2, 3, 4]};

Можна задати менше елементів, ніж розмірність масиву, помилки не буде, але робити так не рекомендується. Задання більшого числа елементів, ніж розмірність, дасть помилку.

Масив – це засіб зберігання однотипних даних під одним іменем. При описі його можна задати, але це не обов’язково.

2 Постановка завдання

  1.  Ввести масив дійсних додатних і відємних чисел (розмірність - 12 елементів), знайти суму додатних чисел. Вивести суму на екран.
  2.  Ввести масив дійсних чисел (розмірність - 10 елементів). Утворити масив, кожен елемент якого дорівнює половині елементів даного масиву. Вивести сформований масив на екран.
  3.  Ввести масив цілих чисел (розмірність - 15 елементів). Сформувати масив, який починається з останнього елементу і відповідно закінчується першим, результат вивести на екран.
  4.  Ввести масив дійсних чисел (розмірність - 11 елементів). Порахувати кількість додатних елементів масиву, результат вивести на екран.
  5.  Ввести масив цілих чисел (розмірність - 8 елементів), значення всіх введених чисел, збільшити на два, результатуючий масив вивести на екран.
  6.  Ввести масив дійсних чисел (розмірність - 12 елементів). Порахувати кількість відємних елементів масиву, результат вивести на екран.
  7.  Ввести масив цілих додатних і відємних чисел (розмірність - 11 елементів), знайти суму додатних чисел. Вивести результат на екран.
  8.  Ввести масив дійсних чисел (максимальна розмірність - 12 елементів). Надрукувати на екрані номери та значення елементів масиву.

Ввести масив цілих додатних і відємних чисел (максимальна розмірність - 12 елементів), знайти суму додатних чисел. Вивести результат на екран.

Ввести масив цілих чисел (розмірність - 7 елементів). Утворити новий масив, кожен елемент якого в 2 рази більший. Надрукувати сформований масив.

Ввести масив цілих чисел (максимальна розмірність - 12 елементів). Утворити новий масив, кожен елемент якого збільшити на 20. Надрукувати сформований масив.

Ввести масив дійсних чисел (розмірність - 15 елементів). Утворити новий масив, кожен елемент якого зменшити на 10. Надрукувати сформований масив.

Ввести 2 масиви цілих чисел (розмірність - 7 елементів). Утворити новий масив, кожен елемент якого рівний різниці елементів заданих масивів. Надрукувати сформований масив.

Ввести 2 масиви цілих чисел (розмірність - 5 елементів). Утворити новий масив, кожен елемент якого рівний сумі елементів заданих масивів. Надрукувати новий масив.

  1.   Ввести масив цілих чисел (розмірність - 15 елементів), значення всіх введених чисел, збільшити в два рази, результатуючий масив вивести на екран.

3 Методичні вказівки

  1.  Уважно прочитати умову задачі. Визначити, що має бути отримано в результаті її розв'язку, які дані для цього потрібно ввести.
  2.  Використати оператори  циклів,  опрацювати відповідні масиви.
  3.  Оголошуючи масиви, враховувати задану максимально можливу кількість елементів. Дійсну кількість елементів, які будуть опрацьовуватись при кожній реалізації програми, вводити з клавіатури.
  4.  Розробити алгоритм розв'язку задачі, дати короткий опис основних кроків алгоритму.
  5.  Для вводу й виводу даних використати бібліотеку функцій    <stdіo.h>.
  6.  Вибір операторів для запису розгалужених процесів
  7.  Ввести текст програми. Звернути увагу на типи даних, що будуть використані в програмі.
  8.  Запустити програму на компіляцію. У випадку необхідності виправити синтаксичні помилки.
  9.  Запустити програму на виконання. У випадку необхідності виправити семантичні помилки. Результати роботи програми вивести на екран.

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

Завдання

  1.  Задати одновимірний масив дійсних чисел розмірністю 17.
  2.  Знищити перший елемент, який дорівнює 8. Одержаний масив вивести на екран.
  3.  Додати після кожного непарного елемента масиву елемент зі значенням. Одержаний масив вивести на екран.

Програма розв'язку

#include<stdio.h>

#include<conio.h>

#include<math.h>

float A[17]={5,4,6,8,5,6,8,9,1,2,4,4,3,9,8,7,4},B[17],C[34],n;

int i,k,l,m,j;

void main() { clrscr();

for(i=0,j=0;(i<17)&&(j<17);i++,j++)

if(A[i]==8) { k++; B[j]=A[i+1];} else if(k<1) B[j]=A[i]; else B[j]=A[i+1];

for(i=0;i<17;i++) printf("B[%d]=%1.0f\t",i,B[i]);

printf("\n");

for(i=0;i<17;i++) { n=fmod(B[i],2); if(n!=0) l++; }

for(i=0,j=0;(i<17)&&(j<(17+l));i++,j++)

{ n=fmod(B[i],2); if(n!=0) { C[j+m]=B[i];  C[j+m+1]=-8; m=m+1; } else

{ if(m<1) C[j]=B[i]; else C[j+m]=B[i]; } }

for(i=0;i<(17+l);i++) printf("C[%d]=%1.0f\t",i,C[i]);   }

Результати:

B[0]=5   B[1]=4   B[2]=6   B[3]=5   B[4]=6   B[5]=8   B[6]=9   B[7]=1   B[8]=2   B[9]=4   B[10]=4   B[11]=3   B[12]=9 B[13]=8   B[14]=7   B[15]=4

C[0]=5   C[1]=-8   C[2]=4   C[3]=6   C[4]=5   C[5]=-8   C[6]=6   C[7]=8   C[8]=9   C[9]=-8   C[10]=1   C[11]=-8   C[12]=2   C[13]=4   C[14]=4   C[15]=3   C[16]=-8   C[17]=9   C[18]=-8   C[19]=8   C[20]=7   C[21]=-8   C[22]=4

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

  1.  Що таке масив?
    1.  Яке значення має індекс 1-го елементу масиву
      1.  Які типи даних можна використати для опису масивів ?
        1.  Яке значення має індекс останнього елементу масиву, коли він має 67 елементів?
        2.  Яке значення має індекс 10-го елементу масиву?


Практична робота № 3

Тема: Написання програм з використанням власних функцій

Мета: Оволодіти основами структуризації програм, навчитись розробляти і використовувати власні функції.

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

Опис функції. Функції при використанні потрібно описувати. Опис функції називають прототипом функції. Синтаксис опису: (прототип функції)

Тип функції (значення, яке повертає функція) ім’я функції(тип арг1. імя-арг. 1, тип арг2. імя-арг.2, тип арг3. імя арг.3);

Оператор опису функції повідомляє компілятору функцію, яка буде визначена в програмі пізніше. Опис включає тип значення, яке повертає функція, ім’я функції і типи аргументів, які передаються в функцію. Оператор опису закінчується ;

Приклад float cube(float x);

Для того, щоб до функції можна було звернутися, у тому ж файлі повинно бути опис функції (прототип).

double line(double x1,double y1,double x2,double y2);

double square(double a, double b, double c);

Це прототипи функцій, описаних вище.

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

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

В описі функції імена аргументів необов’язкові, але в заголовку вони є .

Далі пишемо заголовок функції. Заголовок функції складається з 3-х частин:

  •  Тип повертаючого значення, який визначає тип даних, які повертаються з функції в викликаючу програму. Типи можуть бути будь-які, які розглядаються в мові. Можна описати функцію, яка не повертає ніякого значення, задавши пустий тип void. Приклад

void func(   )   /*нічого не повертає*/

  •  ім’я функції; Це звичайний ідентифікатор, воно має бути унікальне, тобто не співпадати ні з одним іменем змінної чи функції. Бажано давати ім’я таке, щоб воно відповідало виконуваній задачі.
  •  список параметрів, – це величини, які передаються у функцію. Елементи списку розділяються комами. Для кожного параметра вказується тип й ім'я.

Після заголовку йде тіло функції, яке містить виконувані оператори. Тіло повинно починатися з відкриваючої фігурної душки і закінчуватися закриваючою фігурною душкою. Якщо тип повертаючого значення - не void, то в тілі повинен бути хоч би один оператор return для повернення значення відповідного типу.

Приклад опису

float cube(float x);

Приклад визначення

float cube(float x)

{ float x_cube;

x_cube=x*x*x;

return x_cube}

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

Параметри функції.В багатьох функцій є аргументи-значення, які передаються в функцію при її виклику. Функції має бути відомий тип даних кожного аргументу. Інформація про типи приводиться в заголовку функції в виді списку параметрів. Для кожного аргументу список параметрів має відповідний пункт, який складається з типу даних і імені параметру. Якщо параметрів декілька, то вони відділяються комами.

Приклад заголовка функції void. func(int x, float y, char z). Список параметрів складається з описів int x, float y, char z , які декларують, що функція приймає три аргументи відповідних типів, представлені параметрами x, y, z.

Якщо функція не приймає аргументів, то список параметрів складається з одного слова Void, наприклад

int func(Void)

В кінці заголовка функції не ставиться ; , інакше буде помилка.

2 Варіанти індивідуальних завдань

  1.  Написати функцію, яка обчислює об’єм циліндра. Параметрами функції повинні бути радіус і висота циліндра. Використовуючи написану функцію, обчислити і вивести на екран об’єми двох циліндрів з радіусами основи 10 і 20, та  висотами – 15 і 100 відповідно. Вхідні дані ввести  з клавіатури, результат вивести на екран.
  2.  Написати функцію, яка знаходить мінімальне значення з чотирьох цілих чисел. Використовуючи написану функцію, знайти і вивести на екран мінімальне з чотирьох цілих чисел.
  3.  Написати функцію, яка визначає і повертає віддаль від початку координат до заданої точки з координатами (x, y) (параметрами функції є координати  точки). Використовуючи написану функцію, обчислити і вивести на екран відстані від початку координат до трьох заданих точок  З клавіатури ввести координати точок.
  4.  Написати функцію, яка обчислює процент від числа. Параметрами функції є задане число і процент. Використовуючи написану функцію, обчислити і вивести на екран 10% від числа 89, 23%  від 789 і 45% від 789.
  5.  Написати функцію, яка підносить до -ї степені дійсне число. Використовуючи написану функцію, обчислити і вивести на екран суму квадрату числа 34 і кубу числа 56.
  6.  Написати функцію, яка виводить на екран число 1, якщо задане ціле число додатне, і число 2, якщо задане число від’ємне 3, якщо число рівне 0. Використовуючи написану функцію, вивести на екран значення 5-ти заданих чисел, введених з клавіатури.
  7.  Написати функцію, яка підносить число до 3-ї степені. Використовуючи написану функцію, обчислити і вивести на екран  суму кубів  двох чисел, введених з клавіатури.
  8.  Написати функцію, яка обчислює площу повної поверхні циліндра. Параметрами функції є радіус і висота циліндра. Використовуючи написану функцію, обчислити і вивести на екран площу повної поверхні  циліндрів, радіуси основи яких рівні 19 і 45, а висоти – 3 і 8 відповідно. Радіуси і висоти ввести з клавіатури.
  9.  Написати функцію, яка обчислює площу бічної поверхні циліндра. Параметрами функції є радіус і висота циліндра. Використовуючи написану функцію, обчислити і вивести на екран площу бічної поверхні  циліндра , де радіус основи рівний 12, а висота – 13.  Радіус і висоту ввести з клавіатури.
  10.  Написати функцію, яка знаходить максимальне значення з чотирьох цілих чисел. Використовуючи написану функцію, знайти і вивести на екран максимальне з чотирьох цілих чисел.
  11.  Написати функцію, яка виводить на екран число 0, якщо задане число додатне, і число 1, якщо задане число від’ємне. Використовуючи написану функцію, вивести на екран  значення для заданих чисел  -100 і –56.
  12.  Написати функцію, яка обчислює проценти від числа. Параметрами функції є число і процент. Використовуючи написану функцію, обчислити і вивести на екран 19% від числа 899 і 45% від 789.
  13.  Написати функцію, яка повертає максимальне з трьох дійсних чисел, одержаних як аргументи. Використовуючи написану функцію, знайти і вивести на екран більше з трьох дійсних чисел.
  14.  Написати функцію, яка підносить до -ї степені дійсне число. Використовуючи написану функцію, обчислити і вивести на екран суму квадрату числа 39 і кубу числа 51.

3 Методичні вказівки

  1.  Перед написанням програми ще раз переглянути теоретичний матеріал і приклади програм, що ілюструють особливості застосування функцій у С-програмах. Окрему увагу звернути на способи передавання даних у функції.
    1.  Уважно прочитати умову задачі індивідуального завдання, продумати алгоритм її розв'язку. .
      1.  Обов'язковою для оформлення програми є функція, вказана в  індивідуальному завданні. В програмі можна використати й інші функції, якщо це сприятиме кращій структуризації програми.
        1.  Написати головну частину програми (головну функцію main() ), використовуючи в ній звертання до функцій відповідно до запропонованої структури програми. Визначити: які дані, в якому порядку і яким способом передаються у кожну функцію і як функція повертає у головну програму результати виконання.
        2.  Написати відповідну функцію (чи декілька функцій), звертаючи увагу на типи опису  параметрів.

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

Написати функцію, яка обчислює проценти від числа. Параметрами функції є число і процент. Використовуючи написану функцію, обчислити і вивести на екран 19% від числа 899 і 45% від 789.

Текст програми:

# include <stdio.h>

float prozent(float ch, float proz);  /* опис функції */

float l1, l2;

void main()

{

float x1=899, x2=789, p1=19, p2=45;

/*  Виклик функції  */

l1= prozent(x1,p1);

l2= prozent(x2,p2);

/*  Вивід  результату */

printf(“x1=%f\tp1=%f\tl1=%f\nx2=%f\tp2=%f\tl2=%f\n”);

}

float prozent(float ch, float proz)  /* заголовок функції */

{

float r1;

r1=(ch*proz)/100;

return r1;

}

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

  1.  Що називається функцією і чим вона характеризується?
  2.  Чи потрібно описувати функцію?
  3.  Що таке формальні і фактичні параметри?
  4.  Скільки операторів return може бути в функції?
  5.  Які складові частини функції?
  6.  Який синтаксис виклику функції?
  7.  Який синтаксис опису функції?


Практична робота № 4

Тема. Складання програм для опрацювання символьної інформації

Мета: Одержання навичок обробки символьної інформації і використання бібліотечних функцій для роботи з символьними рядками..

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

Робота з символьними змінними. Змінні типу char повинні бути описані до їх використання. При описі їх можна задавати.

char a, b, c;      char d=’x’;  при описі      d=’x’;       оператор присвоєння

Можна створювати іменовані символічні константи

const char a=’z’;    Використовуються одинарні лапки

Приклад програми для виводу змінної c1 в виді числа і в виді символа

printf(«%с», с1);   як символ               printf(«%d», с1);   як число.

Масиви символів (рядки). Опис. Рядки, які є послідовністю символів, задаються масивами символів. Синтаксис опису:  char string[10];  

В цьому масиві можна зберігати дев’ять  символів можна зберігати і менше символів. Чому в асиві, чкий містить 10 елементів, можна зберігати 9 символів.? В мові С рядки визначаються як послідовність символів, що закінчується нульовим символом. Нульовий символ - це спеціальний символ, який позначається \0. Хоч він записується в виді двох знаків (оберненої риски і 0) компілятор сприймає його як один символ, що відповідає коду ASCII ‘0’. Це є спеціальний символ мови С. В чому ж різниця між рядками і масивами символів? По означенню рядок –це послідовність символів з завершуючим символом \0  Масив по означенню являє собою послідовність символів. Тому рядок –це масив символів з завершуючим нулем.

Наприклад в рядку

fghhjkg є 7 символів і ще нульовий символ \0  -всього вісім.

Задання символьних масивів. Масиви можуть задаватися  при описі.

Char r[10]={‘a’,’b’,’c’,’d’, ‘\0’}; але вигідніше використовувати рядкові літерали, тобто послідовності символів в подвійних лапках.

Char r[10]=’’abcd’’;

Кожний раз, коли в програмі використовується рядковий літерал, компілятор автоматично додає нульовий символ в кінець рядка. Якщо при описі і заданні масиву символів опустити його довжину, то компілятор сам порахує довжину масиву по довжині літералу

Char r[]=’’abcd’’; В цьому рядку є масив з 5-ти елементів.

Для роботи з рядками існує бібліотека string.h. Приклади функцій для роботи з.

Функція

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

strcmp

int strcmp(const char *str1, const char *str2);

Порівнює рядки str1 й str2. Якщо str1< str2, то результат від’ємний, якщо str1 = str2, то результат дорівнює 0, якщо str1> str2, то результат додатний.

strcpy

char* strcpy(char*s1, const char *s2);

Копіює рядок s2 у рядок s1

strncpy

char *strncpy(char *s1, const char *s2, int kol);

Копіює kol символів рядка s2 у рядок s1.