1 Программирование на языке Паскаль 1. Введение Введение 2. Ветвления Ветвления 3. Сложные условия Сложные условия 4. Циклы Циклы 5. Циклы с условием Циклы.

Презентация:



Advertisements
Похожие презентации
1 Программирование на языке Паскаль Циклы. 2 Цикл – это многократное выполнение одинаковой последовательности действий. цикл с известным числом шагов.
Advertisements

1 Программирование на языке Паскаль Ветвления. 2 Разветвляющиеся алгоритмы Задача. Ввести два целых числа и вывести на экран наибольшее из них. Идея решения:
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Тема 1. Введение Кулебякин В.В.
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Процедуры. 2 Подпрограммы Задача: Построить фигуру: Особенность: Три похожие фигуры. общее: размеры, угол поворота.
1 Программирование на языке Паскаль Тема 11. Анимация © К.Ю. Поляков,
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Тема 7. Графика.
1 Программирование на языке Паскаль Функции Кулебякин В.В.
Урок 6 Turbo Pascal Язык профессионального программирования, который назван в честь французского математика и философа Блеза Паскаля (1623–1662) и разработан.
1 Программирование на языке Паскаль Тема 1. Введение © К.Ю. Поляков,
Тема 1. Введение 1.
1 Программирование на языке Паскаль Тема 2. Ветвления.
Урок 3 Turbo Pascal Язык профессионального программирования, который назван в честь французского математика и философа Блеза Паскаля (1623–1662) и разработан.
К. Поляков, Программирование на алгоритмическом языке Тема 1. Введение.
Программирование на языке Паскаль Тема 1. Введение.
1 Прикладное программирование Kafmi21. ru – учеба – заочнику – прикладное программирование.
1 Программирование на языке Паскаль © К.Ю. Поляков, ВведениеВведение 2.ВетвленияВетвления 3.Сложные условияСложные условия 4.ЦиклыЦиклы 5.Циклы.
Транксрипт:

1 Программирование на языке Паскаль 1. Введение Введение 2. Ветвления Ветвления 3. Сложные условия Сложные условия 4. Циклы Циклы 5. Циклы с условием Циклы с условием 6. Оператор выбора Оператор выбора 7. Графика Графика 8. Графики функций Графики функций 9. Процедуры Процедуры 10. Рекурсия Рекурсия 11. Анимация Анимация 12. Функции Функции 13. Случайные числа Случайные числа

2 Программирование на языке Паскаль Тема 1. Введение

3 Алгоритм Свойства алгоритма дискретность: состоит из отдельных шагов (команд) понятность: должен включать только команды, известные исполнителю (входящие в СКИ) детерминированность: исполнитель должен знать, какую команду выполнить следующей результативность: результат за конечное число шагов массовость: может применяться многократно при различных исходных данных корректность: дает верное решение при любых допустимых исходных данных Алгоритм – это четко определенный план действий для исполнителя.

4 Программа Программа – это алгоритм, записанный на каком-либо языке программирования набор команд для компьютера Команда – это описание действий, которые должен выполнить компьютер. откуда взять исходные данные? что нужно с ними сделать? Оператор – это команда языка программирования высокого уровня. Блок-схема – изображение алгоритма с помощью геометрических фигур.

5 Блок-схема начало действия ввод данных действие конец да нет условие

6 Простейшая программа program qq; begin { начало программы }..... { программа } end. { конец программы } program qq; begin { начало программы }..... { программа } end. { конец программы } комментарии в фигурных скобках не обрабатываются название программы program Proga; begin write(любые символы,дано = 123); readln; { задержка экрана } end. program Proga; begin write(любые символы,дано = 123); readln; { задержка экрана } end.

7 Вывод текста на экран program qq; Begin write(a,kyb); write(2+,=!,a);{ без перехода } writeln('2=?'); { на новую строку} writeln('Ответ: 4'); readln {задержка экрана} end. program qq; Begin write(a,kyb); write(2+,=!,a);{ без перехода } writeln('2=?'); { на новую строку} writeln('Ответ: 4'); readln {задержка экрана} end. Протокол: 2+2=? Ответ: 4

8 Задания «4»: Вывести на экран текст "лесенкой" Вася пошел гулять «5»: Вывести на экран рисунок из букв Ж ЖЖЖ ЖЖЖЖЖ ЖЖЖЖЖЖЖ HH HH ZZZZZ «6» **************************** МБОУ СОШ «А» ****************************

9 Имена программ, констант, переменных В именах МОЖНО использовать латинские буквы (A-Z) цифры знак подчеркивания _ заглавные и строчные буквы не различаются В именах НЕЛЬЗЯ использовать русские буквы пробелы скобки, знаки +, =, !, ? и др. имя не может начинаться с цифры Какие имена правильные?? AXby R&B 4Wheel Вася PesBarbos TU154 [QuQu] _ABBA A+B

10 Из чего состоит программа? program ; const …;{константы} var …; {переменные} begin … {основная программа} end. program ; const …;{константы} var …; {переменные} begin … {основная программа} end. { процедуры и функции } комментарии в фигурных скобках не обрабатываются

11 Из чего состоит программа? Константа – постоянная величина, имеющая имя. Переменная – изменяющаяся величина, имеющая имя (ячейка памяти). Процедура – вспомогательный алгоритм, описывающий некоторые действия (рисование окружности). Функция – вспомогательный алгоритм для выполнения вычислений (вычисление квадратного корня, sin).

12 Константы const i2 = 45; { целое число } pi = 3.14; { вещественное число } qq = 'Вася'; { строка символов } L = True; { логическая величина } const i2 = 45; { целое число } pi = 3.14; { вещественное число } qq = 'Вася'; { строка символов } L = True; { логическая величина } целая и дробная часть отделяются точкой можно использовать русские буквы! может принимать два значения: True (истина, «да») False (ложь, «нет») может принимать два значения: True (истина, «да») False (ложь, «нет»)

