Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторний практикум.doc
Скачиваний:
1
Добавлен:
10.07.2019
Размер:
275.46 Кб
Скачать

5. Бiблiотека стандартних функцiй

Мова Сi характерна наявнiстю порiвняно великоє кiлькостi стан-

дартних функцiй. Це функцiє вводу-виводу, математичнi, обробки

даних лiтерного типу, графiчнi, обробки помилок. Звертання до фу-

нкцiє здiйснюїться шляхом вказання у вiдповiдному мiсцi програми

єє iменi, пiсля якого в круглих дужках даїться перелiк парамет-

рiв. Кожна функцiя повертаї якесь значення - результат єє викона-

ння. Для того, щоб функцiя могла бути використаною, до програми

повинен бути пiд'їднаним за допомогою директиви препроцесору #in-

clude файл, де ця функцiя описана. В кожнiй з лабораторних робiт

даного практикуму даїться перелiк та опис функцiй i єх парамет-

рiв, якi там використовуються.

При роботi в середовищi Turbo C 2.0 перелiк та опис всiх наяв-

них тут функцiй можна переглянути, виконавши програму thelp.com.

12

Допомога викликаїться на екран клавiшею 5 на додатковiй цифровiй

клавiатурi, єє перегляд виконуїться шляхом вибору за допомогою

курсора вiдповiдного напису. Наприклад, для того, щоб добратися

до опису параметрiв функцiє sin(), необхiдно вибрати написи:

Header files, math.h, sin у вказанiй тут послiдовностi.

6. ОПЕРАЦIЄ

За кiлькiстю операндiв операцiє подiляються на унарнi, бiнарнi

i тренарнi. Вони поданi в таблицi 5.

Порядок виконання бiльшостi операцiй пояснення не потребуї.

Тренарна операцiя виконуїться так: якщо значення операнд1=0,

то результат = операнд3, iнакше - операнд2. Операцiя ++ збiльшуї

операнд на одиницю, наприклад, в результатi виконання операторiв

int i=3; i++; одержимо i=4. Операцiє арифметичних дiй з присвоїн-

ням означають практично двi операцiє, наприклад, нарощення змiн-

ноє s на 2,3 можна виконати так: s+=2.3; або s=s+2.3. Результатом

операцiє sizeof ї об'їм пам'ятi об'їкта в байтах, наприклад, при

float alfa; sizeof(alfa)=4. Також, siseof(float)=4.

7. ВИРАЗИ

За призначенням вирази в Сi можуть бути арифметичнi i симво-

льнi. Арифметичний вираз складаїться з традицiйних в iнших алго-

ритмiчних мовах арифметичних операцiй, констант, змiнних, функцiй

i круглих дужок. Крiм них, вiн може мiстити логiчнiчнi операцiє

та операцiє вiдношень, символи та всi унарнi операцiє. Результа-

том виконання логiчних операцiй та операцiй вiдношення в Сi ї цi-

лi числа. Символи типу char, включенi в арифметичний вираз, спри-

ймаються як коди цих символiв i мають тип int.

13

Символьнi вирази включають в себе рядки символiв та знаки до-

давання i вiднiмання.

Таблиця 5

┌──────┬───────────────────────┬──────┬─────────────────────────┐

│Опера-│ Найменування │Опера-│ Найменування │

│ цiє │ операцiй │ цiє │ операцiй │

├──────┼───────────────────────┼──────┼─────────────────────────┤

│ Унарнi: │

│ +,- │ Унарний плюс, мiнус │ & │ Адресацiя об'їкта │

│ │ Зворотнiй код (тiльда)│ * │ Непряма адресацiя │

│ ! │ Логiчне заперечення │sizeof│ Розмiр типу в байтах │

│ ++ │ Збiльшення на одиницю │ -- │ Зменшення на одиницю │

│ Бiнарнi: │

│ +,- │ Додавання, вiднiмання │ *,/ │ Множення, дiлення │

│ % │ Залишок вiд дiлення │ , │ Послiдовне виконання │

│ << │ Зсув улiво │ >> │ Зсув управо │

│ >,< │ Бiльше, менше │ && │ Логiчне "I" │

│ >= │ Бiльше або дорiвнюї │ || │ Логiчне "АБО" │

│ <= │ Менше або дорiвнюї │ & │ Порозрядне "I" │

│ == │ Дорiвнюї (порiвняння) │ | │ Порозрядне включне "АБО"│

│ != │ Не дорiвнюї │ ^ │ Виключне "АБО" │

│ = │ Просте присвоїння │ -= │ Присвоїння з вiднiманням│

│ += │ Присвоїння з додаван. │ *= │ Присвоїння з множенням │

│ /= │ Присвоїння з дiленням │ %= │ Присвоїння з залишком │

│ <<= │ Присвоїння зi зсувом │ >>= │ Присвоїння зi зсувом упр│

│ &= │ Присвоїння з пороз."I"│ |= │ Присвоїння з вкл. "АБО" │

│ │ │ ^= │ Присвоїння з викл. "АБО"│

├──────┴───────────────────────┴──────┴─────────────────────────┤

│ Тренарна операцiя: операнд1 ? операнд2 : операнд 3 │

└───────────────────────────────────────────────────────────────┘

14

8. ОПЕРАТОРИ

Оператор представляї собою одиничну, логiчно завершену iнст-

рукцiю для ЕОМ. З послiдовностi певноє єх кiлькостi складаїться

програма. В програмi оператори роздiляються знаком крапка з ко-

мою. Будь який оператор програми може мати мiтку, яка ставиться

перед ним, вiддiляїться вiд нього двокрапкою i представляї собою

iдентифiкатор. Нижче оператори перечисленi i названi. Детальний

єх розгляд буде поданий в текстi вiдповiдних лабораторних робiт.

- оператор-вираз. Вiн представляї собою просто вираз. Найбiльш

вживаним ї оператор, який складаїться iз однiїє з операцiй

присвоїння, злiва вiд якоє ставиться iм'я змiнноє, а зправа -

вираз, значення якого присвоюїться цiй змiннiй;

- порожнiй оператор маї вигляд просто крапки з комою. Нi до яких

дiй вiн не приводить, вживаїться переважно в тiлi iнших опера-

торiв (наприклад циклу), де згiдно з синтаксисом повинен бути

хоча б один оператор, а вони вiдсутнi (непотрiбнi);

- оператор безумовного переходу GOTO;

- умовний оператор IF;

- оператор перемикач SWITCH;

- оператор простого (покрокового) циклу FOR;

- оператор циклу з передумовою WHILE;

- оператор циклу з постумовою DO ... WHILE;

- оператор припинення (наприклад циклу) BREAK;

- оператор продовження програми CONTINUE;

- оператор повернення з пiдпрограми RETURN;

- складений оператор, блок - декiлька операторiв, взятих у фiгу-

рнi дужки.

15

9. СТРУКТУРА ПРОГРАМИ, ДИРЕКТИВИ ПРЕПРОЦЕСОРУ

Програма, складена мовою Сi, називаїться початковим модулем.

Iм'я файлу, де вiн буде записаний маї розширення *.c. Для викона-

ння на ПЕОМ вона повинна пройти двi стадiє: компiляцiю i редагу-

вання зв'язкiв. Результатом компiляцiє ї об'їктний модуль (маї

розширення *.obj), який представляї собою набiр машинних команд,

вiдповiдних операторам програми. Пiд час редагування мiж окремими

дiльницями об'їктного модуля встановлюються зв'язки, пiд'їднують-

ся зовнiшнi функцiє, призначаються конкретнi єх адреси. Кiнцевим

продуктом редагування ї завантажний модуль (exe-файл).

Програма мовою Сi складаїться iз сукупностi функцiй, серед

яких одна ї головною i називаїться main(), а решта пiдпорядкова-

нi, та директив препроцесору.

Препроцесор представляї собою програму, яка обробляї початко-

вий модуль до компiляцiє, згiдно з вiдповiдними директивами. Ди-

рективи препроцесору можуть бути розмiщенi в будь-якому мiсцi по-

чаткового модуля, вiд iнших об'їктiв програми вони вiдрiзняються

наявнiстю знака # (дiїз). Найбiльш вживаними з них ї:

# include <iм'я файла> - включення файла, який знаходиться в

стандартному каталозi;

# define iдентифiкатор текст - замiна в програмi iдентифiкатора

на текст;

# undef iдентифiкатор - вiдмiна дiє поточноє директиви #define;

# if - умовна компiляцiя, визначення, чи потрiбно пiд'їднувати

до об'їктного модуля програми певну єє частину;

# error текст - обробка помилок пiд час компiляцiєє програми;

# - порожня директива, iгноруїться компiлятором.

Iдентифiкатор директиви #define може мати параметри подiбно

до того, як це маї мiсце в операторi DEF FN мови Бейсик.

16

10. ПОРЯДОК ВИКОНАННЯ ЛАБОРАТОРНИХ РОБIТ

Перед виконанням лабораторноє роботи студент пiдлягаї перевiр-

цi на ступiнь пiдготовки, в процесi якоє одержуї вiдповiдну оцiн-

ку та допуск до роботи в комп'ютерному залi.

Кожна лабораторна робота виконуїться на ЕОМ. Для входу в сис-

тему Turbo C необхiдно виконати програму tc.exe, пiсля чого кори-

стувачу надаїться можливiсть набору та редагування тексту програ-

ми за допомогою клавiатури. Запис програми у файл, єє компiляцiя

i запуск та iншi функцiєє виконуються шляхом використання меню,

вхiд у яке здiйснюїться натисканням клавiшi F10.

