2
Алгоритм
Свойства алгоритма
Алгоритм – это четко определенный план действий для исполнителя.
3
Программа
Программа – это
алгоритм, записанный на каком-либо языке программирования
набор команд для компьютера
Команда – это описание действий, которые должен выполнить компьютер.
откуда взять исходные данные?
что нужно с ними сделать?
1970 – язык Паскаль (Н. Вирт)
Оператор – это команда языка программирования высокого уровня.
4
Простейшая программа
program qq;
begin { начало программы }
end. { конец программы }
комментарии в фигурных скобках не обрабатываются
название программы
5
Вывод текста на экран
program qq;
begin
write('2+'); { без перехода }
writeln('2=?'); { на новую строку}
writeln('Ответ: 4');
end.
Протокол:
2+2=?
Ответ: 4
6
Задания
«4»: Вывести на экран текст "лесенкой"
Вася
пошел
гулять
«5»: Вывести на экран рисунок из букв
Ж
ЖЖЖ
ЖЖЖЖЖ
ЖЖЖЖЖЖЖ
HH HH
ZZZZZ
7
Переменные
Задача. Ввести с клавиатуры два числа и найти их сумму.
Протокол:
Введите два целых числа
25 30
25+30=55
компьютер
пользователь
компьютер считает сам!
8
Программа
program qq;
begin
{ ввести два числа }
{ вычислить их сумму }
{ вывести сумму на экран }
end.
Псевдокод: алгоритм на русском языке с элементами Паскаля.
9
Переменные
Переменная – это величина, имеющая имя, тип и значение. Значение переменной можно изменять во время работы программы.
a
Значение
Имя
Другой тип данных
10
Имена переменных
В именах МОЖНО использовать
заглавные и строчные буквы не различаются
В именах НЕЛЬЗЯ использовать
имя не может начинаться с цифры
Какие имена правильные??
AXby R&B 4Wheel Вася “PesBarbos” TU154 [QuQu] _ABBA A+B
11
Переменные
Типы переменных:
Объявление переменных:
var a, b, c: integer;
Выделение места в памяти
variable – переменная
тип – целые
список имен переменных
12
Как записать значение в переменную?
a := 5;
Оператор присваивания
5
Оператор – это команда языка программирова-ния (инструкция).
Оператор присваивания – это команда для записи нового значения в переменную.
a
13
Блок-схема линейного алгоритма
начало
конец
c := a + b;
ввод a, b
вывод c
блок «начало»
блок «ввод»
блок «процесс»
блок «вывод»
блок «конец»
15
Ввод значений двух переменных
через пробел:
25 30
через Enter:
25
30
read ( a, b );
Ввод значений двух переменных (через пробел или Enter).
16
Оператор вывода
{ вывод значения переменной a}
{ вывод значения переменной a и переход на новую строчку}
{ вывод текста }
{вывод текста и значения переменной c}
write( a );
writeln( a );
writeln( 'Привет!' );
writeln( 'Ответ: ', c );
writeln ( a, '+', b, '=', c );
17
Сложение двух чисел
Задача. Ввести два целых числа и вывести на экран их сумму.
Простейшее решение:
program qq;
var a, b, c: integer;
begin
read ( a, b );
c := a + b;
writeln ( c );
end.
18
Полное решение
program qq;
var a, b, c: integer;
begin
writeln('Введите два целых числа');
read ( a, b );
c := a + b;
writeln ( a, '+', b, '=', c );
end.
Протокол:
Введите два целых числа
25 30
25+30=55
компьютер
пользователь
19
Как изменить значение переменной?
program qq;
var a, b: integer;
begin
a := 5;
b := a + 2;
a := (a + 2)*(b – 3);
b := b + 1;
end.
a
?
5
5
b
?
5+2
7
a
5
7*4
28
Пример:
b
7
7+1
8
20
Арифметические операции
+ сложение – вычитание
* умножение / деление
div деление нацело (остаток отбрасывается)
mod остаток от деления
var a, b: integer;
begin
a := 7*3 - 4; { 17 }
a := a * 5; { 85 }
b := a div 10; { 8 }
a := a mod 10; { 5 }
end.
21
program qq;
var a, b: integer;
x, y: real;
begin
a := 5;
10 := x;
y := 7,8;
b := 2.5;
x := 2*(a + y);
a := b + x;
end.
Какие операторы неправильные?
имя переменной должно быть слева от знака :=
целая и дробная часть отделяются точкой
нельзя записывать вещественное значение в целую переменную
22
Порядок выполнения операций
вычисление выражений в скобках
умножение, деление, div, mod слева направо
сложение и вычитание слева направо
z := (5*a+c)/a*(b-c)/ b;
x:=(5*c*c-d*(a+b))/((c+d)*(d-2*a));
1 2 4 5 3 6
2 3 5 4 1 10 6 9 8 7
23
Ручная прокрутка программы
program qq;
var a, b: integer;
begin
a := 5;
b := a + 2;
a := (a + 2)*(b – 3);
b := a div 5;
a := a mod b;
a := a + 1;
b := (a + 14) mod 7;
end.
a | b |
? | |
5 | |
7 | |
28 | |
5 | |
3 | |
4 | |
4 |
24
Вывод целых чисел
program qq;
var a, b: integer;
begin
a := 15;
b := 45;
writeln ( a, b );
writeln ( a:4, b:4 );
end.
15 45
1545
25
Вывод вещественных чисел
program qq;
var x: real;
begin
x := 12.345678;
writeln ( x );
writeln ( x:10 );
writeln ( x:7:2 );
end.
12.35
всего символов
всего символов
в дробной части
1.23E+001
1.234568E+001
1,234568∙101
27
Разветвляющиеся алгоритмы
Задача. Ввести два целых числа и вывести на экран наибольшее из них.
Идея решения: надо вывести на экран первое число, если оно больше второго, или второе, если оно больше первого.
Особенность: действия исполнителя зависят от некоторых условий (если … иначе …).
Алгоритмы, в которых последовательность шагов зависит от выполнения некоторых условий, называются разветвляющимися.
29
Вариант 1. Программа
max := a;
max := b;
полная форма условного оператора
program qq;
var a, b, max: integer;
begin
writeln('Введите два целых числа');
read ( a, b );
if a > b then begin
end
else begin
end;
writeln ('Наибольшее число ', max);
end.
30
Условный оператор
if <условие> then begin
{что делать, если условие верно}
end
else begin
{что делать, если условие неверно}
end;
Особенности:
31
Что неправильно?
if a > b then begin
a := b;
end
else
b := a;
end;
if a > b then begin
a := b;
else begin
b := a;
end;
if a > b then begin
a := b;
end;
else begin
b := a;
end;
if a > b then begin
a := b;
end
else b > a begin
b := a;
end;
begin
end
begin
end
33
Вариант 2. Программа
program qq;
var a, b, max: integer;
begin
writeln('Введите два целых числа');
read ( a, b );
max := a;
if b > a then
max := b;
writeln ('Наибольшее число ', max);
end.
неполная форма условного оператора
34
Вариант 2Б. Программа
program qq;
var a, b, max: integer;
begin
writeln('Введите два целых числа');
read ( a, b );
max := b;
if ??? then
???
writeln ('Наибольшее число ', max);
end.
max := a;
a > b
35
Что неправильно?
if a > b then begin
a := b;
else b := a;
if a > b then begin
a := b;
end;
else b := a;
if a > b then
else begin
b := a;
end;
if a > b then
a := b;
else b := a; end;
a := b
end
a := b
if b >= a then
b := a;
37
Сложные условия
Задача. Фирма набирает сотрудников от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он фирме (вывести ответ «подходит» или «не подходит»).
Особенность: надо проверить, выполняются ли два условия одновременно.
38
Вариант 1. Алгоритм
начало
ввод x
'подходит'
конец
да
нет
x >= 25?
да
нет
x <= 40?
'не подходит'
'не подходит'
39
Вариант 1. Программа
program qq;
var x: integer;
begin
writeln('Введите возраст');
read ( x );
if x >= 25 then
if x <= 40 then
writeln ('Подходит')
else writeln ('Не подходит')
else
writeln ('Не подходит');
end.
41
Вариант 2. Программа
сложное условие
program qq;
var x: integer;
begin
writeln('Введите возраст');
read ( x );
if (x >= 25) and (x <= 40) then
writeln ('Подходит')
else writeln ('Не подходит')
end.
42
Сложные условия
Простые условия (отношения)
< <= > >= = <>
равно
не равно
43
Сложные условия
Порядок выполнения (приоритет = старшинство)
выражения в скобках
not
and
or
<, <=, >, >=, =, <>
Особенность – каждое из простых условий обязательно заключать в скобки.
Пример
4 1 6 2 5 3
if not (a > b) or (c <> d) and (b <> a)
then begin
...
end
44
Истинно или ложно при a := 2; b := 3; c := 4;
not (a > b)
(a < b) and (b < c)
not (a >= b) or (c = d)
(a < c) or (b < c) and (b < a)
(a < b) and (b > c)
Для каких значений x истинны условия:
(x < 6) and (x < 10)
(x < 6) and (x > 10)
(x > 6) and (x < 10)
(x > 6) and (x > 10)
(x < 6) or (x < 10)
(x < 6) or (x > 10)
(x > 6) or (x < 10)
(x > 6) or (x > 10)
Сложные условия
True
True
FALSE
(-; 6)
(6; 10)
(10; )
(-; 10)
(-; 6) (10;)
(-; )
(6; )
x < 6
x > 10
x < 10
x > 6
True
True
46
Циклы
Цикл – это многократное выполнение одинаковой последовательности действий.
цикл с известным числом шагов
цикл с неизвестным числом шагов (цикл с условием)
Задача. Вывести на экран 5 раз слово «Привет».
Особенность: одинаковые действия выполняются 5 раз.
47
Циклы
program qq;
begin
writeln('Привет');
writeln('Привет');
writeln('Привет');
writeln('Привет');
writeln('Привет');
end.
49
Алгоритм
начало
Привет!
конец
да
нет
N = 5?
N := 0;
N := N + 1;
еще не сделали ни одного раза
проверить, все ли сделали
вывод на экран
считаем очередной шаг
50
Цикл с неизвестным числом шагов
Пример: Отпилить полено от бревна. Сколько раз надо сделать движения пилой?
Задача: Ввести целое число (<2000000) и определить число цифр в нем.
Идея решения: Отсекаем последовательно последнюю цифру, увеличиваем счетчик.
Проблема: Неизвестно, сколько шагов надо сделать.
Решение: Надо остановиться, когда n = 0, т.е. надо делать «пока n <> 0».
n | count |
123 | 0 |
12 | 1 |
1 | 2 |
0 | 3 |
51
Алгоритм
начало
count
конец
нет
да
n <> 0?
count := 0;
count := count + 1;
n := n div 10;
обнулить счетчик цифр
ввод n
выполнять «пока n <> 0»
52
Программа
program qq;
var n, count: integer;
begin
writeln('Введите целое число');
read(n);
count := 0;
while n <> 0 do begin
count := count + 1;
n := n div 10;
end;
writeln('В числе ', n, ' нашли ',
count, ' цифр');
end.
while n <> 0 do begin
count := count + 1;
n := n div 10;
end;
, n1: integer;
n1 := n;
n1,
выполнять «пока n <> 0»
53
Цикл с условием
while <условие> do begin
{тело цикла}
end;
Особенности:
while (a < b) and (b < c) do begin
{тело цикла}
end;
while a < b do
a := a + 1;
54
Цикл с условием
Особенности:
a := 4; b := 6;
while a > b do
a := a – b;
a := 4; b := 6;
while a < b do
d := a + b;
55
Сколько раз выполняется цикл?
a := 4; b := 6;
while a < b do a := a + 1;
2 раза
a = 6
a := 4; b := 6;
while a < b do a := a + b;
1 раз
a = 10
a := 4; b := 6;
while a > b do a := a + 1;
0 раз
a = 4
a := 4; b := 6;
while a < b do b := a - b;
1 раз
b = -2
a := 4; b := 6;
while a < b do a := a - 1;
зацикливание
56
Цикл с постусловием
Задача: Ввести целое положительное число (<2000000) и определить число цифр в нем.
Проблема: Как не дать ввести отрицательное число или ноль?
Решение: Если вводится неверное число, вернуться назад к вводу данных (цикл!).
Особенность: Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием).
Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла.
57
Цикл с постусловием: алгоритм
начало
конец
да
нет
n > 0?
тело цикла
условие ВЫХОДА
блок «типовой процесс»
ввод n
основной алгоритм
58
Программа
program qq;
var n: integer;
begin
repeat
writeln('Введите положительное число');
read(n);
until n > 0;
... { основной алгоритм }
end.
repeat
writeln('Введите положительное число');
read(n);
until n > 0;
until n > 0;
условие ВЫХОДА
Особенности:
тело цикла всегда выполняется хотя бы один раз
после слова until ("до тех пор, пока не…") ставится условие ВЫХОДА из цикла
59
Сколько раз выполняется цикл?
a := 4; b := 6;
repeat a := a + 1; until a > b;
3 раза
a = 7
a := 4; b := 6;
repeat a := a + b; until a > b;
1 раз
a = 10
a := 4; b := 6;
repeat a := a + b; until a < b;
зацикливание
a := 4; b := 6;
repeat b := a - b; until a < b;
2 раза
b = 6
a := 4; b := 6;
repeat a := a + 2; until a < b;
зацикливание
60
Задания (с защитой от неверного ввода)
«4»: Ввести натуральное число и определить, верно ли, что сумма его цифр равна 10.
Пример:
Введите число >= 0: Введите число >= 0:
-234 1233
Нужно положительное число. Нет
Введите число >= 0:
1234
Да
«5»: Ввести натуральное число и определить, какие цифры встречаются несколько раз.
Пример:
Введите число >= 0: Введите число >= 0:
2323 1234
Повторяются: 2, 3 Нет повторов.
62
Цикл с переменной
Задача. Вывести на экран кубы целых чисел от 1 до 8 (от a до b).
Особенность: одинаковые действия выполняются 8 раз.
N := 1; { очередное число }
cubeN := N*N*N; { куб этого числа }
writeln(N:4, cubeN:4);
N := 2;
...
63
Алгоритм
начало
конец
нет
да
N <= 8?
N := 1;
N := N + 1;
cubeN := N*N*N;
задать начальное значение переменной цикла
проверить, все ли сделали
вычисляем куб
вывод результата
перейти к следующему i
65
Программа
program qq;
var N, cubeN: integer;
begin
for N:=1 to 8 do begin
cubeN := N*N*N;
writeln(N:4, cubeN:4)
end
end.
переменная
цикла
начальное значение
конечное значение
66
Цикл с уменьшением переменной
Задача. Вывести на экран кубы целых чисел от 8 до 1 (в обратном порядке).
Особенность: переменная цикла должна уменьшаться.
Решение:
for N:=8 1 do begin
cubeN := N*N*N;
writeln(N:4, cubeN:4)
end;
downto
67
Цикл с переменной
for <переменная> := <начальное значение> to
<конечное значение> do begin
{тело цикла}
end;
Увеличение переменной на 1:
for <переменная> := <начальное значение> downto
<конечное значение> do begin
{тело цикла}
end;
Уменьшение переменной на 1:
68
Цикл с переменной
Особенности:
for i:=1 to 8 do
writeln('Привет');
69
Цикл с переменной
Особенности:
N := 8;
for i:=1 to N do begin
writeln('Привет');
N := N + 1;
end;
нет зацикливания
70
Цикл с переменной
Особенности:
for i:=1 to 8 do
writeln('Привет');
writeln('i=', i);
for i:=8 downto 1 do
writeln('Привет');
writeln('i=', i);
i=9
i=0
НЕ ДОКУМЕНТИРОВАНО
71
Сколько раз выполняется цикл?
a := 1;
for i:=1 to 3 do a := a+1;
a = 4
a := 1;
for i:=3 to 1 do a := a+1;
a = 1
a := 1;
for i:=1 downto 3 do a := a+1;
a = 1
a := 1;
for i:=3 downto 1 do a := a+1;
a = 4
72
for N:=1 to 9 do begin
if ??? then begin
end;
end;
Как изменить шаг?
Задача. Вывести на экран кубы нечётных целых чисел от 1 до 9.
Особенность: переменная цикла должна увеличиваться на 2.
Проблема: в Паскале шаг может быть 1 или -1.
Решение:
N mod 2 = 1
cubeN := N*N*N;
writeln(N:4, cubeN:4);
выполняется только для нечетных i
73
Как изменить шаг? – II
Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Начальное значение N равно 1, с каждым шагом цикла N увеличивается на 2.
Решение:
???
for k:=1 to 5 do begin
cubeN := N*N*N;
writeln(N:4, cubeN:4);
???
end;
N := N + 2;
N := 1;
74
Как изменить шаг? – III
Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Зная k, надо рассчитать N.
Решение:
k | 1 | 2 | 3 | 4 | 5 |
N | 3 | 5 | 7 | 9 |
N = 2k-1
for k:=1 to 5 do begin
???
cubeN := N*N*N;
writeln(N:4, cubeN:4);
end;
N := 2*k – 1;
75
Замена for на while и наоборот
for i:=1 to 10 do begin
{тело цикла}
end;
i := 1;
while i <= 10 do begin
{тело цикла}
i := i + 1;
end;
for i:=a downto b do
begin
{тело цикла}
end;
i := a;
while i >= b do begin
{тело цикла}
i := i - 1;
end;
Замена while на for возможна только тогда, когда можно заранее рассчитать число шагов цикла.
Замена цикла for на while возможна всегда.
78
Управление цветом
Цвет и толщина линий, цвет точек:
Pen ( 1, 255, 0, 0 );
Цвет и стиль заливки:
Brush ( 1, 0, 255, 0 );
Цвет текста:
TextColor ( 0, 0, 255 );
толщина линии
R(red)
0..255
G(green)
0..255
B(blue)
0..255
0 – выключить
1 - включить
R
G
B
R
G
B
79
Точки, отрезки и ломаные
Pen (1, 0, 255, 0); Line (x1, y1, x2, y2);
Pen (1, 0, 0, 255);
Point (x, y);
Pen (1, 255, 0, 0); MoveTo (x1, y1); LineTo (x2, y2);
LineTo (x3, y3);
LineTo (x4, y4);
LineTo (x5, y5);
80
Фигуры с заливкой
Pen (1, 0, 0, 255);
Brush (1, 255, 255, 0);
Rectangle (x1, y1, x2, y2);
Pen (1, 255, 0, 0);
Brush (1, 0, 255, 0);
Ellipse (x1, y1, x2, y2);
Brush (1, 100, 200, 255);
Fill (x, y);
81
Текст
TextColor (0, 0, 255);
Brush (1, 255, 255, 0);
Font (20, 30, 600);
MoveTo (x, y);
writeln ('Привет!');
Привет!
(x, y)
размер
10 пикселей
угол
поворота
насыщенность:
400 – нормальный
600 – жирный
30о
82
Пример
(200, 50)
(100, 100)
(300, 200)
program qq;
begin
Pen(2, 255, 0, 255);
Brush(1, 0, 0, 255);
Rectangle(100, 100, 300, 200);
MoveTo(100, 100);
LineTo(200, 50);
LineTo(300, 100);
Brush(1, 255, 255, 0);
Fill(200, 75);
Pen(2, 255, 255, 255);
Brush(1, 0, 255, 0);
Ellipse(150, 100, 250, 200);
end.
83
Штриховка
(x1, y1)
(x2, y2)
N линий (N=5)
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);
...
Rectangle (x1, y1, x2, y2);
h := (x2 – x1) / (N + 1);
x := x1 + h;
for i:=1 to N do begin
Line( round(x), y1, round(x), y2);
x := x + h;
end;
var x, h: real;
x
округление до ближайшего целого
x
84
Штриховка (программа)
(x1, y1)
(x2, y2)
h
program qq;
var i, x1, x2, y1, y2, N: integer;
h, x: real;
begin
x1 := 100; y1 := 100;
x2 := 300; y2 := 200;
N := 10;
Rectangle (x1, y1, x2, y2);
h := (x2 - x1) / (N + 1);
x := x1 + h;
for i:=1 to N do begin
Line(round(x), y1, round(x), y2);
x := x + h;
end;
end.
N
85
Штриховка
(x1, y1)
(x2, y2)
(x3, y2)
a
h
(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 := x1 – x2;
x := x1 + h;
for i:=1 to N do begin
Line(round(x), y1, round(x-a), y2);
x := x + h;
end;
x
x-a
86
Штриховка
(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);
...
hx := (x2 – x1) / (N + 1);
hy := (y2 – y1) / (N + 1);
x := x1 + hx; y := y1 + hy;
for i:=1 to N do begin
Line(x1, round(y), round(x), round(y));
x := x + hx; y := y + hy;
end;
87
Как менять цвет?
(x1, y1)
(x2, y2)
Brush ( 1, c, c, c );
Fill ( ???, ??? );
серый: R = G = B
Шаг изменения c:
x
(x-2, y1+2)
hc := 255 div N;
c := 0;
for i:=1 to N+1 do begin
Line(round(x), y1, round(x), y2);
Brush(1, c, c, c );
Fill(round(x)-2, y1+2);
x := x + h; c := c + hc;
end;
var c, hc: integer;
88
Задания
«4»: Ввести с клавиатуры число линий штриховки и построить фигуру, залив все области разным цветом.
«5»: Ввести с клавиатуры число окружностей и построить фигуру, залив все области разным цветом.
или
или
90
Процедуры
Задача: Построить фигуру:
Особенность: Три похожие фигуры.
общее: размеры, угол поворота
отличия: координаты, цвет
91
Процедуры
Процедура – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий.
Применение:
выполнение одинаковых действий в разных местах программы
разбивка программы (или другой процедуры) на подзадачи для лучшего восприятия
92
Процедуры
Порядок разработки:
(x+100, y)
(x, y-60)
procedure Tr( x, y, r, g, b: integer);
begin
MoveTo(x, y);
LineTo(x, y-60);
LineTo(x+100, y);
LineTo(x, y);
Brush(1, r, g, b);
Fill(x+20, y-20);
end;
заголовок
MoveTo(x, y);
LineTo(x, y-60);
LineTo(x+100, y);
LineTo(x, y);
Brush(1, r, g, b);
Fill(x+20, y-20);
тело процедуры
координаты
цвет
параметры
93
Программа
program qq;
begin
Pen(1, 255, 0, 255);
Tr(100, 100, 0, 0, 255);
Tr(200, 100, 0, 255, 0);
Tr(200, 160, 255, 0, 0);
end.
(100,100)
100
60
фактические параметры
вызовы процедуры
procedure Tr( x, y, r, g, b: integer);
begin
...
end;
формальные параметры
процедура
94
Процедуры
Особенности:
procedure Tr( x, y, r, g, b: integer);
Tr (200, 100, 0, 255, 0);
x
y
r
g
b
95
Процедуры
Особенности:
procedure A (x: real; y: integer; z: real);
procedure A (x, z: real; y, k, l: integer);
96
Процедуры
Особенности:
program qq;
procedure A(x, y: integer);
var a, b: real;
begin
a := (x + y)/6;
...
end;
begin
...
end.
procedure A(x, y: integer);
var a, b: real;
begin
a := (x + y)/6;
...
end;
локальные переменные
var a, b: real;
98
Анимация
Анимация (англ. animation) – оживление изображения на экране.
Задача: внутри синего квадрата 400 на 400 пикселей слева направо двигается желтый квадрат 20 на 20 пикселей. Программа останавливается, если нажата клавиша Esc или квадрат дошел до границы синей области.
Проблема: как изобразить перемещение объекта на экране?
Привязка: состояние объекта задается координатами (x,y)
Принцип анимации:
рисуем объект в точке (x,y)
задержка на несколько миллисекунд
стираем объект
изменяем координаты (x,y)
переходим к шагу 1
99
Как «поймать» нажатие клавиши?
Событие – это изменение в состоянии какого-либо объекта или действие пользователя (нажатие на клавишу, щелчок мышкой).
IsEvent – логическая функция, которая определяет, было ли какое-то действие пользователя.
Event – процедура, которая определяет, какое именно событие случилось.
if IsEvent then begin
Event(k, x, y);
if k = 1 then
writeln('Клавиша с кодом ', x)
else { k = 2 }
writeln('Мышь: x=', x, ' y=', y);
end;
var k, x, y: integer;
100
Как выйти из цикла при нажатии Esc?
program qq;
var stop: boolean;
k,code,i: integer;
begin
stop := False;
repeat
if IsEvent then begin
Event(k, code, i);
if (k = 1) and (code = 27) then
stop := True;
end;
...
until stop;
end.
если что-то произошло...
что произошло?
если нажата клавиша с кодом 27 (Esc), то стоп
True, если надо остановиться
запуск цикла
101
Процедура (рисование и стирание)
procedure Draw(x, y: integer; flag: boolean);
begin
if flag then
Brush(1, 255, 255, 0)
else
Brush(1, 0, 0, 255);
Rectangle(x, y, x+20, y+20);
end;
(x, y)
(x+20, y+20)
Идеи
рисовать (True) или нет (False)?
рисуем: цвет кисти – желтый
стираем: цвет кисти – синий
только заливка!
102
Полная программа
program qq;
var x, y, k, code, i: integer;
stop: boolean;
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
begin
Brush(1, 0, 0, 255);
Rectangle(10, 10, 400, 400);
Pen(0, 0, 0, 255);
x := 10; y := 200; stop := false;
repeat
if IsEvent then begin
...
end;
Draw(x, y, True);
Delay(10);
Draw(x, y, False);
x := x + 1;
if x >= 400-20 then stop := true;
until stop;
end.
процедура
начальные условия
выход по клавише Esc
выход при касании границы
синий фон
ждем 10 мс
отключить границу
103
Управление клавишами
Задача: жёлтый квадрат внутри синего квадрата управляется клавишами-стрелками. Коды клавиш:
влево – 37 вверх – 38 Esc – 27
вправо – 39 вниз – 40
Проблема: как изменять направление движения?
Решение:
if {было событие} then begin
if {нажата клавиша} then begin
{получить код клавиши - code}
if code = 37 then x := x – 1;
if code = 38 then y := y – 1;
if code = 39 then x := x + 1;
if code = 40 then y := y + 1;
if code = 27 then stop := True;
end;
end;
IsEvent
Event ( k, code, i);
if k = 1 then begin
case code of
37: x := x – 1; 38: y := y – 1;
39: x := x + 1; 40: y := y + 1;
27: stop := True;
end;
если было нажатие на клавишу, …
104
Программа
program qq;
var x, y, k, code, i: integer;
stop: boolean;
begin
...
repeat
Draw(x, y, True);
Delay(20);
Draw(x, y, False);
until stop;
end.
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
if IsEvent then begin
...
end;
процедура
основной цикл
обработка событий
105
Как убрать мигание?
Проблема: даже если не нажата никакая клавиша, квадрат перерисовывается через каждые 20 мс (мигание!)
Что хочется: не перерисовать квадрат, если не было никакого события
Решение: нарисовать квадрат и ждать события
Новая проблема: как ждать события?
Решение новой проблемы: пустой цикл "пока не случилось событие, ничего не делай":
while not IsEvent do;
106
Программа
program qq;
var x, y, k, code, i: integer;
stop: boolean;
begin
...
repeat
Draw(x, y, True);
while not IsEvent do;
until stop;
end.
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
Draw(x, y, False);
Event(k, code, i);
...
while not IsEvent do;
процедура
рисуем квадрат
ждем события
только теперь стираем
108
Функции
Функция – это вспомогательный алгоритм (подпрограмма), результатом работы которого является некоторое значение.
Примеры:
Вычисление модуля и других функций
расчет значений по сложным формулам
ответ на вопрос (простое число или нет?)
Зачем?
для выполнения одинаковых расчетов в различных местах программы
для создания общедоступных библиотек функций
109
Функции
Задача: составить функцию, которая вычисляет наибольшее из двух значений, и привести пример ее использования
Функция:
формальные параметры
это результат функции
результат - целое число
локальная переменная
function Max (a, b: integer): integer;
var x: integer;
begin
if a > b then x := a
else x := b;
Max := x;
end;
110
Функции
Особенности:
111
Функции
Особенности:
112
Программа
program qq;
var a, b, max: integer;
begin
writeln('Введите два числа');
read(a, b);
max := Max ( a, b );
writeln('Наибольшее число ', max );
end.
function Max (a, b: integer): integer;
begin
...
end;
c
c
c
фактические параметры
вызов функции
113
Задания
«3»: Составить функцию, которая определяет наименьшее из трех чисел и привести пример ее использования.
Пример:
Введите два числа:
28 15
Наименьшее число – 15.
«4»: Составить функцию, которая определяет наибольшее из трех чисел и привести пример ее использования.
Пример:
Введите три числа:
28 15 10
Наибольшее число – 28.
114
Задания
«5»: Составить функцию, которая определяет сумму всех чисел от 1 до N и привести пример ее использования.
Пример:
Введите число:
100
сумма = 5050
115
Логические функции
Задача: составить функцию, которая определяет, верно ли, что заданное число – четное.
Особенности:
ответ – логическое значение (True или False)
результат функции можно использовать как логическую величину в условиях (if, while)
if N mod 2 = 0 then
{ число N четное}
else { число N составное }
116
Логические функции
program qq;
var N: integer;
begin
writeln('Введите целое число');
read(N);
if Chet(N) then
writeln(N, ' – четное число')
else writeln(N, ' – нечетное число');
end.
function Chet(N: integer): boolean;
begin
if N mod 2 = 0 then
Chet := True
else Chet := False;
end;
вызов функции
результат – логическое значение
или
Chet:=(N mod 2)= 0;
118
Случайные процессы
Случайно…
Случайный выбор:
Как получить случайность?
119
Случайные числа на компьютере
Электронный генератор
нужно специальное устройство
нельзя воспроизвести результаты
318458191041
564321
209938992481
458191
938992
малый период (последовательность повторяется через 106 чисел)
Метод середины квадрата (Дж. фон Нейман)
в квадрате
Псевдослучайные числа – обладают свойствами случайных чисел, но каждое следующее число вычисляется по заданной формуле.
120
Распределение случайных чисел
Модель: снежинки падают на отрезок [a,b]
распределение
равномерное
неравномерное
121
Распределение случайных чисел
Особенности:
распределение – это характеристика всей последовательности, а не одного числа
равномерное распределение одно, компьютерные датчики случайных чисел дают равномерное распределение
неравномерных – много
любое неравномерное можно получить с помощью равномерного
a
b
a
b
равномерное распределение
неравномерное распределение
122
Генератор случайных чисел в Паскале
Целые числа в интервале [0,N):
var x: integer;
...
x := random ( 100 ); { интервал [0,99] }
Вещественные числа в интервале [0,1)
var x: real;
...
x := random; { интервал [0,1) }
123
Случайные числа
Задача: заполнить прямоугольник 400 на 300 пикселей равномерно точками случайного цвета
Как получить случайные координаты точки?
x := random ( 400 );
y := random ( 300 );
Как добиться равномерности?
обеспечивается автоматически при использовании функции random
Как получить случайный цвет?
Pen (1, random(256), random(256), random(256));
Point ( x, y );
124
Программа
program qq;
var x, y, k, code, i: integer;
stop: boolean;
begin
stop := False;
repeat
x := random(400);
y := random(300);
Pen(1, random(256), random(256), random(256));
Point(x, y );
if IsEvent then begin
Event(k, code, i);
if (k = 1) and (code = 27) then stop := True;
end;
until stop;
end.
случайные координаты
случайный цвет
выход по клавише Esc
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.