Основи мови ci

176
Програмування на мові Сі © К.Ю. Поляков Переклад: В.Семенюк 1. Вступ 2. Змінні 3. Введення і виведення 4. Розгалуження 5. Складні умови 6. Цикли 7. Цикли з умовою 8. Оператор вибору 9. Відлагодження програм 10. Графіка 11. Графіки функцій 12. Процедури 13. Анімація 14. Випадкові числа 15. Функції

Upload: escuela

Post on 13-Jul-2015

190 views

Category:

Education


0 download

TRANSCRIPT

Програмування

на мові Сі

© К.Ю. Поляков

Переклад: В.Семенюк

1. Вступ

2. Змінні

3. Введення і виведення

4. Розгалуження

5. Складні умови

6. Цикли

7. Цикли з умовою

8. Оператор вибору

9. Відлагодження програм

10. Графіка

11. Графіки функцій

12. Процедури

13. Анімація

14. Випадкові числа

15. Функції

Програмування

на мові Сі

Тема 1. Вступ

© К.Ю. Поляков

Переклад: В.Семенюк

3

Алгоритм

Властивості алгоритма

• дискретність: складається з окремих кроків (команд)

• зрозумілість: повинен включати тільки команди, зрозумілі виконавцеві (що входять до СКВ)

• визначеність: при одинакових вихідних даних завжди видає один і той же результат

• конечність: закінчується за певної кількості кроків

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

• коректність: дає правильний розв’язок для будь-яких допустимих вхідних даних

Алгоритм – це чітко визначений план дії для

виконавця.

4

Програма

Програма – це

• алгоритм, записаний на якій-небудь мові програмування

• набір команд для комп’ютера

Команда – це опис дій, які повинен виконувати

комп’ютер.

• звідки взято вхідні дані?

• що потрібно з ними зробити?

• куди помістити результат?

5

Мови програмування

• Машинно-орієнтовані (низького рівня) - кожна

команда відповідає одній команді процесора

(асемблер)

• Мови високого рівня – наближені до природньої

(англійської) мови, легше сприймаються

людиною, не залежать від конкретного

комп’ютера

• для навчання: Бейсік, ЛОГО, Паскаль

• професійні: Сі, Фортран, Паскаль

• для задач штучного інтелекту: Пролог, ЛІСП

• для Інтернету: JavaScript, Java, Perl, PHP,

ASP

6

Мова Сі

1972-1974 – Б. Керніган, Д. Рітчі

• висока швидкість роботи програм

• багато можливостей

• стала основою багатьох сучасних мов

(С++, С#, Javascript, Java, ActionScript,

PHP)

• багато шансів зробити помилку, яка не

буде знайдена автоматично

7

Найпростіша програма

void main()

{

}

головна (основна)

програма завжди

має ім’я main

void = «пустий»

основна програма не

видає ніякого

результату-числа

початок програми

«тіло» програми

(основна частина)

кінець програми

Що робить ця програма??

8

Що відбувається далі?

void main()

{

}

first.cpp

вихідний файл

first.obj

транслятор

ЪБzЦ2?|ё3БКа

n/36ШпIC+И-

ЦЗ_5МyРЧб

s6bд^:/@:лЖ1_

oб’єктний файл

стандартні функції

редактор

зв’язків

(компоновка)

MZPо:ЄPэ_еЗ"!_

