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

Int dd[4][6]; //двовимірний масив

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

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

cout<<“\n\nдвовимірний масив”;

cout<<“\n “; for(j=0; j<6; j++) cout<<“ “<<I;

for(i=0; i<4; i++) {cout<<“\n “<<“ “<<I;

for(j=0; j<6; j++) cout<<“ “<<dd[i][j];};

cout<<“\nкількість елементів масиву dd=“

<< sizeof(dd)/ sizeof(int);

pause(0); //поділення результату на два кадри

сhar f[n]; //символьний масив

I=N ; cout<<“\n\nввести не більш “<<I; /*операції

ввід/вивід не реагує на директиву #define */

cout<<“ символів, при введенні”

<<“\nне робити пробілів між знаками \n”

cin>>f; //ввід рядка

cout<<“\nрядок символів\n”<<f; //вивід масиву f

cout<<“\nелемент масиву f №6 (з індексом 5)=<<“f[5];

cout<<“\nрозмір масиву f у байтах =“<<sizeof(f);

const int size=2;

const int size1=3;

const int size2=5;

double d[size][size1][size2]; //трьохвимірний масив

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

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

for (k=0;k<size2; k++)

cout<<‘ ‘<<d[i][j][k];

cout<<“\n”;

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

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

for (k=0;k<size2; k++)

cout<<‘ ‘<<d[i][j][k];

cout<<“\n кінець задачі”; pause(0); return 0;}

Оглядові запитання

  1. Який спосіб має назву передачі змінних у функцію за значенням?

  2. Який спосіб має назву передачі аргументів за посиланням?

  3. Що виконує функція swap? Намалюйте алгоритм її роботи.

  4. На що вказує символ & (амперсенд)?

  5. Куди задаються два аргументи (другий та третій) підпрограми?

  6. Які можливі три варіанта виклику функції з трьома аргументами?

  7. Для чого передбачені вбудовані функції, які визначені атрибутом inline?

  8. Що таке масив даних?

  9. Для чого слугують масиви?

  10. Скільки елементів оголошено в масиві int dd [4][6]?

  11. Як виконується ініціалізація масиву? Навести приклади.

Лабораторна робота № 12. Масиви та маніпулятори

Мета:

Здобути навики використання середовища розробки мови C++, створити проект, що пояснює застосування масивів та маніпуляторів, здобути навички написання програм.

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

Масив символів cel ініціалізовний при оголошенні без указаній кількості елементів й виведений у циклі do/while по елементам. До масивів застосовна операція sizeof. Зручно використовувати ту обставину, що кількість елементів масиву символів char співпадає з його розміром у байтах. У масиві cel2 оголошенні 8 елементів ініціалізовних тільки 6. До символьних масивів застосовна операція виводу cout<<, тому масив cel2 виведений за ім’ям, але автоматично виведені тільки ініціалізовані елементи. Операція sizeof визначила увесь зарезервований об’єм пам’яті (8 елементів по 1 байту).

При роботі з масивами треба не виходити за оголошені межи. За допомогою двократного застосування операції sizeof підрахована кількість елементів dd. Масиви типу char можна застосовувати для збереження рядка символів. Розмір масиву f при оголошені задається за допомогою директиви #define. Ввід рядка здійснюється з клавіатури. При спроби ввести більш символів, чим було об’явлено, комп’ютер “зависає”.

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

Окремі символи рядка є самостійними елементами масиву. Після виводу масиву f по імені окремо виведений елемент №6 (з індексом 5) та розмір масиву у байтах.

Розглянемо програму сортування елементів масиву.

Вихідний масив заданий за допомогою генератора випадкових чисел chr1.

if (array[k]>array[i])

{swap (array[i],array[k]); m++;};}

else

{if (array[k]>array[i])

{swap (array[i],array[k]); m++;};}

cout<<”\n “;

for (l=0; l<N; l++) cout<<array[l]<<’ ‘; // Вивід пром.

cout<<” “<<m; //результату

};

cout<<”\n кінець задачі”; pause(0); return 0; }

РЕЗУЛЬТАТИ ВИКОНАННЯ ПРОГРАМИ

