3. 3
Алгоритм
Властивості алгоритма
• дискретність: складається з окремих кроків
(команд)
• зрозумілість: повинен включати тільки команди,
зрозумілі виконавцеві (що входять до СКВ)
• визначеність: при одинакових вихідних даних
завжди видає один і той же результат
• конечність: закінчується за певної кількості кроків
• масовість: може використовуватися багатократно
при різних вхідних даних
• коректність: дає правильний розв’язок для будь-
яких допустимих вхідних даних
Алгоритм – це чітко визначений план дії для
виконавця.
4. 4
Програма
Програма – це
• алгоритм, записаний на якій-небудь мові
програмування
• набір команд для комп’ютера
Команда – це опис дій, які повинен виконувати
комп’ютер.
• звідки взято вхідні дані?
• що потрібно з ними зробити?
• куди помістити результат?
5. 5
Мови програмування
• Машинно-орієнтовані (низького рівня) - кожна
команда відповідає одній команді процесора
(асемблер)
• Мови високого рівня – наближені до природньої
(англійської) мови, легше сприймаються
людиною, не залежать від конкретного
комп’ютера
• для навчання: Бейсік, ЛОГО, Паскаль
• професійні: Сі, Фортран, Паскаль
• для задач штучного інтелекту: Пролог, ЛІСП
• для Інтернету: JavaScript, Java, Perl, PHP,
ASP
6. 6
Мова Сі
1972-1974 – Б. Керніган, Д. Рітчі
• висока швидкість роботи програм
• багато можливостей
• стала основою багатьох сучасних мов
(С++, С#, Javascript, Java, ActionScript,
PHP)
• багато шансів зробити помилку, яка не
буде знайдена автоматично
7. 7
Найпростіша програма
void main()
{
}
головна (основна)
програма завжди
має ім’я main
void = «пустий»
основна програма не
видає ніякого
результату-числа
початок програми
«тіло» програми
(основна частина)
кінець програми
Що робить ця програма??
8. 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. 9
Виведення тексту на екран
#include <stdio.h>
void main()
{
printf("Привіт!");
}
include = включити файл stdio.h: опис
стандартних функцій
введення і виведення
виклик стандартної
функції
printf = print format
(форматне виведення)
цей текст
буде на
екрані
10. 10
Як розпочати роботу?
тут ми
набираємо
програму
тут виводяться
повідомлення
про помилки
верхнє меню
кнопка
закриття вікна
координати курсора
(рядок, стовпець)
11. 11
Оболонка Borland C ++ 3.1
Borland International (також Turbo Pascal, Delphi)
IDE = Integrated Development Environment
інтегроване середовище розробки:
• текстовий редактор для створення і редагування
текстів програм
• транслятор для переведення текстів програм на Сі та
Сі++ в команди процесора
• редактор зв’язків для створення виконуваного файла
(EXE-файла), підключаються стандартні функції
• відлагоджувач для пошуку помилок в програмах
12. 12
Робота з файлами
Збереження файла: F2 ввести ім’я файла:
• не більше 8 символів
• без пробілів
• тільки латинські букви
і цифри
Esc - відміна
Enter - збереження
розширення .CPP
додається
автоматично
!
13. 13
Робота з файлами
Завантаження файла: F3
вибір файла
зі списку
якщо ввести ім’я
неіснуючого файла, він
буде створений
Esc - відміна
Enter - відкрити (або створити)
14. 14
Запуск програми на виконання
Трансляція + компоновка: F9
Трансляція + компоновка + запуск: Ctrl-F9
число
помилок
Errors
(помилки)
Press any key
(натисніть будь-яку
клавішу)
Warnigns
(попередження)
Success
(успіх)
16. 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. 17
Керування клавішами
Довідникова система F1
Зберегти файл F2
Відкрити файл F3
Закрити вікно з програмою Alt-F3
Запуск програми Ctrl-F9
Розкрити на весь екран Ctrl-Enter
Показати робочий екран Alt-F5
Вийти з оболонки Alt-X
18. 18
Робота з блоками тексту
Виділити блок
мишкою або
Shift - ↑↓
Відмінити виділення Ctrl-K + H
Вирізати (в буфер обміну) Shift-Delete
Копіювати (в буфер обміну) Ctrl-Insert
Вставити з буфера обміна Shift-Insert
Вилучити текучий рядок Ctrl-Y
Вилучити виділенний блок Ctrl-Delete
19. 19
Сервіс
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr(); /* очищення екрану */
printf("Привіт!"); // виведення на екран
getch(); /* чекати натиск клавіши */
}
файл conio.h: опис
функцій для роботи з
клавіатурою і монітором
чекати натиску
будь-якої клавіши
коментар до
кінця рядка
коментар між /* і */
очищення екрану
clear screen
• очистка екрану перед початком роботи
• затримка до натиску будь-якої клавіши
20. 20
Перехід на новий рядок
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
printf("Привіт,nВася!");
getch();
}
Привіт,
Вася!
на екрані:
послідовність n
код 10
перехід на новий рядок
21. 21
Завдання
"4": Вивести на екран текст «драбинкою"
Вася
пішов
гуляти
"5": Вивести на екран рисунок з букв
Ж
ЖЖЖ
ЖЖЖЖЖ
ЖЖЖЖЖЖЖ
HH HH
ZZZZZ
23. 23
Що таке змінна?
Змінна - це комірка в пам’яті комп’ютера, яка має ім’я
і зберігає певне значення.
• Значення змінної може змінюється в часі виконання
програми.
• При запису в комірку нового значення старе
стирається.
Типи змінних
• int – ціле число в інтервалі [-32768…32767]
(2 байта)
• float – дійсне число, floating point (4 байта)
• char – символ, character (1 байт)
24. 24
Імена змінних
Можуть включати
• латинські букви (A-Z, a-z)
• знак підкреслення _
• цифри 0-9
НЕ можуть включати
• букви кирилиці
• пробіли
• дужки, знаки +, =, !, ? та інші.
Ім’я не може починатися з цифри!!
Які імена правильні?
AXby R&B 4Wheel Вася “PesBarbos”
TU154 [QuQu] _ABBA A+B
25. 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. 26
Оператор присвоєння
Оператор – це команда мови програмування
високого рівня.
Оператор присвоєння служить для зміни значення
змінної.
Приклад
a = 5;
x = a + 20;
y = (a + x) * (x – a);
?
a
5 5
?
x
5+2025
?
y
600 30*20
27. 27
Оператор присвоєння
Загальна структура:
Арифметичний вираз може включати
• константи (сталі)
• імена змінних
• знаки арифметичних операцій:
+ - * / %
• виклик функцій
• круглі дужки ( )
множення ділення
залишок від
ділення
iм’я змінної = вираз;
куди що
Для чого служать
круглі дужки?
?
28. 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. 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. 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. 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. 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
badca
x
)(
)(35
cb
ab
dcac
z
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));
34. 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. 35
Введення чисел з клавіатури
scanf ("%d%d", &a, &b);
формат введення
scanf – форматне
введення
адреса комірок, куди
записати введенні
числа
Формат – символьний рядок, який показує, які числа
вводяться (виводяться).
%d – ціле число
%f – дійсне число
%c – 1 символ
%s – символьний рядок
12
7652
a – значення
змінної a
&a – адреса
змінної a
чекати введення з клавіатури двох
цілих чисел (через пробіл або
Enter), перше з них записати в
змінну a, друге – в b
37. 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. 38
Виведення цілих чисел
int x = 1234;
printf ("%d", x);
1234
printf ("%9d", x);
мінімальне число
позицій
1234 всього 9 позицій
або "%i"
або "%9i"
39. 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. 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
це виводить
комп’ютер
це вводить користувач
42. 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
44. 44
Алгоритми розгалуження
Задача. Ввести два цілих числа і вивести на екран
найбільше з них.
Ідея розв’язку: потрібно вивести на екран перше число,
якщо воно більше другого, або друге, якщо воно більше
першого.
Особливість: дія виконавця залежить від деяких умов
(якщо … інакше …).
Алгоритм, в якому послідовність кроків залежить від
виконання деяких умов, називається розгалуженним.
45. 45
Варіант 1. Блок-схема
початок
max = a;
ввести a,b
виведення max
a > b?
max = b;
кінець
так ні повна форма
розгалуження
блок "розв’язання"
Якщо a = b??
46. 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. 47
Умовний оператор
if ( умова )
{
// що робити, якщо умова правильна
}
else
{
// що робити, якщо умова неправильна
}
Особливісті:
• друга частина (else …) може бути відсутньою
(неповна форма)
• якщо в блоці один оператор, можна забрати { }
48. 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;
50. 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. 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. 52
Завдання
"4": Ввести три числа і знайти найбільше з них.
Приклад:
Введіть три числа:
4 15 9
Найбільше число 15
"5": Ввести п’ять чисел i знайти найбільше з них.
Приклад:
Введіть п’ять чисел:
4 15 9 56 4
Найбільше число 56
54. 54
Складні умови
Задача. Фірма набирає співробітників від 25 до 40 років
включно. Ввести вік людини і визначити, чи підходить
вона фірмі чи ні (вивести відповідь "підходить" або "не
підходить").
Особливість: потрібно перевірити, чи виконуються дві
умови одночасно.
Чи можна розв’язати відомими методами??
58. 58
Варіант 2. Програма
void main()
{
int x;
printf("Введіть вікn");
scanf("%d", &x);
if ( x >= 25 && x <= 40 )
printf("Підходить");
else printf("Не підходить");
}
складна
умова
59. 59
Складні умови
Складні умови – це умови, що складаються з декількох
простих умов (відношень), зв’язанних за допомогою
логічних операцій:
! – НІ (not, заперечення, інверсія)
&& – І (and, логічне множення, кон’юнкція,
одночасне виконання умов)
|| – АБО (or, логічне додавання, диз’юнкція,
виконання хотя б одної з умов)
Прості умови (відношення)
< <= > >= == !=
дорівнює не дорівнює
60. 60
Складні умови
Порядок виконання складних умов:
• вираз в дужках
• ! (НІ, заперечення)
• <, <=, >, >=
• ==, !=
• && (І)
• || (АБО)
Приклад:
2 1 6 3 5 4
if ( !(a > b) || c != d && b == a)
{
...
}
61. 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
1
1
62. 62
Завдання
"4": Ввести номер місяця і вивести назву пори року.
Приклад:
Введіть номер місяця:
4
весна
"5": Ввести вік людини (від 1 до 150 років) і вивести
його разом з наступним словом «рік", «роки" або
«років".
Приклад:
Введіть вік: Введіть вік:
24 57
Вам 24 роки Вам 57 років
64. 64
Цикли
Цикл – це багатократне виконання одинакової
послідовності дій.
• цикл з відомими числом кроків
• цикл з невідомим числом кроків (цикл з умовою)
Задача. Вивести на екран квадрати і куби цілих чисел від
1 до 8 (від a до b).
Особливість: однакові дії виконуються 8 раз.
Чи можна розв’язати відомими методами??
65. 65
Алгоритм
початок
i, i2, i3
кiнець
ні
так
i <= 8?
i = 1;
i = i + 1;
i2 = i * i;
i3 = i2 * i;
задати початкове значення
змінною циклу
перевірити, чи всі зроблені
обчислюємо квадрат і куб
виведення
результату
перейти до
наступного i
66. 66
Алгоритм (з блоком "цикл")
початок
i, i2, i3
кінець
i2 = i * i;
i3 = i2 * i;
i = 1,8
блок "цикл"
тіло циклу
67. 67
Програма
void main()
{
int i, i2, i3;
for (i=1; i<=8; i++)
{
i2 = i*i;
i3 = i2*i;
printf("%4d %4d %4dn", i, i2, i3);
}
}
for (i=1; i<=8; i++)
{
i2 = i*i;
i3 = i2*i;
printf("%4d %4d %4dn", i, i2, i3);
}
змінна циклу
початкове
значення
кінцеве
значення
зміна на
кожному кроці:
i=i+1
рівні
стовпчики
цикл працює, поки ця
умова виконується
цикл
початок циклу
кінець циклу
заголовок
циклу
for (i=1; i<=8; i++)
i2 = i*i;
i3 = i2*i;
printf("%4d %4d %4dn", i, i2, i3);
тіло циклу
68. 68
Цикл із зменшенням змінної
Задача. Вивести на екран квадрати і куби цілих чисел від
8 до 1 (у зворотньому порядку).
Особливість: змінна циклу повинна зменшуватися.
Розв’язок:
for ( )
{
i2 = i*i;
i3 = i2*i;
printf("%4d %4d %4dn", i, i2, i3);
}
i = 8; i >= 1; i --
69. 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. 70
Цикл із змінною
Особливості:
• умова перевіряється на початку чергового кроку циклу,
якщо вона хибна цикл не виконується;
• зміни (третя частина в заголовку) виконується в кінці
чергового кроку циклу;
• якщо умова ніколи не стане хибною, цикл може
продовжуватися незкінченно (зациклювання)
• якщо в тілі циклу один оператор, дужки {} можна не
ставити:
for(i=1; i<8; i++) { i--; }
for (i = 1; i < 8; i++) a += b;
Не радять змінювати змінну
циклу в тілі циклу!
!
71. 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. 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. 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
75. 75
Цикл з невідомим числом кроків
Приклад: ВІдпиляти поліно від колоди. Скільки раз потрібно
зробити рухів пилкою?
Задача: Ввести ціле число (<2000000) і визначити число цифр
в ньому.
Ідея розв’язку: Відсікаємо послідовно останню цифру,
збільшуємо лічильник.
Проблема: Невідомо, скільки кроків потрібно зробити.
Розв’язок: Потрібно зупинитися, коли n = 0, тобто потрібно
робити "поки n != 0".
n count
123 0
12 1
1 2
0 3
77. 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. 78
Цикл з умовою
while ( умова )
{
// т іло циклу
}
Особливості:
• можна використовувати складні умови:
• якщо у тілі циклу тільки один оператор, дужки {}
можна не писати:
while ( a < b && b < c ) { ... }
while ( a < b ) a ++;
79. 79
Цикл з умовою
Особливості:
• умова перераховується кожний раз при вході в цикл
• якщо умова на вході в цикл хибна, цикл не
виконується ні разу
• якщо умова ніколи не стане хибною, програма
зациклюється
a = 4; b = 6;
while ( a > b ) a = a– b;
a = 4; b = 6;
while ( a < b ) d = a + b;
80. 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. 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. 82
Завдання
"4": Ввести ціле число і знайти суму його цифр.
Приклад:
Введіть ціле число:
1234
Сума цифр числа 1234 дорівнює 10.
"5": Ввести ціле число і визначити, чи вірно, що в
його записі є дві одинакові цифри.
Приклад:
Введіть ціле число: Введіть ціле число:
1234 1224
Ні. Так.
84. 84
Послідовності
Задача: знайти суму всіх елементів послідовності,
які по модулю більші 0,001:
...,
32
5
,
16
4
,
8
3
,
4
2
,
2
1
,1
...
32
5
16
4
8
3
4
2
2
1
1 S
Елемент послідовності (починаючи з №2):
c
b
za
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. 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. 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. 87
Завдання
"4": Знайти суму елементів послідовності з
точністью 0,001:
Відповідь:
S = 1.157
"5": Знайти суму елементів послідовності з
точністью 0,001:
Відповідь:
S = 1.220
...
819
8
277
6
95
4
33
2
1
S
...
24313
10
818
8
275
6
93
4
32
2
1
S
88. 88
Цикл с передумовою
Задача: Ввести ціле додатне число (<2000000) і
визначити число цифр в ньому.
Проблема: Як не дати ввести від’ємне число або нуль?
Розв’язок: Якщо вводиться невірне число, повернутися
назад до введення даних (цикл!).
Особливість: Один раз тіло циклу потрібно виконати в
будь-якому випадку перевірку умови циклу потрібно
робити в кінці циклу (цикл з післяумови).
Цикл с післяумовою – це цикл, в якому перевірка
умови виконується в кінці циклу.
89. 89
Цикл з післяумовою: алгоритм
початок
кінець
ні
так
n <= 0?
тіло циклу
умова
блок "типовий
процес"
введення n
основний
алгоритм
90. 90
Програма
void main()
{
long n;
do {
printf("Введіть додатне числоn");
scanf("%ld", &n);
}
while ( n <= 0 );
... // основний алгоритм
}
умова
Особливості:
• тіло циклу завжди виконується хоча б один раз
• після слова while («поки…» ) ставиться умова
продовження циклу
91. 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. 92
Завдання (із захистом від невірного введення)
"4": Ввести натуральне число і визначити, чи правильно, що
сума його цифр дорівнює 10.
Приклад:
Введіть число >= 0: Введіть число >= 0:
-234 1233
Потрібно податне число. Ні
Введіть число >= 0:
1234
Так
"5": Ввести натуральне число і визначити, які цифри
зустрічаються декілька разів.
Приклад:
Введіть число >= 0: Введіть число >= 0:
2323 1234
Повторюється: 2, 3 Немає повторень.
94. 94
Оператор вибору
Задача: Ввести номер місяця і вивести кількість
днів в цьому місяці.
Розв’язок: Число днів по місяцям:
28 днів – 2 (лютий)
30 днів – 4 (квітень), 6 (червень), 9 (вересень),
11 (листопад)
31 день – 1 (січень), 3 (березень), 5 (травень),
7 (липень), 8 (серпень), 10 (жовтень),
12 (грудень)
Особливість: Вибір не з двох, а з декількох
варіантів в залежності від номера місяця.
Чи можно розв’язати відомими методами??
96. 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. 97
Оператор вибору
Задача: Ввести букву і вивести назву тварини на цю
букву.
Особливість: вибір по символьній величині.
void main()
{
char c;
printf("Введіть першу букву назви тварини:n");
c = getch();
switch ( c ) {
case 'а': printf("Антилопа"); break;
case 'б': printf("Барсук"); break;
case 'в': printf("Вовк"); break;
default: printf("Не знаю я таких!");
}
}
Що буде, якщо всюди забрати break??
98. 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. 99
Завдання (із захистом від неправильного введення)
"4": Ввести номер місяця і вивести кількість днів у ньому, а
також число помилок при введенні.
Приклад:
Введіть номер місяця: Введіть номер місяця:
-2 2
Введіть номер місяця: В цьому місяці 28 днів.
11 Ви вводили неправильно 0 раз.
В цьому місяці 30 днів.
Ви вводили неправильно 1 раз.
"5": Ввести номер місяця і номер дня, вивести число днів, що
залишилося до Нового року.
Приклад:
Введіти номер місяця:
12
Введіти день:
25
До Нового року залишилося 6 днів.
101. 101
Відлагодження програм
Відлагодження – пошук і виправлення помилок в
програмі.
Англ. debugging, bug = міль, жук
Методи:
• трасування – виведення сигнальних повідомлень
• відключення частини коду (в коментарі)
• покрокове виконання – виконати один рядок
програми і зупинитися
• точки зупинка – виконання програми зупиняється
при досягнені відміченних рядків (перехід в
покроковий режим)
• перегляд і зміна значень змінних в покроковому
режимі
103. 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. 104
Покрокове виконання
F8 – виконати 1 рядок і зупинитися
виділення рядка буде
виконано при
наступному натиску F8
F7 – увійти в процедуру або функцію
Ctrl-F9 – неперервне виконання
Ctrl-F2 – зупинити виконання програми
105. 105
Точки зупинки
F4 – виконати неперервно до того рядка, де знаходиться
курсор (1 раз)
Ctrl-F8 – встановити/зняти точку зупинити
Ctrl-F9 – виконати до наступної точки зупинки
це точка зупинки
(зняти – Ctrl-F8)
106. 106
Перегляд значень змінних
Ctrl-F4 – відкрити вікно перегляду змінних
тут ввести ім’я
змінної або
виразу
показати
результат
(= Enter)
можно ввести
новое значение
для переменной
изменить
переменную
110. 110
#include <graphics.h>
#include <conio.h>
void main()
{
int d = DETECT, m;
initgraph(&d, &m,
"c:borlandcbgi");
... // малюємо на екрані
getch();
closegraph();
}
initgraph(&d, &m,
"c:borlandcbgi");
closegraph();
Структура графічної програми
визначити режим
автоматично
допоміжні змінні d,
m
шлях до файла
egavga.bgi
включити
графічний
режим
виключити графічний
режим
щоб подивитися
результат
бібліотека для роботи
з графікою
111. 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. 112
Керування кольором
Колір ліній:
set color = встановити колір
setcolor ( колір );
Колір і стиль заливки:
set fill style = встановити стиль заливки
setfillstyle ( стиль, колір );
Колір тексту:
setcolor ( колір );
0 – виключити 3..6 похилі лінії
1 – суцільна 7..8 сітка 9..11 точкова
115. 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, "Вася" );
118. 118
Штриховка
(x1, y1)
(x2, y2)
N ліній (N=5)
h
1
12
N
xx
h
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. 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. 120
Штриховка
(x1, y1)
(x2, y2) (x3, y2)
a
h
1
23
N
xx
h21 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. 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
xx
hx
1
12
N
yy
hy
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. 122
Завдання
"4": Ввести з клавіатури число ліній і побудувати фігуру:
"5": Ввести з клавіатури число ліній і побудувати фігуру:
123. 123
Завдання
"4": Ввести з клавіатури число ліній штриховки і побудувати
фігуру, заливши всі області різним кольором.
"5": Ввести з клавіатури число кіл і побудувати фігуру,
заливши області різним кольором.
125. 125
Побудова графіків функцій
Задача: побудувати графік функції y = 3 sin(x) на
інтервалі від 0 до 2π.
Аналіз:
максимальне значення ymax = 3 при x = π/2
мінімальне значення ymin = -3 при x = 3π/2
Проблема: функція задана в математичній системі
координат, будувати потрібно на екрані, вказуючи
координати в пікселях.
127. 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);
}
Що погано??
2π
h – крок зміни x
w – довжина вісі ОХ в пікселях
координати
точки на екрані
вісі координат
цикл
побудови
графіка
oбов’язково
#include <math.h>
128. 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);
...
}
початкове значення
132. 132
Процедури
Процедура – це допоміжний алгоритм, який призначений
для виконання певних дій.
Примітка:
• виконання однакових дій у різних місцях програми
• розбивка програми (або іншої процедури) на
підзадачі для кращого сприйняття
Підзадача1 Підзадача2 Підзадача3
1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3
Задача
133. 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. 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. 135
Процедури
Особливості:
• зазвичай процедури розташовуються вище
основної програми
• в заголовку процедури перераховуються
формальні параметри, вони позначаються
іменами, оскільки можуть змінюватися
• при виклику процедури в дужках вказувають
фактичні параметри (числа або арифметичні
вирази) в тому ж порядку
void Tr( int x, int y, int c )
Tr ( 200, 100, LIGHTGREEN );
x y c
136. 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. 137
Як поміняти місцями?
2Задача: поміняти місцями
вмістиме двох горняток.
Задача: поміняти місцями вмістиме двох комірок
пам’яті.
4 6
?4
6 4
x y
c
c = x;
x = y;
y = c;
x = y;
y = x;
2
Чи можна обійтися без c??
138. 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. 139
Параметри-змінні
Примітка:
таким чином процедура (і функція) можуть
повертати декілька значень
Заборонені варіанти викликів
Swap ( 2, 3 ); // числа
Swap ( x+z, y+2 ); // вираз
void Swap ( int & a, int & b )
{
int c;
c = a; a = b; b = c;
}
&
параметри можуть
змінюватися
&
142. 142
Анімація
Анімація (англ. animation) – оживлення
зображення на екрані.
Задача: всередині синього квадрата 400 на 400
пікселів зліва направо рухається жовтий
квадрат 20 на 20 пікселів. Програма
зупиняється, якщо натиснута клавіша Esc
або квадрат дійшов до межі синьої області.
Проблема: як зобразити переміщення об’єкта на екрані?
Прив’язка: стан об’єкта задається координатами (x,y)
Принцип анімації:
1. малюється об’єкт в точці (x,y)
2. затримка на декілька мілісекунд
3. стирається об’єкт
4. змiнюються координати (x,y)
5. перехід до кроку 1
143. 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. 144
Як вийти з циклу?
#include <conio.h>
void main()
{
...
while ( x + 20 < 400 )
{
if ( kbhit() )
if ( getch() == 27 ) break;
...
}
...
}
якщо натиснута клавіша ...
якщо натиснута
клавіша з кодом 27
(Esc), вийти з циклу
для kbhit() і getch()
поки не вийшли за межу синього квадрата
Як не допустити виходу за межі поля??
x + 20 < 400
145. 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. 146
Повна програма
void Draw ( int x, int y, int color )
{
...
}
void main()
{
int d = DETECT, m;
initgraph ( &d, &m, "c:borlandcbgi" );
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. 147
"4": Два квадрата рухаються
в протилежних напрямках:
"5": Два квадрата рухаються
в протилежних напрямках
і відштовхуються від
стінок синього квадрата:
Завдання
148. 148
Керування клавішами
Задача: жовтий квадрат всередині синього квадрата керується
клавішами-стрілками. Коди клавіш:
вліво – 75 вверх – 72 Esc – 27
вправо – 77 вниз – 80
Проблема: як змінювати напрямок руху?
Розв’язок:
if натиснута клавіша {
одержати код клавіши - code
if (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. 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. 150
"4": Квадрат рухається при
натиску стрілок, однак не
може вийти за межі
синього квадрата:
"5": Квадрат неперервно
рухається, при натиску
стрілок змінює напрямок і
відштовхується від стінок
синього квадрата:
Завдання
151. 151
Обертання
Задача: зобразити модель обертання Землі навколо
Сонця.
Проблема: рух по колу, як змінювати координати?
Розв’язок: використання в якості незалежної змінної
(змінювати в циклі) кут повороту α
(x0, y0)
α
L
(x, y)
x = x0 + L·cos(α)
y = y0 – L·sin(α)
152. 152
Процедура
void Draw( int x, int y, int color )
{
const r = 10;
setcolor ( color );
circle ( x, y, r );
}
колір: жовтий – малюємо,
чорний – стираємо
встановили колір
ліній
радіус Землі
(x,y)
r
153. 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:borlandcbgi" );
...
}
void Draw ( int x, int y, int color )
{
...
}
154. 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. 155
"4": Зобразити модель Сонця
з двома планетами, які
обертаються в протилежні
сторони:
"5": Зобразити модель
системи Сонце-Земля-
Місяць:
Завдання
157. 157
Випадкові числа
Випадкові явища: всюди…
• кидання монети ("орел" або "решка")
• падіння снігу
• броунівський рух
• завади при телефонному зв’язку
• шум радіоефіра
Випадкові числа – це така послідовність чисел, для якої
неможливо передбачити наступне навіть знаючи всі
попередні.
Проблема: як одержати на комп’ютерi?
Можливі розв’язки:
• використовувати зовнішнє джерело шумових завад
• за допомогою математичних перетворень
158. 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. 159
Розподіл випадкових чисел
Модель: сніжинки падають на відрізок [a,b]
a b a b
розподіл
рівномірне нерівномерне
Скільки може бути різних розподілів??
160. 160
Розподіл випадкових чисел
Особливості:
• розподіл – це характеристика всієї послідовності, а не одного
числа
• рівномірний розподіл один, комп’ютерні датчики (псевдо)
випадкових чисел дають рівномірний розподіл
• нерівномірних – багато
• будь-який неравномірний можна одержати за допомогою
рівномірного
a b
2
21 xx
x
a b
12
1221 xxx
x
рівномірний розподіл
рівномірний розподіл
161. 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. 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. 163
Випадкові числа
Задача: заповнити прямокутник
400 на 300 пікселів рівномірно
точками випадкового кольору
Як одержати випадкові координати точки?
x = random ( 400 );
y = random ( 300 );
Як досягнути рівномірності?
забеспечується автоматично при використанні
функції random
Як одержати випадковий колір?
color = random ( 16 );
164. 164
Програма
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
void main()
{
int d = DETECT, m;
int x, y, color;
initgraph ( &d, &m, "C:BORLANDCBGI" );
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. 165
"4": Ввести з клавіатури
координати кутів
прямокутника і заповнити
його точками випадкового
кольору.
"5": Заповнити трикутник
точками випадкового
кольору (рівномірно або
нерівномірно).
Підказка: візьміть
рівнобедренний трикутник
з кутом 60о.
Завдання
(100,100)
(300,200)
167. 167
Функції
Функція – це допоміжний алгоритм (підпрограма),
результатом роботи якої є деяке значення.
Приклади:
• обчислення модуля числа,
• розрахунок значень по складним формулам
• відповідь на питання (просте число чи ні?)
Для чого?
• для виконання одинакових розрахунків у різних
місцях програми
• для створення загальнодоступних бібліотек функцій
x
В чому відмінність від процедур??
168. 168
Функції
Задача: скласти функцію, яка обчислює найбільше з
двох значень, і навести приклад її використання
Функція:
формальні
параметри
int Max ( int a, int b )
{
if ( a > b ) return a ;
else return b ;
}
return - повернути
результат функції
169. 169
Функції
Особливості:
• на початку заголовку ставиться тип результату
• формальні параметри описуються так само, як і для
процедур
• можна використовувати параметри-змінні
• функції зазвичай розташовуються до основної
програми
Max ( int a, int b )int
float qq ( )int a, float x, char c
int Vasya (int a, int b )& &
170. 170
Функції
Особлмвості:
• можна оголошувати і використовувати локальні
змінні
float qq ( int a, int b)
{
...
}
float x, y;
локальні
змінні
Локальні змінні недоступні в основній
програмі та інших процедурах і функціях.
!
171. 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. 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. 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. 174
Завдання
"4": Скласти функцію, яка визначає суму всіх чисел від 1 до N і
навести приклад її виконання.
Приклад:
Введіть число:
100
сума чисел від 1 до 100 = 5050
"5": Скласти функцію, яка визначає, скільки зерен попросив
покласти на N-у клітинку винахідник шахів (на 1-у – 1
зернятко, на 2-у – 2 зернятка, на 3-ю – 4 зернятка, …)
Підказка: використовуйте тип long int.
Приклад:
Введіть номер клітинки:
28
На 28-ій клітинці 134217728 зерен.
175. 175
Завдання (варіант 2 для 8-11 класів)
"4": Скласти функцію, яка визначає найбільший спільний
дільник двох натуральних чисел і навести приклад його
використання.
Приклад:
Введіть два числа:
14 21
НОД(14,21)=7
"5": Скласти функцію, яка обчислює функцію синус як суму
ряду (з точністю 0.001)
Приклад:
Введіть кут в градусах:
45
sin(45) = 0.707
!7!5!3
sin
753
xxx
xx x в радіанах!