`кn,ЦbЄ-Щр1

G _БАC,_Ощях¤9жФ

first.exe

виконуваний файл

• по вихідному

файлу можна

поновити

решту

• виконуваний

файл можна

запустити

!

текст програми на Сі або Сі++

9

Виведення тексту на екран

#include <stdio.h>

void main()

{

printf("Привіт!");

}

include = включити файл stdio.h: опис

стандартних функцій

введення і виведення

виклик стандартної

функції

printf = print format

(форматне виведення)

цей текст

буде на

екрані

10

Як розпочати роботу?

тут ми

набираємо

програму

тут виводяться

повідомлення

про помилки

верхнє меню

кнопка

закриття вікна

координати курсора

(рядок, стовпець)

11

Оболонка Borland C ++ 3.1

Borland International (також Turbo Pascal, Delphi)

IDE = Integrated Development Environment

інтегроване середовище розробки:

• текстовий редактор для створення і редагування

текстів програм

• транслятор для переведення текстів програм на Сі та

Сі++ в команди процесора

• редактор зв’язків для створення виконуваного файла

(EXE-файла), підключаються стандартні функції

• відлагоджувач для пошуку помилок в програмах

12

Робота з файлами

Збереження файла: F2ввести ім’я файла:

• не більше 8 символів

• без пробілів

• тільки латинські букви

і цифри

Esc - відміна

Enter - збереження

розширення .CPP

додається

автоматично

!

13

Робота з файлами

Завантаження файла: F3

вибір файла

зі списку

якщо ввести ім’я

неіснуючого файла, він

буде створений

Esc - відміна

Enter - відкрити (або створити)

14

Запуск програми на виконання

Трансляція + компоновка: F9

Трансляція + компоновка + запуск: Ctrl-F9

число

помилок

Errors

(помилки)

Press any key

(натисніть будь-яку

клавішу)

Warnigns

(попередження)

Success

(успіх)

15

Де помилки?

переміщення

курсора ↑↓

ця помилка

знайдена тут!

Помилка може бути в кінці попереднього рядка!!

Enter – перейти до

редагування

16

Найбільш популярні помилки

Unable to open include file

'xxx.h'не знайдено файл заголовку

'xxx.h' (неправильно вказане його

ім’я, він вилучений або тощо.)

Function 'xxx' should have a

prototype

функцiя 'xxx' не зголошена (не

підключений файл заголовку або

не зголошена своя функція, або

невірне ім’я функції)

Unterminated string or

character

constant

не закриті лапки

Statement missing; немає крапки з комою в кінці

оператора у попередньому рядку

Compound statement

missing }не закрита фігурна дужка

Undefined symbol 'xxx' не зголошена змінна 'xxx'

17

Керування клавішами

Довідникова система F1

Зберегти файл F2

Відкрити файл F3

Закрити вікно з програмою Alt-F3

Запуск програми Ctrl-F9

Розкрити на весь екран Ctrl-Enter

Показати робочий екран Alt-F5

Вийти з оболонки Alt-X

18

Робота з блоками тексту

Виділити блокмишкою або

Shift - ↑↓

Відмінити виділення Ctrl-K + H

Вирізати (в буфер обміну) Shift-Delete

Копіювати (в буфер обміну) Ctrl-Insert

Вставити з буфера обміна Shift-Insert

Вилучити текучий рядок Ctrl-Y

Вилучити виділенний блок Ctrl-Delete

19

Сервіс

#include <stdio.h>

#include <conio.h>

void main()

{

clrscr(); /* очищення екрану */

printf("Привіт!"); // виведення на екран

getch(); /* чекати натиск клавіши */

}

файл conio.h: опис

функцій для роботи з

клавіатурою і монітором

чекати натиску

будь-якої клавіши

коментар до

кінця рядка

коментар між /* і */

очищення екрану

clear screen

• очистка екрану перед початком роботи

• затримка до натиску будь-якої клавіши

20

Перехід на новий рядок

#include <stdio.h>

#include <conio.h>

void main()

{

clrscr();

printf("Привіт,\nВася!");

getch();

}

Привіт,

Вася!

на екрані:

послідовність \nкод 10

перехід на новий рядок

21

Завдання

"4": Вивести на екран текст «драбинкою"Вася

пішов

гуляти

"5": Вивести на екран рисунок з буквЖЖЖЖЖЖЖЖЖ ЖЖЖЖЖЖЖHH HHZZZZZ

Програмування

на мові Сі

Тема 2. Змінні

23

Що таке змінна?

Змінна - це комірка в пам’яті комп’ютера, яка має ім’я

і зберігає певне значення.

• Значення змінної може змінюється в часі виконання

програми.

• При запису в комірку нового значення старе

стирається.

Типи змінних

• int – ціле число в інтервалі [-32768…32767]

(2 байта)

• float – дійсне число, floating point (4 байта)

• char – символ, character (1 байт)

24

Імена змінних

Можуть включати

• латинські букви (A-Z, a-z)

• знак підкреслення _

• цифри 0-9

НЕ можуть включати

• букви кирилиці

• пробіли

• дужки, знаки +, =, !, ? та інші.

Ім’я не може починатися з цифри!!

Які імена правильні?

AXby R&B 4Wheel Вася “PesBarbos”

TU154 [QuQu] _ABBA A+B

25

Оголошення змінних

Оголосити змінну = визначити її ім’я, тип, початкове

значення і виділити їй місце в пам’яті.

void main()

{

int a;

float b, c;

int Tu104, Il86=23, Yak42;

float x=4.56, y, z;

char c, c2='A', m;

}

Якщо початкове значення не задане, то в цій

комірці знаходиться «сміття"!!

ціла змінна a

дійсні змінні b і cцілі змінні Tu104, Il86 і

Yak42

Il86 = 23дійсні змінні x, y і z

x = 4,56

·

ціла і дробова частини

розділяються крапкою

символьні змінні c, c2 і

m

c2 = 'A'

26

Оператор присвоєння

Оператор – це команда мови програмування

високого рівня.

Оператор присвоєння служить для зміни значення

змінної.

Приклад

a = 5;

x = a + 20;

y = (a + x) * (x – a);

?

a5 5

?

x5+2025

?

y600 30*20

27

Оператор присвоєння

Загальна структура:

Арифметичний вираз може включати

• константи (сталі)

• імена змінних

• знаки арифметичних операцій:

+ - * / %

• виклик функцій

• круглі дужки ( )

множення діленнязалишок від

ділення

iм’я змінної = вираз;

куди що

Для чого служать

круглі дужки??

28

void main()

{

int a, b;

float x, y;

a = 5;

10 = x;

y = 7,8;

b = 2.5;

x = 2*(a + y);

a = b + x;

}

Які оператори неправильні?

iм’я змінної повинне бути

зліва від знаку =

цiла i дробова частини

відокремляються крапкою

при записі дійсного значення

в цілу змінну дробова

частина буде відкинута

29

Особливості ділення в Сі

При діленні цілих чисел залишок відкидається!!

void main()

{

int a = 7;

float x;

x = a / 4;

x = 4 / a;

x = float(a) / 4;

x = 1.*a / 4;

}

1

0

1.75

1.75

30

Скорочений запис операцій в Сі

повний запис скорочений запис

інкремент

декремент

a = a + 1; a++;

a = a + b; a += b;

a = a - 1; a--;

a = a – b; a -= b;

a = a * b; a *= b;

a = a / b; a /= b;

a = a % b; a %= b;

31

Ручне прокручування програми

void main()

{

int a, b;

a = 5;

b = a + 2;

a = (a + 2)*(b – 3);

b = a / 5;

a = a % b;

a++;

b = (a + 14) % 7;

}

a b

5

7

28

5

3

4

4

? ?

32

Порядок виконання операцій

• обчислення виразів у дужках

• множення, ділення, % зліва направо

• додавання і віднімання зліва направо

2 3 5 4 1 7 8 6 9

z = (5*a*c+3*(c-d))/a*(b-c)/ b;

)2)((

)(5 22

addc

badcax

)()(35

cbab

dcacz

2 6 3 4 7 5 1 12 8 11 10 9

x =(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));

Програмування

на мові Сі

Тема 3. Введення і виведення

34

Додавання двох чисел

Задача. Ввести два цілих числа і вивести на

екран їхню суму.

Найпростіший розв’язок:

#include <stdio.h>

#include <conio.h>

void main()

{

int a, b, c;

printf("Введіть два цілих числа\n");

scanf ("%d%d", &a, &b);

c = a + b;

printf("%d", c);

getch();

}

підказка для введення

введення двох

чисел з

клавіатури

виведення результату

35

Введення чисел з клавіатури

scanf ("%d%d", &a, &b);

формат введення

scanf – форматне

введення

адреса комірок, куди

записати введенні

числа

Формат – символьний рядок, який показує, які числа

вводяться (виводяться).

%d – ціле число

%f – дійсне число

%c – 1 символ

%s – символьний рядок

12

7652

a – значення

змінної a

&a – адреса

змінної a

чекати введення з клавіатури двох

цілих чисел (через пробіл або

Enter), перше з них записати в

змінну a, друге – в b

36

Що неправильно?

int a, b;

scanf ("%d", a);

scanf ("%d", &a, &b);

scanf ("%d%d", &a);

scanf ("%d %d", &a, &b);

scanf ("%f%f", &a, &b);

&a

%d%d

&a, &b

забрати пробіл

%d%d

37

Виведення чисел на екран

printf ("%d", c);

тут вивести ціле

числоце число взяти з

комірки c

printf ("Результат: %d", c);

printf ("%d+%d=%d", a, b, c );

формат виведеннясписок значень

a, b, c

printf ("%d+%d=%d", a, b, a+b );

арифметичний

вираз

38

Виведення цілих чисел

int x = 1234;

printf ("%d", x);

1234

printf ("%9d", x);

мінімальне число

позицій

1234 всього 9 позицій

або "%i"

або "%9i"

39

Виведення дійсних чисел

float x = 123.4567;

printf ("%f", x);

123.456700

printf ("%9.3f", x);

мінімальне число

позицій, 6 цифр в

дробовій частині

123.456

всього 9 позицій,

3 цифри в дробовій

частині

printf ("%e", x);

1.234560e+02стандартний вигляд:

1,23456·102

printf ("%10.2e", x);

1.23e+02

всього 10 позицій,

2 цифри в дробовій

частині мантиси

40

Повний розв’язок

#include <stdio.h>

#include <conio.h>

void main()

{

int a, b, c;

clrscr();

printf("Введіть два цілих числа\n");

scanf("%d%d", &a, &b);

c = a + b;

printf("%d+%d=%d", a, b, c);

getch();

}

Протокол:

Введіть два цілих числа

25 30

25+30=55

це виводить

комп’ютер

це вводить користувач

41

Блок-схема лінійного алгоритму

початок

кінець

c = a + b;

введення a, b

виведення c

блок «початок"

блок "введення"

блок "процес"

блок "виведення"

блок "кінець"

42

Завдання

"4": Ввести три числа, знайти їхню суму і добуток.

Приклад:

Введіть три числа:

4 5 7

4+5+7=16

4*5*7=140

"5": Ввести три числа, знайти їхню суму, добуток і

середнє арифметичне.

Приклад:

Введіть три числа:

4 5 7

4+5+7=16

4*5*7=140

(4+5+7)/3=5.33

Програмування

на мові Сі

Тема 4. Розгалуження

44

Алгоритми розгалуження

Задача. Ввести два цілих числа і вивести на екран

найбільше з них.

Ідея розв’язку: потрібно вивести на екран перше число,

якщо воно більше другого, або друге, якщо воно більше

першого.

Особливість: дія виконавця залежить від деяких умов

(якщо … інакше …).

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

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

45

Варіант 1. Блок-схема

початок

max = a;

ввести a,b

виведення max

a > b?

max = b;

кінець

так ні повна форма

розгалуження

блок "розв’язання"

Якщо a = b??

46

Варіант 1. Програма

void main()

{

int a, b, max;

printf("Введіть два цілих числа\n");

scanf("%d%d", &a, &b );

if (a > b) {

}

else {

}

printf(“Більше число %d", max);

}

max = a;

max = b;

повна форма

умовного

оператора

47

Умовний оператор

if ( умова )

{

// що робити, якщо умова правильна

}

else

{

// що робити, якщо умова неправильна

}

Особливісті:

• друга частина (else …) може бути відсутньою

(неповна форма)

• якщо в блоці один оператор, можна забрати { }

48

Що неправильно?

if a > b {

a = b;

}

else

b = a;

if ( a > b ) {

a = b;

else

b = a;

if ( a > b )

else

b = a;

if ( a > b )

a = b;

c = 2*a;

else

b = a;

}

( )

}

{a = b;

49

Варіант 2. Блок-схема

неповна форма

розгалуження

початок

max = a;

ввести a,b

виведення max

max = b;

кінець

так ніb > a?

50

Варіант 2. Програма

void main()

{

int a, b, max;

printf("Введіть два цілих числа\n");

scanf("%d%d", &a, &b );

max = a;

if (b > a)

printf(“Більше число %d", max);

}

max = b;

неповна форма

умовного

оператора

51

void main()

{

int a, b, max;

printf("Введіть два цілих числа\n");

scanf("%d%d", &a, &b );

max = b;

if ( ??? )

???

printf(“Більше число %d", max);

}

Варіант 2Б. Програма

max = a;

a > b

52

Завдання

"4": Ввести три числа і знайти найбільше з них.

Приклад:

Введіть три числа:

4 15 9

Найбільше число 15

"5": Ввести п’ять чисел i знайти найбільше з них.

Приклад:

Введіть п’ять чисел:

4 15 9 56 4

Найбільше число 56

Програмування

на мові Сі

Тема 5. Складні умови

54

Складні умови

Задача. Фірма набирає співробітників від 25 до 40 років

включно. Ввести вік людини і визначити, чи підходить

вона фірмі чи ні (вивести відповідь "підходить" або "не

підходить").

Особливість: потрібно перевірити, чи виконуються дві

умови одночасно.

Чи можна розв’язати відомими методами??

55

Варiант 1. Алгоритм

початок

ввести x

'підходить'

кінець

так ніx >= 25?

так ніx <= 40?

'не підходить' 'не підходить'

56

Вариант 1. Програма

void main()

{

int x;

printf("Введіть вік\n");

scanf("%d", &x);

if (x >= 25)

if (x <= 40)

printf("Підходить");

else printf("Не підходить");

else

printf("Не підходить");

}

57

Варіант 2. Алгоритм

початок

ввести x

'підходить'

так ніx >= 25і

x <= 40?

'не підходить'

кінець

58

Варіант 2. Програма

void main()

{

int x;

printf("Введіть вік\n");

scanf("%d", &x);

if ( x >= 25 && x <= 40 )

printf("Підходить");

else printf("Не підходить");

}

складна

умова

59

Складні умови

Складні умови – це умови, що складаються з декількох

простих умов (відношень), зв’язанних за допомогою

логічних операцій:

! – НІ (not, заперечення, інверсія)

&& – І (and, логічне множення, кон’юнкція,

одночасне виконання умов)

|| – АБО (or, логічне додавання, диз’юнкція,

виконання хотя б одної з умов)

Прості умови (відношення)

< <= > >= == !=

дорівнює не дорівнює

60

Складні умови

Порядок виконання складних умов:

• вираз в дужках

• ! (НІ, заперечення)

• <, <=, >, >=

• ==, !=

• && (І)

• || (АБО)

Приклад:2 1 6 3 5 4

if ( !(a > b) || c != d && b == a)

{

...

}

61

Істинно або хибно при a = 2; b = 3; c = 4;

!(a > b)

a < b && b < c

!(a >= b) || c == d

a < c || b < c && b < a

a > b || !(b < c)

Для яких значень x істиннa умова:

x < 6 && x < 10

x < 6 && x > 10

x > 6 && x < 10

x > 6 && x > 10

x < 6 || x < 10

x < 6 || x > 10

x > 6 || x < 10

x > 6 || x > 10

Складні умови

1

1

0

(-, 6)

(6, 10)

(10, )

(-, 10)

(-, 6) (10,)

(-, )

(6, )

x < 6

x > 10

x < 10

x > 6

11

62

Завдання

"4": Ввести номер місяця і вивести назву пори року.

Приклад:

Введіть номер місяця:

4

весна

"5": Ввести вік людини (від 1 до 150 років) і вивести

його разом з наступним словом «рік", «роки" або

«років".

Приклад:

Введіть вік: Введіть вік:

24 57

Вам 24 роки Вам 57 років

Програмування

на мові Сі

Тема 6. Цикли

64

Цикли

Цикл – це багатократне виконання одинакової

послідовності дій.

• цикл з відомими числом кроків

• цикл з невідомим числом кроків (цикл з умовою)

Задача. Вивести на екран квадрати і куби цілих чисел від 1 до 8 (від a до b).

Особливість: однакові дії виконуються 8 раз.

Чи можна розв’язати відомими методами??

65

Алгоритм

початок

i, i2, i3

кiнецьні

так

i <= 8?

i = 1;

i = i + 1;

i2 = i * i;

i3 = i2 * i;

задати початкове значення

змінною циклу

перевірити, чи всі зроблені

обчислюємо квадрат і куб

виведення

результату

перейти до наступного i

66

Алгоритм (з блоком "цикл")

початок

i, i2, i3

кінець

i2 = i * i;

i3 = i2 * i;

i = 1,8

блок "цикл"

тіло циклу

67

Програма

void main()

{

int i, i2, i3;

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

{

i2 = i*i;

i3 = i2*i;

printf("%4d %4d %4d\n", i, i2, i3);

}

}

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

{

i2 = i*i;

i3 = i2*i;

printf("%4d %4d %4d\n", i, i2, i3);

}

змінна циклу

початкове

значеннякінцеве

значення

зміна на

кожному кроці:i=i+1

рівні

стовпчики

цикл працює, поки ця

умова виконується

цикл

початок циклу

кінець циклу

заголовок

циклу

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

i2 = i*i;

i3 = i2*i;

printf("%4d %4d %4d\n", i, i2, i3);

тіло циклу

68

Цикл із зменшенням змінної

Задача. Вивести на екран квадрати і куби цілих чисел від

8 до 1 (у зворотньому порядку).

Особливість: змінна циклу повинна зменшуватися.

Розв’язок:

for ( )

{

i2 = i*i;

i3 = i2*i;

printf("%4d %4d %4d\n", i, i2, i3);

}

i =8; i>=1; i--

69

Цикл із змінною

for (початкове значення;

умова продовження циклу;

зміна на кажному кроці)

{

// тіло циклу

}

Приклади:

for (a = 2; a < b; a+=2) { ... }

for (a = 2, b = 4; a < b; a+=2) { ... }

for (a = 1; c < d; x++) { ... }

for (; c < d; x++) { ... }

for (; c < d; ) { ... }

70

Цикл із змінною

Особливості:

• умова перевіряється на початку чергового кроку циклу,

якщо вона хибна цикл не виконується;

• зміни (третя частина в заголовку) виконується в кінці

чергового кроку циклу;

• якщо умова ніколи не стане хибною, цикл може

продовжуватися незкінченно (зациклювання)

• якщо в тілі циклу один оператор, дужки {} можна не

ставити:

for(i=1; i<8; i++) { i--; }

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

Не радять змінювати змінну

циклу в тілі циклу!!

71

for (i=8; i>=1; i--)

printf("Привіт");

printf("i=%d", i);

Цикл із змінною

Особливості:

• після виконання циклу в багатьох системах

встановлюється і зберігається перше значення

змінної циклу, при якому порушується умова:

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

printf("Привіт");

printf("i=%d", i);

i=9

i=0

72

Скільки разів виконається цикл?

a=1;

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

a=1; b=2;

for(i=3; i >=1; i--)a+=b; a= 7

a=1;

for(i=1; i >=3; i--)a=a+1;a= 1

a=1;

for(i=1; i<=4; i--)a++;

зациклювання

a=1;

for(i=1; i<4; i++) a= a+i; a= 7

73

Завдання

"4": Ввести a і b та вивести квадрати і куби чисел від a до b.

Приклад:

Введіть межі інтервалу:

4 6

4 16 64

5 25 125

6 36 216

"5": Вивести квадрати і куби 10 чисел наступної

послідовності: 1, 2, 4, 7, 11, 16, …

Приклад:

1 1 1

2 4 8

4 16 64

...

46 2116 97336

Програмування

на мові Сі

Тема 7. Цикли з умовою

75

Цикл з невідомим числом кроків

Приклад: ВІдпиляти поліно від колоди. Скільки раз потрібно

зробити рухів пилкою?

Задача: Ввести ціле число (<2000000) і визначити число цифр

в ньому.

Ідея розв’язку: Відсікаємо послідовно останню цифру,

збільшуємо лічильник.

Проблема: Невідомо, скільки кроків потрібно зробити.

Розв’язок: Потрібно зупинитися, коли n = 0, тобто потрібно

робити "поки n != 0".

n count

123 0

12 1

1 2

0 3

76

Алгоритм

початок

count

кінець

ні

так

n != 0?

count = 0;

count = count + 1;

n = n / 10;

обнулити лічильник цифрвведення n

виконати "поки

n != 0"

77

Програма

void main()

{

long n;

int count;

printf("Введіть ціле число\n");

scanf("%ld", &n);

count = 0;

while (n != 0)

{

count ++;

n = n / 10;

}

printf("В числі %ld знайшли %d цифр", n, count);

}

n1 = n;

n1,

виконати "поки

n != 0"

Що погано??

long – довге ціле число (±

2147483647)

%ld – формат введення і

виведення довгих чисел, n1;

78

Цикл з умовою

while ( умова )

{

// т іло циклу

}

Особливості:

• можна використовувати складні умови:

• якщо у тілі циклу тільки один оператор, дужки {}

можна не писати:

while ( a < b && b < c ) { ... }

while ( a < b ) a ++;

79

Цикл з умовою

Особливості:

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

• якщо умова на вході в цикл хибна, цикл не

виконується ні разу

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

зациклюється

a = 4; b = 6;

while ( a > b ) a = a– b;

a = 4; b = 6;

while ( a < b ) d = a + b;

80

Скільки разів виконується цикл?

a = 4; b = 6;

while ( a < b ) a ++;

2 разиa = 6

a = 4; b = 6;

while ( a < b ) a += b;

1 разa = 10

a = 4; b = 6;

while ( a > b ) a ++;

0 разівa = 4

a = 4; b = 6;

while ( a < b ) b = a - b;

1 разb = -2

a = 4; b = 6;

while ( a < b ) a --;

зациклювання

81

Заміна for на while і навпаки

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

{

// тіло циклу

}

i = 1;

while ( i <= 10 ) {

// тіло циклу

i ++;

}

for ( i=a; i>=b; i--)

{

// тіло циклу

}

i = a;

while ( i >= b ) {

// тіло циклу

i --;

}

В мові Сі заміна циклу for на while і навпаки

можлива завжди!!

82

Завдання

"4": Ввести ціле число і знайти суму його цифр.

Приклад:

Введіть ціле число:

1234

Сума цифр числа 1234 дорівнює 10.

"5": Ввести ціле число і визначити, чи вірно, що в

його записі є дві одинакові цифри.

Приклад:

Введіть ціле число: Введіть ціле число:

1234 1224

Ні. Так.

83

Послідовності

Приклади:

• 1, 2, 3, 4, 5, …

• 1, 2, 4, 7, 11, 16, …

• 1, 2, 4, 8, 16, 32, …

• ...,32

5,

4

1,

8

3,

2

1,

2

1...,

32

5,

16

4,

8

3,

4

2,

2

1

an = n a1 = 1, an+1 = an+1

a1 = 1, an+1 = an + n

an = 2n-1 a1 = 1, an+1 = 2an

b1 = 1, bn+1 = bn+1

c1 = 2, cn+1 = 2cnn

nn

c

ba

84

Послідовності

Задача: знайти суму всіх елементів послідовності,

які по модулю більші 0,001:

...,32

5,

16

4,

8

3,

4

2,

2

1,1

...32

5

16

4

8

3

4

2

2

11 S

Елемент послідовності (починаючи з №2):

c

bza

n 1 2 3 4 5 ...

b 1 2 3 4 5 ...

c 2 4 8 16 32 ...

z -1 1 -1 1 -1 ...

b = b+1;

c = 2*c;

z = -z;

85

Алгоритм

початок

S

кінець

ні

так

|a| > 0.001?

S = S + a;

S = 0; b = 1;

c = 2; z = -1;

a = 1;

початкові

значення

a = z*b/c;

b = b + 1;

c = 2*c; z = -z;

перший елементa = 1;

S = 0;

новий елемент

змінна

Перестановка??

86

Програма

#include <math.h>

void main()

{

int b, c, z;

float S, a;

S = 0; z = -1;

b = 1; c = 2; a = 1;

while (fabs(a) > 0.001) {

S += a;

a = z * b / c;

z = - z;

b ++;

c *= 2;

}

printf ("S = %10.3f", S);

}

перехід до

наступного

доданку

початкові

значення

збільшення

сумирозрахунок елемента

послідовності

математичні функції

fabs – модуль

дійсного числа

Що погано??

, b;

щоб не було

заокруглення при

діленні

87

Завдання

"4": Знайти суму елементів послідовності з

точністью 0,001:

Відповідь:

S = 1.157

"5": Знайти суму елементів послідовності з

точністью 0,001:

Відповідь:

S = 1.220

...819

8

277

6

95

4

33

21

S

...24313

10

818

8

275

6

93

4

32

21

S

88

Цикл с передумовою

Задача: Ввести ціле додатне число (<2000000) і

визначити число цифр в ньому.

Проблема: Як не дати ввести від’ємне число або нуль?

Розв’язок: Якщо вводиться невірне число, повернутися

назад до введення даних (цикл!).

Особливість: Один раз тіло циклу потрібно виконати в

будь-якому випадку перевірку умови циклу потрібно

робити в кінці циклу (цикл з післяумови).

Цикл с післяумовою – це цикл, в якому перевірка

умови виконується в кінці циклу.

89

Цикл з післяумовою: алгоритм

початок

кінець

ні

такn <= 0?

тіло циклу

умова

блок "типовий

процес"

введення n

основний

алгоритм

90

Програма

void main()

{

long n;

do {

printf("Введіть додатне число\n");

scanf("%ld", &n);

}

while ( n <= 0 );

... // основний алгоритм

}

умова

Особливості:

• тіло циклу завжди виконується хоча б один раз

• після слова while («поки…» ) ставиться умова

продовження циклу

91

Скільки разів виконується цикл?

a = 4; b = 6;

do { a ++; } while (a <= b);

3 разиa = 7

a = 4; b = 6;

do { a += b; } while ( a <= b );

1 разa = 10

a = 4; b = 6;

do { a += b; } while ( a >= b );зациклювання

a = 4; b = 6;

do b = a - b; while ( a >= b );

2 разиb = 6

a = 4; b = 6;

do a += 2; while ( a >= b );зациклювання

92

Завдання (із захистом від невірного введення)

"4": Ввести натуральне число і визначити, чи правильно, що

сума його цифр дорівнює 10.

Приклад:

Введіть число >= 0: Введіть число >= 0:

-234 1233

Потрібно податне число. Ні

Введіть число >= 0:

1234

Так

"5": Ввести натуральне число і визначити, які цифри

зустрічаються декілька разів.

Приклад:

Введіть число >= 0: Введіть число >= 0:

2323 1234

Повторюється: 2, 3 Немає повторень.

Програмування

на мові Сі

Тема 8. Оператор вибору

94

Оператор вибору

Задача: Ввести номер місяця і вивести кількість

днів в цьому місяці.

Розв’язок: Число днів по місяцям:

28 днів – 2 (лютий)

30 днів – 4 (квітень), 6 (червень), 9 (вересень),

11 (листопад)

31 день – 1 (січень), 3 (березень), 5 (травень),

7 (липень), 8 (серпень), 10 (жовтень),

12 (грудень)

Особливість: Вибір не з двох, а з декількох

варіантів в залежності від номера місяця.

Чи можно розв’язати відомими методами??

95

Алгоритм

початок

кінець

оператор вибору

ні один

варіант не

підійшов

введення M

так

ні

M = 1? D = 31;

ні

M = 2? D = 28;так

ні

M = 12? D = 31;так

виведення Dпомилка

96

Програма

void main()

{

int M, D;

printf("Введіть номер місяця:\n");

scanf("%d", &M);

switch ( M ) {

case 2: D := 28;

case 4: case 6: case 9: case 11:

D := 30;

case 1: case 3: case 5: case 7:

case 8: case 10: case 12:

D := 31;

default: D := -1;

}

if (D > 0)

printf("В цьому місяці %d днів.", D);

else printf("Невірний номер місяця");

}

ні один варіант не

підійшов

break;

break;

break;

вийти із

switch

97

Оператор вибору

Задача: Ввести букву і вивести назву тварини на цю

букву.

Особливість: вибір по символьній величині.

void main()

{

char c;

printf("Введіть першу букву назви тварини:\n");

c = getch();

switch ( c ) {

case 'а': printf("Антилопа"); break;

case 'б': printf("Барсук"); break;

case 'в': printf("Вовк"); break;

default: printf("Не знаю я таких!");

}

}

Що буде, якщо всюди забрати break??

98

Оператор вибору

Особливості:

• після switch може бути ім’я змінною або арифметичний

вираз цілого типу (int, long)

або символьного типу (char)

• Не можна ставити два однакових значень:

switch ( i+3 ) {

case 1: a = b; break;

case 2: a = c;

}

switch ( x ) {

case 1: a = b; break;

case 1: a = c;

}

99

Завдання (із захистом від неправильного введення)

"4": Ввести номер місяця і вивести кількість днів у ньому, а

також число помилок при введенні.

Приклад:Введіть номер місяця: Введіть номер місяця:

-2 2

Введіть номер місяця: В цьому місяці 28 днів.

11 Ви вводили неправильно 0 раз.

В цьому місяці 30 днів.

Ви вводили неправильно 1 раз.

"5": Ввести номер місяця і номер дня, вивести число днів, що

залишилося до Нового року.

Приклад:Введіти номер місяця:

12

Введіти день:

25До Нового року залишилося 6 днів.

Програмування

на мові Сі

Тема 9. Відлагодження програм

101

Відлагодження програм

Відлагодження – пошук і виправлення помилок в

програмі.

Англ. debugging, bug = міль, жук

Методи:

• трасування – виведення сигнальних повідомлень

• відключення частини коду (в коментарі)

• покрокове виконання – виконати один рядок

програми і зупинитися

• точки зупинка – виконання програми зупиняється

при досягнені відміченних рядків (перехід в

покроковий режим)

• перегляд і зміна значень змінних в покроковому

режимі

102

Трасування

printf("Введено X=%d\n", X);

printf("В циклі: i=%d, X=%d\n", i, X);

printf("Після циклу: X=%d\n", X);

void main()

{

int i, X;

printf("Введіть ціле число:\n");

scanf("%d", &X);

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

{

...

}

...

}

103

Відлючення частини коду (коментар)

void main()

{

int i, X;

printf("Введіть ціле число:\n");

scanf("%d", &X);

X *= X + 2;

for(i=1; i<10; i++) X *= i;

while ( X > 5 ) {

...

}

...

}

// X *= X + 2;

/* while ( X > 5 ) {

...

} */

коментар до кінця рядка //

закоментований блок /* … */

104

Покрокове виконання

F8 – виконати 1 рядок і зупинитися

виділення рядка буде

виконано при наступному натиску F8

F7 – увійти в процедуру або функцію

Ctrl-F9 – неперервне виконання

Ctrl-F2 – зупинити виконання програми

105

Точки зупинки

F4 – виконати неперервно до того рядка, де знаходиться

курсор (1 раз)

Ctrl-F8 – встановити/зняти точку зупинити

Ctrl-F9 – виконати до наступної точки зупинки

це точка зупинки (зняти – Ctrl-F8)

106

Перегляд значень змінних

Ctrl-F4 – відкрити вікно перегляду змінних

тут ввести ім’я

змінної або виразу

показати

результат (= Enter)

можно ввести

новое значение для переменной

изменить переменную

Програмування

на мові Сі

Тема 10. Графіка

108

Система координат

(0,0)

(x,y)

X

Y

x

y

640

480

(639,479)

(639,0)

(0,479)

109

Принцип сендвіча

малювати в графічному

режимі

включити графічний режим

виключити графічний режим

110

#include <graphics.h>

#include <conio.h>

void main()

{

int d = DETECT, m;

initgraph(&d, &m,

"c:\\borlandc\\bgi");

... // малюємо на екрані

getch();

closegraph();

}

initgraph(&d, &m,

"c:\\borlandc\\bgi");

closegraph();

Структура графічної програми

визначити режим автоматично

допоміжні змінні d,

m

шлях до файлаegavga.bgi

включити

графічний режим

виключити графічний режим

щоб подивитися результат

бібліотека для роботи з графікою

111

Кольори

Код Назва

0 BLACK

1 BLUE

2 GREEN

3 CYAN

4 RED

5 MAGENTA

6 BROWN

7 LIGHTGRAY

Код Назва

8 DARKGRAY

9 LIGHTBLUE

10 LIGHTGREEN

11 LIGHTCYAN

12 LIGHTRED

13 LIGHTMAGENTA

14 YELLOW

15 WHITE

112

Керування кольором

Колір ліній:set color = встановити колір

setcolor ( колір );

Колір і стиль заливки:set fill style = встановити стиль заливки

setfillstyle ( стиль, колір );

Колір тексту:

setcolor ( колір );

0 – виключити 3..6 похилі лінії

1 – суцільна 7..8 сітка 9..11 точкова

113

Точки, відрізки і ламані

(x1, y1)

(x2, y2)setcolor ( 10 );

line (x1, y1, x2, y2);

(x, y)putpixel (x, y, 9);

(x1, y1) (x2, y2)

(x3, y3)

(x4, y4)

(x5, y5)

setcolor ( 12 );

moveto (x1, y1);

lineto (x2, y2);

lineto (x3, y3);

lineto (x4, y4);

lineto (x5, y5);

колір (номер або назва)

114

Прямокутники

(x1, y1)

(x2, y2)

setcolor ( 9 );

rectangle (x1, y1, x2, y2);

(x1, y1)

(x2, y2)

setfillstyle ( 1, 12 );

bar (x1, y1, x2, y2);

(x1, y1)

(x2, y2)

setfillstyle ( 1, 12 );

bar (x1, y1, x2, y2);

setcolor ( 9 );

rectangle (x1, y1, x2, y2);

колір

стиль

(1 - суцільна)

115

Круг, заливка, текст

setcolor ( LIGHTRED );

circle ( x, y, R );

setfillstyle ( 1, LIGHTCYAN );

floodfill ( x, y, BLACK );(x, y)

(x, y)

R

стиль

(1 - суцільна)

колір межі

колір

заливки

(x, y)

Вася

setcolor ( 9 );

outtextxy ( x, y, "Вася" );

116

Приклад

(200, 50)

(100, 100)

(300, 200)

setfillstyle(1,9);

bar(100,100,300,200);

setcolor(13);

rectangle(100,100,300,200);

moveto(100,100);

lineto(200, 50);

lineto(300,100);

setfillstyle(1,14);

floodfill(200, 75, 13);

setcolor(15);

circle(200, 150,50);

setfillstyle(1, 10);

floodfill(200,150, 15);

setcolor(12);

outtextxy(100, 230,

"Sharik's house.");

Sharik's house

117

Завдання

"4": “Жаба"

"5": "Корона"

118

Штриховка

(x1, y1)

(x2, y2)

N ліній (N=5)

h

1

12

N

xxh

rectangle (x1, y1, x2, y2);

line( x1+h, y1, x1+h, y2);

line( x1+2*h, y1, x1+2*h, y2);

line( x1+3*h, y1, x1+3*h, y2);

...

h = (x2 – x1) / (N + 1.);

rectangle (x1, y1, x2, y2);

for (x = x1+h; x < x2; x += h)

line(x, y1, x, y2);

x

дробова частини xвідкидається

x

float x, h;!

результат – з

дробовою частиною

119

Як змінювати колір?

(x1, y1)

(x2, y2)

setfillstyle ( 1, c );

floodfill( ???, ???, 15 );

колір заливки

зміна c: 1, 2, 3, ...

x

(x-1, y1+1)

for (x = x1+h; x <= x2; x += h)

{

line (x, y1, x, y2);

setfillstyle ( 1, );

floodfill (x-1, y1+1, 15);

}

c = 1;

c

c ++;

колір

межі

<=

В чому може

бути проблема??

120

Штриховка

(x1, y1)

(x2, y2) (x3, y2)

a

h

1

23

N

xxh

21 xxa (x3+a, y1)

line( x1+h, y1, x1+h-a, y2);

line( x1+2*h, y1, x1+2*h-a, y2);

line( x1+3*h, y1, x1+3*h-a, y2);

...

h = (x3 – x2) / (N + 1.);

a = x2 – x1;

x = x1 + h;

for (i = 1; i <= N; i ++, x += h )

line(x, y1, x-a, y2);

x x-a

i ++, x += h

після кожного кроку

виконуються дві команди

Плюси і мінуси??

121

Штриховка

(x1, y1)

(x2, y2)

hx

hy

y x y

line( x1, y1+hy, x1+hx, y1+hy) ;

line( x1, y1+2*hy, x1+2*hx, y1+2*hy);

line( x1, y1+3*hy, x1+3*hx, y1+3*hy);

...

1

12

N

xxhx

1

12

N

yyhy

hx = (x2 – x1) / (N + 1.);

hy = (y2 – y1) / (N + 1.);

x = x1 + hx; y = y1 + hy;

for (i=1; i<=N; i++) {

line ( x1, y, x, y );

x += hx; y += hy;

}

122

Завдання

"4": Ввести з клавіатури число ліній і побудувати фігуру:

"5": Ввести з клавіатури число ліній і побудувати фігуру:

123

Завдання

"4": Ввести з клавіатури число ліній штриховки і побудувати

фігуру, заливши всі області різним кольором.

"5": Ввести з клавіатури число кіл і побудувати фігуру, заливши області різним кольором.

Програмування

на мові Сі

Тема 11. Графіки функцій

125

Побудова графіків функцій

Задача: побудувати графік функції y = 3 sin(x) на

інтервалі від 0 до 2π.

Аналіз: максимальне значення ymax = 3 при x = π/2

мінімальне значення ymin = -3 при x = 3π/2

Проблема: функція задана в математичній системі

координат, будувати потрібно на екрані, вказуючи

координати в пікселях.

126

Перетворення координат

(x,y)

X

Y

x

y

Математична

система координатЕкранна система

координат (пікселі)

(xе,yе)xе

(0,0)

(0,0)

a

b

k – масштаб (довжина

зображення одиничного

відрізка на екрані)

xе = a + kx

yе = b - ky

127

Програма

const a = 50, b = 200, k = 50;

const float xmin = 0, xmax =2*M_PI;

float x, y, h = 0.01;

int xe, ye, w;

w = (xmax - xmin)*k;

line(a-10, b, a+w, b);

line(a, 0, a, 2*b);

for (x = xmin; x < xmax; x += h)

{

y = 3*sin(x);

xe = a + k*x;

ye = b - k*y;

putpixel (xe, ye, 12);

}

Що погано??

h – крок зміни x

w – довжина вісі ОХ в пікселях

координати

точки на екрані

вісі координат

цикл

побудови графіка

oбов’язково

#include <math.h>

128

Як з’єднати точки?

Алгоритм:

Якщо перша точка

перейти в точку (xеyе)

інакше

відрізок в точку (xе,yе)

Програма:

вибір

варіанта

дій

змінна-прапор

(тільки 1 або 0)

int first;

...

first = 1;

for (x = xmin; x < xmax; x += h)

{

...

if ( first ) {

moveto(xe, ye);

first = 0;

}

else lineto(xe, ye);

...

}

початкове значення

129

Завдання

"4": Побудувати графік

функції y = x2 на інтервалі

[-3,3].

"5": Побудувати графік

функції (еліпс)

1916

22

yx

Програмування

на мові Сі

Тема 12. Процедури

131

Процедури

Задача: Побудувати фігуру:

Особливності: Три схожі фігури.

загальні: розміри, кут повороту

відмінність: координати, колір

Чи можна розв’язати відомими методами??

Скільки координат потрібно задати??

132

Процедури

Процедура – це допоміжний алгоритм, який призначений

для виконання певних дій.

Примітка:

• виконання однакових дій у різних місцях програми

• розбивка програми (або іншої процедури) на

підзадачі для кращого сприйняття

Підзадача1 Підзадача2 Підзадача3

1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3

Задача

133

Процедури

Порядок розробки:

• виділити однакові або схожі дії (три фігури)

• знайти в них спільне (розміри, форма, кут повороту) і

відмінність (координати, колір)

• відмінності записати у вигляді невідомих змінних, вони будуть

параметрами процедури

(x, y) 100

60 (x+100, y)

(x, y-60)

void Tr( int x, int y, int c )

{

moveto ( x, y );

lineto ( x, y-60 );

lineto ( x+100, y );

lineto ( x, y );

setfillstyle ( 1, c );

floodfill ( x+20, y-20, 15);

}

заголовок

процедури

тіло процедури

координати

колір

формальні

параметри

134

Програма

void main()

{

...

Tr(100, 100, LIGHTBLUE);

Tr(200, 100, LIGHTGREEN);

Tr(200, 160, LIGHTRED);

...

}

(100,100)

100

60

фактичні параметри

виклики

процедури

void Tr( int x, int y, int c)

{

...

}

формальні параметри

процедура

135

Процедури

Особливості:

• зазвичай процедури розташовуються вище

основної програми

• в заголовку процедури перераховуються

формальні параметри, вони позначаються

іменами, оскільки можуть змінюватися

• при виклику процедури в дужках вказувають

фактичні параметри (числа або арифметичні

вирази) в тому ж порядку

void Tr( int x, int y, int c )

Tr ( 200, 100, LIGHTGREEN );

x y c

136

Процедури

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

процедури вказують її тип

• всередині процедури параметри використовуються так

само, як і змінні

• в процедурі можна оголошувати додаткові локальні

змінні, решта процедур не мають до них доступу

void A ( int x, float y, char z ) { ... }

void A ( int x, float y, char z )

{

int a2, bbc = 345;

...

}

локальні

змінніint a2, bbc = 345;

137

Як поміняти місцями?

2Задача: поміняти місцями

вмістиме двох горняток.

Задача: поміняти місцями вмістиме двох комірок

пам’яті.

4 6

?4

6 4

x y

c

c = x;

x = y;

y = c;

x = y;

y = x;

2

Чи можна обійтися без c??

138

Параметри-змінні

Задача: скласти процедуру, яка міняє місцями значення

двох змінних.

Особливості:

потрібно, щоб зміни, зроблені в процедурі, стали

відомими викликаючій програмі

void main()

{

int x = 1, y = 2;

Swap ( x, y );

printf ( "x = %d, y = %d", x, y );

}

void Swap ( int a, int b )

{

int c;

c = a; a = b; b = c;

}

ця процедура

працює з копіями

параметрів

x = 1, y = 2

139

Параметри-змінні

Примітка:

таким чином процедура (і функція) можуть

повертати декілька значень

Заборонені варіанти викликів

Swap ( 2, 3 ); // числа

Swap ( x+z, y+2 ); // вираз

void Swap ( int & a, int & b )

{

int c;

c = a; a = b; b = c;

}

&

параметри можуть

змінюватися

&

140

Завдання

"4": Використовуючи процедури, побудувати фігуру.

"5": Використовуючи процедури, побудувати фігуру.

a

a a 0,866∙a

рівносторонній трикутник

Програмування

на мові Сі

Тема 13. Анімація

142

Анімація

Анімація (англ. animation) – оживлення

зображення на екрані.

Задача: всередині синього квадрата 400 на 400

пікселів зліва направо рухається жовтий

квадрат 20 на 20 пікселів. Програма

зупиняється, якщо натиснута клавіша Esc

або квадрат дійшов до межі синьої області.

Проблема: як зобразити переміщення об’єкта на екрані?

Прив’язка: стан об’єкта задається координатами (x,y)

Принцип анімації:

1. малюється об’єкт в точці (x,y)

2. затримка на декілька мілісекунд

3. стирається об’єкт

4. змiнюються координати (x,y)

5. перехід до кроку 1

143

Як «зловити" натиск клавіши?

kbhit() – функція, визначає, чи була натиснута (будь-яка!)

клавіша (0 – не була, не 0 – була).

getch() – функція, яка визначає код натиснутої клавіши:

27 = Esc, 13 = Enter, 32 = пробіл, …

if ( kbhit() )

printf("Натиснута якась клавіша...");

else printf("Немає натиску...");

if ( kbhit() ) {

printf("Натиснута якась клавіша...");

c = getch();

printf("Код клавіши %d", c);

}

int c;

if ( kbhit() != 0 )

144

Як вийти з циклу?

#include <conio.h>

void main()

{

...

while ( x + 20 < 400 )

{

if ( kbhit() )

if ( getch() == 27 ) break;

...

}

...

}

якщо натиснута клавіша ...

якщо натиснута

клавіша з кодом 27

(Esc), вийти з циклу

для kbhit() і getch()

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

Як не допустити виходу за межі поля??

x + 20 < 400

145

Процедура (малювання і стирання)

void Draw( int x, int y, int color )

{

setfillstyle ( 1, color );

bar(x, y, x+20, y+20);

}

(x, y)

(x+20, y+20)

Ідеї

• одна процедура малює і стирає

• стерти = намалювати кольором

фону

• межу квадрата відключити (в

основній програмі)колір: жовтим малюємо,

синім стираємо

суцільна заливка

кольором color

залитий прямокутник

146

Повна програма

void Draw ( int x, int y, int color )

{

...

}

void main()

{

int d = DETECT, m;

initgraph ( &d, &m, "c:\\borlandc\\bgi" );

int x, y;

setfillstyle(1, 9);

bar(0, 0, 399, 399);

x = 0; y = 240;

while ( x + 20 < 400 )

{

if ( kbhit() )

if ( getch() == 27 ) break;

Draw ( x, y, YELLOW );

delay ( 20 );

Draw ( x, y, 9 );

x ++;

}

closegraph();

}

процедура

початкові

координати

вихід по

клавіші Esc

синій фон

чекає 20 мс, потрібно#include <dos.h>

включити

графічний

режим

147

"4": Два квадрата рухаються

в протилежних напрямках:

"5": Два квадрата рухаютьсяв протилежних напрямкахі відштовхуються відстінок синього квадрата:

Завдання

148

Керування клавішами

Задача: жовтий квадрат всередині синього квадрата керується

клавішами-стрілками. Коди клавіш:

вліво – 75 вверх – 72 Esc – 27

вправо – 77 вниз – 80

Проблема: як змінювати напрямок руху?

Розв’язок:

if натиснута клавіша {

одержати код клавіши - codeif (code == 27) break;

if (code == 75) x --;

if (code == 77) x ++;

if (code == 72) y --;

if (code == 80) y ++;

}

( kbhit() )

code = getch();

якщо було натиснуто

на клавішу, …

одержати її код

вихід по Esc

переміщення

switch ( code ) {

case 75: x --; break;

case 77: x ++; break;

case 72: y --; break;

case 80: y ++;

}

}

149

Програма

void Draw (int x, int y, int color)

{

...

}

if ( kbhit() ) {

...

}

Що погано??

процедура

основний цикл

обробка

натиску на

клавішу

void main()

{

int x, y, code;

...

while ( 1 ) {

Draw(x, y, YELLOW);

delay(20);

Draw(x, y, 9);

}

} Як забрати

блимання??

150

"4": Квадрат рухається при

натиску стрілок, однак не

може вийти за межі

синього квадрата:

"5": Квадрат неперервнорухається, при натиску стрілок змінює напрямок і відштовхується від стіноксинього квадрата:

Завдання

151

Обертання

Задача: зобразити модель обертання Землі навколо

Сонця.

Проблема: рух по колу, як змінювати координати?

Розв’язок: використання в якості незалежної змінної

(змінювати в циклі) кут повороту α

(x0, y0)

α

L

(x, y)

x = x0 + L·cos(α)

y = y0 – L·sin(α)

152

Процедура

void Draw( int x, int y, int color )

{

const r = 10;

setcolor ( color );

circle ( x, y, r );

}

колір: жовтий – малюємо,

чорний – стираємо

встановили колір

ліній

радіус Землі

(x,y)

r

153

Константи і змінні

#include <math.h> // математичні функції

void main()

{

const rSun = 60, // радіус Сонця

L = 150, // радіус орбіти Землі

x0 = 200, // координати центра Сонця

y0 = 200;

int x, y, // координати Землі

code; // код натиснутої клавіши

float a, ha; // кут поворота, крок

int d = DETECT, m;

initgraph ( &d, &m, "c:\\borlandc\\bgi" );

...

}

void Draw ( int x, int y, int color )

{

...

}

154

Основний цикл

circle ( x0, y0, rSun );

setfillstyle(1, YELLOW);

floodfill ( x0, y0, WHITE );

a = 0; // початковий кут

ha = M_PI/180; // крок 1o за 100 мс

while(1) {

x = x0 + L*cos(a);

y = y0 - L*sin(a);

Draw ( x, y, LIGHTBLUE );

delay ( 20 );

Draw(x, y, 0);

a = a + ha;

}

closegraph();

малюємо Сонце:

білий контур, жовта

заливка

нові

координати

поворот на ha

чекаємо 20 мс

if ( kbhit() )

if ( 27 == getch() ) break;

вихід по Esc

#include<math.h> // sin, cos, M_PI!

const M_PI=3.1415926;

155

"4": Зобразити модель Сонця

з двома планетами, які

обертаються в протилежні

сторони:

"5": Зобразити модель системи Сонце-Земля-Місяць:

Завдання

Програмування

на мові Сі

Тема 14. Випадкові числа

157

Випадкові числа

Випадкові явища: всюди…

• кидання монети ("орел" або "решка")

• падіння снігу

• броунівський рух

• завади при телефонному зв’язку

• шум радіоефіра

Випадкові числа – це така послідовність чисел, для якої

неможливо передбачити наступне навіть знаючи всі

попередні.

Проблема: як одержати на комп’ютерi?

Можливі розв’язки:

• використовувати зовнішнє джерело шумових завад

• за допомогою математичних перетворень

158

Псевипадкові числа

Псевипадкові числа – це така послідовність чисел, яка володіє

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

обчислюється за заданою формулою.

Приклади:

1. Випадкові цілі числа [0,m) (лінійний конгруєнтний метод)

2. Випадкові дійсні числа [0,1]

Література:

Д. Кнут, Мистецтво програмування для ЕВМ, т.2.

1073741823mod)1234516807( 1 nn xx

k

nn xx )( 1

дробова частина числа

a, c, m - цілі числаmcxax nn mod)( 1

просте число 230-1

наприклад, k = 5

залишок від ділення

159

Розподіл випадкових чисел

Модель: сніжинки падають на відрізок [a,b]

a b a b

розподіл

рівномірне нерівномерне

Скільки може бути різних розподілів??

160

Розподіл випадкових чисел

Особливості:

• розподіл – це характеристика всієї послідовності, а не одного

числа

• рівномірний розподіл один, комп’ютерні датчики (псевдо)

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

• нерівномірних – багато

• будь-який неравномірний можна одержати за допомогою

рівномірного

a b

2

21 xxx

a b

12

1221 xxxx

рівномірний розподілрівномірний розподіл

161

Генератор випадкових чисел в Сі

Цілі числа в інтервалі [0,N]:

int x;

x = random ( 100 ); // інтервал [0,99]

x = random ( z ); // інтервал [0,z-1]

Цілі числа в інтервалі [a,b]:

x = random ( z ) + a; // інтервал [a,z-1+a]

x = random (b – a + 1) + a; // інтервал [a,b]

Встановити початкове значення послідовності:

srand ( 345 ); // розпочнемо з 345

Встановити випадковий початок послідовності:

randomize ( );

#include <stdlib.h> // випадкові числа

162

Генератор випадкових чисел в Сі

Дійсні числа в інтервалі [0,1]

float x;

x = 1.*rand() / RAND_MAX; // інтервал [0,1)

Дійсні числа в інтервалі [0,z)

x = 1.*z*rand()/RAND_MAX;

Дійсні числа в інтервалі [a,z+a)

x = 1.*z*rand()/RAND_MAX + a;

Дійсні числа в інтервалі [a,b)

x = 1.*(b-a)*rand()/RAND_MAX + a;

[0,RAND_MAX-1] = [0,32767]

163

Випадкові числа

Задача: заповнити прямокутник

400 на 300 пікселів рівномірно

точками випадкового кольору

Як одержати випадкові координати точки?x = random ( 400 );

y = random ( 300 );

Як досягнути рівномірності?

забеспечується автоматично при використанні функції random

Як одержати випадковий колір?color = random ( 16 );

164

Програма

#include <graphics.h>

#include <conio.h>

#include <stdlib.h>

void main()

{

int d = DETECT, m;

int x, y, color;

initgraph ( &d, &m, "C:\\BORLANDC\\BGI" );

closegraph();

}

while ( 1 ) {

x = random(320)+160;

y = random(240)+120;

color = random(16);

putpixel ( x, y, color );

if ( kbhit() )

if ( 27 == getch() ) break;

}

випадкові координати

випадковий колір

вихід по Esc

165

"4": Ввести з клавіатури

координати кутів

прямокутника і заповнити

його точками випадкового

кольору.

"5": Заповнити трикутникточками випадковогокольору (рівномірно абонерівномірно).

Підказка: візьмітьрівнобедренний трикутникз кутом 60о.

Завдання

(100,100)

(300,200)

Програмування

на мові Сі

Тема 15. Функції

167

Функції

Функція – це допоміжний алгоритм (підпрограма),

результатом роботи якої є деяке значення.

Приклади:

• обчислення модуля числа,

• розрахунок значень по складним формулам

• відповідь на питання (просте число чи ні?)

Для чого?

• для виконання одинакових розрахунків у різних

місцях програми

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

x

В чому відмінність від процедур??

168

Функції

Задача: скласти функцію, яка обчислює найбільше з

двох значень, і навести приклад її використання

Функція:формальні

параметри

int Max ( int a, int b )

{

if ( a > b ) return a ;

else return b ;

}

return - повернути

результат функції

169

Функції

Особливості:

• на початку заголовку ставиться тип результату

• формальні параметри описуються так само, як і для

процедур

• можна використовувати параметри-змінні

• функції зазвичай розташовуються до основної

програми

Max ( int a, int b )int

float qq ( )int a, float x, char c

int Vasya (int a, int b )& &

170

Функції

Особлмвості:

• можна оголошувати і використовувати локальні

змінні

float qq ( int a, int b)

{

...

}

float x, y;локальні

змінні

Локальні змінні недоступні в основній

програмі та інших процедурах і функціях.!

171

Програма

void main()

{

int a, b, с;

printf ( "Введіть два числа\n" );

scanf ( "%d%d", &a, &b );

c = Max ( a, b );

printf ( "Найбільше число %d", c );

}

int Max ( int a, int b )

{

...

}

фактичні

параметри

виклик

функції

формальні

параметри

172

Логічні функції

Задача: скласти функцію, яка визначає, чи задане число

просте.

Особливості:

• відповідь – логічне значення: «так» (1) або «ні» (0)

• результат функції можна використовувати як логічнувеличину в умоваях (if, while)

Алгоритм: вважаємо число дільників в інтервалі від 2 до N-1,

якщо воно не дорівнює нулю – число складене.

Як покращити??

count = 0;

for (i = 2; i < N; i ++)

if ( N % i == 0 ) count ++;

if ( count == 0 )

// число N просте}

else // число N складене

173

Логічні функції

void main()

{

int N;

printf ( "Введіть ціле число\n" );

scanf ( "%d", &N );

if ( Prime( N ) )

printf ("%d - просте число“, N);

else printf ("%d - просте число“, N);

}

int Prime ( int N )

{

int count = 0, i;

for (i = 2; i*i <= N; i++)

if (N % i == 0) count ++;

return (count == 0);

}

виклик функції

перебір тільки до N

if (count == 0) return 1;

else return 0;

Prime( N )

174

Завдання

"4": Скласти функцію, яка визначає суму всіх чисел від 1 до N і

навести приклад її виконання.

Приклад:

Введіть число:

100

сума чисел від 1 до 100 = 5050

"5": Скласти функцію, яка визначає, скільки зерен попросив

покласти на N-у клітинку винахідник шахів (на 1-у – 1

зернятко, на 2-у – 2 зернятка, на 3-ю – 4 зернятка, …)

Підказка: використовуйте тип long int.

Приклад:

Введіть номер клітинки:

28

На 28-ій клітинці 134217728 зерен.

175

Завдання (варіант 2 для 8-11 класів)

"4": Скласти функцію, яка визначає найбільший спільний

дільник двох натуральних чисел і навести приклад його

використання.

Приклад:

Введіть два числа:

14 21

НОД(14,21)=7

"5": Скласти функцію, яка обчислює функцію синус як суму

ряду (з точністю 0.001)

Приклад:

Введіть кут в градусах:

45

sin(45) = 0.707

!7!5!3

sin753 xxx

xx x в радіанах!

176

Кінець