Сортування від max до min здійснюється за таким алгоритмом. Перший елемент масиву (індекс 0) позачергово порівняється зі всіма наступними елементами. Коли якійсь елемент більш першого, то вони за допомогою програми swap міняються місцями і процес продовжується. У результаті обміну всіх елементів найбільший елемент масиву стає на першу позицію (з індексом 0).

Далі операція обміну значеннями повторюється для елемента з індексом 1 до останнього. Потім від елемента з індексом 2 і так далі. Сортування від min до max здійснюється аналогічно.

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

ПЕРЕЛІЧУВАЛЬНИЙ ТИП enum

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

enum MyType{BA, BL, G, PP, G1, FROG, K} mm, nn;

Така запис оголошує тип з ім’ям MyType. Одночасно робиться об’ява змінним mm та nn типу MyType. Змінну можна об’явити окремо у вигляді: MyType kk;

Ідентифікаторам - константам у фігурних дужках присвоюється значення натурального ряду від 0. Коли значення одного із ідентифікаторів задається явно, то наступним присвоюється номери за збільшенням на 1. Наприклад,

enum MyType{BA, BL, G = -5, PP, G1, FROG = 18, K} , то ідентифікатори будуть мати значення BA = 0, BL = 1, G = -5, PP = -4, G1 = -3, FROG = 18, K = 19;

Імена ідентифікаторів - нумераторів повинні відрізнятися від інших змінних, писатися з великої літери та починатися з великої букви. Ці ідентифікатори мають за замовчуванням атрибут const. Розглянемо правила використання типу enum на прикладі програми. Для визначення перелічувального типу month, у якості ідентифікаторів застосовані назви місяців, а для ініціалізації використовувані числа кількості днів у місяці. Одночасно з типом об’явлена змінна mm, якій потім присвоюється значення суми October + February. Друга змінна того ж типу об’явлена окремо з ініціалізацією:

month mon1=July;

Частина перелічувального типу ініціалізовані символами, але фактично вони ініціалізуються кодами цих символів. Для виявлення власне символу потрібно провести явне перетворення типів int→char.

ФОРМАТУВАННЯ ВИВОДУ. МАНІПУЛЯТОРИ

При звернені до cout<< визначається тип змінної в залежності від типу за замовчуванням виводиться:

  • символьна змінна – у вигляді символу на одній позиції;

  • ціле число – в десятковій системи числення ;

  • число з плаваючою точкою - в десятковій системи числення до 6 знаків. При виводі великих чисел cout<< автоматично переходить на наукову нотацію.

Розглянемо один із можливих в С++ способів форматування виводу – за допомогою маніпуляторів. Перелік найуживаніших маніпуляторів розглянутий у табл.1.3.

Таблиця 1.3. Маніпулятори

Замість маніпулятора setbase можна використовувати свій маніпулятор: dec –для десяткової, hex – для 16-річної, oct – для 8-річної.

** Коли число із заданою точністю не поміщається в заданому полі, довжина полю автоматично збільшується до мінімально потрібної.

*** Число 0 повертається до вигляду за замовчуванням.

**** Включений до iostream.h

Оглядові запитання

  1. Що виконує за допомогою двократного застосування операція sizeof?

  2. До яких масивів застосовна операція виводу cout<<?

  3. При введенні символів можна робити пробіли між знаками чи ні?

  4. За яким алгоритмом здійснюється сортування масиву від max до min?

  5. Коли застосовується тип enum і для чого?

  6. Що виводиться за замовчуванням при звернені до cout<< в залежності від типу змінної?

  7. Зробити перелік найуживаніших маніпуляторів.

  8. Що робиться коли число із заданою точністю не поміщається в заданому полі?

Лабораторна робота № 13. Робота з файлами і базами даних

Мета:

Здобути навики використання середовища розробки мови C++, створити проект, що пояснює роботу з файлами і базами даних, здобути навички написання програм.

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

Збереження даних у змінних та масивах є тимчасовим (до кінця програми). Для тривалого збереження призначені файли, що розміщені на запам’ятовуючих пристроях комп’ютера. Для роботи з файлами треба включити у програму заголовочний файл fstream.h.