13 Переменные Переменная – это величина, имеющая имя, тип и значение. Значение переменной можно изменять во время работы программы. Типы переменных: integer{ целая } real{ вещественная } char{ один символ } string{ символьная строка } boolean { логическая } Объявление переменных (выделение памяти): var a, b: integer; Q: real; s1, s2: string; var a, b: integer; Q: real; s1, s2: string;

14 Как изменить значение переменной? Оператор – это команда языка программирования высокого уровня. Оператор присваивания служит для изменения значения переменной. program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); end. program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); end. a ? 5 5 b ? a 5 7*4 28 Пример:

15 Как записать значение в переменную? a := 5; Оператор присваивания При записи нового значения старое стирается! ! 5 5 Оператор – это команда языка программирова- ния (инструкция). Оператор присваивания – это команда для записи нового значения в переменную.

16 Оператор присваивания Арифметическое выражение может включать константы имена переменных знаки арифметических операций: + - * / div mod вызовы функций круглые скобки ( ) умножение деление деление нацело остаток от деления := ;

17 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. 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. Какие операторы неправильные? имя переменной должно быть слева от знака := целая и дробная часть отделяются точкой нельзя записывать вещественное значение в целую переменную

18 Переменные Задача. Ввести с клавиатуры два числа и найти их сумму. Протокол: Введите два целых числа =55 компьютер пользователь компьютер считает сам! 1. Как ввести числа в память? 2. Где хранить введенные числа? 3. Как вычислить? 4. Как вывести результат? ?

19 Блок-схема линейного алгоритма начало конец c := a + b; ввод a, b вывод c блок «начало» блок «ввод» блок «процесс» блок «вывод» блок «конец»

20 Как ввести значение с клавиатуры read ( a ); 1. Программа ждет, пока пользователь введет значение и нажмет Enter. 2. Введенное значение записывается в переменную a. ! Оператор ввода 5 5

21 Ввод значений двух переменных через пробел: через Enter: a 25 b 30 a 25 b 30 read ( a, b ); Ввод значений двух переменных (через пробел или Enter).

22 Оператор вывода { вывод значения переменной a} { вывод значения переменной a и переход на новую строчку} { вывод текста } {вывод текста и значения переменной c} write( a ); writeln( a ); writeln( 'Привет!' ); writeln( 'Ответ: ', c ); writeln ( a, '+', b, '=', c );

23 Сложение двух чисел Задача. Ввести два целых числа и вывести на экран их сумму. Простейшее решение: program qq; var a, b, c: integer; begin read ( a, b ); c := a + b; writeln (a + b =, c ); end. program qq; var a, b, c: integer; begin read ( a, b ); c := a + b; writeln (a + b =, c ); end. Что плохо? ?

24 Полное решение program qq; var a, b, c: integer; x, y: real; begin writeln('Введите два целых числа'); read ( a, b ); c := a + b; writeln ( a, '+', b, '=', c ); end. program qq; var a, b, c: integer; x, y: real; begin writeln('Введите два целых числа'); read ( a, b ); c := a + b; writeln ( a, '+', b, '=', c ); end. Введите два целых числа =55 компьютер пользователь

25 Арифметические операции + сложение – вычитание * умножение / деление 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. 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.

26 Порядок выполнения операций 1)вычисление выражений в скобках 2)умножение, деление, div, mod слева направо 3)сложение и вычитание слева направо z := (5*a+c)/a*(b-c)/ b; x:=(5*c*c-d*(a+b))/((c+d)*(d-2*a));

27 Ручная прокрутка программы 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. 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. ab ??

Вывод целых чисел program qq; var a, b: integer; begin a := 15; b := 45; writeln ( a, b ); writeln ( a:4, b:4 ); end. program qq; var a, b: integer; begin a := 15; b := 45; writeln ( a, b ); writeln ( a:4, b:4 ); end символов на число символов на число

29 Вывод вещественных чисел program qq; var x: real; begin x := ; writeln ( x ); writeln ( x:10 ); writeln ( x:7:2 ); end. program qq; var x: real; begin x := ; writeln ( x ); writeln ( x:10 ); writeln ( x:7:2 ); end всего символов в дробной части 1.23E E+001 1,

30 Задания «4»: Ввести три числа, найти их сумму и произведение. Пример: Введите три числа: =16 4*5*7=140 «5»: Ввести три числа, найти их сумму, произведение и среднее арифметическое. Пример: Введите три числа: =16 4*5*7=140 (4+5+7)/3=5.33

31 Программирование на языке Паскаль Тема 2. Ветвления © К.Ю. Поляков,

32 Разветвляющиеся алгоритмы Задача. Ввести два целых числа и вывести на экран наибольшее из них. Идея решения: надо вывести на экран первое число, если оно больше второго, или второе, если оно больше первого. Особенность: действия исполнителя зависят от некоторых условий (если … иначе …). Алгоритмы, в которых последовательность шагов зависит от выполнения некоторых условий, называются разветвляющимися.

33 Вариант 1. Блок-схема начало max:= a; ввод a,b вывод max a > b? max:= b; конец да нет полная форма ветвления блок «решение» Если a = b? ?

34 Вариант 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.

35 Условный оператор if then begin {что делать, если условие верно} end else begin {что делать, если условие неверно} end; if then begin {что делать, если условие верно} end else begin {что делать, если условие неверно} end; Особенности: перед else НЕ ставится точка с запятой вторая часть ( else …) может отсутствовать (неполная форма) если в блоке один оператор, можно убрать слова begin и end

36 Что неправильно? if a > b then begin a := b; end else b := a; end; 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; 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 begin b := a; end; if a > b then begin a := b; end else b > a begin b := a; end; if a > b then begin a := b; end else b > a begin b := a; end; begin end begin end