Закiнчивши роботу, студент повинен пред'явити викладачевi єє

результати на екранi монiтора та, якщо ї можливiсть, роздрукiвку

тексту програми i одержаних чисел.

Результати роботи оформляються у виглядi звiту, першою сторiн-

кою якого ї титульний лист. Звiт повинен складатися з роздiлiв:

1. Постановка задачi.

2. Короткi теоретичнi вiдомостi.

3. Графiчний алгоритм програми та його опис.

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

5. Результати виконання роботи та єх пояснення.

Лабораторна робота вважаїться виконаною, якщо студент захистив

звiт i одержав пiдсумкову оцiнку, яка виставляїться на основi

трьох оцiнок: за пiдготовку i виконання роботи та захист звiту.

17

11. ЛАБОРАТОРНА РОБОТА N 1. ЛIНIЙНI ПРОГРАМИ

Мета роботи: оволодiння прийомами складання алгоритмiв i про-

грам лiнiйного типу, освоїння оболонки TurboC,

ознайомлення з комп'ютерною технiкою кафедри.

11.1. Короткi теоретичнi вiдомостi

Лiнiйною називаїться програма, яка виконуїться в тiй послiдов-

ностi, в якiй записанi єє оператори, вона не маї розгалужень, пе-

реходiв та повторень. Як правило, лiнiйна програма складаїться з

директив препроцесору, оголошень даних, операторiв-виразiв i

функцiй вводу-виводу.

Препроцесор це - програма, яка обробляї початковий модуль пе-

ред компiляцiїю. Ознакою директиви препроцесору ї знак # (дiїз),

поставлений на початку рядка, в якому вона записана. За допомогою

директив препроцесору можна пiд'їднувати файли з описами стандар-

тних функцiй (директива #include), задавати макропiдстановки (ди-

ректива #define) та визначати умови компiляцiє (директива #if).

Наявнiсть директив препроцесору в програмах необов'язкова.

В оголошеннi даних даїться повний перелiк єх iдентифiкаторiв,

а також тип, клас пам'ятi та модифiкатор кожного об'їкта даних.

Пiд час оголошення данi можуть бути iнiцiалiзованi (заданi). Ок-

ремi елементи оголошення даних, наприклад, клас пам'ятi або моди-

фiкатор можуть бути явно вiдсутнi i прийнятi за замовчуванням.

Оператори-вирази служать для присвоїння змiнним значення, до

них входять iдентифiкатори, операцiє присвоїння i вирази.

Основними функцiями вводу-виводу ї

scanf("сф", саз); - ввiд даних з клавiатури;

printf("сф", сiз); - вивiд даних на екран.

18

Тут сф - список специфiкаторiв форматiв;

саз - список адрес змiнних;

сiз - список iмен змiнних.

Основними специфiкаторами форматiв ї:

i,d - для цiлочислових даних типу int або char;

f - для дiйсних чисел типу float;

c - для лiтерних даних типу char;

s - для рядка (масиву) лiтер типу char.

Кожному специфiкатору формату в списку повинен передувати символ

% (процент), який ї його ознакою. Крiм специфiкаторiв форматiв

функцiя printf може мiстити лiтернi константи (текст), числовi

константи для задання кiлькостi розрядiв виводу числа та його

дробовоє частини, а також спецiальнi символи: \n - перевiд рядка,

\t - знак табуляцiє та iншi.

Описи всiх функцiй вводу-виводу знаходяться в файлi stdio.h,

який пiд'їднують до програми за допомогою директиви #include. Фу-

нкцiє scanf() i printf(), як найбiльш вживанi, викликаються без

застосування цiїє директиви.

11.2. Приклад програми

Постановка задачi:

Скласти графiчний алгоритм i програму мовою Сi для обчислення

значення виразу

y= ─────── при x= ──, a=12,67.

19

Графiчний алгоритм лiнiйного Графiчний алгоритм предста-

типу. влений на рисунку 1. Вiн маї

лiнiйний тип i складаїться з

шести стандартних знакiв, пе-

ршим з яких ї "Початок", а ос-

таннiм "Кiнець". Знаки, якi

знаходяться мiж ними, читають-

ся, а дiє, якi в них записанi,

виконуються послiдовно зверху

вниз. Вони вiдповiдають послi-

довностi рiшення задачi: при-

своїння числових значень змiн-

ним a i x, обчислення заданого

виразу i присвоїння його зна-

чення змiннiй y та єє вивiд.

Рис. 1.

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

# include <math.h> Програму можна умовно подi-

# define a 12.67 лити на двi частини: директиви

main() /*Лiнiйна програма*/ препроцесору i головна функцiя

{ main().

float y, x, pi=3.1415926; Тут ї двi директиви. В пер-

x=pi/6; y=pow(a+4,0.333)/cos(x); шiй мiститься вказiвка компi-

printf("Результ.=%6.3f\n",y); лятору пiд'їднати до програми

} файл math.h, в якому знаходя-

ться описи математичних функ-

цiй, в т.ч. pow() - пiднесення до степеня та cos() - косинуса.

Друга директива (#define) означаї, що скрiзь в текстi програми

буква a пiд час компiляцiє повинна бути замiнена на число 12.67.

Функцiя main() представляї собою блок, взятий у фiгурнi дужки.

20

На його початку оголошенi змiннi x, y та pi, причому змiнна pi

iнiцiалiзована константою 3.1415926. Всi змiннi мають тип float.

Далi в програмi маїмо два оператор-вирази для обчислення i зане-

сення в оперативну пам'ять значень змiнних x i y. Тут оператори-

вирази складаються зi знака присвоїння, злiва вiд якого маїмо

iм'я змiнноє, яка одержуї значення виразу, що розмiщений зправа.

Програма завершуїться виводом на екран результату y за допомо-

гою функцiє printf(), яка маї такi параметри:

- текстову константу Результ.=;

- знак % (процент), який означаї, що наступним символом ї специ-

фiкатор формату;

- число 6.3, воно означаї, що вивести необхiдно 6 розрядiв, вклю-

чаючи крапку, з точнiстю 3 розряди пiсля крапки;

- специфiкатор формату f (типу float);

- символ \n для переведення курсора на новий рядок пiсля виводу.

- iм'я змiнноє y, значення якоє слiд вивести.

Результати виконання програми одержимо в виглядi такого рядка:

Результ.= 2.947

На початку рядка маїмо текстову константу Результ.=, пiсля

якоє - число, виведене в заданому форматi. В правильностi резуль-

тату пересвiдчуїмось, виконавши паралельнi обчислення за допомо-

гою мiкрокалькулятора.

11.3. Запитання для самоперевiрки

1. В чому суть програми лiнiйного типу?

2. У якому секторi оперативноє пам'ятi буде знаходитися програма?

3. Якi результати одержимо, якщо послiдовно виконаїмо:

int i=6, j=3; char c='a'; i+=++a; i=i<j; i++;?

4. Чим розрiзняються оператори-вирази: s=s+1; s+=1; s++;?

21

5. Назвiть специфiкатори форматiв функцiє printf().

6. Вкажiть можливi способи занесення в комiрку x значення 3,27.

7. Чому у програмi прикладу змiнна y маї тип float? Який об'їм

пам'ятi вона займаї? Хто призначаї комiрку пам'ятi для цiїє

змiнноє i чи можна визначити єє фiзичну адресу?

8. Як буде знайдено (звiдки взято) значення y при його виводi?

9. Чому для добування кубiчного кореня використана функцiя pow()?

Назвiть iншi можливостi мови Сi.

10. Яке число буде знаходитися в комiрцi пам'ятi pi?

12. ЛАБОРАТОРНА РОБОТА N 2. РОЗГАЛУЖЕНI ПРОГРАМИ

Мета роботи: оволодiння прийомами складання розгалужених алго-

ритмiв i програм, освоїння операторiв: переходу,

умовного, перемикача.

2.1. Короткi теоретичнi вiдомостi

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

виконання єє операторiв визначаїться поставленими умовами.

Для органiзацiє розгалужень в програмах мовою Сi використовую-

ться такi оператори:

- умовний оператор: IF (вираз) оператор1; ELSE оператор2;

Вiн працюї так: якщо значення виразу не дорiвнюї нулю, то далi

виконуїться оператор1, iнакше - оператор2, якщо ж оператора2 не-

маї, то - наступний оператор програми;

- оператор переходу: GOTO мiтка;

При його виконаннi вiдбуваїться безумовний перехiд на оператор

з вiдповiдною мiткою. Мiтка представляї собою iдентифiкатор;

22

- оператор-перемикач: SWITCH(вираз)

{оголошення;

CASE константа: оператори1;

CASE константа: оператори2;

... ...

DEFAULT: операториХ;}

Тiло перемикача представляї собою блок, в ньому можуть мiсти-

тися власнi оголошення даних. Його виконання починаїться з обчис-

лення виразу, який може бути тiльки типу int. (Нагадаїмо, що лi-

тернi константи типу char можуть сприйматися як коди лiтер i мати

тип int). Подальше виконання операторiв починаїться вiд того мiс-

ця, де константа спiвпадаї зi значенням виразу, до слова default

або, якщо його немаї, - до кiнця блока, незважаючи на те, що ниж-

че трапляться оператори з iншими константами - мiтками. Операто-

риХ виконуються, якщо значення виразу не спiвпадаї нi з однiїю

константою;

- оператор припинення BREAK;

Дiя цього оператора приводить до виходу за межi блока.

2.2. Приклад програми для виконання лабораторноє роботи

Постановка задачi:

Скласти графiчний алгоритм i програму для обчислення виразу

│f(x)=2x +2 при x=2;

y= p(x)=6x при x=4;

│g(x)=-x+14 при x>=8;

При iнших значеннях аргумента x видати повiдомлення про те, що

функцiя не iснуї.

23

Для виконання роботи представимо iнтервали задання функцiє на

числовiй осi:

y=f(x) y=p(x)

Не iснуї │ Не iснуї │ Не iснуї y=g(x) x

────────────────┴────────────────┴─────────────────┴─────────────

2 4 8

Ця робота виконана у двох варiантах: з оператором if i switch.

Графiчний алгоритм програми з оператором if показаний на рису-

нку 2а. Вiн мiстить три розгалуження за умовами задачi, тому маї-

мо чотири гiлки алгоритму. Для графiчного зображення розгалужень

використаний спецiально для цього призначений знак, який маї ви-

гляд поверненого ромба. Всерединi кожного знака записана умова, в

Графiчний алгоритм розгалуженого типу.

Рис. 2а.

24

залежностi вiд якоє вибираїться гiлка подальшого ходу алгоритму.

Нижче подана програма розгалуженого типу. Вона не маї директив

препроцесору, бо вони тут непотрiбнi. Тут не використовуються нi-

якi математичнi функцiє, а функцiє scanf() та printf(), як най-

бiльш вживанi, викликаються без пiд'їднання файлу stdio.h.

main() /*Розгалужена програма*/

{

float x,y; scanf("%f",&x);

if(x==2) {y=2*x*x+2; goto a;}

if(x==4) {y=6*x; goto a;}

if(x>=8) {y=-x+14; goto a;}

printf("Функцiя не iснуї x=%f\n",x); goto b;

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

b:;}

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

значеннях змiнноє x, єх передбачено вводити з клавiатури за допо-

могою функцiє scanf(). Ця функцiя маї два аргументи: першим ї

специфiкатор типу f, тобто float, другим - адреса змiнноє x.

Розгалуження побудоване за допомогою трьох операторiв if, вiд-

повiдно до кiлькостi умов. Оскiльки в кожнiй гiлцi розгалужень

згiдно з алгоритмом необхiдно виконати двi дiє: обчислити y та

перейти до виводу, а синтаксис оператора if дозволяї писати лише

по одному оператору, то тут застосованi складенi оператори, взятi

в фiгурнi дужки. Якщо нi одна з умов не задовiльняїться (це може

бути, наприклад, при x=3), обчислювальний процес буде переданий

на функцiю виводу повiдомлення про те, що функцiя не iснуї, а да-

лi за допомогою оператора безумовного переходу - на порожнiй опе-

ратор з мiткою b, розмiщений вкiнцi програми. Застосування порож-

нього оператора тут обов'язкове, так вимагаї синтаксис мови.

З метою перевiрки програми в усiх гiлках розгалужень пiдберемо

25

вiдповiднi єм декiлька значень змiнноє x, а програму запустимо

кiлькаразово. Тодi одержимо:

Функцiя не iснуї x= 1.0000

x= 2.0000 y=10.0000

Функцiя не iснуї x= 3.0000

x= 4.0000 y=24.0000

Функцiя не iснуї x= 6.0000

x= 9.0000 y= 5.0000

Цi результати спiвпадають з числами, одержаними при ручних

розрахунках, i свiдчать про правильнiсть програми.

Варiант розгалуженого алгоритму, в якому мiститься перемикач,

показаний на рисунку 2б. Оскiльки константами-мiтками перемикача

можуть бути лише цiлi числа або букви, то змiнна x не може бути

використана у його виразi, цьому перешкоджаї умова x>=8. Тому тут

застосована допомiжна змiнна с типу int, значення якоє дорiвнюють

x в усiх випадках, крiм одного, де x>=8. В останньому випадку

змiннiй с присвоюїться значення 8 (с=8) за допомогою додаткового

розгалуження. Основою алгоритму ї перемикач, який направляї обчи-

слювальний процес в одну з чотирьох гiлок, в залежностi вiд зна-

чення змiнноє c.

Програма варiанту з перемикачем вiдповiдаї графiчному алгорит-

му. Єє побудова стала можливою завдяки запровадженню допомiжноє

змiнноє с, в залежностi вiд значень якоє обчислювальний процес

буде потрапляти в ту чи iншу гiлку розгалуження. На початку про-

грами змiннiй с присвоюються значення x в усiх випадках. Якщо

x>=8, вiдбуваїться переприсвоїння с=8, слiд зауважити, що для

успiшного виконання програми тут змiннiй с можна було надати

будь-яке цiле значення, вiдмiнне вiд 2 i 4, в тому числi тi, при

яких функцiя не iснуї.

Основою програми ї перемикач switch, який представляї собою

26

блок операторiв, помiчених константами-мiтками цiлого типу. Ого-

лошення внутрiшнiх змiнних у блоцi перемикача вiдсутнї, в даному

випадку в них не було потреби. З метою запобiгання переходу обчи-

слювального процесу на нижнi оператори перемикача, якi мають iншi

мiтки, застосовуються оператори break для своїчасного виходу за

межi блоку. Для закiнчення програми пiсля повiдомлення, що функ-

цiя не iснуї, служить функцiя exit(1).

Результати виконання розгалуженоє програми варiанту з переми-

качем такi самi, як i в прикладi з оператором if.

Розгалужений алгоритм типу перемикача.

Рис. 2б.

27

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

main() /*Розгалужена програма з перемикачем*/

{float x,y; int c; scanf("%f",&x); c=x;

if(x>=8) c=8;

switch(c)

{case 2: y=2*x*x+2; break;

case 4: y=6*x; break;

case 8: y=-x+14; break;

default: printf("Функцiя не iснуї x=%f\n",x);

exit(1);}

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

}

2.3. Запитання для самоперевiрки

1. Дайте визначення розгалуженого алгоритму.

2. Перелiчiть всi можливi форми виразiв (логiчний, вiдношення

i т.д.) оператора if. Наведiть приклади, пояснiть виконання.

3. Чи можна в програмi прикладу з перемикачем обiйтися без опера-

тора if, для чого вiн тут служить?.

4. Складiть програму до наведеного в прикладi алгоритму з опера-

торами if без жодного оператора goto;

5. Чому дорiвнюватиме k пiсля виконання if(i=j) k=1; else k=2;

при а) int k,i=2,j=2; б) int k,i=0,j=0; в) int k,i=2,j=0;