ЗВЕРНЕННЯ ДО ФАЙЛІВ

ofstream filename (“name.box”, ios :: app);

Оголошення наказує: відкрити файл name.box з програмним ім’ям filename у режимі запису. При повторному звернені новий запис додає до існуючого (аргумент ios :: app). Ім’я у програмі (filename ) та ім’я файлу в ОС (name.box) формально ніяк не зв’язані. Розширення (.box) вибираємо довільно. Деякі можливі значення аргументу, визначають режим відкриття файлу, дані у табл.1.4. Аргументи можуть об'єднуватися оператором порозрядного ИЛИ |.

Таблиця 1.4. Режими звернення до файлів

* Стирається без попередження

** Можливо позиціонування в будь-яке місце файлу

Коли файл name.box раніше не існував, то при оголошенні він створюється:

ifstream filename(“name.box”);

Оголошення наказує: відкрити файл name.box з програмним ім’ям filename у режимі зчитування. Аргумент ios::in опущений, тому він встановлюється за замовчуванням: ifstream filename(“name.box”, ios :: in | ios :: out);

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

filename.close(); - розпорядження закрити файл

Новий файл name.box автоматично відкривається у тієї директорії, в яку був записаний виконуваний файл програми, що її відкрив. Файл для зчитування повинний бути записаний в одну директорію з виконуваним файлом програми, в якій наказується його відкрити. Коли програмісту не зручно таке розміщення, потрібно вказати повне ім’я файлу (з маршрутом).

Після наказу “відкрити файл” потрібно перевірити його виконання.

if (| filename){cout<<“file error”; hause(0); };

Коли файл не відкритий, функцією exit (1) у складі pause може зупинити виконання програми.

ФАЙЛИ ПОСЛІДОВНОГО ДОСТУПУ

Операція запису у файл (вивід, аналог cout<<);

filename<<a<<i<<‘$’<< “запис у файл”;

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

/* файл PERT!\FILE\1_45.cpp

Запис у файл. що створює базу даних */

#include “c:\CPP\SUBPROG\\roll.h”

#include “c:\CPP\SUBPROG\\ roll_txt.h”

#include <fstream.h> // для роботи з файлами

main () { clrscr();

ofstream base(“base1.box”, ios::app); //відкриття файла для запису

If (! base) {cout<<“file error”;

pause (0); }; //перевірка відкриття файлу

cout<<“ввести: власний номер, прізвище, баланс”<<end1;

cout<<“при закінчені ввести CTRL+z”<<end1;

//для номера використовують глоб. змінну num

сhar name [11]; // прізвище клієнта

float balance; //баланс

while(cin>>num>>name>>balance)

{cout<<“ввести дані”<<end1;

base<<num<<‘ ‘<<name<<‘ ‘<<balance<<end1; /*запис у файл*/ };

cout<<“ кінець запису”;

base.close(); // файл зачинений

pause(0); return 0; }

Програма відкриває файл base із вмістом у файлі base1.box, у режимі запису (оголошення ofstream ), з додаванням нових записів до існуючих (аргумент ios::app). Коли файл base1.box раніш не існував, то він створюється. Після відкриття файлу здійснюється перевірка успішного виконання цієї операції. Функція pause дозволяє програмісту по його бажанню зупинити або продовжити виконання програми. На екрані виводяться вказівки оператору про порядок введення даних. Для закінчення запису даних застосовується маркер кінця файлу EOF (end of file), який водиться сполученням клавіш Ctrl+z. Запис (вивід у файл) здійснюється у структурі повторення while, де у якості умови застосовується операція ввід з клавіатури cin>>, яка задає значення змінним num, name, balance. Операція base<< здійснює вивід (запис) у файл подібно виводу на екран cout<<. Маркер EOF відображається, як ^Z (у деяких версіях компілятора – не виводиться на екран). При закінчені запису файл base1.box закривається.

Для розміщення програмних та створених текстових файлів передбачена окрема директорія PART1\FILE. Розглянемо програму для зчитування (вводу) із файлу, де ім’я файлу в ОС вводиться директивою #define.

