SlideShare uma empresa Scribd logo
1 de 176
Програмування
на мові Сі
© К.Ю. Поляков
Переклад: В.Семенюк
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 HH
ZZZZZ
Програмування
на мові Сі
Тема 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);
?
a
5 5
?
x
5+2025
?
y
600 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
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));
Програмування
на мові Сі
Тема 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
1
1
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 %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
Цикл із зменшенням змінної
Задача. Вивести на екран квадрати і куби цілих чисел від
8 до 1 (у зворотньому порядку).
Особливість: змінна циклу повинна зменшуватися.
Розв’язок:
for ( )
{
i2 = i*i;
i3 = i2*i;
printf("%4d %4d %4dn", 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
n
n
c
b
a 
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
Алгоритм
початок
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
2
1 







S
...
24313
10
818
8
275
6
93
4
32
2
1 









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=%dn", X);
printf("В циклі: i=%d, X=%dn", i, X);
printf("Після циклу: X=%dn", 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:borlandcbgi");
... // малюємо на екрані
getch();
closegraph();
}
initgraph(&d, &m,
"c:borlandcbgi");
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
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
Як змінювати колір?
(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
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
Штриховка
(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
Завдання
"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е
yе
(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);
}
Що погано??
2π
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": Побудувати графік
функції (еліпс)
1
916
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: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
"4": Два квадрата рухаються
в протилежних напрямках:
"5": Два квадрата рухаються
в протилежних напрямках
і відштовхуються від
стінок синього квадрата:
Завдання
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
Програма
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:borlandcbgi" );
...
}
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 xx
x


a b
12
1221 xxx
x



рівномірний розподіл
рівномірний розподіл
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: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
"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
sin
753
xxx
xx x в радіанах!
176
Кінець

Mais conteúdo relacionado

Mais procurados

Презентація:Додавання і віднімання мішаних чисел
Презентація:Додавання і віднімання мішаних чиселПрезентація:Додавання і віднімання мішаних чисел
Презентація:Додавання і віднімання мішаних чисел
sveta7940
 
геометрія підручник для 7 класу авт. Бевз Г. П. Бевз В. Г. Владімірова Н. Г.
геометрія   підручник для 7 класу авт. Бевз Г. П. Бевз В. Г. Владімірова Н. Г.геометрія   підручник для 7 класу авт. Бевз Г. П. Бевз В. Г. Владімірова Н. Г.
геометрія підручник для 7 класу авт. Бевз Г. П. Бевз В. Г. Владімірова Н. Г.
Гергель Ольга
 
Презентація:Кути та їх вимірювання
Презентація:Кути та їх вимірюванняПрезентація:Кути та їх вимірювання
Презентація:Кути та їх вимірювання
sveta7940
 
Складові комп"ютера та їх призначення
Складові комп"ютера та їх призначенняСкладові комп"ютера та їх призначення
Складові комп"ютера та їх призначення
sveta7940
 

Mais procurados (20)

Презентація:Додавання і віднімання мішаних чисел
Презентація:Додавання і віднімання мішаних чиселПрезентація:Додавання і віднімання мішаних чисел
Презентація:Додавання і віднімання мішаних чисел
 
Підсумковий урок з інформатики_презентація.docx
Підсумковий урок з інформатики_презентація.docxПідсумковий урок з інформатики_презентація.docx
Підсумковий урок з інформатики_презентація.docx
 
Математика 6 клас
Математика 6 класМатематика 6 клас
Математика 6 клас
 
Презентація до уроку №1 "Числові функції. Зростаючі і спадні, парні і непарні...
Презентація до уроку №1 "Числові функції. Зростаючі і спадні, парні і непарні...Презентація до уроку №1 "Числові функції. Зростаючі і спадні, парні і непарні...
Презентація до уроку №1 "Числові функції. Зростаючі і спадні, парні і непарні...
 
Поняття моделi. Типи моделей. Моделювання
Поняття моделi. Типи моделей. МоделюванняПоняття моделi. Типи моделей. Моделювання
Поняття моделi. Типи моделей. Моделювання
 
Додавання раціональних чисел. 6 клас
Додавання раціональних чисел. 6 класДодавання раціональних чисел. 6 клас
Додавання раціональних чисел. 6 клас
 
Віднімання раціональних чисел
Віднімання раціональних чиселВіднімання раціональних чисел
Віднімання раціональних чисел
 
6 клас контрольна робота 2 (математика)
6 клас контрольна робота 2 (математика)6 клас контрольна робота 2 (математика)
6 клас контрольна робота 2 (математика)
 
геометрія підручник для 7 класу авт. Бевз Г. П. Бевз В. Г. Владімірова Н. Г.
геометрія   підручник для 7 класу авт. Бевз Г. П. Бевз В. Г. Владімірова Н. Г.геометрія   підручник для 7 класу авт. Бевз Г. П. Бевз В. Г. Владімірова Н. Г.
геометрія підручник для 7 класу авт. Бевз Г. П. Бевз В. Г. Владімірова Н. Г.
 
Я досліджую світ за НУШ для 1 класу (автор Тетяна Гільберт та ін.)
Я досліджую світ за НУШ для 1 класу (автор Тетяна Гільберт та ін.)Я досліджую світ за НУШ для 1 класу (автор Тетяна Гільберт та ін.)
Я досліджую світ за НУШ для 1 класу (автор Тетяна Гільберт та ін.)
 
Урок 42. Алгоритми з повтореннями для опрацювання величин. Цикл з лічильником
 Урок 42. Алгоритми з повтореннями  для опрацювання величин.  Цикл з лічильником Урок 42. Алгоритми з повтореннями  для опрацювання величин.  Цикл з лічильником
Урок 42. Алгоритми з повтореннями для опрацювання величин. Цикл з лічильником
 
Урок 21 для 7 класу - Розробка діалогових програм.
Урок 21 для 7 класу - Розробка діалогових програм.Урок 21 для 7 класу - Розробка діалогових програм.
Урок 21 для 7 класу - Розробка діалогових програм.
 
Рівняння і нерівності з модулями
Рівняння і нерівності з модулямиРівняння і нерівності з модулями
Рівняння і нерівності з модулями
 
Збірник програм з математики для допрофільної підготовки та профільного навч...
Збірник програм з математики  для допрофільної підготовки та профільного навч...Збірник програм з математики  для допрофільної підготовки та профільного навч...
Збірник програм з математики для допрофільної підготовки та профільного навч...
 
5 клас урок 27 нова програма
5 клас урок 27 нова програма5 клас урок 27 нова програма
5 клас урок 27 нова програма
 
рівняння нерівності з параметрами
рівняння нерівності з параметрамирівняння нерівності з параметрами
рівняння нерівності з параметрами
 
Презентація:Кути та їх вимірювання
Презентація:Кути та їх вимірюванняПрезентація:Кути та їх вимірювання
Презентація:Кути та їх вимірювання
 
Урок 30 для 7 класу - Підготовка презентаційних матеріалів проекту та звіту.
Урок 30 для 7 класу - Підготовка презентаційних матеріалів проекту та звіту.Урок 30 для 7 класу - Підготовка презентаційних матеріалів проекту та звіту.
Урок 30 для 7 класу - Підготовка презентаційних матеріалів проекту та звіту.
 
План роботи класного керівника
План роботи класного керівникаПлан роботи класного керівника
План роботи класного керівника
 
Складові комп"ютера та їх призначення
Складові комп"ютера та їх призначенняСкладові комп"ютера та їх призначення
Складові комп"ютера та їх призначення
 

Destaque

Destaque (14)

майбутні цифрові технології
майбутні цифрові технологіїмайбутні цифрові технології
майбутні цифрові технології
 
системи числення
системи численнясистеми числення
системи числення
 
ЗНО-2016
ЗНО-2016ЗНО-2016
ЗНО-2016
 
Medicaid organization profile
Medicaid organization profileMedicaid organization profile
Medicaid organization profile
 
C language. Introduction
C language. IntroductionC language. Introduction
C language. Introduction
 
пIсок давно минувших днiв
пIсок давно минувших днiвпIсок давно минувших днiв
пIсок давно минувших днiв
 
C programming tutorial for beginners
C programming tutorial for beginnersC programming tutorial for beginners
C programming tutorial for beginners
 
C tutorial
C tutorialC tutorial
C tutorial
 
Introduction to programming with c,
Introduction to programming with c,Introduction to programming with c,
Introduction to programming with c,
 
C ppt
C pptC ppt
C ppt
 
C Programming Language Part 7
C Programming Language Part 7C Programming Language Part 7
C Programming Language Part 7
 
C Programming Language Part 8
C Programming Language Part 8C Programming Language Part 8
C Programming Language Part 8
 
C Programming Language Part 6
C Programming Language Part 6C Programming Language Part 6
C Programming Language Part 6
 
C Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointC Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpoint
 

Semelhante a Основи мови Ci

програмування на мові паскаль
програмування на мові паскаль програмування на мові паскаль
програмування на мові паскаль
Helen Pata
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
Ann Eres
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
1cana1
 
Основи програмування .Паскаль ч.1
Основи програмування .Паскаль ч.1Основи програмування .Паскаль ч.1
Основи програмування .Паскаль ч.1
rznz
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
Dmitry Chabanenko
 
01 c# basics
01 c# basics01 c# basics
01 c# basics
eleksdev
 

Semelhante a Основи мови Ci (20)

програмування на мові паскаль
програмування на мові паскаль програмування на мові паскаль
програмування на мові паскаль
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
 
Основи програмування .Паскаль ч.1
Основи програмування .Паскаль ч.1Основи програмування .Паскаль ч.1
Основи програмування .Паскаль ч.1
 
Паскаль
ПаскальПаскаль
Паскаль
 
3018 1
3018 13018 1
3018 1
 
Pascal osnovu
Pascal osnovuPascal osnovu
Pascal osnovu
 
Pascal основи програмування частина 1
Pascal основи програмування частина 1Pascal основи програмування частина 1
Pascal основи програмування частина 1
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
 
01 c# basics
01 c# basics01 c# basics
01 c# basics
 
Знайомство з програмуванням на мові C++
Знайомство з програмуванням на мові C++Знайомство з програмуванням на мові C++
Знайомство з програмуванням на мові C++
 
Модулі Python
Модулі PythonМодулі Python
Модулі Python
 
2
22
2
 
2
22
2
 
2
22
2
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
 
7_2811.pptx
7_2811.pptx7_2811.pptx
7_2811.pptx
 
Less37
Less37Less37
Less37
 
Funkciji1
Funkciji1Funkciji1
Funkciji1
 
тема 7
тема 7тема 7
тема 7
 

Mais de Escuela

Mais de Escuela (20)

Фізика - ЗНО 2020 (пробне)
Фізика - ЗНО 2020 (пробне)Фізика - ЗНО 2020 (пробне)
Фізика - ЗНО 2020 (пробне)
 
Рух тіла під дією кількох сил
Рух тіла під дією кількох сил Рух тіла під дією кількох сил
Рух тіла під дією кількох сил
 
Files
FilesFiles
Files
 
Iнтернет
IнтернетIнтернет
Iнтернет
 
Excel
ExcelExcel
Excel
 
Comp net
Comp netComp net
Comp net
 
Information
InformationInformation
Information
 
Pascal osnovu2
Pascal osnovu2Pascal osnovu2
Pascal osnovu2
 
Lytva
LytvaLytva
Lytva
 
Kod infor
Kod inforKod infor
Kod infor
 
Gcompris
GcomprisGcompris
Gcompris
 
Web 2 0
Web 2 0Web 2 0
Web 2 0
 
Power Point 2007
Power Point 2007Power Point 2007
Power Point 2007
 
MKT
MKTMKT
MKT
 
бази даних
бази данихбази даних
бази даних
 
Світло і звук
Світло і звукСвітло і звук
Світло і звук
 
Android OC
Android OC Android OC
Android OC
 
Лондон
ЛондонЛондон
Лондон
 
Хімія навколо нас
Хімія навколо насХімія навколо нас
Хімія навколо нас
 
Білки
БілкиБілки
Білки
 

Último

Último (10)

Супрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptxСупрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptx
 
Габон
ГабонГабон
Габон
 
Супрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptxСупрун презентація_presentation_for_website.pptx
Супрун презентація_presentation_for_website.pptx
 
psychologistpresentation-230215175859-50bdd6ed.ppt
psychologistpresentation-230215175859-50bdd6ed.pptpsychologistpresentation-230215175859-50bdd6ed.ppt
psychologistpresentation-230215175859-50bdd6ed.ppt
 
Роль українців у перемозі в Другій світовій війні
Роль українців у перемозі в Другій світовій війніРоль українців у перемозі в Другій світовій війні
Роль українців у перемозі в Другій світовій війні
 
Відкрита лекція на тему: "Сидерати - як спосіб виживання"
Відкрита лекція на тему: "Сидерати - як спосіб виживання"Відкрита лекція на тему: "Сидерати - як спосіб виживання"
Відкрита лекція на тему: "Сидерати - як спосіб виживання"
 
Defectolog_presentation_for_website.pptx
Defectolog_presentation_for_website.pptxDefectolog_presentation_for_website.pptx
Defectolog_presentation_for_website.pptx
 
Горбонос 2024_presentation_for_website.pptx
Горбонос 2024_presentation_for_website.pptxГорбонос 2024_presentation_for_website.pptx
Горбонос 2024_presentation_for_website.pptx
 
Балади про Робіна Гуда. Аналіз образу Робіна Гуда
Балади про Робіна Гуда. Аналіз образу Робіна ГудаБалади про Робіна Гуда. Аналіз образу Робіна Гуда
Балади про Робіна Гуда. Аналіз образу Робіна Гуда
 
Спектроскоп. Спостереження оптичних явищ
Спектроскоп. Спостереження оптичних явищСпектроскоп. Спостереження оптичних явищ
Спектроскоп. Спостереження оптичних явищ
 

Основи мови Ci

  • 1. Програмування на мові Сі © К.Ю. Поляков Переклад: В.Семенюк 1. Вступ 2. Змінні 3. Введення і виведення 4. Розгалуження 5. Складні умови 6. Цикли 7. Цикли з умовою 8. Оператор вибору 9. Відлагодження програм 10. Графіка 11. Графіки функцій 12. Процедури 13. Анімація 14. Випадкові числа 15. Функції
  • 2. Програмування на мові Сі Тема 1. Вступ © К.Ю. Поляков Переклад: В.Семенюк
  • 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 (успіх)
  • 15. 15 Де помилки? переміщення курсора ↑↓ ця помилка знайдена тут! Помилка може бути в кінці попереднього рядка!! Enter – перейти до редагування
  • 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));
  • 33. Програмування на мові Сі Тема 3. Введення і виведення
  • 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
  • 36. 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. 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 це виводить комп’ютер це вводить користувач
  • 41. 41 Блок-схема лінійного алгоритму початок кінець c = a + b; введення a, b виведення c блок «початок" блок "введення" блок "процес" блок "виведення" блок "кінець"
  • 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;
  • 49. 49 Варіант 2. Блок-схема неповна форма розгалуження початок max = a; ввести a,b виведення max max = b; кінець так ні b > a?
  • 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 років включно. Ввести вік людини і визначити, чи підходить вона фірмі чи ні (вивести відповідь "підходить" або "не підходить"). Особливість: потрібно перевірити, чи виконуються дві умови одночасно. Чи можна розв’язати відомими методами??
  • 55. 55 Варiант 1. Алгоритм початок ввести x 'підходить' кінець так ні x >= 25? так ні x <= 40? 'не підходить' 'не підходить'
  • 56. 56 Вариант 1. Програма void main() { int x; printf("Введіть вікn"); scanf("%d", &x); if (x >= 25) if (x <= 40) printf("Підходить"); else printf("Не підходить"); else printf("Не підходить"); }
  • 57. 57 Варіант 2. Алгоритм початок ввести x 'підходить' так ніx >= 25 і x <= 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
  • 76. 76 Алгоритм початок count кінець ні так n != 0? count = 0; count = count + 1; n = n / 10; обнулити лічильник цифр введення n виконати "поки n != 0"
  • 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 Ні. Так.
  • 83. 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 n n c b a 
  • 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 Немає повторень.
  • 93. Програмування на мові Сі Тема 8. Оператор вибору
  • 94. 94 Оператор вибору Задача: Ввести номер місяця і вивести кількість днів в цьому місяці. Розв’язок: Число днів по місяцям: 28 днів – 2 (лютий) 30 днів – 4 (квітень), 6 (червень), 9 (вересень), 11 (листопад) 31 день – 1 (січень), 3 (березень), 5 (травень), 7 (липень), 8 (серпень), 10 (жовтень), 12 (грудень) Особливість: Вибір не з двох, а з декількох варіантів в залежності від номера місяця. Чи можно розв’язати відомими методами??
  • 95. 95 Алгоритм початок кінець оператор вибору ні один варіант не підійшов введення M так ні M = 1? D = 31; ні M = 2? D = 28; так ні M = 12? D = 31; так виведення D помилка
  • 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 днів.
  • 100. Програмування на мові Сі Тема 9. Відлагодження програм
  • 101. 101 Відлагодження програм Відлагодження – пошук і виправлення помилок в програмі. Англ. debugging, bug = міль, жук Методи: • трасування – виведення сигнальних повідомлень • відключення частини коду (в коментарі) • покрокове виконання – виконати один рядок програми і зупинитися • точки зупинка – виконання програми зупиняється при досягнені відміченних рядків (перехід в покроковий режим) • перегляд і зміна значень змінних в покроковому режимі
  • 102. 102 Трасування printf("Введено X=%dn", X); printf("В циклі: i=%d, X=%dn", i, X); printf("Після циклу: X=%dn", X); void main() { int i, X; printf("Введіть ціле число:n"); scanf("%d", &X); for(i=1; i<10; i++) { ... } ... }
  • 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) можно ввести новое значение для переменной изменить переменную
  • 109. 109 Принцип сендвіча малювати в графічному режимі включити графічний режим виключити графічний режим
  • 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 точкова
  • 113. 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. 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. 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. 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
  • 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": Ввести з клавіатури число кіл і побудувати фігуру, заливши області різним кольором.
  • 124. Програмування на мові Сі Тема 11. Графіки функцій
  • 125. 125 Побудова графіків функцій Задача: побудувати графік функції y = 3 sin(x) на інтервалі від 0 до 2π. Аналіз: максимальне значення ymax = 3 при x = π/2 мінімальне значення ymin = -3 при x = 3π/2 Проблема: функція задана в математичній системі координат, будувати потрібно на екрані, вказуючи координати в пікселях.
  • 126. 126 Перетворення координат (x,y) X Y x y Математична система координат Екранна система координат (пікселі) (xе,yе) xе yе (0,0) (0,0) a b k – масштаб (довжина зображення одиничного відрізка на екрані) xе = a + kx yе = b - ky
  • 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); ... } початкове значення
  • 129. 129 Завдання "4": Побудувати графік функції y = x2 на інтервалі [-3,3]. "5": Побудувати графік функції (еліпс) 1 916 22  yx
  • 131. 131 Процедури Задача: Побудувати фігуру: Особливності: Три схожі фігури. загальні: розміри, кут повороту відмінність: координати, колір Чи можна розв’язати відомими методами?? Скільки координат потрібно задати??
  • 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; } & параметри можуть змінюватися &
  • 140. 140 Завдання "4": Використовуючи процедури, побудувати фігуру. "5": Використовуючи процедури, побудувати фігуру. a a a 0,866∙a рівносторонній трикутник
  • 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": Зобразити модель системи Сонце-Земля- Місяць: Завдання
  • 156. Програмування на мові Сі Тема 14. Випадкові числа
  • 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 в радіанах!