г) int k,i='a',j=99; /*99 - код символа 'a'*/?

6. Назвiть дiапазон значень змiнноє x, якi можна ввести з клавiа-

тури за допомогою функцiє scanf().

7. В яких випадках можна було б обiйтися без промiжноє змiнноє с

в програмi з перемикачем i застосувати змiнну x у його виразi?

8. Чи можлива ситуацiя, коли розгалужена програма закiнчена, про-

те знайдуться єє оператори, якi нi разу не виконувались?

28

3. ЛАБОРАТОРНА РОБОТА N 3. ЦИКЛIЧНI ПРОГРАМИ

Мета роботи: оволодiння прийомами складання циклiчних алгорит-

мiв i програм, освоїння оператора циклу з рiвно-

мiрним приростом аргумента.

3.1. Короткi теоретичнi вiдомостi

Циклом називаїться обчислювальний процес, який багаторазово

повторюїться. Вiн характерний наявнiстю аргумента, iнакше - пара-

метра циклу. Це змiнна, яка перед циклом одержуї початкове зна-

чення, а в циклi нарощуїться i перевiряїться на досягнення кiнце-

вого значення, що ї умовою закiнчення циклу. Розрiзняють цикли з

рiвномiрним приростом аргумента, якi називають ще арифметичними

або типу арифметичноє прогресiє, та iтерацiйнi або перерахунку.

Цикл з рiвномiрним приростом аргумента ї найбiльш вживаним.

Число його виконань n можна обчислити за формулою:

n=─────────── +1,

де Xп, Xк, h - вiдповiдно, початкове i кiнцеве значення та при-

рiст параметра циклу.

Для програмування циклу арифметичного типу служать оператори:

- циклу: FOR(Вираз1;Вираз2;Вираз3) оператор;

тут: Вираз1 - присвоїння параметру циклу початкового значення;

Вираз2 - умова, перевiрка на досягнення параметром циклу

кiнцевого значення;

Вираз3 - нарощення параметра циклу;

оператор - простий оператор або блок, тiло циклу.

- продовження: CONTINUE;

29

Останнiй оператор може знаходитися в тiлi циклу i його дiя по-

лягаї в переходi на кiнець циклу, тобто на нарощення параметра i

перевiрку умови закiнчення циклу.

В тiлi циклу може також знаходитися оператор break, його вико-

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

3.2. Приклад програми для виконання лабораторноє роботи

Постановка задачi: обчислити Графiчний алгоритм циклу типу

таблицю 6-ти значень функцiє арифметичноє прогресiє

y=f(x)=x +2,8

на вiдрiзку [1,5; 2,0].

Рис. 3.

30

Графiчний алгоритм показаний на рисунку 3. Його можна умовно

подiлити на двi частини: лiнiйну i циклiчну. В лiнiйнiй частинi

вiдображено обчислення кроку h та присвоїння аргументу функцiє x

початкового значення Xп. Початок циклу вiдображений спецiальним

знаком, який маї вигляд двох паралельних горизонтальних лiнiй,

з'їднаних з бокiв прямими кутами. Всерединi знака записане iм'я

параметра циклу i та його початкове i кiнцеве значення. Оскiльки

прирiст параметра дорiвнюї одиницi, вiн тут опущений. В циклi