37 Вариант 2. Блок-схема неполная форма ветвления начало max:= a; ввод a,b вывод max max:= b; конец да нет b > a?

38 Вариант 2. Программа program qq; var a, b, max: integer; begin writeln('Введите два целых числа'); read ( a, b ); max := a; if b > a then max := b; writeln ('Наибольшее число ', max); end. неполная форма условного оператора

39 Вариант 2Б. Программа program qq; var a, b, max: integer; begin writeln('Введите два целых числа'); read ( a, b ); max := b; if ??? then ??? writeln ('Наибольшее число ', max); end. max := a; a > b

40 Что неправильно? if a > b then begin a := b; else b := a; 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 begin a := b; end; else b := a; if a > b then else begin b := a; end; if a > b then else begin b := a; end; if a > b then a := b; else b := a; end; if a > b then a := b; else b := a; end; a := b end a := b if b >= a then b := a; if b >= a then b := a;

41 Задания «4»: Ввести три числа и найти наибольшее из них. Пример: Введите три числа: Наибольшее число 15 «5»: Ввести пять чисел и найти наибольшее из них. Пример: Введите пять чисел: Наибольшее число 56

42 Программирование на языке Паскаль Тема 3. Сложные условия © К.Ю. Поляков,

43 Сложные условия Задача. Фирма набирает сотрудников от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он фирме (вывести ответ «подходит» или «не подходит»). Особенность: надо проверить, выполняются ли два условия одновременно. Можно ли решить известными методами? ?

44 Вариант 1. Алгоритм начало ввод x 'подходит' конец да нет x >= 25? да нет x < = 40? 'не подходит'

45 Вариант 1. Программа program qq; var x: integer; begin writeln('Введите возраст'); read ( x ); if x >= 25 then if x

46 Вариант 2. Алгоритм начало ввод x 'подходит' да нет x >= 25 и x

47 Вариант 2. Программа сложное условие program qq; var x: integer; begin writeln('Введите возраст'); read ( x ); if (x >= 25) and (x

48 Сложные условия Простые условия (отношения) >= = Сложное условие – это условие, состоящее из нескольких простых условий (отношений), связанных с помощью логических операций: not – НЕ (отрицание, инверсия) and – И (логическое умножение, конъюнкция, одновременное выполнение условий) or – ИЛИ (логическое сложение, дизъюнкция, выполнение хотя бы одного из условий) xor – исключающее ИЛИ (выполнение только одного из двух условий, но не обоих) равно не равно

49 Сложные условия Порядок выполнения (приоритет = старшинство) выражения в скобках not and or, xor, >=, =, Особенность – каждое из простых условий обязательно заключать в скобки. Пример if not (a > b) or (c d) and (b a) then begin... end if not (a > b) or (c d) and (b a) then begin... end

50 Истинно или ложно при 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 c) Для каких значений x истинны условия: (x < 6) and (x < 10) (x 10) (x > 6) and (x < 10) (x > 6) and (x > 10) (x < 6) or (x < 10) (x 10) (x > 6) or (x < 10) (x > 6) or (x > 10) Сложные условия True FALSE (- ; 6) (6; 10) (10; ) (- ; 10) (- ; 6) (10; ) (- ; ) (6; ) x < 6x < 6 x > 10 x < 10 x > 6x > 6 True

51 Задания «4»: Ввести номер месяца и вывести название времени года. Пример: Введите номер месяца: 4 весна «5»: Ввести возраст человека (от 1 до 150 лет) и вывести его вместе с последующим словом «год», «года» или «лет». Пример: Введите возраст: Вам 24 года Вам 57 лет

52 Программирование на языке Паскаль Тема 4. Циклы © К.Ю. Поляков,

53 Циклы Цикл – это многократное выполнение одинаковой последовательности действий. цикл с известным числом шагов цикл с неизвестным числом шагов (цикл с условием) Задача. Вывести на экран 5 раз слово «Привет». Особенность: одинаковые действия выполняются 5 раз. Можно ли решить известными методами? ?

54 Циклы program qq; begin writeln('Привет'); end. program qq; begin writeln('Привет'); end. Что плохо? ?

55 Алгоритм начало Привет! конец да нет i = 5?i = 5? i := 0 ; i := i + 1; еще не сделали ни одного раза проверить, все ли сделали вывод на экран считаем очередной шаг

56 Циклы program qq; var i: integer; begin for i:=1 to 5 do writeln('Привет'); end. program qq; var i: integer; begin for i:=1 to 5 do writeln('Привет'); end. «Для всех i от 1 до 5 делай …» «Для всех i от 1 до 5 делай …» for i:=1 to 5 do Если в цикле более одного оператора: for i:=1 to 5 do begin write('Привет'); writeln(', Вася!'); end; for i:=1 to 5 do begin write('Привет'); writeln(', Вася!'); end; begin end; Что получится? ?

57 Циклы Задача. Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b ). Особенность: одинаковые действия выполняются 8 раз. Можно ли решить известными методами? ? i := 1; { очередное число } i2 := i*i;{ его квадрат } i3 := i2*i;{ куб } writeln(i:4, i2:4, i3:4); i := 2;... i := 1; { очередное число } i2 := i*i;{ его квадрат } i3 := i2*i;{ куб } writeln(i:4, i2:4, i3:4); i := 2;... А если начальное и конечное значения вводятся с клавиатуры? ?

58 Алгоритм начало i, i2, i3 конец нет да i

59 Алгоритм (с блоком «цикл») начало i, i2, i3 конец i2 := i * i; i3 := i2 * i; i := 1,8 блок «цикл» тело цикла

60 Программа 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. переменная цикла переменная цикла начальное значение конечное значение