Програма відкриває файл base1.box для зчитування (об’явою ifstream). Програмні імена файлів у програмах запису та зчитування ніяк не пов’язані і вибрані однаковими (base) тільки для зручності.

Зчитування і присвоєння змінних num, name, balance здійснюється в умовах структури while. Операція зчитування (вводу) із файлу base>> подібна операції вводу cin>> з клавіатури. Значення зчитаних змінних виводиться на екран. Структура while закінчує роботу при досягненні кінця файлу, з котрого вона зчитує дані.

РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ

Дві описані програми (запису та зчитування) здійснюють послідовний доступ до файлу. Файли з послідовним доступом зручні для накопичування даних.

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

ФАЙЛИ ДОВІЛЬНОГО ДОСТУПУ

У файлах довільного доступу дозволяється здійснювати запис та зчитування, починаючи з будь-якого місця (позиції) у файлі. Позиціонування проводиться функціями seekp для запису (seek – шукати, put – класти) та seekg - для зчитування (get – отримувати) з аргументом, який визначає номер позиції у байтах. Відлік від початку файлу задається за замовчуванням. Запис реалізує функція write (писати), зчитування – read (читати) – обидві з двома аргументами, які визначають змінну та її розміри у байтах.

filename. seekp (n); filename.write ((char*)&t, sizeof (t));

Визначають: встановити позицію для запису на n-ий байт від початку файлу filename та записати значення змінної t з розміром sizeof (t) байтов, починаючи від позиції n уперед.

filename. seekg (m); filename.read ((char*)&a sizeof (a));

Визначають: встановити позицію для зчитування на m-ий байт від початку файлу filename та присвоїти змінної а значення, що записано від позиції m на sizeof (a) позицій уперед.

Читання та запис завжди здійснюються уперед, починаючи з заданої позиції.

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

Програма, що здійснює розмітку файлу base1.box для бази даних на 100 абонентів (100 комірок), записуються нулі на ділянки, які визначені для власного номера (int) та значення балансу (float), а також по 10 зірочок (11-й,

службовий, знак додає сам комп’ютер) на ділянці для імені клієнту.

Розглянемо програму 1_50.

/* файл PART1\FILE\1_50.cpp

Розмітка файлу довільного доступу*/

#include “c:\CPP\SUBPROG\\roll.h”

#include “c:\CPP\SUBPROG\\ roll_txt.h”

#include <fstream.h> //для роботи з файлами

#define FILE “base2.box”

main () { clrscr();

ofstream base(FILE); /* відкриття файлe для запису зі стиранням попередньої за замовчуванням */

if (! base) {cout<<”file error”;

pause(0);}; //перевірка відкриття файлу

cout<<“ розмітка файлу на 100 абонентів”<<end1;

num=0; //для номера застосовуємо глоб. змінну num

char name[ ]={“**********”};/*прізвище клієнта, 10 символів*/

float balance=o.00; //баланс

cout<<“ \nабонент №1\n”;

for (i=1; i<=100; i++) { //ввід порожніх значень

base.write ((char*)&num, sizeof(num));

base.write ((char*)&name, sizeof(name));

base.write ((char*)&balance, sizeof(balance));

If (i==1)cout<<num<<name<< balance;};

cout<<“\nкінець розмітки”;

base.close(); //файл закритий

pause(0); return 0;}

РЕЗУЛЬТАТ ВИКОНАННЯ ПРОГРАМИ розмітка файлу на 100 абонентів

Оглядові запитання

  1. На що вказує оголошення?

  2. Як описуються режими звернення до файлів?

  3. Який аргумент додає новий запис при повторному звернені до існуючого?

  4. Що може зробити функцією exit (1) у складі pause, коли файл не відкритий?

  5. Яким типом може бути файл для запису (зчитування) за замовчуванням?

  6. Яким сполученням клавіш водиться маркер кінця файлу EOF (end of file)?

  7. Для чото застосовується операція cin>>, що вводиться з з клавіатури?

  8. Що здійснює операція base<<?

  9. Для чого передбачена окрема директорія PART1\FILE?

  10. Для чого зручні файли з послідовним доступом?

  11. Що реалізує запис функцій write та read, та що визначають їх аргументи?