обчислюються i виводяться на екран черговi значення функцiє y та

нарощуїться змiнна x на величину h.

Текст циклiчноє програми типу арифметичноє прогресiє

/*Циклiчна програма*/

main()

{int i, n=6; float Xmin=1.5, Xmax=2, x, y, h;

h=(Xmax-Xmin)/(n-1); x=Xmin;

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

{y=x*x+2.8;

printf("x=%4.2f y=%f\n",x,y); x+=h;

}

}

Програма мiстить оператор циклу for типу арифметичноє прогре-

сiє, в заголовку якого вказано iм'я параметра циклу, а також його

початкове i кiнцеве значення та прирiст. В якостi параметра циклу

тут застосовуїться змiнна i типу int, проте синтаксис мови дозво-

ляї вибрати iнший тип, наприклад, float. Тiло циклу представляї

собою блок, взятий у фiгурнi дужки. В блоцi маїмо оператори-вира-

зи для обчислення значення y та нарощення змiнноє x, а також зве-

рнення до функцiє printf().

Нижче поданi результати, виконання програми. Єх правильнiсть

31

можна перевiрити шляхом порiвняння з числами, одержаними при па-

ралельних розрахунках, виконаних вручну.

x=1.50 y=5.050000

x=1.60 y=5.360000

x=1.70 y=5.690000

x=1.80 y=6.040000

x=1.90 y=6.410000

x=2.00 y=6.800000

3.3. Запитання для самоперевiрки

1. Пояснiть термiни: цикл, параметр циклу, тiло циклу, кiлькiсть

виконань циклу.

2. Що змiниться в результатах, якщо в програмi прикладу опустити

фiгурнi дужки, в якi взято тiло циклу?

3. Що потрiбно змiнити в програмi прикладу, щоб не змiнились ре-

зультати, якщо оператор-вираз нарощення змiнноє x (x+=h;) буде

знаходитись спочатку тiла циклу (перед y=...)?

4. Скоротiть текст програми прикладу, застосувавши змiнну x в

якостi параметра циклу. Якi труднощi тут можуть виникнути в

зв'язку з накопиченням похибки?

5. Якi значення будуть мати змiннi x та i пiсля останнього єх ви-

воду?, пiсля виходу з циклу?

6. Складiть графiчний алгоритм i програму для поставленоє в при-

кладi задачi, використавши оператор if замiсть for. Виконайте

єх порiвняльний аналiз з поданими в прикладi.

7. Змiнiть параметри функцiє printf() так, щоб пари чисел, виве-

дених за допомоги програми прикладу, роздiлялись не переходом

на новий рядок, як це маї мiсце, а горизонтальною табуляцiїю.

32

4. ЛАБОРАТОРНА РОБОТА N 4. ЦИКЛIЧНI IТЕРАЦIЙНI ПРОГРАМИ

Мета роботи: оволодiння прийомами складання циклiчних алгорит-

мiв i програм iтерацiйного типу, освоїння опера-

торiв циклу з постумовою та передумовою.

4.1. Короткi теоретичнi вiдомостi

Циклiчнi iтерацiйнi алгоритми характернi тим, що нi кiлькiсть

єх виконань, нi значення параметра циклу заздалегiдь невiдомi. В

них, як правило, вiдбуваїться наближення параметра циклу до пев-

ного, наперед невiдомого значення, яке ї одним з результатiв ви-

конання циклу.

Iтерацiйний циклiчний процес може бути збiжним або розбiжним.

Умовою забезпечення збiжностi ї вимога, щоб вiдстань мiж сусiднi-

ми наближеннями з кожним кроком поступово скорочувалась. Вважа-

ють, що, якщо ця вiдстань стане меншою за деяку, наперед задану

малу величину, то вона також менша за похибку обчислення, тодi

iтерацiйний процес припиняїться. Вiдстань виступаї в ролi параме-

тра циклу.

Питання дослiдження збiжностi iтерацiє в кожному конкретному

випадку розв'язуїться по-своїму i тут не розглядаїться. Рекомен-

дуїться обмежувати число виконань циклу певною кiлькiстю iтера-

цiй, щоб уникнути зациклення.

Для програмноє реалiзацiє iтерацiйного циклу можна використа-

ти вже розгляненi оператори if або for, проте мова Сi маї i спе-

цiальнi засоби, це:

- оператор циклу з передумовою: WHILE(вираз) оператор;

- оператор циклу з постумовою: DO оператор; WHILE (вираз);

Тут вираз - будь який, цикл виконуїться, поки його значення не

33

дорiвнюї нулю. Оператор представляї собою тiло циклу, найчастiше

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

ки, в ньому можуть знаходитися i вже розгляненi ранiше оператори

continue та break.

Перший оператор while вiдрiзняїться вiд другого do...while

тим, що в ньому спочатку обчислюїться значення виразу i перевiря-

їться умова виходу з циклу, а потiм виконуїться тiло циклу.

4.2. Приклад програми для виконання лабораторноє роботи

Постановка задачi: розв'язати рiвняння f(x)= e -x +3=0

з похибкою, що не перевищуї число Е=0,0001, використавши iтерацi-

йну формулу x = (x )=x - ─────── , якщо x =2,0; i=0,1,2,3,...

Iтерацiйну формулу можна прочитати так: обчислити в циклi на-

ступнi значення x , починаючи вiд x , поки рiзниця │x -x │>E.

Можна математично доказати, що дана формула забезпечуї збiж-

нiсть iтерацiє, як це схематично показано на рис. 4а. Тут

x* - точне (теоретичне) положення кореня рiвняння;

x - задане початкове наближення кореня;

x , x ,... - черговi наближення, одержанi в ходi виконання цик-

лiчного iтерацiйного алгоритму.

Мал. 4а. Iлюстрацiя ходу iтерацiйного процесу.

x x x x ... x* x

───────┴────────────────┴──────────┴──────┴──────┴─────────────

34

Графiчний алгоритм показаний Графiчний алгоритм циклу

на рисунку 4б. Оскiльки в обчис- iтерацiйного типу.

леннях приймають участь одночас-

но два сусiднi наближення кореня,

то для єх запам'ятовування в ал-

горитмi використовуються двi

змiннi: x - попереднї i y - нас-

тупне значення.

Основою графiчного алгоритму

ї iтерацiйний цикл, в ньому ви-

конуїться переприсвоїння x=y,

обчислення наступного наближення

y за iтерацiйною формулою, а та-

кож нарощування змiнноє i та пе-

ревiрка умови i>20 передчасного

виходу з циклу. Змiнна i вiдi-

граї роль лiчильника кiлькостi

виконань циклу i застосовуїться

для запобiгання зациклення, бо

незважаючи на те, що даний iтера- Рис. 4б.

цiйний процес ї збiжним, можливi помилки на етапi налагодження

програми. Закiнчуїться цикл перевiркою умови │x-y│>E, за якою

вiдбуваїться або його повторення (гiлка алгоритму "Так"), або ви-

хiд (завершення циклу) з вiрним результатом. Цикловi передуї лi-

нiйна частина, де змiнним присвоюються початковi значення. Закiн-

чуїться алгоритм виводом результатiв обчислень.

Слiд звернути увагу на те, що в програмi початкове значення

кореня присвоїно не змiннiй x, як це мало би мати мiсце згiдно з

iтерацiйною формулою, а змiннiй y - наступному значенню кореня.

Зроблено це з метою спрощення алгоритму.

35

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

/*Iтерацiйна програма*/ Програма починаїться з ди-

# include <math.h> рективи препроцесору #include

main() для пiдключення файлу math.h з

{ функцiями fabs(), exp() та iн.

float y=2.0, x, E=0.0001; Основою програми ї оператор

int i=0; циклу типу do ... while. Йо-

do го тiло буде виконуватись хоча

{ б один раз навiть тодi, коли

x=y; змiннiй y буде присвоїно точне

y=x-(exp(x)-x*x*x+3)/ значення кореня на початку про-

(exp(x)-3*x*x); грами. Всерединi циклу, крiм

if(++i>20) break; уточнення кореня, нарощуїться

} змiнна i та перевiряїться умо-

while(fabs(x-y)>E); ва передчасного виходу з циклу

printf("x=%f i=%d\n",y,i); при i>20.

}

Результати виконання програми мають вигляд

x=2.431569 i=4

З метою перевiрки єх правильностi пiдставимо одержане значення

кореня в задане рiвняння. Тодi одержимо f(2.431569)=-0.000002, що

свiдчить про порiвняно невелику похибку одержаного результату.

Оскiльки i=4, передчасний вихiд з циклу не вiдбувся.

4.3. Запитання для самоперевiрки

1. Назвiть оператори циклу з передумовою та постумово. Чим вони

вiдрiзняються мiж собою?

2. Складiть програми для задачi роздiлу 4.2. з використанням опе-

раторiв if, for i while.

36

3. Застосуйте оператори iтерацiйного циклу while i do...while для

побудови програми за умовою прикладу лабораторноє роботи 3.

4. Для чого в програмi прикладу застосовуїться змiнна i? Чи можна

одержати значення кореня рiвняння без неє?

5. Чому, як результат, виведено значення змiнноє y, хоча в лапках

записано "x=", чи не ї це помилкою, чи не краще виводити x?

6. Складiть графiчний алгоритм i програму з використанням опера-

торiв do...while i while, в якiй початкове значення кореня бу-

де присвоїне не змiннiй y, як це маї мiсце в прикладi, а - x.

7. Як буде виконуватись оператор do...while, якщо в його дужках

замiсть виразу fabs(x-y)>E буде поставлено число 1?, число 0?

