Слайд 2
Программирование
на языке Паскаль
Тема 1. Введение
© К.Ю. Поляков,
2006-2009
Слайд 3
Алгоритм
Свойства алгоритма
дискретность: состоит из отдельных шагов (команд)
понятность: должен
включать только команды, известные исполнителю (входящие в СКИ)
определенность: при
одинаковых исходных данных всегда выдает один и тот же результат
конечность: заканчивается за конечное число шагов
массовость: может применяться многократно при различных исходных данных
корректность: дает верное решение при любых допустимых исходных данных
Алгоритм – это четко определенный план действий для исполнителя.
Слайд 4
Программа
Программа – это
алгоритм, записанный на каком-либо языке
программирования
набор команд для компьютера
Команда – это описание действий, которые
должен выполнить компьютер.
откуда взять исходные данные?
что нужно с ними сделать?
1970 – язык Паскаль (Н. Вирт)
Оператор – это команда языка программирования высокого уровня.
Слайд 5
Простейшая программа
program qq;
begin { начало программы }
end. {
конец программы }
комментарии в фигурных скобках не обрабатываются
название программы
Слайд 6
Вывод текста на экран
program qq;
begin
write('2+'); {
без перехода }
writeln('2=?'); { на новую строку}
writeln('Ответ:
4');
end.
Протокол:
2+2=?
Ответ: 4
Слайд 7
Задания
«4»: Вывести на экран текст "лесенкой"
Вася
пошел
гулять
«5»: Вывести на экран рисунок из букв
Ж
ЖЖЖ
ЖЖЖЖЖ
ЖЖЖЖЖЖЖ
HH HH
ZZZZZ
Слайд 8
Переменные
Задача. Ввести с клавиатуры два числа и найти
их сумму.
Протокол:
Введите два целых числа
25 30
25+30=55
компьютер
пользователь
компьютер
считает сам!
Слайд 9
Программа
program qq;
begin
{ ввести два числа }
{
вычислить их сумму }
{ вывести сумму на экран
}
end.
Псевдокод: алгоритм на русском языке с элементами Паскаля.
Слайд 10
Переменные
Переменная – это величина, имеющая имя, тип и
значение. Значение переменной можно изменять во время работы программы.
a
Значение
Имя
Другой
тип данных
Слайд 11
Имена переменных
В именах МОЖНО использовать
латинские буквы (A-Z)
цифры
знак подчеркивания
_
заглавные и строчные буквы не различаются
В именах НЕЛЬЗЯ использовать
русские
буквы
пробелы
скобки, знаки +, =, !, ? и др.
имя не может начинаться с цифры
Какие имена правильные??
AXby R&B 4Wheel Вася “PesBarbos” TU154 [QuQu] _ABBA A+B
Слайд 12
Переменные
Типы переменных:
integer { целая }
real { вещественная }
и другие…
Объявление переменных:
var
a, b, c: integer;
Выделение места в памяти
variable – переменная
тип – целые
список имен переменных
Слайд 13
Как записать значение в переменную?
a := 5;
Оператор присваивания
5
Оператор
– это команда языка программирова-ния (инструкция).
Оператор присваивания – это
команда для записи нового значения в переменную.
Слайд 14
Блок-схема линейного алгоритма
начало
конец
c := a + b;
ввод a,
b
вывод c
блок «начало»
блок «ввод»
блок «процесс»
блок «вывод»
блок «конец»
Слайд 15
Как ввести значение с клавиатуры
read ( a );
Оператор
ввода
5
Слайд 16
Ввод значений двух переменных
через пробел:
25 30
через Enter:
25
30
read
( a, b );
Ввод значений двух переменных (через пробел
или Enter).
Слайд 17
Оператор вывода
{ вывод значения переменной a}
{ вывод значения
переменной a и переход на новую строчку}
{ вывод текста
}
{вывод текста и значения переменной c}
write( a );
writeln( a );
writeln( 'Привет!' );
writeln( 'Ответ: ', c );
writeln ( a, '+', b, '=', c );
Слайд 18
Сложение двух чисел
Задача. Ввести два целых числа и
вывести на экран их сумму.
Простейшее решение:
program qq;
var a, b,
c: integer;
begin
read ( a, b );
c := a + b;
writeln ( c );
end.
Слайд 19
Полное решение
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
компьютер
пользователь
Слайд 20
Как изменить значение переменной?
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
Слайд 21
Арифметические операции
+ сложение – вычитание
* умножение / деление
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.
Слайд 22
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.
Какие операторы неправильные?
имя переменной должно быть слева от знака :=
целая и дробная часть отделяются точкой
нельзя записывать вещественное значение в целую переменную
Слайд 23
Порядок выполнения операций
вычисление выражений в скобках
умножение, деление, 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
Слайд 24
Ручная прокрутка программы
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.
Слайд 25
Вывод целых чисел
program qq;
var a, b: integer;
begin
a
:= 15;
b := 45;
writeln ( a,
b );
writeln ( a:4, b:4 );
end.
15 45
1545
Слайд 26
Вывод вещественных чисел
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
Задания
«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
Слайд 28
Программирование
на языке Паскаль
Тема 2. Ветвления
© К.Ю. Поляков,
2006-2009
Слайд 29
Разветвляющиеся алгоритмы
Задача. Ввести два целых числа и вывести
на экран наибольшее из них.
Идея решения: надо вывести на
экран первое число, если оно больше второго, или второе, если оно больше первого.
Особенность: действия исполнителя зависят от некоторых условий (если … иначе …).
Алгоритмы, в которых последовательность шагов зависит от выполнения некоторых условий, называются разветвляющимися.
Слайд 30
Вариант 1. Блок-схема
полная форма ветвления
блок «решение»
Слайд 31
Вариант 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.
Слайд 32
Условный оператор
if then begin
{что делать,
если условие верно}
end
else begin
{что делать, если условие неверно}
end;
Особенности:
перед else НЕ ставится точка с запятой
вторая часть (else …) может отсутствовать (неполная форма)
если в блоке один оператор, можно убрать слова begin и end
Слайд 33
Что неправильно?
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
Слайд 34
Вариант 2. Блок-схема
неполная форма ветвления
Слайд 35
Вариант 2. Программа
program qq;
var a, b, max: integer;
begin
writeln('Введите два целых числа');
read ( a,
b );
max := a;
if b > a then
max := b;
writeln ('Наибольшее число ', max);
end.
неполная форма условного оператора
Слайд 36
Вариант 2Б. Программа
program qq;
var a, b, max: integer;
begin
writeln('Введите два целых числа');
read ( a,
b );
max := b;
if ??? then
???
writeln ('Наибольшее число ', max);
end.
max := a;
a > b
Слайд 37
Что неправильно?
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;
Слайд 38
Задания
«4»: Ввести три числа и найти наибольшее из
них.
Пример:
Введите три числа:
4 15 9
Наибольшее
число 15
«5»: Ввести пять чисел и найти наибольшее из них.
Пример:
Введите пять чисел:
4 15 9 56 4
Наибольшее число 56
Слайд 39
Программирование
на языке Паскаль
Тема 3. Сложные условия
© К.Ю.
Поляков, 2006-2009
Слайд 40
Сложные условия
Задача. Фирма набирает сотрудников от 25 до
40 лет включительно. Ввести возраст человека и определить, подходит
ли он фирме (вывести ответ «подходит» или «не подходит»).
Особенность: надо проверить, выполняются ли два условия одновременно.
Слайд 41
Вариант 1. Алгоритм
начало
ввод x
'подходит'
конец
да
нет
x >= 25?
да
нет
x
подходит'
'не подходит'
Слайд 42
Вариант 1. Программа
program qq;
var x: integer;
begin
writeln('Введите
возраст');
read ( x );
if x
>= 25 then
if x <= 40 then
writeln ('Подходит')
else writeln ('Не подходит')
else
writeln ('Не подходит');
end.
Слайд 43
Вариант 2. Алгоритм
начало
ввод x
'подходит'
да
нет
x >= 25
и
x
40?
'не подходит'
Слайд 44
Вариант 2. Программа
сложное условие
program qq;
var x: integer;
begin
writeln('Введите возраст');
read ( x );
if
(x >= 25) and (x <= 40) then
writeln ('Подходит')
else writeln ('Не подходит')
end.
Слайд 45
Сложные условия
Простые условия (отношения)
<
> >= =
Сложное условие
– это условие, состоящее из нескольких простых условий (отношений), связанных с помощью логических операций:
not – НЕ (отрицание, инверсия)
and – И (логическое умножение, конъюнкция,
одновременное выполнение условий)
or – ИЛИ (логическое сложение, дизъюнкция,
выполнение хотя бы одного из условий)
xor – исключающее ИЛИ (выполнение только
одного из двух условий, но не обоих)
равно
не равно
Слайд 46
Сложные условия
Порядок выполнения (приоритет = старшинство)
выражения в скобках
not
and
or,
xor
=, =,
Особенность – каждое из
простых условий обязательно заключать в скобки.
Пример
4 1 6 2 5 3
if not (a > b) or (c <> d) and (b <> a)
then begin
...
end
Слайд 47
Истинно или ложно при 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) xor not (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
Слайд 48
Задания
«4»: Ввести номер месяца и вывести название времени
года.
Пример:
Введите номер месяца:
4
весна
«5»: Ввести возраст человека (от
1 до 150 лет) и вывести его вместе с последующим словом «год», «года» или «лет».
Пример:
Введите возраст: Введите возраст:
24 57
Вам 24 года Вам 57 лет
Слайд 49
Программирование
на языке Паскаль
Тема 4. Циклы
© К.Ю. Поляков,
2006-2009
Слайд 50
Циклы
Цикл – это многократное выполнение одинаковой последовательности действий.
цикл
с известным числом шагов
цикл с неизвестным числом шагов (цикл
с условием)
Задача. Вывести на экран 5 раз слово «Привет».
Особенность: одинаковые действия выполняются 5 раз.
Слайд 51
Циклы
program qq;
begin
writeln('Привет');
writeln('Привет');
writeln('Привет');
writeln('Привет');
writeln('Привет');
end.
Слайд 52
Циклы
program qq;
begin
{ сделай 5 раз }
writeln('Привет');
end.
i := i + 1;
Слайд 53
Алгоритм
начало
Привет!
конец
да
нет
i = 5?
i := 0;
i := i +
1;
еще не сделали ни одного раза
проверить, все ли сделали
вывод
на экран
считаем очередной шаг
Слайд 54
Циклы
program qq;
var i: integer;
begin
for i:=1 to 5
do
writeln('Привет');
end.
«Для всех i от 1 до
5
делай …»
for i:=1 to 5 do
Если в цикле более одного оператора:
for i:=1 to 5 do begin
write('Привет');
writeln(', Вася!');
end;
begin
end;
Слайд 55
Циклы
Задача. Вывести на экран квадраты и кубы целых
чисел от 1 до 8 (от a до b).
Особенность:
одинаковые действия выполняются 8 раз.
i := 1; { очередное число }
i2 := i*i; { его квадрат }
i3 := i2*i; { куб }
writeln(i:4, i2:4, i3:4);
i := 2;
...
Слайд 56
Алгоритм
начало
i, i2, i3
конец
нет
да
i
i + 1;
i2 := i * i;
i3 := i2
* i;
задать начальное значение переменной цикла
проверить, все ли сделали
вычисляем квадрат и куб
вывод результата
перейти к следующему i
Слайд 57
Алгоритм (с блоком «цикл»)
начало
i, i2, i3
конец
i2 := i
* i;
i3 := i2 * i;
i := 1,8
блок «цикл»
тело
цикла
Слайд 58
Программа
program qq;
var i, i2, i3: integer;
begin
for
i:=1 to 8 do begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
end.
переменная
цикла
начальное значение
конечное значение
Слайд 59
Цикл с уменьшением переменной
Задача. Вывести на экран квадраты
и кубы целых чисел от 8 до 1 (в
обратном порядке).
Особенность: переменная цикла должна уменьшаться.
Решение:
for i:=8 1 do begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
downto
Слайд 60
Цикл с переменной
for := to
do begin
{тело цикла}
end;
Увеличение переменной на 1:
for <переменная> := <начальное значение>
downto
<конечное значение> do begin
{тело цикла}
end;
Уменьшение переменной на 1:
Слайд 61
Цикл с переменной
Особенности:
переменная цикла может быть только целой
(integer)
шаг изменения переменной цикла всегда равен 1 (to) или
-1 (downto)
если в теле цикла только один оператор, слова begin и end можно не писать:
если конечное значение меньше начального, цикл (to) не выполняется ни разу (проверка условия в начале цикла, цикл с предусловием)
for i:=1 to 8 do
writeln('Привет');
Слайд 62
Цикл с переменной
Особенности:
в теле цикла не разрешается изменять
переменную цикла (почему?)
при изменении начального и конечного значения внутри
цикла количество шагов не изменится:
n := 8;
for i:=1 to n do begin
writeln('Привет');
n := n + 1;
end;
нет зацикливания
Слайд 63
Цикл с переменной
Особенности:
после выполнения цикла во многих системах
устанавливается первое значение переменной цикла, при котором нарушено условие:
for
i:=1 to 8 do
writeln('Привет');
writeln('i=', i);
for i:=8 downto 1 do
writeln('Привет');
writeln('i=', i);
i=9
i=0
НЕ ДОКУМЕНТИРОВАНО
Слайд 64
Сколько раз выполняется цикл?
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
Слайд 65
for i:=1 to 9 do begin
if
??? then begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
end;
Как изменить шаг?
Задача. Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9.
Особенность: переменная цикла должна увеличиваться на 2.
Проблема: в Паскале шаг может быть 1 или -1.
Решение:
i mod 2 = 1
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
выполняется только для нечетных i
Слайд 66
Как изменить шаг? – II
Идея: Надо вывести всего
5 чисел, переменная k изменяется от 1 до 5.
Начальное значение i равно 1, с каждым шагом цикла i увеличивается на 2.
Решение:
???
for k:=1 to 5 do begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
???
end;
i := i + 2;
i := 1;
Слайд 67
Как изменить шаг? – III
Идея: Надо вывести всего
5 чисел, переменная k изменяется от 1 до 5.
Зная k, надо рассчитать i.
Решение:
i = 2k-1
for k:=1 to 5 do begin
???
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
i := 2*k – 1;
Слайд 68
Задания
«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
Слайд 69
Программирование
на языке Паскаль
Тема 5. Циклы с условием
©
К.Ю. Поляков, 2006-2009
Слайд 70
Цикл с неизвестным числом шагов
Пример: Отпилить полено от
бревна. Сколько раз надо сделать движения пилой?
Задача: Ввести целое
число (<2000000) и определить число цифр в нем.
Идея решения: Отсекаем последовательно последнюю цифру, увеличиваем счетчик.
Проблема: Неизвестно, сколько шагов надо сделать.
Решение: Надо остановиться, когда n = 0, т.е. надо делать «пока n <> 0».
Слайд 71
Алгоритм
начало
count
конец
нет
да
n 0?
count := 0;
count := count +
1;
n := n div 10;
обнулить счетчик цифр
ввод
n
выполнять «пока n <> 0»
Слайд 72
Программа
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»
Слайд 73
Цикл с условием
while do begin
{тело
цикла}
end;
Особенности:
можно использовать сложные условия:
если в
теле цикла только один оператор, слова begin и end можно не писать:
while (a < b) and (b < c) do begin
{тело цикла}
end;
while a < b do
a := a + 1;
Слайд 74
Цикл с условием
Особенности:
условие пересчитывается каждый раз при входе
в цикл
если условие на входе в цикл ложно, цикл
не выполняется ни разу
если условие никогда не станет ложным, программа зацикливается
a := 4; b := 6;
while a > b do
a := a – b;
a := 4; b := 6;
while a < b do
d := a + b;
Слайд 75
Сколько раз выполняется цикл?
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;
зацикливание
Слайд 76
Замена 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 возможна всегда.
Слайд 77
Задания
«4»: Ввести целое число и найти сумму его
цифр.
Пример:
Введите целое число:
1234
Сумма цифр числа 1234 равна
10.
«5»: Ввести целое число и определить, верно ли, что в его записи есть две одинаковые цифры.
Пример:
Введите целое число: Введите целое число:
1234 1224
Нет. Да.
Слайд 78
Последовательности
Примеры:
1, 2, 3, 4, 5, …
1, 2, 4,
7, 11, 16, …
1, 2, 4, 8, 16, 32,
…
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 = 2cn
Слайд 79
Последовательности
Задача: найти сумму всех элементов последовательности,
которые
по модулю больше 0,001:
Элемент последовательности (начиная с №2):
b
:= b+1;
c := 2*c;
z := -z;
Слайд 80
Алгоритм
начало
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;
новый элемент
изменение
Слайд 81
Программа
program qq;
var b, c, z: integer;
S,
a: real;
begin
S := 0; z := -1;
b := 1; c := 2; a := 1;
while abs(a) > 0.001 do begin
S := S + a;
a := z * b / c;
z := - z;
b := b + 1;
c := c * 2;
end;
writeln('S =', S:10:3);
end.
z := - z;
b := b + 1;
c := c * 2;
переход к следующему слагаемому
S := 0; z := -1;
b := 1; c := 2; a := 1;
начальные значения
увеличение суммы
расчет элемента последовательности
Слайд 82
Задания
«4»: Найти сумму элементов последовательности с точностью 0,001:
Ответ:
S = 1.157
«5»: Найти сумму элементов последовательности с
точностью 0,001:
Ответ:
S = 1.220
Слайд 83
Цикл с постусловием
Задача: Ввести целое положительное число (
и определить число цифр в нем.
Проблема: Как не
дать ввести отрицательное число или ноль?
Решение: Если вводится неверное число, вернуться назад к вводу данных (цикл!).
Особенность: Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием).
Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла.
Слайд 84
Цикл с постусловием: алгоритм
начало
конец
да
нет
n > 0?
тело цикла
условие
ВЫХОДА
блок «типовой процесс»
ввод n
основной
алгоритм
Слайд 85
Программа
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 ("до тех пор, пока не…") ставится условие ВЫХОДА из цикла
Слайд 86
Сколько раз выполняется цикл?
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;
зацикливание
Слайд 87
Задания (с защитой от неверного ввода)
«4»: Ввести натуральное
число и определить, верно ли, что сумма его цифр
равна 10.
Пример:
Введите число >= 0: Введите число >= 0:
-234 1233
Нужно положительное число. Нет
Введите число >= 0:
1234
Да
«5»: Ввести натуральное число и определить, какие цифры встречаются несколько раз.
Пример:
Введите число >= 0: Введите число >= 0:
2323 1234
Повторяются: 2, 3 Нет повторов.
Слайд 88
Программирование
на языке Паскаль
Тема 6. Оператор выбора
© К.Ю.
Поляков, 2006-2009
Слайд 89
Оператор выбора
Задача: Ввести номер месяца и вывести количество
дней
в этом месяце.
Решение: Число дней по месяцам:
28 дней – 2 (февраль)
30 дней – 4 (апрель), 6 (июнь), 9 (сентябрь), 11 (ноябрь)
31 день – 1 (январь), 3 (март), 5 (май), 7 (июль),
8 (август), 10 (октябрь), 12 (декабрь)
Особенность: Выбор не из двух, а из нескольких
вариантов в зависимости от номера месяца.
Слайд 90
Алгоритм
начало
конец
выбор
ни один вариант не подошел
ввод M
да
нет
M = 1?
D
:= 31;
нет
M = 2?
D := 28;
да
нет
M = 12?
D :=
31;
да
вывод D
ошибка
Слайд 91
Программа
program qq;
var M, D: integer;
begin
writeln('Введите номер
месяца:');
read ( M );
case M
of
2: begin D := 28; end;
4,6,9,11: begin D := 30; end;
1,3,5,7,8,10,12: D := 31;
else D := -1;
end;
if D > 0 then
writeln('В этом месяце ', D, ' дней.')
else
writeln('Неверный номер месяца');
end.
case M of
2: begin D := 28; end;
4,6,9,11: begin D := 30; end;
1,3,5,7,8,10,12: D := 31;
else D := -1;
end;
ни один вариант не подошел
Слайд 92
Оператор выбора
Особенности:
после case может быть имя переменной или
арифметическое выражение целого типа (integer)
или символьного типа
(char)
case i+3 of
1: begin a := b; end;
2: begin a := c; end;
end;
var c: char;
...
case c of
'а': writeln('Антилопа');
'б': writeln('Барсук');
else writeln('Не знаю');
end;
Слайд 93
Оператор выбора
Особенности:
если нужно выполнить только один оператор, слова
begin и end можно не писать
нельзя ставить два одинаковых
значения
case i+3 of
1: a := b;
1: a := c;
end;
case i+3 of
1: a := b;
2: a := c;
end;
Слайд 94
Оператор выбора
Особенности:
значения, при которых выполняются одинаковые действия, можно
группировать
case i of
1:
a := b;
2,4,6: a := c;
10..15: a := d;
20,21,25..30: a := e;
else writeln('Ошибка');
end;
перечисление
диапазон
смесь
Слайд 95
Что неправильно?
case a of
2: begin a
:= b;
4: a := c;
end;
case a of
2: a := b
4: a := c
end;
;
case a of
2..5: a := b;
4: a := c;
end;
case a of
0..2: a := b;
6..3: a := c;
end;
3..6:
case a+c/2 of
2: a := b;
4: a := c;
end;
case a of
2: a := b; d := 0;
4: a := c;
end;
begin
end;
Слайд 96
Задания (с защитой от неверного ввода)
«4»: Ввести номер
месяца и вывести количество дней в нем, а также
число ошибок при вводе.
Пример:
Введите номер месяца: Введите номер месяца:
-2 2
Введите номер месяца: В этом месяце 28 дней.
11 Вы вводили неверно 0 раз.
В этом месяце 30 дней.
Вы вводили неверно 1 раз.
«5»: Ввести номер месяца и номер дня, вывести число дней, оставшихся до Нового года.
Пример:
Введите номер месяца:
12
Введите день:
25
До Нового года осталось 6 дней.
Слайд 97
Программирование
на языке Паскаль
Тема 7. Графика
© К.Ю. Поляков,
2006-2009
Слайд 98
Система координат
(0,0)
(x,y)
X
Y
x
y
Слайд 99
Управление цветом
Цвет и толщина линий, цвет точек:
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
Слайд 100
Точки, отрезки и ломаные
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);
Слайд 101
Фигуры с заливкой
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);
Слайд 102
Текст
TextColor (0, 0, 255);
Brush (1, 255, 255, 0);
Font
(20, 30, 600);
MoveTo (x, y);
writeln ('Привет!');
Привет!
(x, y)
размер
10 пикселей
угол
поворота
насыщенность:
400
– нормальный
600 – жирный
30о
Слайд 103
Пример
(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.
Слайд 104
Задания
«4»: «Лягушка»
«5»: «Корона»
Слайд 105
Штриховка
(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
Слайд 106
Штриховка (программа)
(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
Слайд 107
Как менять цвет?
(x1, y1)
(x2, y2)
Brush ( 1, c,
c, c );
Fill ( ???, ??? );
серый: R =
G = B
Шаг изменения c:
x
(x-1, y1+1)
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)-1, y1+1);
x := x + h; c := c + hc;
end;
var c, hc: integer;
Слайд 108
Штриховка
(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
Слайд 109
Штриховка
(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;
Слайд 110
Задания
«4»: Ввести с клавиатуры число линий и построить
фигуру:
«5»: Ввести с клавиатуры число линий и построить
фигуру:
Слайд 111
Задания
«4»: Ввести с клавиатуры число линий штриховки и
построить фигуру, залив все области разным цветом.
«5»:
Ввести с клавиатуры число окружностей и построить фигуру, залив все области разным цветом.
Слайд 112
Программирование
на языке Паскаль
Тема 8. Графики функций
© К.Ю.
Поляков, 2006-2009
Слайд 113
Построение графиков функций
Задача: построить график функции y =
3 sin(x) на интервале от 0 до 2π.
Анализ:
максимальное
значение ymax = 3 при x = π/2
минимальное значение ymin = -3 при x = 3π/2
Проблема: функция задана в математической системе координат, строить надо на экране, указывая координаты в пикселях.
Слайд 114
Преобразование координат
(x,y)
X
Y
x
y
Математическая
система координат
Экранная система координат (пиксели)
(xэ,yэ)
xэ
yэ
(0,0)
(0,0)
a
b
k –
масштаб (длина изображения единичного отрезка на экране)
xэ = a
+ kx
yэ = b - ky
Слайд 115
Программа
2π
h – шаг изменения x
w – длина оси
ОХ
в пикселях
на экране
оси координат
цикл построения графика
program qq;
const a
= 50; b = 200; k = 50;
xmin = 0; xmax = 6.2832;
var x, y, h: real;
xe, ye, w: integer;
begin
w := round((xmax - xmin)*k);
Line(a-10, b, a+w, b);
Line(a, 0, a, 2*b);
x := xmin; h := 0.05;
while x <= xmax do begin
y := 3*sin(x);
xe := a + round(k*x);
ye := b - round(k*y);
Point (xe, ye);
x := x + h;
end;
end.
Слайд 116
Как соединить точки?
Алгоритм:
Если первая точка
перейти в точку
(xэ,yэ)
иначе
отрезок в точку (xэ,yэ)
Программа:
начальное значение
выбор варианта действий
логическая
переменная
var first: boolean;
...
begin
...
first := True;
while x <= xmax do begin
...
if first then begin
MoveTo(xe, ye);
first := False;
end
else LineTo(xe, ye);
...
end;
end.
Слайд 117
Задания
«4»: Построить график функции y = x2 на
интервале [-3,3].
«5»: Построить график
функции (эллипс)
Слайд 118
Программирование
на языке Паскаль
Тема 9. Процедуры
© К.Ю. Поляков,
2006-2009
Слайд 119
Процедуры
Задача: Построить фигуру:
Особенность: Три похожие фигуры.
общее: размеры,
угол поворота
отличия: координаты, цвет
Слайд 120
Процедуры
Процедура – это вспомогательный алгоритм, который предназначен для
выполнения некоторых действий.
Применение:
выполнение одинаковых действий в разных местах программы
разбивка
программы (или другой процедуры) на подзадачи для лучшего восприятия
Слайд 121
Процедуры
Порядок разработки:
выделить одинаковые или похожие действия (три фигуры)
найти
в них общее (размеры, форма, угол поворота) и отличия
(координаты, цвет)
отличия записать в виде неизвестных переменных, они будут параметрами процедуры
(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);
тело процедуры
координаты
цвет
параметры
Слайд 122
Программа
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;
формальные параметры
процедура
Слайд 123
Процедуры
Особенности:
все процедуры расположены выше основной программы
в заголовке процедуры
перечисляются формальные параметры, они обозначаются именами, поскольку могут меняться
при
вызове процедуры в скобках указывают фактические параметры (числа или арифметические выражения) в том же порядке
procedure Tr( x, y, r, g, b: integer);
Tr (200, 100, 0, 255, 0);
x
y
r
g
b
Слайд 124
Процедуры
Особенности:
для каждого формального параметра после двоеточия указывают его
тип
если однотипные параметры стоят рядом, их перечисляют через запятую
внутри
процедуры параметры используются так же, как и переменные
procedure A (x: real; y: integer; z: real);
procedure A (x, z: real; y, k, l: integer);
Слайд 125
Процедуры
Особенности:
в процедуре можно объявлять дополнительные локальные переменные, остальные
процедуры не имеют к ним доступа
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;
Слайд 126
Параметры-переменные
Задача: составить процедуру, которая меняет местами значения двух
переменных.
Особенности:
надо, чтобы изменения, сделанные в процедуре, стали известны вызывающей
программе
program qq;
var x, y: integer;
begin
x := 1; y := 2;
Exchange ( x, y );
writeln ( ’x = ’, x, ’ y = ’, y );
end.
procedure Exchange ( a, b: integer );
var c: integer;
begin
c := a; a := b; b := c;
end;
эта процедура работает с копиями параметров
x = 1 y = 2
Слайд 127
Параметры-переменные
Применение:
таким образом процедура (и функция) может возвращать
несколько значений,
Запрещенные варианты вызова
Exchange ( 2, 3 );
{ числа }
Exchange ( x+z, y+2 ); { выражения }
procedure Exchange ( a, b: integer );
var c: integer;
begin
c := a; a := b; b := c;
end;
var
параметры могут изменяться
Слайд 128
Задания
«4»: Используя процедуры, построить фигуру.
«5»: Используя
процедуры, построить фигуру.
равносторонний треугольник
Слайд 129
Программирование
на языке Паскаль
Тема 10. Рекурсия
© К.Ю. Поляков,
2006-2009
Слайд 130
Рекурсивные объекты
Рекурсивный объект – это объект, определяемый через
один или несколько таких же объектов.
У попа была
собака, он ее любил.
Она съела кусок мяса, он ее убил.
В ямку закопал, надпись написал:
Сказка о попе и собаке
Примеры:
Сказка о попе и собаке:
Факториал:
если
если
Рисунок с рекурсией:
Слайд 131
Дерево Пифагора
Дерево Пифагора из N уровней – это
ствол и отходящие от него симметрично два дерева Пифагора
из N-1 уровней, такие что длина их стволов в 2 раза меньше и угол между ними равен 90o.
6 уровней:
Слайд 132
Дерево Пифагора
Особенности:
когда остановиться?
деревья имеют различный наклон
когда число оставшихся
уровней станет равно нулю!
(x1, y1)
(x0, y0)
α
α+45o
α-45o
L
x1 = x0 +
L·cos(α)
y1 = y0 – L·sin(α)
наклон «дочерних» деревьев
α + π/4
α – π/4
Слайд 133
Процедура
угол α
длина ствола
procedure Pifagor(x0, y0, a, L: real;
N: integer);
const k = 0.6; { изменение длины }
var x1, y1: real; { локальные переменные }
begin
if N > 0 then begin
x1 := x0 + L*cos(a);
y1 := y0 - L*sin(a);
Line (round(x0), round(y0),
round(x1), round(y1));
Pifagor (x1, y1, a+pi/4, L*k, N-1);
Pifagor (x1, y1, a-pi/4, L*k, N-1);
end;
end;
рекурсивные вызовы
закончить, если N=0
Рекурсивной называется процедура, вызывающая сама себя.
Слайд 134
Программа
program qq;
procedure Pifagor(x0, y0, a, L: real;
N: integer);
...
end;
begin
Pifagor (250, 400, pi/2, 150, 8);
end.
угол α
длина ствола
число уровней
x0
y0
Pifagor (250, 400, 2*pi/3, 150, 8);
Слайд 135
«4»: Используя рекурсивную процедуру, построить фигуру:
«5»:
Используя рекурсивную процедуру, построить фигуру:
Задания
Слайд 136
Программирование
на языке Паскаль
Тема 11. Анимация
© К.Ю. Поляков,
2006-2009
Слайд 137
Анимация
Анимация (англ. animation) – оживление изображения на экране.
Задача:
внутри синего квадрата 400 на 400 пикселей слева направо
двигается желтый квадрат 20 на 20 пикселей. Программа останавливается, если нажата клавиша Esc или квадрат дошел до границы синей области.
Проблема: как изобразить перемещение объекта на экране?
Привязка: состояние объекта задается координатами (x,y)
Принцип анимации:
рисуем объект в точке (x,y)
задержка на несколько миллисекунд
стираем объект
изменяем координаты (x,y)
переходим к шагу 1
Слайд 138
Как "поймать" нажатие клавиши?
Событие – это изменение в
Слайд 139
Как выйти из цикла при нажатии 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, если надо остановиться
запуск цикла
Слайд 140
Процедура (рисование и стирание)
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)?
рисуем: цвет кисти – желтый
стираем: цвет кисти – синий
только заливка!
Слайд 141
Полная программа
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 мс
отключить границу
Слайд 142
«4»: Два квадрата двигаются в противоположном направлении:
«5»: Два квадрата двигаются в противоположном направлении и отталкиваются
от стенок синего квадрата:
Задания
Слайд 143
Управление клавишами
Задача: жёлтый квадрат внутри синего квадрата управляется
клавишами-стрелками. Коды клавиш:
влево – 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;
если было нажатие на клавишу, …
Слайд 144
Программа
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;
процедура
основной цикл
обработка событий
Слайд 145
Как убрать мигание?
Проблема: даже если не нажата никакая
клавиша, квадрат перерисовывается через каждые 20 мс (мигание!)
Что хочется:
не перерисовать квадрат, если не было никакого события
Решение: нарисовать квадрат и ждать события
Новая проблема: как ждать события?
Решение новой проблемы: пустой цикл "пока не случилось событие, ничего не делай":
while not IsEvent do;
Слайд 146
Программа
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;
процедура
рисуем квадрат
ждем события
только теперь стираем
Слайд 147
«4»: Квадрат двигается при нажатии стрелок, однако не
может выйти за границы синего квадрата:
«5»: Квадрат
непрерывно двигается, при нажатии стрелок меняет направление и отталкивается от стенок синего квадрата:
Задания
Слайд 148
Вращение
Задача: изобразить модель вращения Земли вокруг Солнца.
Проблема: движение
по окружности, как изменять координаты?
Решение: использовать в качестве независимой
переменной (менять в цикле) угол поворота α
(x0, y0)
α
L
(x, y)
x = x0 + L·cos(α)
y = y0 – L·sin(α)
Слайд 149
Процедура
procedure Draw(x, y: integer; flag: boolean);
const r =
10;
begin
if flag then
Brush(1, 100, 100, 255)
else
Brush(1, 0, 0, 0);
Ellipse(x-r, y-r, x+r, y+r);
end;
рисовать (True) или нет (False)?
рисуем: цвет кисти – голубой
стираем: цвет кисти – черный
только заливка!
радиус Земли
(x-r, y-r)
(x,y)
(x+r, y+r)
Слайд 150
Константы и переменные
program qq;
const rSun = 60;
{ радиус Солнца}
L = 150;
{ радиус орбиты Земли }
x0 = 200; { координаты центра Солнца}
y0 = 200;
var x, y, { координаты Земли }
k, code, i: integer; { для Event }
a, ha: real; { угол поворота, шаг }
stop: boolean; { признак остановки программы }
begin
...
end.
procedure Draw(x, y: integer; flag: Boolean);
begin
...
end;
Слайд 151
Основная программа
program qq;
...
begin
Brush(1, 0, 0, 0); Fill(1,1);
Brush(1, 255, 255, 0);
Ellipse(x0-rSun, y0-rSun, x0+rSun, y0+rSun);
a
:= 0; ha := 1*pi/180; { начальный угол, шаг 1o за 100 мс}
stop := false;
Pen(0,0,0,0); { отключаем контуры }
repeat
x := round(x0 + L*cos(a));
y := round(y0 - L*sin(a));
Draw(x, y, True);
Delay(100);
Draw(x, y, False);
a := a + ha;
until stop;
end.
залить фон черным
рисуем Солнце
новые координаты
поворот на ha
ждем 100 мс
if IsEvent then begin
Event(k, code, i);
if (k = 1) and (code = 27) then stop := true;
end;
Слайд 152
«4»: Изобразить модель Солнца с двумя планетами, которые
вращаются в противоположные стороны:
«5»: Изобразить модель системы
Солнце-Земля-Луна:
Задания
Слайд 153
Программирование
на языке Паскаль
Тема 12. Функции
© К.Ю. Поляков,
2006-2009
Слайд 154
Функции
Функция – это вспомогательный алгоритм (подпрограмма), результатом работы
которого является некоторое значение.
Примеры:
вычисление
, ,
расчет значений по сложным формулам
ответ на вопрос (простое число или нет?)
Зачем?
для выполнения одинаковых расчетов в различных местах программы
для создания общедоступных библиотек функций
Слайд 155
Функции
Задача: составить функцию, которая вычисляет наибольшее из двух
значений, и привести пример ее использования
Функция:
формальные параметры
function Max (a,
b: integer): integer;
begin
if a > b then Max := a
else Max := b;
end;
это результат функции
Слайд 156
Функции
Особенности:
заголовок начинается словом function
формальные параметры описываются так же,
как и для процедур
можно использовать параметры-переменные
в конце заголовка через
двоеточие указывается тип результата
функции располагаются ВЫШЕ основной программы
Слайд 157
Функции
Особенности:
можно объявлять и использовать локальные переменные
значение, которое является
результатом, записывается в переменную, имя которой совпадает с названием
функции; объявлять ее НЕ НАДО:
Слайд 158
Программа
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
фактические параметры
вызов функции
Слайд 159
Задания
«4»: Составить функцию, которая определяет сумму всех чисел
от 1 до N и привести пример ее использования.
Пример:
Введите число:
100
сумма = 5050
«5»: Составить функцию, которая определяет, сколько зерен попросил положить на N-ую клетку изобретатель шахмат (на 1-ую – 1 зерно, на 2-ую – 2 зерна, на 3-ю – 4 зерна, …)
Пример:
Введите номер клетки:
28
На 28-ой клетке 134217728 зерен.
Слайд 160
Задания (вариант 2)
«4»: Составить функцию, которая определяет наибольший
общий делитель двух натуральных и привести пример ее использования.
Пример:
Введите два числа:
14 21
НОД(14,21)=7
«5»: Составить функцию, которая вычисляет функцию синус как сумму ряда (с точностью 0.001)
Пример:
Введите угол в градусах:
45
sin(45) = 0.707
x в радианах!
Слайд 161
Логические функции
Задача: составить функцию, которая определяет, верно ли,
что заданное число – простое.
Особенности:
ответ – логическое значение (True
или False)
результат функции можно использовать как логическую величину в условиях (if, while)
Алгоритм: считаем число делителей в интервале от 2 до N-1, если оно не равно нулю – число составное.
count := 0;
for i := 2 to N-1 do
if N mod i = 0 then
count := count + 1;
if count = 0 then
{ число N простое}
else { число N составное }
for i := 2 to N-1 do
if N mod i = 0 then
count := count + 1;
Слайд 162
Логические функции
program qq;
var N: integer;
begin
writeln('Введите целое число');
read(N);
if Prime(N) then
writeln(N,
' – простое число')
else writeln(N, ' – составное число');
end.
function Prime (N: integer): boolean;
var count, i: integer;
begin
i := 2; count := 0;
while i*i <= N do begin
if N mod i = 0 then count := count + 1;
i := i + 1;
end;
Prime := (count = 0);
end;
вызов функции
результат – логическое значение
условие – это логическое значение
Слайд 163
Задания
«4»: Составить функцию, которая определяет, верно ли, что
сумма его цифр – четное число.
Пример:
Введите
число:
136
Сумма цифр четная.
«5»: Составить функцию, которая определяет, верно ли, что в заданном числе все цифры стоят по возрастанию.
Пример:
Введите число:
258
Верно.
Введите число:
528
Неверно.
Введите число:
245
Сумма цифр нечетная.
Слайд 164
Программирование
на языке Паскаль
Тема 13. Случайные числа
© К.Ю.
Поляков, 2006-2009
Слайд 165
Случайные числа
Случайные явления: везде…
бросание монеты («орел» или «решка»)
падение
снега
броуновское движение
помехи при телефонной связи
шум радиоэфира
Случайные числа – это
такая последовательность чисел, для которой невозможно предсказать следующее даже зная все предыдущие.
Проблема: как получить на компьютере?
Возможные решения:
использовать внешний источник шумовых помех
с помощью математических преобразований
Слайд 166
Псевдослучайные числа
Псевдослучайные числа – это такая последовательность чисел,
которая обладает свойствами случайных чисел, но каждое следующее число
вычисляется по заданной формуле.
Примеры:
Случайные целые числа [0,m) (линейный конгруэнтный метод)
Случайные вещественные числа [0,1]
Литература:
Д. Кнут, Искусство программирования для ЭВМ, т.2.
дробная часть числа
a, c, m - целые числа
простое число
230-1
например, k = 5
Слайд 167
Распределение случайных чисел
Модель: снежинки падают на отрезок [a,b]
распределение
равномерное
неравномерное
Слайд 168
Распределение случайных чисел
Особенности:
распределение – это характеристика всей
последовательности, а не одного числа
равномерное распределение одно, компьютерные датчики
(псевдо)случайных чисел дают равномерное распределение
неравномерных – много
любое неравномерное можно получить с помощью равномерного
a
b
a
b
равномерное распределение
неравномерное распределение
Слайд 169
Генератор случайных чисел в Паскале
Целые числа в интервале
[0,N]:
var x: integer;
...
x := random
( 100 ); { интервал [0,99] }
Вещественные числа в интервале [0,1]
var x: real;
...
x := random; { интервал [0,1] }
Слайд 170
Случайные числа
Задача: заполнить прямоугольник
400 на 300 пикселей
равномерно
точками случайного цвета
Как получить случайные координаты точки?
x :=
random ( 400 );
y := random ( 300 );
Как добиться равномерности?
обеспечивается автоматически при использовании
функции random
Как получить случайный цвет?
Pen (1, random(256), random(256), random(256));
Point ( x, y );
Слайд 171
Программа
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
Слайд 172
«4»: Ввести с клавиатуры координаты углов прямоугольника и
заполнить его точками случайного цвета.
«5»: Заполнить треугольник точками
случайного цвета (равномерно или неравномерно).
Подсказка: возьмите равнобедренный треугольник с углом 45о.
Задания
(100,100)
(300,200)