Лабораторна робота № 14. Початкове заповнення бази даних з клавіатури

Мета:

Здобути навики використання середовища розробки мови C++, створити проект, що пояснює початкове заповнення бази даних з клавіатури, здобути навички написання програм.

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

Розглянемо програму призначену для початкового (після розмітки) заповнення бази даних з клавіатури.

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

Розглянемо програму зчитування даних із файлу base2.box та запис їх у текстовий файл report.box.

У програмі підраховується також кількість заповнених та порожніх комірок та сумарний баланс. На екран при виконанні програми у файл report.box виводяться тільки заповнені комірки.

РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ

ДИРЕКТИВИ ПРЕПРОЦЕСОРУ

Використання директив препроцесору (таких як: #include ), обов’язково у програмі. Усі директиви починаються зі знаку п, котрому в рядку може передувати тільки пробіли. Після директиви знак ; не ставиться. Розглянемо найуживаніші директиви.

  • #define – директива, що вказує на заміну ідентифікатора у програмі числовою або текстовою константою. Коли ідентифікатор замінюється деякою послідовністю дій, він має назву макрос (макровизначення)..

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

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

  • ## - визначає операцію, яка здійснює “склейку” лексем. Наприклад, #define SS(x, y) при виклику SS(a, 5) утворює ідентифікатор а5.

  • # - визначає операцію, що перетворює підставлену лексему у символьний рядок. Використовується тільки у макросі з аргументом. Приклад, директива # define HELLO(x) cout<<“Привіт, “ #x

у тексті програми підставити замість HELLO (приятель) рядок

cout<<“Привіт, “ “приятель”

Рядок, що розділений пробілом, при попередній обробці “склеюється”, і в результаті отримуємо: cout<<“Привіт, приятель”;

  • # undef - директива, яка відміняє дію поточного визначення # define . Структура директиви має вигляд: # undef пробіл ідентифікатор

Таким чином, область дії символьної константи або макросу починається від місту їх визначення # define та закінчується містом відміни # undef

  • # include – директива, що включає у програму файли:

# include пробіл <ім’я файлу>

# include пробіл “ім’я файлу”

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

Директиви препроцесору організують режими умовної компіляції.

  • вже відоме сполучення директив:

#ifndef WORD

# define WORD

…………………

#endif

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

Аналогічно можна виключити повторне визначення констант:

#ifndef e

#definef e 2.71828

#endif

Ifndef – скорочений запис виразу if !define (коли не визначено).

  • для перевизначення констант можна використовувати набір директив:

#ifdef e

#undef e

#definef e 1828

#endif

Ifdef – скорочений запис виразу if defined (коли визначено). Кожна директива #if повинна супроводжуватися своєю #endif.

Операції приведення типів, sizeof та константи enum не повинні приймати участь у виразах, обчислюваних у директивах препроцесору.

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

# if 0

Фрагмент програми, що виключається

#endif

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

Можна використовувати варіант:

#ifdef DB

Фрагмент програми, що виключається

#endif

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

Обробка програми препроцесором здійснюється до компіляції. Виконуються усі підстановки, а рядки, що містять #define та #undef, замінюються і стають порожніми. На місце рядків # include підставляється вміст файлу, що включається. Виконується обробка директив умовної компіляції, а рядки, їх вміст, замінюються порожніми. Порожніми замінюються також рядки, вміст яких виключається у процесі умовної компіляції.

Оглядові запитання

  1. Що робить операцію розмітки, коли її застосувати до заповненої бази даних?

  2. Чи використання директив препроцесору (таких як: #include ), обов’язково у програмі?

  3. Після директиви знак ; ставиться чи ні?

  4. Чим відрізняється функціонально макрос від вбудованій функції?

  5. Чи приймають участь у виразах, обчислюваних у директивах препроцесору, операції приведення типів, sizeof та константи enum?

  6. Що достатньо змінити для включення фрагмента у процес компіляції?

  7. Коли здійснюється обробка програми препроцесором?

Лабораторна робота № 15. Налагодження програми та виконання контрольної роботи № 1

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися з процесом по налагодженню програми, надати відповіді на запитання контрольної роботи №1.

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

Розглянемо деякі корисні прийоми налагодження програми.

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

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

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

  4. Після компіляції не потрібно відразу виправляти усі помилки. Часто одні помилки провокують інші. Потрібно виправляти очевидні й повторювати компіляцію.

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

  6. У процесі налагодження можна локалізувати окремі блоки директивами або дужками коментаря. Не всі версії компілятора дозволяють застосовувати вкладені коментарі типу /*…// …*/.

  7. Не слід економити на дужках. Вони роблять програму більш зрозумілою та вносять визначеність у сумнівних випадках.

  8. Не існує ніяких гарантій (крім самоконтролю), що програміст правильно використовує типи даних та що дані не суперечливі.

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

  10. Необхідно заздалегідь перевірити можливість поділу на нуль і передбачити обхід особливої точки. Ці помилки не фіксуються при компіляції, але припиняють виконання програми. Повідомлення про ділення на 0 можна побачити при погашених панелях nc та bc або у спеціальному повідомлені (під Win).

  11. Необхідно заздалегідь перевірити можливість «зациклівання». Ця помилка також не може бути виявлена при компіляції, і вона не зупиняє виконання програми. При налагоджуванні програми корисно передбачити вивід на екран або у файл контрольних міток або після фіксованої кількості циклів використати примусове переривання break. Такі прийоми дозволяють зафіксувати місце без кінцевого циклу у програмі.

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

  13. Коли зміна у процесі виконання програми присвоює значення, яке перевищує заданий формат, то виникає помилка – «переповнення»,котре не фіксується при компіляції (при виконанні програми може бути видано відповідне повідомлення). У результаті змінній присвоюється невідоме помилкове значення. Потрібно бути уважним при об’яві змінних і по можливості прогнозувати порядок їх величин. Корисно виводити проміжні контрольні результати розрахунків.

  14. При роботі з масивами потрібно уважно слідкувати за тим, щоб не вийти за об’явлені межі масиву. Коли ініціалізуються не усі елементи масиву, то ні ініціалізовані – ігноруються (у деяких компіляторах автоматично записуються нулі).

  15. Коли при розв’язані задачі потрібно попередньо присвоїти нулі змінної або масиву, краще це зробити у програмі, не сподіватися на ініціалізацію за замовчуванням.

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

  17. Імена у директивах не слід використовувати у будь-якій якості у власних програмах. Ці імена у різних заголовочих файлах не повинні повторюватися.

  18. Не треба без потреби використовувати глобальні змінні у бібліотечних функціях, тому що при цьому важко контролювати усі їх зміни. Виняток складають константи і спеціальні (адресно) об’явлені глобальні змінні.

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

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

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

  22. Не стоїть шукати «кремезну» логіку у всіх правилах мови. Треба ці правила виконувати.

  23. Компілятор – це програма, котру можна кваліфікувати як багатовимірну систему з великою ступеню свободи. Тому важко передбачити його реакцію на ваші дії. Потрібно підходити до компілятору з позиції дослідника, але при цьому безумовно треба виконувати запропоновані правила, уникати помилок і «зависання» комп’ютера.

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

  25. «Золоте правило програміста!» – шукай помилку у себе в програмі.

КОТРОЛЬНА РОБОТА № 1.

Вона складається з питань, що надані у лабораторних роботах з №1  по № 14 та має три запитання, які надає вам викладач.

Обов’язковим першим запитанням є із оглядових питань з лабораторних робіт № 1 і № 2.

Другим є теоретичне запитання із оглядових питань лабораторних робіт № 3 – № 14.

Третє є виконання однієї із програм лабораторних робіт № 3 – № 14.

ПІСЛЯМОВА ДО ПОПЕРЕДНІХ ЛАБОРАТОРНИХ РОБІТ

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

  2. Друга дозволяє вам вивчити основні типові фрагменти побудови блок-схем алгоритмів, що є основою побудови програм.

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