8. Складiть графiчний алгоритм i програму для уточнення квадрат-

ного кореня x з числа a за формулою x =(x +a/x )/2.

9. Знайдiть iтерацiйну формулу добування кореня будь-якого степе-

ня з довiльного числа a.

5. ЛАБОРАТОРНА РОБОТА N 5. НАКОПИЧЕННЯ СУМИ I ДОБУТКУ

Мета роботи: оволодiння прийомами складання циклiчних алгорит-

мiв i програм з накопичення суми i добутку певноє

кiлькостi членiв ряду.

5.1. Короткi теоретичнi вiдомостi

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

добутку

s= a ; s= a ; s= a ; s= a .

Тут - символ суми, - символ добутку,

a - значення чергового члена ряду, n - кiлькiсть членiв.

37

Накопичення суми або добутку виконують в циклi за формулами:

для суми s=s+a , для добутку s=s*a . Перед циклом змiннiй s при-

своюїться початкове значення: для суми s=0, для добутку s=1.

Якщо ряд маї кiнцеве число членiв, в якостi параметра циклу

вибирають змiнну i - порядковий номер члена, якщо - безмежне, то

a - значення члена ряду.

При накопиченнi суми або добутку безмежного числа членiв ряд

повинен бути збiжним, тобто при i ─── a ─── 0. Обчислювальний

процес припиняїться, якщо │a │< , де - задана похибка.

Як правило, a представляї собою арифметичний вираз. З метою

його спрощення, зменшення похибки обчислень та запобiгання пере-

повнення пам'ятi при одержаннi промiжних результатiв слiд там,

де це можливо, використовувати рекурсiю для обчислення чергового

члена ряду за формулою a =F(a ).

5.2. Приклад програми для виконання лабораторноє роботи

Постановка задачi: обчислити суму з похибкою, що не перевищуї

число =0,001, при x=3,15 за формулою

s= (-1) ─── = 1-x+ ─── - ─── + ─── - ...

Використовуючи рекурсiю, одержимо

s= a ; a =1, a =- ──.

Графiчний алгоритм програми показаний на рис. 5. Його основою

ї цикл iтерацiйного типу з постумовою. В якостi параметра циклу

використовуїться змiнна a.

38

Графiчний алгоритм накопичення суми Текст програми

/*Накопичення суми*/

# include <math.h>

main()

{float s=0,a=1,eps=0.001,

x=3.15; int i=1;

do {s+=a;a=-a*x/i++;}

while(fabs(a)>eps);

printf("%f\n",s);

}

Результати виконання

програми одержимо в такому

виглядi:

0.043245

В єх достовiрностi можна

пересвiдчитись, виконавши

паралельнi ручнi розрахунки

за допомогою мiкрокалькуля-

Рис. 5. тора.

5.3. Запитання для самоперевiрки

1. Наведiть приклад постановки задачi накопичення суми кiнцевого

числа членiв ряду.

2. За якими формулами вiдбуваїться накопичення суми та добутку?

3. Що таке рекурсiя? Наведiть приклад.

4. Що служить в якостi параметра циклу в програмах з накопичен-

ням суми та добутку?

5. Якi типи елементарних алгоритмiв використовуються для накопи-

чення суми та добутку?

39

6. Якi оператори можна застосувати для органiзацiє циклу при на-

копиченнi суми та добутку?

7. Чи буде ряд, запропонований в постановцi задачi до даноє ла-

бораторноє роботи, завжди збiжним? Якi тут можуть бути обме-

ження на змiннi x та eps?

8. Доповнiть програму прикладу запобiганням вiд зациклення, по-

дiбно до того, як це зроблено в програмi для розв'язування

рiвняння. В яких випадках така мiра буде корисною?

6. ЛАБОРАТОРНА РОБОТА N 6. ОБРОБКА МАСИВIВ ДАНИХ

Мета роботи: вивчення засобiв мови Сi для обробки масивiв да-

них, оволодiння прийомами складання алгоритмiв i

програм з застосуванням масивiв.

6.1. Короткi теоретичнi вiдомостi

Мова Сi передбачаї використання тiльки одновимiрних масивiв

даних. Ознакою масиву пiд час його оголошення ї квадратнi дужки,

якi ставляться пiсля iдентифiкатора масиву, в дужках вказуїться

кiлькiсть елементiв масиву. Мiнiмальне значення iндекса (порядко-

вого номера) елемента масиву завжди дорiвнюї нулю. Пiд час оголо-

шення масив може бути iнiцiалiзований. Мова Сi дозволяї обробляти

багатовимiрнi масиви, тодi вони розглядаються як масиви масивiв.

Приклади оголошення масивiв:

char h[]="Система", t[25], s[9]="Комп'ютер";

float a[20], b[5][3], c[2][3]={{2,3,7},{6,,12}};

Тут для масиву h буде зарезервовано в пам'ятi мiсце для зберi-

гання 8 букв, причому h[0]='C', h[1]='и', h[2]='c',..., h[6]='a'

та h[7]='\0', в цьому випадку компiлятор добавить до масиву нуль.

40

Масиви t i s займуть, вiдповiдно, 25 i 9 комiрок пам'ятi типу

char. Так само, як i масив c, вектор s буде iнiцiалiзований, про-

те вiн не буде доповнений нульовим елементом. Для масиву a буде

видiлено 20, масиву b - 15, масиву c - 6 комiрок пам'ятi типу

float, причому пiд час оголошення вiдбудеться iнiцiалiзацiя маси-

ву c п'ятьма елементами, тобто c[0][0]=2, c[0][1]=3, c[0][2]=7,

c[1][0]=6 та c[1][2]=12.

Звернення до елемента масиву в програмi вiдбуваїться шляхом

вказування iдентифiкатора масиву, пiсля якого в квадратних дужках

задаються значення всiх його iндексiв за допомогою констант або

виразiв цiлого типу.

Iдентифiкатор масиву сприймаїться компiлятором як адреса його

першого елемента, тому фрагменти float *p, a[7]; p=&a[0]; або

float *p, a[7]; p=a; виконаються однаково.

6.2. Приклад програми

Постановка задачi: скласти графiчний алгоритм i програму для

сортування в порядку зростання елементiв вектора a бульбашковим

методом.

a=2,-1,8,3,5,-6,2,0,9,-4,5.

Суть бульбашкового методу полягаї в багаторазовому порiвняннi

кожних двох сусiднiх елементiв вектора i замiни єх мiсцями, якщо

наступний з них виявиться меншим.

Графiчний алгоритм сортування вектора показаний на рисунку 6.

Алгоритм починаїться з iнiцiалiзацiє заданого масиву.

41

Графiчний алгоритм сортування

Для розв'язування даноє

задачi використаний алгоритм

типу "цикл в циклi" з розга-

луженням у внутрiшньому ци-

клi. Параметром зовнiшнього

циклу ї змiнна i, параметром

внутрiшнього - змiнна j. Вну-

трiшнiй цикл служить для на-

рощування iндекса масиву. Зо-

внiшнiй цикл забезпечуї бага-

торазове повторення внутрiш-

нього циклу. Розгалуження

служить для порiвняння двох

сусiднiх елементiв a[j] i

a[j+1] вектора та замiни єх

мiсцями, якщо a[j+1]<a[j].

Рис. 6.

Програма маї вигляд

main() /*Сортування вектора*/

{int a[11]={2,-1,8,3,5,-6,2,0,9,-4,5},i,j,k;

for(i=0;i<10;i++)for(j=0;j<10;j++)

if(a[j+1]<a[j]){k=a[j+1];a[j+1]=a[j];a[j]=k;}

printf("Результати сортування:");

for(i=0;i<11;i++)printf("%3d",a[i]);

}

У програмi оголошений та iнiцiалiзований одновимiрний масив

a[11], його елементи - цiлi числа, тому вiн маї тип int. Тип int

42

мають також змiннi i,j та k, тут не було необхiдностi використан-

ня iнших типiв змiнних.

Пiсля виконання програми на екран буде виведено лiтерну конс-

танту "Результати сортування:" та вiдсортований масив, тобто

Результати сортування: -6 -4 -1 0 2 2 3 5 5 8 9

У правильностi одержаних результатiв легко пересвiдчитись, ви-

конавши паралельнi розрахунки вручну.

6.3. Запитання для самоперевiрки

1. Якi види масивiв дозволяї обробляти мова Сi? Чи можна в про-

грамах використовувати тривимiрнi масиви?

2. Як оголошуються масиви? Наведiть можливi приклади.

3. Що таке iнiцiалiзацiя масиву?

4. Яка ознака дозволяї вiдрiзняти масив вiд iнших даних?

5. Як вiдбуваїться звертання до елемента масиву в програмi?

6. Яка роль змiнноє k в програмi, чи можна без неє обiйтись?

7. Чому всi змiннi програми прикладу мають тип int?

8. Якi типи елементарних алгоритмiв ї в програмi прикладу?

7. ЛАБОРАТОРНА РОБОТА N 7. ПРОЦЕДУРА-ФУНКЦIЯ

Мета роботи: вивчення засобiв мови Сi для програмування проце-

дур, оволодiння прийомами складання алгоритмiв i

програм з пiдпрограмами.

7.1. Короткi теоретичнi вiдомостi

Мова Сi дозволяї використовувати лише один вид пiдпрограми:

процедуру-функцiю з параметрами. Характерною особливiстю процеду-

43

ри-функцiє ї наявнiсть багатьох вхiдних параметрiв i одного вихi-

дного, який присвоюїться iменi функцiє. Всi пiдпрограми повиннi

