- •О.Ф.Тарасов, о.В.Алтухов
- •1 Заняття № 1 Вивчення інтегрованого середовища с
- •1.1 Теоретичні відомості
- •1.2 Хід роботи
- •1.3 Вимоги до звітів
- •1.4 Питання для контролю і самостійної роботи
- •2 Заняття № 2 Функції введення/виведення даних printf( ), scanf( ). Лінійні обчислювальні процеси
- •2.1 Теоретичні відомості
- •2.2 Хід роботи
- •2.3 Індивідуальне завдання до заняття №2
- •2.4 Питання для контролю і самостійної роботи
- •3 Заняття № 3 Розробка програм зі скалярними типами даних
- •3.1 Теоретичні відомості
- •Приклад
- •3.2 Хід роботи
- •3.3 Індивідуальне завдання до заняття № 3
- •3.4 Питання для контролю і самостійної роботи
- •4 Заняття № 4 Розробка програм з циклічними обчислювальними процесами
- •4.1 Теоретичні відомості
- •Алгоритм роботи оператора циклу for ( )
- •4.2 Хід роботи
- •4.3 Індивідуальне завдання до заняття № 4
- •4.4 Питання для контролю і самостійної роботи
- •5 Заняття № 5
- •Розгалуження обчислювального процесу.
- •Оператори, які реалізують розгалуження: if... Else, switch,
- •Умовна операція ( ? : )
- •5.1 Теоретичні відомості
- •Умовна тернарна операція ( ? : )
- •Оператор варіанта switch
- •Приклад
- •5.2 Хід роботи
- •5.3 Індивідуальне завдання до заняття № 5
- •5.4 Питання для контролю і самостійної роботи
- •6 Заняття № 6 Операції с, їхні пріоритети і використання. Перетворення типів
- •Пріоритет операцій і порядок виконання (асоційованість)
- •(Новий_тип) Операнд
- •Приклад
- •6.2 Хід роботи
- •6.3 Індивідуальне завдання до заняття № 6
- •6.4 Питання для контролю і самостійної роботи
- •7 Заняття № 7
- •7.1 Теоретичні відомості
- •Оголошення функцій (створення прототипів)
- •([ Список_типів_параметрів ])
- •Синтаксис визначення функцій
- •[ Return Значення_типу_що_повертається ]
- •Використання локальних і глобальних перемінних у функціях. Виклик функції
- •Приклад
- •7.2 Хід роботи
- •7.3 Індивідуальне завдання до заняття № 7
- •7.4 Питання для контролю і самостійної роботи
- •8 Заняття № 8
- •8.1 Теоретичні відомості
- •Основні операції з покажчиками
- •Покажчики і цілі величини
- •Динамічне розміщення покажчиків у пам'яті
- •Приклад
- •Приклад
- •8.2 Хід роботи
- •8.3 Індивідуальне завдання до заняття № 8
- •8.4 Питання для контролю і самостійної роботи
- •9 Заняття № 9
- •9.1 Теоретичні відомості
- •Приклад
- •9.2 Хід роботи
- •9.3 Індивідуальне завдання до заняття №9
- •9.4 Питання для контролю і самостійної роботи
- •10 Заняття № 10
- •10.1 Теоретичні відомості
- •Приклад
- •10.2 Хід роботи
- •10.3 Індивідуальне завдання до заняття № 10
- •10.4 Питання для контролю і самостійної роботи
- •Заняття №11 Обробка символьних даних
- •Теоретичні відомості
- •Індивідуальне завдання до заняття №11
- •Питання для контролю і самостійної роботи
- •Приклад
- •Хід роботи
- •Питання для контролю і самостійної роботи
- •Теоретичні відомості
- •Приклад
- •Індивідуальне завдання до завдання №13
- •Питання для контролю і самостійної роботи
- •Заняття № 14 Розробка програм зі складеними типами даних
- •Структури
- •Хід роботи
- •Питання для контролю і самостійної роботи
- •Заняття № 15 Використання покажчиків для роботи зі складеними типами даних (2години)
- •Теоретичні відомості
- •Приклад
- •Хід роботи
- •Питання для контролю і самостійної роботи
- •Використання покажчиків для роботи з функціями
- •Покажчики як параметри функції
- •[Const ] Тип * Ім'я_покажчика
- •Приклад
- •Хід роботи
- •Індивідуальне завдання до заняття №16
- •Питання для контролю і самостійної роботи
- •Використання функцій високого і низького рівня для роботи з потоками (файлами)
- •Функції для роботи з файлами
- •Хід роботи
- •Індивідуальне завдання до заняття №17
- •Питання для контролю і самостійної роботи
- •Розробка програм із багатофайловою структурою. Заголовочні файли. Класи пам'яті перемінних і функцій
- •Керування многофайловими проектами
- •Використання адміністратора проектів
- •Приклад
- •Основний файл проекту
- •Заголовний файл
- •Хід роботи
- •Індивідуальне завдання до заняття №18
- •Питання для контролю і самостійної роботи
- •Графічні функції
- •Графічні примітиви
- •Хід роботи
- •Індивідуальне завдання до заняття №19
- •Питання для контролю і самостійної роботи
- •Заняття№20 Розробка програм з використанням класів
- •Теоретичні відомості
- •Оголошення і визначення класу
- •Тіло класу
- •Інкапсуляція. Керування доступом до членів класу
- •Використання даних-членів класу
- •Хід роботи
- •Індивідуальне завдання до заняття №20
- •Питання для контролю і самостійної роботи
- •Заняття№21 Використання конструкторів і деструкторів у класах
- •Теоретичні відомості
- •Ініціалізація об'єктів класу
- •Деструктори
- •Виклик деструкторів
- •Хід роботи
- •Питання для контролю і самостійної роботи
- •"Друзі" класів (friend)
- •Хід роботи
- •Індивідуальне завдання до заняття №22
- •Контрольні питання для підготовки і самостійної роботи
- •Віртуальні базові класи
- •Віртуальні деструктори
- •Хід роботи
Питання для контролю і самостійної роботи
Приведіть приклади оголошення масивів з різною розмірністю. Поясніть організацію розміщення елементів масиву у пам’яті.
Як відбувається масштабування при послідовному разіменуванні покажчика-імені масиву у процесі доступу до елементів ? Які синтаксичні конструкції можна використовувати для доступу до елементів масиву ?
Приведіть загальну формулу для масиву Тип Ім'я [N][M][K] при доступі до заданого елемента Ім'я [ i ][ j ][ k ] і поясніть її.
Як здійснюється ініціалізація багатомірних масивів ?
Чи залежить ініціалізація масиву від класу пам'яті при оголошенні ?
Як використовувати засіб typedef для оголошення типу масиву ?
Який з індексів можна не вказувати при явній ініціалізації масивів ?
Чи можна вказувати не всі елементи при ініціалізації ? Як можна використовувати дужки при ініціалізації ?
Який індекс масиву не використовується при розрахунку переміщення покажчика в процесі доступу до елемента масиву ?
Для чого використовується зазначений індекс ?
Заняття № 14 Розробка програм зі складеними типами даних
(2години)
Ціль роботи: виробити практичні навички в написанні програм з використанням комбінованих типів даних.
Теоретичні відомості
Структури
С підтримує визначений користувачем складений тип, що оголошується з ключовим словом struct, що визначає структури. Ці структури подібні записам, які використовуються в інших мовах програмування. Структура містить дані-члени, що є даними базових типів, або є попередньо оголошеними структурами. Структури не можуть містити структури свого типу, але можуть містити покажчики на такі структури.
Оголошення структур
У С ключове слово struct використовується не тільки для оголошення об'єктів структурного типу, але і для оголошення нового (структурного) типу. Оголошений тип структури можна використовувати для оголошення об'єктів структурного типу.
Представимо загальний синтаксис для оголошення структур і приведемо кілька прикладів структур.
Таблиця 14.2 - Загальний синтаксис і приклади оголошення структур
Загальний синтаксис оголошення структури |
Приклади оголошення структур |
|
struct <Тип_структури> { <Тип1> <Ім'я_даного1>; [<Тип2 > <Ім'я_даного2>;] [ //Інші дані-члени ] } [Ім'я_структури1, Ім'я_структури2, …]; //Оголошення типу структури і необов'язкове оголошення об'єктів-структур |
struct Point { float x; float y; } Apoint, Bpoint, *Ppoint, Mpt[10]; //Оголошення типу й об'єктів: дві структури, покажчик і масив |
struct Person {char firstn[12]; char lastn[15]; int birthday; float weight; }; //Оголошення типу структури |
Після оголошення типу (<Тип_структури>), його можна використовувати для оголошення об'єктів, наприклад
Point Astr, Mstr[5], *pstr;
Оголошено об'єкти структурного типу Point: Astr- структура; Mstr[5]- масив з 5-ти структур; pstr- покажчик на структуру даного типу.
Структура типу Point має два даних - членів типу float.
Структура типу Person - містить дані-члени, які є масивами: firstn[ ]- масив з 12 символів, у якому зберігається ім'я; lastn[ ]- масив з 15 символів, у якому зберігається прізвище; birthday – перемінна типу int, у якій зберігається рік народження; weight - перемінна типу float, у якій зберігається вага.
Оголошення структур-перемінних (об'єктів структурного типу) не відрізняється від оголошення перемінних з базовими чи попередньо визначеними типами. Приклади оголошення об'єктів (перемінних) структурного типу:
sttype structVar; //Оголошення перемінної типу sttype
sttype stArray[Kol_elem]; //Оголошення масиву структур sttype
Point Origin, StartPoint, Points[10]; //Оголошення об'єктів (перемінних)
Person You, Me, Us[30], *PYou; //структурних типів
У цьому прикладі оголошені перемінні-структури: structVar , Origin, StartPoint типу Point, масив Points [10], що має 10 елементів - структур типу Point, перемінні Me і You типу Person, масив Us [30], що має 30 елементів- структур типу Person і покажчик на тип Person.
С дозволяє виконувати явну ініціалізацію даних-членів структур. Ініціалізація здійснюється подібно ініціалізації масивів і відповідає тим же правилам. Загальний синтаксис для ініціалізації даних-членів структури
<Тип_структури> Ім'я_структури = { <Значення1>, <Значення2>, };
Компілятор привласнює <Значення1> першому даному-члену структури Ім'я_структури, <Значення2> - другому даному-члену цієї структури і т.д. С вимагає дотримання наступних правил :
Значення, що привласнюються, повинні бути сумісні з відповідними їм даними-членами по типу, діапазону і кількості (для масивів).
Можна повідомляти меншу кількість значень, що привласнюються, ніж кількість даних в структурі. Компілятор привласнює нулі іншим даним- членам структури.
Не можна вказувати більше значень, що привласнюються, ніж кількість даних-членів.
Значення зі списку ініціалізації послідовно привласнюються даним-членам вкладених структур і масивів.
Приклад ініціалізації структури
Point fPoint = {12.4, 34.5};
У цьому прикладі оголошена перемінна fPoint типу Point і ініціалізовані її дані-члени х = 12.4, у = 34.5 відповідними значеннями.
Доступ до даних-членів здійснюється за допомогою операції ( .) "крапка".
Таблиця 14.2 - Загальний синтаксис і приклади доступу до даних-членів структури
Загальний синтаксис для доступу до даних-членів структури |
Приклади доступу до даних - членів структури |
<Ім'я_структури> . <Дане_член>; |
Point MyPt, mp[5]; //Оголошення MyPt . x = 10.9; //Доступ до х MyPt . y = 21.89; //Доступ до y mp[2] . x = 2.96; //Доступ до х mp[2] . y = 1.89; //Доступ до y |
Оголошена структурна перемінна MyPt типу Point, доступ до її даних-членів х, у здійснюється за допомогою виражень ( MyPt . x ) і ( MyPt . y ) відповідно; mp[5] – масив з 5-ти структур також типу Point. Доступ до даних-членів х, у структури у масиві здійснюється за допомогою виражень ( mp[2] . x) і ( mp[2] . y ) відповідно.
Приклад
/* ЗАНЯТТЯ N 14
Розробив Петров О.Д.
Оголосити складені типи даних: структуру, масиву структур, виконати їхню ініціалізацію. Ініціалізацію масиву структур виконати з
використанням операторів організації циклу. Одержати доступ
до елементів структур. Вивести значення елементів масиву
структур на екран із застосуванням спеціальної функції. */
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <alloc.h>
#define N 20
#define M 5
typedef struct Adr //Adr -тип структури
{ char town[N]; char *country;
char region; float indeks; int kolvo;
} adr; //adr - теж тип структури (синонім Adr)
//input_st( ) - функція для ініціалізації структури типу adr
adr input_st(char *town, char *coun, char reg, float ind, int kol);
void print_st(adr adr3); //Функція виведення елементів структури
int main(void)
{ clrscr( ); int a; float f1;
char str[125]; //Буфер для введення рядка символів
adr adress[M]; //Масив структур
adr adr1, adr2 = {"Kiev", "Ukr", 'r', 12.3, 15}; //Явна ініціалізація
adr1 = adr2; //Ініціалізація adr1 присвоюванням
printf("Виведення елементів структури ");
print_st( adr1 ); //Виведення adr1
adr1= input_st( "Kr", "Ukr", 't', 134.5, 2); //Ініціалізація adr1
printf("Виведення елементів структури ");
print_st( adr1 ); //Виведення adr1
int і = 0, j;
while (a && і < M) //Введення елементів масиву структур
{ printf("Введення міста (char array[N]) ");
scanf("%s", &adress[ і ] . town); fflush(stdin);
printf("Введення країни (char *) ");
scanf("%s", str); fflush(stdin);
adress[ i ] . country = (char *)malloc(strlen( str ) + 1);
strcpy(adress[ i] . country, str);
//adress[ і ] . country = strdup( str ); //Можливий варіант ініціалізації.
printf("Введення коду регіону (char) ");
scanf("%c", &adress[ і ] . region); fflush(stdin);
printf("Введення цифрового коду (float) ");
scanf("%f", &f1); fflush(stdin);
adress[і].indeks=f1;
printf("Введення кількості (int) ");
scanf("%і", &adress[ і ] . kolvo); fflush(stdin);
printf("\n\t\t\t Продовжити введення ? y/n : ");
char c = getche( ); printf("\n");
if (c = = 'n' || c = = 'N' ) a = 0;
і ++;
} //end while
printf("Виведення елементів структур \n ");
j = i;
for(i = 0; i < j; i ++) print_st( adress[ i ] );
getche( );
return 0;
} //end main( )
adr input_st(char *t, char *c, char r, float f, int k)
{ adr ad; //Оголошення локальної структури
strcpy(ad . town, t); //Копіювання "t" у "ad . town"
ad . country = (char *)malloc( strlen( c ) + 1 ); //Виділення пам'яті
strcpy(ad . country, c); //Копіювання "c" у "ad . country"
// ad . country = strdup( c ); //Можливий варіант ініціалізації
ad . region = r; ad . indeks = f; ad . kolvo = k;
return ad; //Повернення структури з функції
} //end input_st( )
void print_st(adr adr3) //Функція виведення елементів структури
{ printf("| %s ", adr3 . town);
printf("| %s ", adr3 . country);
printf("| %4c | %10f | %6i | \n", adr3 . region, adr3 . indeks, adr3 . kolvo);
} //end print_st( )
/*Виведення елементів структури | Kiev | Ukr | r | 12.300000 | 15|
Виведення елементів структури | Kr | Ukr | t | 134.500000| 2|
Введення міста (char array[N]) Don
Введення країни (char *) Ukr
Введення коду регіону (char) t
Введення цифрового коду (float) 45.67
Введення кількості (int) 8
Продовжити введення ? y/n : y
Введення міста (char array[N]) Khar
Введення країни (char *) Ukr
Введення коду регіону (char) g
Введення цифрового коду (float) 67.84
Введення кількості (int) 4
Продовжити введення ? y/n : n
Виведення елементів структур | Don | Ukr | t | 45.669998 | 8 |
| Khar | Ukr | g | 67.839996 | 4 | */