61 Цикл с уменьшением переменной Задача. Вывести на экран квадраты и кубы целых чисел от 8 до 1 (в обратном порядке). Особенность: переменная цикла должна уменьшаться. Решение: for i:=8 1 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; for i:=8 1 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; downto

62 Цикл с переменной for := to do begin {тело цикла} end; for := to do begin {тело цикла} end; Увеличение переменной на 1: for := downto do begin {тело цикла} end; for := downto do begin {тело цикла} end; Уменьшение переменной на 1:

63 Цикл с переменной Особенности: переменная цикла может быть только целой ( integer ) шаг изменения переменной цикла всегда равен 1 ( to ) или -1 ( downto ) если в теле цикла только один оператор, слова begin и end можно не писать: если конечное значение меньше начального, цикл ( to ) не выполняется ни разу (проверка условия в начале цикла, цикл с предусловием) for i:=1 to 8 do writeln('Привет'); for i:=1 to 8 do writeln('Привет');

64 Цикл с переменной Особенности: в теле цикла не разрешается изменять переменную цикла (почему?) при изменении начального и конечного значения внутри цикла количество шагов не изменится: n := 8; for i:=1 to n do begin writeln('Привет'); n := n + 1; end; n := 8; for i:=1 to n do begin writeln('Привет'); n := n + 1; end; нет зацикливания

65 Сколько раз выполняется цикл? a := 1; for i:=1 to 3 do a := a+1; a := 1; for i:=1 to 3 do a := a+1; a = 4a = 4 a = 4a = 4 a := 1; for i:=3 to 1 do a := a+1; a := 1; for i:=3 to 1 do a := a+1; a = 1a = 1 a = 1a = 1 a := 1; for i:=1 downto 3 do a := a+1; a := 1; for i:=1 downto 3 do a := a+1; a = 1a = 1 a = 1a = 1 a := 1; for i:=3 downto 1 do a := a+1; a := 1; for i:=3 downto 1 do a := a+1; a = 4a = 4 a = 4a = 4

66 for i:=1 to 9 do begin if ??? then begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; for i:=1 to 9 do begin if ??? then begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; Как изменить шаг? Задача. Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9. Особенность: переменная цикла должна увеличиваться на 2. Проблема: в Паскале шаг может быть 1 или -1. Решение: i mod 2 = 1 i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); выполняется только для нечетных i Что плохо? ?

67 Как изменить шаг? – 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; ??? 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;

68 Как изменить шаг? – III Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Зная k, надо рассчитать i. Решение: k12345 i13579 i = 2k-1 for k:=1 to 5 do begin ??? i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; 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;

69 Задания «4»: Ввести a и b и вывести квадраты и кубы чисел от a до b. Пример: Введите границы интервала: «5»: Вывести квадраты и кубы 10 чисел следующей последовательности: 1, 2, 4, 7, 11, 16, … Пример:

70 Программирование на языке Паскаль Тема 5. Циклы с условием © К.Ю. Поляков,

71 Цикл с условием while do begin {тело цикла} end; while do begin {тело цикла} end; Особенности: можно использовать сложные условия: если в теле цикла только один оператор, слова begin и end можно не писать: while (a < b) and (b < c) do begin {тело цикла} end; while (a < b) and (b < c) do begin {тело цикла} end; while a < b do a := a + 1; while a < b do a := a + 1;

72 Цикл с условием Особенности: условие пересчитывается каждый раз при входе в цикл если условие на входе в цикл ложно, цикл не выполняется ни разу если условие никогда не станет ложным, программа зацикливается a := 4; b := 6; while a > b do a := a – b; a := 4; b := 6; while a > b do a := a – b; a := 4; b := 6; while a < b do d := a + b; a := 4; b := 6; while a < b do d := a + b;

73 Программа program qq; var n, count: integer; begin writeln('Введите целое число'); read(n); c := 0; while n 0 do begin c := c + 1; n := n div 10; end; writeln( n,c); end. program qq; var n, count: integer; begin writeln('Введите целое число'); read(n); c := 0; while n 0 do begin c := c + 1; n := n div 10; end; writeln( n,c); end. while n 0 do begin ; n := n div 10; end; while n 0 do begin ; n := n div 10; end; выполнять «пока n 0»

74 Сколько раз выполняется цикл? a := 4; b := 6; while a < b do a := a + 1; a := 4; b := 6; while a < b do a := a + 1; 2 раза a = 6 2 раза a = 6 a := 4; b := 6; while a < b do a := a + b; a := 4; b := 6; while a < b do a := a + b; 1 раз a = 10 1 раз a = 10 a := 4; b := 6; while a > b do a := a + 1; a := 4; b := 6; while a > b do a := a + 1; 0 раз a = 4 0 раз a = 4 a := 4; b := 6; while a < b do b := a - b; a := 4; b := 6; while a < b do b := a - b; 1 раз b = -2 1 раз b = -2 a := 4; b := 6; while a < b do a := a - 1; a := 4; b := 6; while a < b do a := a - 1; зацикливание

75 Замена for на while и наоборот for i:=1 to 10 do begin {тело цикла} end; for i:=1 to 10 do begin {тело цикла} end; i := 1; while i = b do begin {тело цикла} i := i - 1; end; Замена while на for возможна только тогда, когда можно заранее рассчитать число шагов цикла. Замена цикла for на while возможна всегда.

76 Задания «4»: Ввести целое число и найти сумму его цифр. Пример: Введите целое число: 1234 Сумма цифр числа 1234 равна 10. «5»: Ввести целое число и определить, верно ли, что в его записи есть две одинаковые цифры. Пример: Введите целое число: Введите целое число: Нет. Да.

77 Последовательности Примеры: 1, 2, 3, 4, 5, … 1, 2, 4, 7, 11, 16, … 1, 2, 4, 8, 16, 32, … an = nan = n an = nan = n a 1 = 1, a n+1 = a n +1 a 1 = 1, a n+1 = a n + n a n = 2 n-1 a 1 = 1, a n+1 = 2 a n b 1 = 1, b n+1 = b n +1 c 1 = 2, c n+1 = 2 c n