бути оголошенi в головнiй або пiдпорядкованих програмах. Оголо-

шення процедури-функцiє маї вигляд:

ТПЗ IПФ(СТП);,

де ТПЗ - тип значення, яке повертаї процедура-функцiя;

IПФ - iм'я процедури-функцiє, iдентифiкатор;

СТП - список типiв дiйсних параметрiв.

Крiм оголошення, функцiя маї бути визначена, тобто маї бути вка-

зано що ця функцiя власне виконуї. Визначення функцiє маї вигляд:

ТПЗ IПФ(СФП){ОЗП;ТПФ;},

де:СФП - список формальних параметрiв i єх типiв;

ОЗП - оголошення внутрiшнiх (власних) змiнних функцiє;

ТПФ - тiло процедури, оператори та вирази.

Тiло процедури-функцiє може мiстити один або декiлька операто-

рiв RETURN(вираз); Його виконання приводить до завершення проце-

дури i повернення в програму, з якоє функцiя викликалася. Якщо

цей оператор маї вираз, то його значення присвоюїться iменi про-

цедури i ї результатом єє виконання. Формальнi параметри функцiє,

якщо вони ї, локалiзованi в єє тiлi, пам'ять пiд них дублюїться.

Локалiзованими ї також внутрiшнi змiннi функцiє, єх значення теж

втрачаються пiсля виходу з процедури, якщо вони не мають клас па-

м'ятi static. Звернення до процедури-функцiє в головнiй програмi

вiдбуваїться шляхом вказування єє iменi, пiсля якого в круглих

дужках даїться список дiйсних параметрiв.

Забороняїться передавати масиви в якостi параметрiв функцiє.

Натомiсть можна використовувати вказувачi на масиви. Масиви в

процедурi не дублюються.

Звернення до процедури графiчно вiдображаїться за допомогою

прямокутника з подвоїними бiчними сторонами.

44

7.2. Приклад програми

Постановка задачi: Задана матриця a порядку 3*3. Скласти гра-

фiчний алгоритм i програму для формування вектора b, елементами

якого ї максимальнi елементи кожного рядка заданоє матрицi. Для

знаходження максимального елемента рядка використати процедуру-

функцiю.

Алгоритм головноє програми Алгоритм пiдпрограми

Рис. 7а. Рис. 7б.

Графiчний алгоритм головноє програми (рис. 7а) представляї со-

бою один цикл з параметром i, в якому вiдбуваїться перебiр рядкiв

матрицi, одержання чергового максимального елемента рядка шляхом

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

Основою алгоритму пiдпрограми (рис. 7б) ї один цикл з парамет-

ром j, який змiнюїться вiд 1 до n (n - число стовпчикiв матрицi).

Всерединi циклу розмiщене розгалуження для аналiзу чергового еле-

мента рядка матрицi та його запам'ятовування, якщо вiн бiльший за

попереднi.

45

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

main() /*Головна пр-ма*/ Дана програма складаїться з

{ двох програмних одиниць: голов-

float mxr(float *,int), ноє програми main() та пiдпро-

a[3][3]={1,3,2, грами mxr(). Головна програма

6,5,4, мiстить оголошення пiдпрограми,

7,9,8},b[3]; з якого видно, що вона маї по-

int i; вернути значення типу float.

for(i=0;i<3;i++) Вказано тут також iм'я функцiє,

{b[i]=mxr(a[i],3); пiсля якого в круглих дужках

printf("%f\t",b[i]); дано перелiк типiв дiйсних па-

} раметрiв. Першим параметром ї

} вказувач на тип float, це озна-

/* Пiдпрограма */ чаї, що в пiдпрограму буде пе-

float mxr(float *d,int n) редана адреса оперативноє пам'-

{int j; float mx=*d,y; ятi типу float. Другий параметр

for(j=1;j<n;j++) буде мати тип int. Крiм проце-

{y=*(d+j); дури, в головнiй програмi ого-

if(y>mx) mx=y; лошенi масиви a[3][3] i b[3]

} дiйсного типу та цiла змiнна i.

return mx; Матриця a iнiцiалiзована пiд

} час оголошення.

Тiло головноє програми складаї цикл перебору рядкiв матрицi з

параметром i. В циклi вiдбуваїться звернення до процедури mxr,

яка маї два дiйснi параметри, перший представляї собою адресу по-

чатку кожного рядка матрицi, тобто адресу його нульового стовпчи-

ка. Звернiмо увагу на те, що замiсть a[i] тут можна було записати

&a[i][0]. Другим дiйсним параметром ї число 3 - кiлькiсть стовп-

чикiв матрицi. Процедура повертаї чергове максимальне число i-го

рядка, яке заноситься в масив b та виводиться на екран.

46

Процедура приймаї вiд головноє програми адресу початку кожного

рядка матрицi та кiлькiсть стовпчикiв, це формальнi параметри -

змiннi d та n, якi у визначеннi процедури оголошенi як вказувач

на тип float та типу int. Перед циклом змiннiй mx присвоюїться

значення a[j][0], в процесi його виконання вона одержить максима-

льне значення рядка матрицi за рахунок розгалуження. Пiсля вико-

нання процедури значення mx передаїться в головну програму. В

пiдпрограмi застосовуїться допомiжна змiнна y для запам'ятовуван-

ня чергового елемента даного рядка.

Результати виконання програми мають вигляд:

3.000000 6.000000 9.000000

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

7.3. Запитання для самоперевiрки

1. Дайте визначення головноє програми та пiдпрограми.

2. Якi види пiдпрограм дозволяї застосовувати мова Сi?

3. Чим вiдрiзняються дiйснi параметри вiд формальних. Чи можна

застосовувати вирази в єх якостi?

4. Якi типи даних дозволено передавати в процедуру мовою Сi?

5. Чи повиннi спiвпадати кiлькiсть i тип формальних i дiйсних па-

раметрiв у програмах мовою Сi?

6. Запропонуйте варiант процедури для даного тут прикладу, в якiй

буде вiдсутня промiжна змiнна y.

7. Якi ще ї способи передачi масиву в процедуру? Запропонуйте ва-

рiант головноє програми та процедури для даного прикладу, в

яких буде вiдсутнiй вказувач на масив.

8. Наведiть приклад застосування макропiдстановки з параметрами

(#define). Чим вона вiдрiзняїться вiд процедури? Чи можна єє

використати для обробки масиву в даному прикладi?

47

8. ЛАБОРАТОРНА РОБОТА N 8. ФАЙЛИ

Мета роботи: вивчення засобiв мови Сi для обробки файлiв.

8.1. Короткi теоретичнi вiдомостi

Файлом називаїться будь-яка iнформацiя, записана в зовнiшню

(магнiтну) пам'ять. Обмiн даними мiж оперативною та магнiтною па-

м'яттю вiдбуваїться через спецiально вiдведену для цього частину

оперативноє пам'ятi, яка називаїться буферною.

При використаннi файлiв обов'язковими атрибутами програми ї:

оголошення, функцiє вiдкриття та закриття файлу, а також функцiє

вводу-виводу. Оголошення файлiв виконуїться так:

FILE *f1,*f2,...,*fn;

Тут *f1,...,*fn -вказувачi на файли, одночасно можна оголосити n

файлiв. Кожному файлу вiдповiдаї свiй вказувач, ця вiдповiднiсть

встановлюїться в момент вiдкриття файлiв.

Нижче приведенi основнi функцiє для роботи з файлами.

f1=FOPEN("iф","тип"); - вiдкриття файлу з iменем iф, призна-

чення йому вказувача f1. Iм'я файлу складаїться з назви та розши-

рення, роздiлених крапкою. Назва може мати до 8-ми лiтер. Розши-

рення маї довжину до трьох букв i в файлах, утворених користува-

чем, необов'язкове. Для задання типу служать символи: r - зчиту-

вання з файлу, w - запис у файл, a - доточування файлу. Функцiя

повертаї значення NULL, якщо при вiдкриттi сталася помилка.

FCLOSE(f1,...,fn); - закриття файлiв. В момент закриття вiд-

буваїться запис у файл залишку буферноє пам'ятi, якщо вiн був

вiдкритий для запису.

FSEEK(f1,n,k); - прямий доступ до файлу, встановлення вказува-

ча файлу, на який вказуї f1. При вводi-виводi контролюїться пото-

48

чний номер байта, який саме вводиться чи виводиться, вказувачем

файлу (лiчильником номера байта в файлi, не путати з вказувачем

на файл). Параметр n визначаї на скiльки байтiв слiд змiстити цей

вказувач. Параметр k задаї початкову позицiю, вiд якоє потрiбно

перемiстити вказувач, вiн може приймати значення: 0 - вiд початку

файлу, 1 - вiд поточноє позицiє, 2 - вiд кiнця файлу.

a=FGETC(f1); - читання одного символа з файлу, на який вказуї

f1, присвоїння його значення змiннiй a типу int або char.

FPUTC(a,f1); - запис у файл iз вказувачем f1 одного символа.

FGETS(*s,size,f1); - читання з файлу, на який вказуї f1, рядка

символiв довжиною size байт, який закiнчуїться нулем ('\0'), по-

мiщення цього рядка в оперативну пам'ять, починаючи з адреси s

типу char.

FPUTS(*s,f1); - занесення в файл iз вказувачем f1 лiтерного

рядка, який закiнчуїться нулем i який знаходиться в оперативнiй

пам'ятi, починаючи з адреси s типу char.

FREAD(*r,size,N,f1); - читання з файлу, на який вказуї f1, N

записiв - рядкiв фiксованоє довжини, кожний з яких займаї size

байт, i занесення єх в оперативну пам'ять, починаючи з адреси r.

Записи в файлi повиннi закiнчуватися символом повернення каретки,

кiнець рядка, тощо.

FWRITE(*r,size,N,f1); - занесення записiв у файл.

FSCANF(f1,"сф",саз); - форматоване введення, читання з файлу,

який маї вказувач f1, даних, перетворення єх типiв вiдповiдно до

списку форматiв сф i занесення в оперативну пам'ять, задану спис-

ком адрес змiнних саз.

FPRINTF(f1,"сф",сiз); - форматоване виведення, занесення в

файл змiнних, заданих списком сiз.

Всi функцiє читання файлу повертають значення EOF або NULL,

якщо був досягнений кiнець файлу.

49

Один i той самий файл, створений засобами мови Сi, може бути

використаний для вводу-виводу посимвольно, у виглядi лiтерних ря-

дкiв змiнноє або фiксованоє (записiв) довжини та форматованих да-

них. При форматованому вводi-виводi та вводi-виводi записiв вiд-

буваїться перетворення числових даних у лiтернi i навпаки. Неза-

лежно вiд типiв даних, занесених у файл засобами мови Сi, на маг-

нiтний диск записуються данi лiтерного типу (ASCII-коди).

8.2. Приклад програми для виконання лабораторноє роботи

Задача 1. Постановка задачi: скласти програму для створення

файлу з iм'ям abc та занесення в нього прiзвищ двох студентiв,

кожний з яких маї оцiнки з трьох предметiв. Використати функцiю

форматованого виводу.

Графiчний алгоритм запису в файл.

Алгоритм розв'язку даноє

задачi показаний на рис.

8а. Вiн представляї собою

цикл типу арифметичноє про-

гресiє, параметр якого змi-

нюїться вiд 0 до 1. В циклi

вiдбуваїться запис у файл

прiзвищ та вiдповiдних єм

оцiнок (елементiв масиву

структур s).

Рис. 8а.

50

Нижче приводиться текст програми до задачi 1. В програмi ого-

лошений вказувач f на файл, змiнна i типу int для органiзацiє ци-

клу та масив двох структур s[2]. Елементами структури ї лiтерний

масив c[12] для прiзвища та масив n[3] типу int для оцiнок. Масив

структур iнiцiалiзуїться пiд час оголошення.

Iм'я файлу abc складаїться з трьох букв латини, розширення

вiдсутнї. Файл вiдкриваїться для записування (виводу) за допомо-

гою функцiє fopen(), йому вiдповiдаї вказувач f.

Запис структур у файл виконуїться в циклi за допомогою функцiє

fprintf(), параметрами якоє ї вказувач f на файл, список форматiв

для кожного елемента структури та список елементiв структури.

# include <stdio.h>

main() /*Програма створення файлу abc*/

{FILE *f; int i;

struct {char c[12];

int n[3];}s[2]={"Iванов I.I.",{3,4,4},

"Петров П.П.",{5,5,4}};

f=fopen("abc","w");

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

fprintf(f,"%s%d%d%d\n",s[i].c,s[i].n[0],s[i].n[1],s[i].n[2]);

fclose(f);

}

Результатом виконання програми буде файл abc, утворений в по-

точному каталозi та записанi в нього два рядки, кожний з яких

мiстить прiзвище i вiдповiднi йому оцiнки. В правильностi вико-

нання програми пересвiдчуїмось, переглянувши файл за допомогою

команди F3 або F4 читання файлу в Norton Commander. Вiн маї виг-

ляд:

Iванов I.I.344

Петров П.П.554

51

Задача 2. Постановка задачi: скласти графiчний алгоритм i про-

граму для читання та виводу на екран файлу abc двiчi. За першим

разом використати функцiю посимвольного вводу, на екран вивести

змiст файлу в лiтерному представленнi. За другим - функцiю вводу

рядкiв змiнноє довжини, оцiнки вивести на екран як числа.

Алгоритм розв'язування задачi 2 показаний на рис. 8б. Вiн

представляї собою два послiдо- Графiчний алгоритм вводу файлу.

внi цикли типу while, якi забе-

зпечують читання файлу за допо-

могою двох функцiй: fgetc() i

fgets(). В першому циклi вiдбу-

ваїться побайтове читання фай-

лу, присвоїння одержаноє лiтери

змiннiй x i єє вивiд.

Всерединi другого циклу чи-

таїться черговий рядок файлу,

який заноситья в лiтерний ма-

сив z[16]. За допомогою двох

послiдовних циклiв типу for

цей масив дiлиться на двi ча-

стини: масив с[12] для зберi-

гання прiзвища i масив a[2]

для черговоє оцiнки. Кожна

оцiнка з лiтерноє перетворюї-

ться в число i заноситься в

масив n[3] типу int. Пiсля чи-

тання i перетворення рядка

прочитанi з файлу данi виводя-

ться на екран.

Рис. 8б.

52

Нижче поданий текст програми.

/*Читання (вводу) файлу двома способами*/

# include <stdio.h>

# include <stdlib.h>

main()

{FILE *ff;

int i=0,n[3];

char x,z[16],a[2],c[11];

if((ff=fopen("abc","r"))==NULL)

{printf("\n Помилка при вiдкриттi файлу \n");

exit(1);}

printf(" \n\n Посимвольне читання файлу: \n");

while((x=fgetc(ff))!=EOF)printf("%c",x);

printf(" \n Читання з файлу рядкiв змiнноє довжини: \n");

fseek(f,0,0);

while((fgets(z,sizeof(z),ff))!=NULL)

{for(i=0;i<11;i++)c[i]=z[i];

for(i=0;i<3;i++){a[0]=z[i+11];a[1]='\0';n[i]=atoi(a);}

printf("%s маї оцiнки: %d %d %d\n",c,n[0],n[1],n[2]);

}

fclose(ff);bioskey(0);

}

Програма маї двi директиви препроцесору типу #include. Вони

служать для пiд'їднання файлiв stdio.h та stdlib.h з описами фун-

кцiй, перший - вводу-виводу, другий - atoi().

Всерединi програми оголошений масив n[3] цiлого типу для запа-

м'ятовування трьох оцiнок. Змiнна x лiтерного типу (char) служить

для запам'ятовування лiтер при посимвольному читаннi файлу, ма-

сив z[16] - для запам'ятовування цiлого рядка лiтер при порядко-

вому читаннi. Лiтерний масив c[11] призначений для запам'ятову-

53

вання прiзвища, a[2] - для черговоє оцiнки в лiтерному представ-

леннi. Оголошений також вказувач ff на файл.

Тiло програми починаїться з вiдкриття файлу abc для читання за

допомогою функцiє fopen(). Тут передбачена обробка можливоє поми-

лки при вiдкриттi файлу (файл зiпсований, вiдсутнiй, записаний в

iншому каталозi, тощо) - на екран виводиться повiдомлення про те,

що сталася помилка при вiдкриттi файлу, i закiнчуїться виконання

програми за допомогою функцiє exit(1).

За своїю структурою програма складаїться з двох циклiв типу

while. В першому циклi вiдбуваїться читання чергового символа з

файлу, присвоїння його змiннiй x i вивiд символа на екран поки не

буде досягнений кiнець файлу. Читання файлу виконуїться за допо-

могою функцiє fgetc(), яка при досягненнi кiнця файлу видаї зна-

чення EOF.

У другому - читання цiлого рядка лiтер, який закiнчуїться сим-

волом "новий рядок", i занесення його в оперативну пам'ять на ад-

ресу, з якоє починаїться масив z[16], при цьому, довжина рядка в

файлi не повинна перевищувати довжину масиву z[]. Нагадаїмо, що в

кожний рядок файлу входить прiзвище студента, вiдповiднi йому три

оцiнки та символ "новий рядок" (\n), тому його довжина складаї

11+3+1=15 лiтер. Рядки з файлу читаються за допомогою функцiє

fgets(), яка при досягненнi кiнця файлу видаї значення NULL.

Цей цикл, в свою чергу, мiстить два послiдовнi цикли типу for.

Перший служить для полiтерного переприсвоїння перших 11 лiтер

(прiзвище) з масиву z[] у масив c[11], його параметр - змiнна i

приймаї значення вiд 0 до 10. В другому циклi типу for, параметр

якого змiнна i приймаї значення вiд 0 до 2, вiдбуваїться вибiр з

масиву z[] i присвоїння елементу масиву c[0] черговоє лiтери-оцi-

нки. Пiсля доповнення елементом '\0' - нуль (c[1]='\0';) масив

c[2], як лiтерний, перетворюїться в число за допомогою функцiє

54

atoi(). Параметром цiїє функцiє ї вказувач на масив лiтер (адреса

першого елемента масиву), останнiм елементом якого ї нуль.

Закiнчуїться другий цикл типу while виводом на екран масиву

лiтер c[11] - прiзвища та цiлого масиву n[3] - трьох оцiнок.

Оскiльки пiсля першого прочитання файлу функцiїю fgetc() вка-

зувач файлу зупиниться на останньому його байтi, а нам потрiбно

заново його читати функцiїю fgets() спочатку, в програмi пiсля

першого циклу типу while використана функцiя fseec(ff,0,0). Па-

раметри цiїє функцiє означають, що в файлi, на який вказуї ff,

необхiдно встановити вказувач файлу на перший байт вiд початку

файлу, тобто на початок файлу.

Програма завершуїться функцiїю закриття файлу та функцiїю

bioskey(0), яка в даному випадку служить для затримки екрану з

метою вiзуального спостереження результатiв виконання. На екранi

одержимо:

Посимвольне читання файлу:

Iванов I.I.344

Петров П.П.554

Читання з файлу рядкiв змiнноє жовжини:

Iванов I.I. маї оцiнки: 3 4 4

Петров П.П. маї оцiнки: 5 5 4

Одержанi результати свiдчать про правильнiсть програми.

8.3. Запитання для самоперевiрки

1. Що таке файл, iм'я файлу, розширення iменi файлу?

2. Назвiть обов'язковi засоби мови Сi для обробки файлiв.

3. Перелiчiть основнi функцiє вводу-виводу, назвiть та пояснiть

єх параметри.

55

4. Як оголошуїться файл мовою Ci, що таке вказувач на файл i яке

вiн маї вiдношення до iменi файлу?

5. Чим вiдрiзняїться вказувач файлу вiд вказувача на файл?

6. Яка рiзниця мiж вказувачами типу char, int i float?

7. Що таке прямий доступ до файлу i як вiн здiйснюїться?

8. Чи можна файл, який мiстить данi лiтерного i числового типiв i

створений функцiїю посимвольного вводу, читати за допомогою

iнших функцiй? Чи потрiбнi будуть тут якiсь перетворення?

9. Чи ї необхiднiсть в додатковому застосуваннi якихось перетво-

рень типiв даних, якщо вiдбуваїться форматоване читання файлу,

створеного шляхом занесення записiв?

9. ЛАБОРАТОРНА РОБОТА N 9. ВИКОНАННЯ ГРАФIЧНИХ РОБIТ

Мета роботи: практичне засвоїння прийомiв виконання графiчних

робiт за допомогою комп'ютера, побудови геомет-

ричних фiгур та виводу текстiв, якi супроводжу-

ють малюнок, вивчення графiчних функцiй мови.

9.1. Короткi теоретичнi вiдомостi

Перед програмуванням графiчних символiв необхiдно встановити

графiчний режим роботи монiтора. Ця та iншi графiчнi роботи вико-

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

цiями ї:

BAR(int left, int top, int right, int bottom); - видаї на ек-

ран прямокутник, параметри: координати лiвого верхнього та право-

го нижнього кута;

CIRCLE(int x, int y, int rad); - видаї на екран коло, параме-

три: координати центра та радiус кола;

56

CLEARDEVICE(void); - витираї екран;

CLOSEGRAPH(void); - закриваї графiчний режим;

ELLIPSE(int x, int y, int st, int en, int xr, int yr); - видаї

елiпс, параметри: координати центра, кути початку та кiнця лiнiє

елiпса в градусах (у повного елiпса st=0, en=360), довжини радiу-

сiв вздовж осей;

GETIMAGE(int l, int tp, int r, int bt, void *b); - запам'ято-

вуї частину екрану, параметри: координати лiвого верхнього i пра-

вого нижнього кута частини екрану, яка пiдлягаї запам'ятовуванню,

та адреса оперативноє пам'ятi, куди рисунок буде записаний;

INITGRAPH(*grdriver, *grmode, char *pathdriver); - iнiцiалiзо-

вуї графiчний режим, параметри: тип графiчного драйвера, модель

екрану (розмiри в пiкселях та палiтра кольорiв), шлях до драйвера.

LINE(int x1, int y1, int x2, int y2); - рисуї лiнiю, парамет-

ри: координати початку та кiнця лiнiє;

OUTTEXTXY(int x, int y, char *textstring); - виводить на екран

текст, параметри: координати початку тексту i текстова константа

або адреса початку тексту в пам'ятi (iм'я масиву лiтер);