78 Последовательности Задача: найти сумму всех элементов последовательности, которые по модулю больше 0,001: Элемент последовательности (начиная с 2): n b12345 c z b := b+1; c := 2*c; z := -z;

79 Алгоритм начало 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 ; новый элемент изменение Перестановка? ?

80 Программа program qq; var b, c, z: integer; S, a: real; begin S := 0; z := -1; b := 1; c := 2; a := 1; while abs(a) > do begin S := S + a; a := z * b / c; z := - z; b := b + 1; c := c * 2; end; writeln('S =', S:10:3); end. program qq; var b, c, z: integer; S, a: real; begin S := 0; z := -1; b := 1; c := 2; a := 1; while abs(a) > 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; начальные значения увеличение суммы расчет элемента последовательности

81 Задания «4»: Найти сумму элементов последовательности с точностью 0,001: Ответ: S = «5»: Найти сумму элементов последовательности с точностью 0,001: Ответ: S = 1.220

82 Цикл с постусловием Задача: Ввести целое положительное число ( проверку условия цикла надо делать в конце цикла (цикл с постусловием). Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла.

83 Цикл с постусловием: алгоритм начало конец да нет n > 0? тело цикла условие ВЫХОДА блок «типовой процесс» ввод n основной алгоритм

84 Программа program qq; var n: integer; begin repeat writeln('Введите положительное число'); read(n); until n > 0;... { основной алгоритм } end. program qq; var n: integer; begin repeat writeln('Введите положительное число'); read(n); until n > 0;... { основной алгоритм } end. repeat writeln('Введите число'); readln(n); until n > 0; условие ВЫХОДА Особенности: тело цикла всегда выполняется хотя бы один раз после слова until ("до тех пор, пока не…") ставится условие ВЫХОДА из цикла

85 Сколько раз выполняется цикл? a := 4; b := 6; repeat a := a + 1; until a > b; a := 4; b := 6; repeat a := a + 1; until a > b; 3 раза a = 7 3 раза a = 7 a := 4; b := 6; repeat a := a + b; until a > b; a := 4; b := 6; repeat a := a + b; until a > b; 1 раз a = 10 1 раз a = 10 a := 4; b := 6; repeat a := a + b; until a < b; a := 4; b := 6; repeat a := a + b; until a < b; зацикливание a := 4; b := 6; repeat b := a - b; until a < b; a := 4; b := 6; repeat b := a - b; until a < b; 2 раза b = 6 2 раза b = 6 a := 4; b := 6; repeat a := a + 2; until a < b; a := 4; b := 6; repeat a := a + 2; until a < b; зацикливание

86 Задания (с защитой от неверного ввода) «4»: Ввести натуральное число и определить, верно ли, что сумма его цифр равна 10. Пример: Введите число >= 0: Введите число >= 0: Нужно положительное число. Нет Введите число >= 0: 1234 Да «5»: Ввести натуральное число и определить, какие цифры встречаются несколько раз. Пример: Введите число >= 0: Повторяются: 2, 3 Нет повторов.

87 Программирование на языке Паскаль Тема 6. Оператор выбора © К.Ю. Поляков,

88 Оператор выбора Задача: Ввести номер месяца и вывести количество дней в этом месяце. Решение: Число дней по месяцам: 28 дней – 2 (февраль) 30 дней – 4 (апрель), 6 (июнь), 9 (сентябрь), 11 (ноябрь) 31 день – 1 (январь), 3 (март), 5 (май), 7 (июль), 8 (август), 10 (октябрь), 12 (декабрь) Особенность: Выбор не из двух, а из нескольких вариантов в зависимости от номера месяца. Можно ли решить известными методами? ?

89 Алгоритм начало конец выбор ни один вариант не подошел ввод M да нет M = 1? D := 31; нет M = 2? D := 28; да нет M = 12? D := 31; да вывод D ошибка

90 Программа 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. 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; 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; ни один вариант не подошел

91 Оператор выбора Особенности: после case может быть имя переменной или арифметическое выражение целого типа ( integer ) или символьного типа ( char ) case i+3 of 1: begin a := b; end; 2: begin a := c; end; end; 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; var c: char;... case c of 'а': writeln('Антилопа'); 'б': writeln('Барсук'); else writeln('Не знаю'); end;

92 Оператор выбора Особенности: если нужно выполнить только один оператор, слова begin и end можно не писать нельзя ставить два одинаковых значения case i+3 of 1: a := b; 1: a := c; end; case i+3 of 1: a := b; 1: a := c; end; case i+3 of 1: a := b; 2: a := c; end; case i+3 of 1: a := b; 2: a := c; end;

93 Оператор выбора Особенности: значения, при которых выполняются одинаковые действия, можно группировать case i of 1: a := b; 2,4,6: a := c; : a := d; 20,21,25..30: a := e; else writeln('Ошибка'); end; case i of 1: a := b; 2,4,6: a := c; : a := d; 20,21,25..30: a := e; else writeln('Ошибка'); end; перечисление диапазон смесь

94 Что неправильно? case a of 2: begin a := b; 4: a := c; end; 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: a := b 4: a := c end; ; case a of 2..5: 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; 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+c/2 of 2: a := b; 4: a := c; end; case a of 2: a := b; d := 0; 4: a := c; end; case a of 2: a := b; d := 0; 4: a := c; end; begin end;

95 Задания (с защитой от неверного ввода) «4»: Ввести номер месяца и вывести количество дней в нем, а также число ошибок при вводе. Пример: Введите номер месяца: Введите номер месяца: -2 2 Введите номер месяца: В этом месяце 28 дней. 11 Вы вводили неверно 0 раз. В этом месяце 30 дней. Вы вводили неверно 1 раз. «5»: Ввести номер месяца и номер дня, вывести число дней, оставшихся до Нового года. Пример: Введите номер месяца: 12 Введите день: 25 До Нового года осталось 6 дней.

96 Программирование на языке Паскаль Тема 7. Графика © К.Ю. Поляков,

97 Система координат (0,0) (x,y)(x,y) X Y x y

98 Управление цветом Цвет и толщина линий, цвет точек: Pen ( 1, 255, 0, 0 ); Цвет и стиль заливки: Brush ( 1, 0, 255, 0 ); Цвет текста: TextColor ( 0, 0, 255 ); толщина линии R(red) R(red) G(green) G(green) B(blue) B(blue) – выключить 1 - включить 0 – выключить 1 - включить R R G G B B R R G G B B

99 Точки, отрезки и ломаные (x 1, y 1 ) (x 2, y 2 ) Pen (1, 0, 255, 0); Line (x1, y1, x2, y2); (x, y) Pen (1, 0, 0, 255); Point (x, y); Pen (1, 0, 0, 255); Point (x, y); (x 1, y 1 ) (x 2, y 2 ) (x 3, y 3 ) (x 4, y 4 ) (x 5, y 5 ) Pen (1, 255, 0, 0); MoveTo (x1, y1); LineTo (x2, y2); LineTo (x3, y3); LineTo (x4, y4); LineTo (x5, y5); Pen (1, 255, 0, 0); MoveTo (x1, y1); LineTo (x2, y2); LineTo (x3, y3); LineTo (x4, y4); LineTo (x5, y5);

100 Фигуры с заливкой (x 1, y 1 ) (x 2, y 2 ) Pen (1, 0, 0, 255); Brush (1, 255, 255, 0); Rectangle (x1, y1, x2, y2); Pen (1, 0, 0, 255); Brush (1, 255, 255, 0); Rectangle (x1, y1, x2, y2); (x 1, y 1 ) (x 2, y 2 ) Pen (1, 255, 0, 0); Brush (1, 0, 255, 0); Ellipse (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); Brush (1, 100, 200, 255); Fill (x, y); (x, y) Как отменить заливку? ?

101 Текст TextColor (0, 0, 255); Brush (1, 255, 255, 0); Font (20, 30, 600); MoveTo (x, y); writeln ('Привет!'); TextColor (0, 0, 255); Brush (1, 255, 255, 0); Font (20, 30, 600); MoveTo (x, y); writeln ('Привет!'); Привет! (x, y) размер 10 пикселей размер 10 пикселей угол поворота угол поворота насыщенность: 400 – нормальный 600 – жирный насыщенность: 400 – нормальный 600 – жирный 30 о

102 Пример (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. 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.

103 Задания «4»: «Лягушка» «5»: «Корона»

104 Штриховка (x 1, y 1 ) (x 2, y 2 ) 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; 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 округление до ближайшего целого x x

105 Штриховка (программа) (x 1, y 1 ) (x 2, y 2 ) 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. 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

106 Как менять цвет? (x 1, y 1 ) (x 2, y 2 ) Brush ( 1, c, c, c ); Fill ( ???, ??? ); Brush ( 1, c, c, c ); Fill ( ???, ??? ); серый: R = G = B Шаг изменения c: x (x-1, y 1 +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;

107 Штриховка (x 1, y 1 ) (x 2, y 2 ) (x 3, y 2 ) a h (x 3 +a, y 1 ) 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; 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 x-a

108 Штриховка (x 1, y 1 ) (x 2, y 2 ) hxhx hyhy y y x x y 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; 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;

109 Задания «4»: Ввести с клавиатуры число линий и построить фигуру: «5»: Ввести с клавиатуры число линий и построить фигуру:

110 Задания «4»: Ввести с клавиатуры число линий штриховки и построить фигуру, залив все области разным цветом. «5»: Ввести с клавиатуры число окружностей и построить фигуру, залив все области разным цветом.

111 Программирование на языке Паскаль Тема 8. Графики функций © К.Ю. Поляков,

112 Построение графиков функций Задача: построить график функции y = 3 sin(x ) на интервале от 0 до 2π. Анализ: максимальное значение y max = 3 при x = π/2 минимальное значение y min = -3 при x = 3 π/2 Проблема: функция задана в математической системе координат, строить надо на экране, указывая координаты в пикселях.

113 Преобразование координат (x,y)(x,y) X Y x y Математическая система координат Экранная система координат (пиксели) (xэ,yэ)(xэ,yэ) xэxэ yэyэ (0,0)(0,0) (0,0)(0,0) a b k – масштаб (длина изображения единичного отрезка на экране) x э = a + kx y э = b - ky x э = a + kx y э = b - ky

114 Программа 2π2π 2π2π h – шаг изменения x w – длина оси ОХ в пикселях на экране оси координат цикл построения графика program qq; const a = 50; b = 200; k = 50; xmin = 0; xmax = ; 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

115 Как соединить точки? Алгоритм: Если первая точка перейти в точку (x э,y э ) иначе отрезок в точку (x э,y э ) Если первая точка перейти в точку (x э,y э ) иначе отрезок в точку (x э,y э ) Программа: начальное значение выбор варианта действий логическая переменная var first: boolean;... begin... first := True; while x

116 Задания «4»: Построить график функции y = x 2 на интервале [-3,3]. «5»: Построить график функции (эллипс)

117 Программирование на языке Паскаль Тема 9. Процедуры © К.Ю. Поляков,

118 Процедуры Задача: Построить фигуру: Особенность: Три похожие фигуры. общее: размеры, угол поворота отличия: координаты, цвет Можно ли решить известными методами? ? Сколько координат надо задать? ?

119 Процедуры Процедура – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий. Применение: выполнение одинаковых действий в разных местах программы разбивка программы (или другой процедуры) на подзадачи для лучшего восприятия Подзадача 1Подзадача 2Подзадача Задача

120 Процедуры Порядок разработки: выделить одинаковые или похожие действия (три фигуры) найти в них общее (размеры, форма, угол поворота) и отличия (координаты, цвет) отличия записать в виде неизвестных переменных, они будут параметрами процедуры (x, y) (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); MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); Brush(1, r, g, b); Fill(x+20, y-20); тело процедуры координаты цвет параметры

121 Программа 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. 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) фактические параметры вызовы процедуры procedure Tr( x, y, r, g, b: integer); begin... end; формальные параметры процедура

122 Процедуры Особенности: все процедуры расположены выше основной программы в заголовке процедуры перечисляются формальные параметры, они обозначаются именами, поскольку могут меняться при вызове процедуры в скобках указывают фактические параметры (числа или арифметические выражения) в том же порядке procedure Tr( x, y, r, g, b: integer); Tr (200, 100, 0, 255, 0); x x y y r r g g b b

123 Процедуры Особенности: для каждого формального параметра после двоеточия указывают его тип если однотипные параметры стоят рядом, их перечисляют через запятую внутри процедуры параметры используются так же, как и переменные procedure A (x: real; y: integer; z: real); procedure A (x, z: real; y, k, l: integer);

124 Процедуры Особенности: в процедуре можно объявлять дополнительные локальные переменные, остальные процедуры не имеют к ним доступа 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;

125 Параметры-переменные Задача: составить процедуру, которая меняет местами значения двух переменных. Особенности: надо, чтобы изменения, сделанные в процедуре, стали известны вызывающей программе program qq; var x, y: integer; begin x := 1; y := 2; Exchange ( x, y ); writeln ( x =, x, y =, y ); end. 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

126 Параметры-переменные Применение: таким образом процедура (и функция) может возвращать несколько значений, Запрещенные варианты вызова Exchange ( 2, 3 ); { числа } Exchange ( x+z, y+2 ); { выражения } procedure Exchange ( a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; procedure Exchange ( a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; var параметры могут изменяться

127 Задания «4»: Используя процедуры, построить фигуру. «5»: Используя процедуры, построить фигуру. a aa 0,866a равносторонний треугольник

128 Программирование на языке Паскаль Тема 10. Рекурсия © К.Ю. Поляков,

129 Рекурсивные объекты Рекурсивный объект – это объект, определяемый через один или несколько таких же объектов. У попа была собака, он ее любил. Она съела кусок мяса, он ее убил. В ямку закопал, надпись написал: У попа была собака, он ее любил. Она съела кусок мяса, он ее убил. В ямку закопал, надпись написал: Сказка о попе и собаке Примеры: Сказка о попе и собаке: Факториал: если Рисунок с рекурсией:

130 Дерево Пифагора Дерево Пифагора из N уровней – это ствол и отходящие от него симметрично два дерева Пифагора из N-1 уровней, такие что длина их стволов в 2 раза меньше и угол между ними равен 90 o. 6 уровней: Как доказать, что это рекурсивная фигура? ?

131 Дерево Пифагора Особенности: когда остановиться? деревья имеют различный наклон когда число оставшихся уровней станет равно нулю! (x 1, y 1 ) (x 0, y 0 ) α α+45 o α-45 o L x 1 = x 0 + L · cos(α) y 1 = y 0 – L·sin(α) x 1 = x 0 + L · cos(α) y 1 = y 0 – L·sin(α) наклон «дочерних» деревьев α + π/4 α – π/4 α + π/4 α – π/4

132 Процедура угол α длина ствола 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; рекурсивные вызовы закончить, если N=0 Рекурсивной называется процедура, вызывающая сама себя.

133 Программа program qq; procedure Pifagor(x0, y0, a, L: real; N: integer);... end; begin Pifagor (250, 400, pi/2, 150, 8); end. угол α длина ствола число уровней x0x0 x0x0 y0y0 y0y0 Как наклонить дерево влево на 30 o ? ? Pifagor (250, 400, 2*pi/3, 150, 8);

134 «4»: Используя рекурсивную процедуру, построить фигуру: «5»: Используя рекурсивную процедуру, построить фигуру: Задания

135 Программирование на языке Паскаль Тема 11. Анимация © К.Ю. Поляков,

136 Анимация Анимация (англ. animation) – оживление изображения на экране. Задача: внутри синего квадрата 400 на 400 пикселей слева направо двигается желтый квадрат 20 на 20 пикселей. Программа останавливается, если нажата клавиша Esc или квадрат дошел до границы синей области. Проблема: как изобразить перемещение объекта на экране? Привязка: состояние объекта задается координатами (x,y) Принцип анимации: 1. рисуем объект в точке (x,y) 2. задержка на несколько миллисекунд 3. стираем объект 4. изменяем координаты (x,y) 5. переходим к шагу 1

137 Как "поймать" нажатие клавиши? Событие – это изменение в состоянии какого-либо объекта или действие пользователя (нажатие на клавишу, щелчок мышкой). 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; 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;

138 Как выйти из цикла при нажатии 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, если надо остановиться запуск цикла

139 Процедура (рисование и стирание) 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; 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)? рисуем: цвет кисти – желтый стираем: цвет кисти – синий только заливка!

140 Полная программа 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 >= then stop := true; until stop; end. процедура начальные условия выход по клавише Esc выход при касании границы синий фон ждем 10 мс отключить границу

141 «4»: Два квадрата двигаются в противоположном направлении: «5»: Два квадрата двигаются в противоположном направлении и отталкиваются от стенок синего квадрата: Задания

142 Управление клавишами Задача: жёлтый квадрат внутри синего квадрата управляется клавишами-стрелками. Коды клавиш: влево – 37 вверх – 38Esc – 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; 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; 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; если было нажатие на клавишу, …

143 Программа 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. 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; Что плохо? ? процедура основной цикл обработка событий

144 Как убрать мигание? Проблема: даже если не нажата никакая клавиша, квадрат перерисовывается через каждые 20 мс (мигание!) Что хочется: не перерисовать квадрат, если не было никакого события Решение: нарисовать квадрат и ждать события Новая проблема: как ждать события? Решение новой проблемы: пустой цикл "пока не случилось событие, ничего не делай": while not IsEvent do;

145 Программа program qq; var x, y, k, code, i: integer; stop: boolean; begin... repeat Draw(x, y, True); while not IsEvent do; until stop; end. 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; процедура рисуем квадрат ждем события только теперь стираем Что можно улучшить? ?

146 «4»: Квадрат двигается при нажатии стрелок, однако не может выйти за границы синего квадрата: «5»: Квадрат непрерывно двигается, при нажатии стрелок меняет направление и отталкивается от стенок синего квадрата: Задания

147 Вращение Задача: изобразить модель вращения Земли вокруг Солнца. Проблема: движение по окружности, как изменять координаты? Решение: использовать в качестве независимой переменной (менять в цикле) угол поворота α (x 0, y 0 ) α L (x, y) x = x 0 + L · cos(α) y = y 0 – L·sin(α)

148 Процедура 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; 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,y) (x+r, y+r)

149 Константы и переменные 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. 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;

150 Основная программа 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; { начальный угол, шаг 1 o за 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. 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; { начальный угол, шаг 1 o за 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;

151 «4»: Изобразить модель Солнца с двумя планетами, которые вращаются в противоположные стороны: «5»: Изобразить модель системы Солнце-Земля- Луна: Задания

152 Программирование на языке Паскаль Тема 12. Функции © К.Ю. Поляков,

153 Функции Функция – это вспомогательный алгоритм (подпрограмма), результатом работы которого является некоторое значение. Примеры: вычисление,, расчет значений по сложным формулам ответ на вопрос (простое число или нет?) Зачем? для выполнения одинаковых расчетов в различных местах программы для создания общедоступных библиотек функций В чем отличие от процедур? ?

154 Функции Задача: составить функцию, которая вычисляет наибольшее из двух значений, и привести пример ее использования Функция: формальные параметры function Max (a, b: integer): integer; begin if a > b then Max := a else Max := b; end; это результат функции

155 Функции Особенности: заголовок начинается словом function формальные параметры описываются так же, как и для процедур можно использовать параметры-переменные в конце заголовка через двоеточие указывается тип результата функции располагаются ВЫШЕ основной программы Max (a, b: integer): integer; function function Max (a, b: integer): ; integer function qq( a, b: integer; x: real ): real; a, b: integer; x: real function Max ( a, b: integer): integer; var

156 Функции Особенности: можно объявлять и использовать локальные переменные значение, которое является результатом, записывается в переменную, имя которой совпадает с названием функции; объявлять ее НЕ НАДО: function Max (a, b: integer): integer; begin... end; function Max (a, b: integer): integer; begin... end; Max := a; function qq (a, b: integer): float; begin... end; function qq (a, b: integer): float; begin... end; var x, y: real; В Delphi: ! Result := a;

157 Программа program qq; var a, b, max: integer; begin writeln('Введите два числа'); read(a, b); max := Max ( a, b ); writeln('Наибольшее число ', max ); end. 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 Имена переменных, функций и процедур не должны совпадать! ! фактические параметры вызов функции

158 Задания «4»: Составить функцию, которая определяет сумму всех чисел от 1 до N и привести пример ее использования. Пример: Введите число: 100 сумма = 5050 «5»: Составить функцию, которая определяет, сколько зерен попросил положить на N-ую клетку изобретатель шахмат (на 1-ую – 1 зерно, на 2-ую – 2 зерна, на 3-ю – 4 зерна, …) Пример: Введите номер клетки: 28 На 28-ой клетке зерен.

159 Задания (вариант 2) «4»: Составить функцию, которая определяет наибольший общий делитель двух натуральных и привести пример ее использования. Пример: Введите два числа: НОД(14,21)=7 «5»: Составить функцию, которая вычисляет функцию синус как сумму ряда (с точностью 0.001) Пример: Введите угол в градусах: 45 sin(45) = x в радианах!

160 Логические функции Задача: составить функцию, которая определяет, верно ли, что заданное число – простое. Особенности: ответ – логическое значение ( 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 составное } 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; Как улучшить? ?

161 Логические функции program qq; var N: integer; begin writeln('Введите целое число'); read(N); if Prime(N) then writeln(N, ' – простое число') else writeln(N, ' – составное число'); end. 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

162 Задания «4»: Составить функцию, которая определяет, верно ли, что сумма его цифр – четное число. Пример: Введите число: 136 Сумма цифр четная. «5»: Составить функцию, которая определяет, верно ли, что в заданном числе все цифры стоят по возрастанию. Пример: Введите число: 258 Верно. Введите число: 528 Неверно. Введите число: 245 Сумма цифр нечетная.

163 Программирование на языке Паскаль Тема 13. Случайные числа © К.Ю. Поляков,

164 Случайные числа Случайные явления: везде… бросание монеты («орел» или «решка») падение снега Случайные числа – это такая последовательность чисел, для которой невозможно предсказать следующее даже зная все предыдущие. Проблема: как получить на компьютере? Возможные решения: использовать внешний источник шумовых помех с помощью математических преобразований

165 Генератор случайных чисел в Паскале Целые числа в интервале [0,N]: var x: integer; begin randomize;... x := random ( 100 ); { интервал [0,99] } Вещественные числа в интервале [0,1] var x: real;... x := random; { интервал [0,1] }

166 Конец фильма