PUTIMAGE(int left, int top, void *sitmap, int ap); - вiдновлюї

рисунок, запам'ятований функцiїю getimage(), параметри: координа-

ти лiвого верхнього кута екрану для виводу рисунка, адреса опера-

тивноє пам'ятi, починаючи з якоє записаний рисунок, змiщення;

PUTPIXEL(int x, int y, int c); - рисуї точку заданого кольору;

SETCOLOR(int color); - встановлюї поточний колiр;

SETTEXTSTYLE(int font, int direction, int charsize);

Функцiя визначаї тип, розмiщення та розмiри букв тексту, який

буде виданий функцiїю outtextxy(). Нижче поданi можливi значення

параметрiв.

font: DEFAULT_FONT (тип шрифта 8*8), TRIPLEX_FONT, SMALL_FONT,

SANS_SERIF_FONT, GOTHIC_FONT;

57

direction: HORIZ_DIR (горизонтальний напис), VERT_DIR;

charsize: 1 - мiнiмальнi розмiри, 2,...,10.

Якщо функцiя settextstyle() не вживаїться, то для функцiє out-

textxy() автоматично вибираються параметри:

DEFAULT_FONT, HORIZ_DIR, 1.

9.2. Приклад програми

Постановка задачi: скласти графiчний алгоритм i програму для

багаторазового виконання таких графiчних робiт, якi вибираються

шляхом натискання клавiш:

k - нарисувати коло, яке падаї зверху екрану;

w - змiнити колiр на наступний i нарисувати трикутник;

t - нарисувати нерухомий прямокутнiй трикутник;

p - вивести на екран горизонтальний напис "Вихiд", запам'ятати

цю частину екрану;

e - витерти екран i вивести на нього те, що було раньше запам'-

ятовано (напис "Вихiд"), закiнчити роботу;

Esc - закiнчити роботу.

При натисканнi будь-якоє iншоє клавiшi вивести текст: "Виберiть

клавiшу: w,k,t,p,e,Esc".

Алгоритм розв'язування даноє задачi показаний на рис. 9. Вiн

представляї собою зациклений перемикач для вибору i виконання

заданих робiт.

Нижче поданий текст програми. Програма маї двi директиви пре-

процесору типу #include, якi служать для пiд'їднання файлу grap-

hics.h з графiчними функцiями та bios.h з функцiїю bioskey(0).

Серед оголошень програми маїмо змiнну col цiлого типу, яка iнiцi-

алiзована кольором EGA_WHITE (бiлий). Лiтерний масив b[1024] слу-

жить для запам'ятовування частини екрану функцiїю getimage(), ма-

58

Графiчний алгоритм виконання графiчних робiт.

Рис. 9.

сив txt[], iнiцiалiзований словом "Вихiд" - для видачi тексту при

натисканнi клавiш p та e . Змiнна j цiлого типу призначена для

органiзацiє циклу. Змiннi gmode i gdriver використовуються функ-

цiїю initgraph(), оскiльки gdriver=DETECT (автоматичний вибiр

графiчного драйвера), змiннiй gmode значення не присвоїно.

Основою програми ї перемикач, зациклений оператором while(1).

Виразом перемикача ї функцiя bioskey(0), яка зупиняї програму i

видаї код клавiшi, натисненоє пiд час зупинки. В тiлi перемикача

цей код аналiзуїться i виконуїться вiдповiдний йому вид роботи.

Результатом виконання програми ї рисунки, виведенi на екран.

59

/* Пpогpама pисування на екpанi*/

# include <graphics.h>

# include <bios.h>

main()

{int col=EGA_WHITE;

char b[1024], txt[]="Вихiд";

int j,gmode,gdriver=DETECT;

initgraph(&gdriver,&gmode,"\BGI");setcolor(col);

while(1)

switch(bioskey(0))

{case 107:for(j=0;j<100;j++) /* k */

{cleardevice();circle(300,2*j,j);

}

break;

case 119:if(++col>15)col=1;setcolor(col); /* w */

case 116:cleardevice(); /* t */

line(100,100,300,300);

line(100,100,100,300);

line(100,300,300,300);break;

case 112:outtextxy(200,200,txt);bioskey(0); /* p */

getimage(195,195,250,210,b);

break;

case 101:cleardevice();putimage(195,195,b,0); /* e */

bioskey(0);

case 283:exit(1); /* Esc */

default:cleardevice();

outtextxy(100,50,"Виберiть кл.: w,k,t,p,e,Esc");

}

closegraph();

}

60

9.3. Запитання для самоперевiрки

1. Перелiчiть графiчнi функцiє, назвiть та пояснiть єх параметри.

2. Як забезпечити змiну розмiрiв та пересування геометричних фi-

гур на екранi?

3. Як вiдбуваїться чергування кольорiв у програмi прикладу? Який

колiр буде першим пiсля запуску програми?

4. Як можна вивести на екран текст у графiчному режимi?

5. Як працюють функцiє bioskey(0) та exit(1)?

6. Складiть програму для видачi на екран кодiв усiх клавiш персо-

нального комп'ютера.

7. Назвiть одиницю вимiру площi екрану в графiчному режимi.

8. Чим вiдрiзняються текстовий i графiчний режими роботи екрану?

9. Як вивести на екран точку заданого кольору?

Використана лiтература

1. Бочков С.О., Субботин Д.М. Язык программирования Си для персо-

нального компютера. - М.: Радио и связь, 1990.

2. Трой Д. Программирование на языке Си для персонального компю-

тера IBM PC. - М.: Радио и связь, 1991.

3. Бек Л. Введение в системное программирование. :Пер. с англ.

-М.: Мир, 1988.

4. Довгаль С.И., Сбитнев А.И. Интерфейс современной программной

системы. -К.: Информсистема-сервис, 1994.

5. Кузнецов С.Д. Турбо Сi. -М.: Малип, 1992.

6. Стариков Ю.А. Мобильность программ и особенности реализаций

языка Сi. -М.: МП Память, 1992.

7. Проценко В.С. i iн. Технiка програмування мовою Сi. -К.: Ли-

бiдь, 1993.

61