
Лекция 25.pptx
- Количество слайдов: 48
Лекция 25 Тема № 6 АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ
Разветвляющиеся алгоритмы Задача. Ввести два целых числа и вывести на экран наибольшее из них. Идея решения: надо вывести на экран первое число, если оно больше второго, или второе, если оно больше первого. Особенность: действия исполнителя зависят от некоторых условий (если … иначе …). Алгоритмы, в которых последовательность шагов зависит от выполнения некоторых условий, называются разветвляющимися. 2
Вариант 1. Блок-схема начало блок «решение» ввод a, b да a > b? max: = a; полная форма ветвления нет max: = b; вывод max конец 3 ? Если a = b?
Вариант 1. Программа program qq; var a, b, max: integer; begin writeln('Введите два целых числа'); read ( a, b ); полная форма if a > b then begin условного max : = a; оператора end else begin max : = b; end; writeln ('Наибольшее число ', max); end. 4
Условный оператор if <условие> then begin {что делать, если условие верно} end else begin {что делать, если условие неверно} end; Особенности: • перед else НЕ ставится точка с запятой • вторая часть (else …) может отсутствовать (неполная форма) • если в блоке один оператор, можно убрать слова begin и end 5
Вариант 2. Блок-схема начало ввод a, b max: = a; да нет b > a? max: = b; вывод max конец 6 неполная форма ветвления
Вариант 2. Программа program qq; var a, b, max: integer; begin writeln('Введите два целых числа'); read ( a, b ); неполная форма max : = a; условного if b > a then оператора max : = b; writeln ('Наибольшее число ', max); end. 7
Вариант 2 Б. Программа program qq; var a, b, max: integer; begin writeln('Введите два целых числа'); read ( a, b ); max : = b; if a? ? ? b then > ? ? ? max : = a; writeln ('Наибольшее число ', max); end. 8
Сложные условия Задача. Фирма набирает сотрудников от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он фирме (вывести ответ «подходит» или «не подходит» ). Особенность: надо проверить, выполняются ли два условия одновременно. ? Можно ли решить известными методами? 9
Вариант 1. Алгоритм начало ввод x да да 'подходит' x <= 40? x >= 25? нет 'не подходит' конец 10 'не подходит'
Вариант 1. Программа program qq; var x: integer; begin writeln('Введите возраст'); read ( x ); if x >= 25 then if x <= 40 then writeln ('Подходит') else writeln ('Не подходит'); end. 11
Вариант 2. Алгоритм начало ввод x да x >= 25 и x <= 40? 'подходит' нет 'не подходит' конец 12
Вариант 2. Программа program qq; var x: integer; begin сложное writeln('Введите возраст'); условие read ( x ); if (x >= 25) and (x <= 40) then writeln ('Подходит') else writeln ('Не подходит') end. 13
Сложные условия Сложное условие – это условие, состоящее из нескольких простых условий (отношений), связанных с помощью логических операций: • not – НЕ (отрицание, инверсия) • and – И (логическое умножение, конъюнкция, одновременное выполнение условий) • or – ИЛИ (логическое сложение, дизъюнкция, выполнение хотя бы одного из условий) • xor – исключающее ИЛИ (выполнение только одного из двух условий, но не обоих) Простые условия (отношения) < <= > >= 14 равно = не равно <>
Сложные условия Порядок выполнения (приоритет = старшинство) • выражения в скобках • not • and • or, xor • <, <=, >, >=, =, <> Особенность – каждое из простых условий обязательно заключать в скобки. Пример 4 1 6 2 5 3 if not (a > b) or (c <> d) and (b <> a) then begin. . . end 15
Обобщенный порядок выполнения операций: 1) вычисления в круглых скобках; 2) вычисления значений функций; 3) унарные операции; 4) операции *, /, div, mod, and; 5) операции +, —, or, xor; 6) операции отношения =, <>, <, >, <=, >=.
Оператор выбора Структура оператора имеет следующий вид: case S of c 1: insruction 1; c 2: insruction 2; … cn: insruction. N; else instruction end; где S – выражение порядкового типа, значение которого вычисляется; с1, с2…. , сn – константы порядкового типа, с которыми сравнивается выражение S; instruction 1, …, instruction. N – операторы, из которых выполняется тот, с константой которого совпадает значение выражения S; instruction – оператор, который выполняется, если значение выражения S не совпадает ни с одной из констант c 1, с2…. сn. Данный оператор является обобщением условного оператора If для произвольного числа альтернатив. Существует сокращенная форма оператора, при которой ветвь else отсутствует.
ПРИМЕР: Вводится целое число, если это цифра, то определить четная она или нет, а если число, то определить попадает ли оно в диапазон от 10 до 100, если нет, то выдать соответствующее сообщение. program chislo; var i: integer; begin write('Введите целое число: '); readln(i); case i of 0, 2, 4, 6, 8 : writeln('Четная цифра'); 1, 3, 5, 7, 9 : writeln('Нечетная цифра'); 10. . . 100, 200 : writeln('Число от 10 до 100 или 200'); else writeln('Число либо отрицательное, либо > 100, но не 200'); end; readln end.
Оператор выбора позволяет выбирать одно из нескольких возможных действий (операторов). Формат: case <выражение> of <список значений 1>: <оператор 1>; . . . <список значений n>: <оператор n>; [else <оператор>] end;
Правила оформления оператора выбора выражение (переключатель) должно иметь порядковый тип после списка значений должен быть один оператор. Если в какой – либо ветви необходимо выполнить несколько операторов, то используется составной оператор.
Списки значений 1. могут содержать одно или несколько разделенных 2. 3. 4. 5. запятыми возможных значений константных выражений; а также диапазоны значений; константы и константные выражения должны быть совместимы по типу с объявленным выражением; не могут включать переменные и многие функции; не должны пересекаться; должны располагаться в возрастающем порядке (рекомендовано для получения оптимального кода).
Определить порядок целого числа N от 0 до 999 Var N: integer; … Randomize; N: =Random(1000); case N of 0. . 9: writeln('однозначное'); 10. . 99: writeln('двузначное'); 100. . 999: writeln('трехзначное') end;
Определить тип символа Var symbol: Char; … case symbol of ’ 0’. . ’ 9’: writeln('это цифра'); ’a’. . ’z’: writeln('стр. буква'); ’A’. . ’Z’: writeln('прописная буква') else writeln(‘Это др. символ’) end;
Var Year: Integer; … case Year of -500. . -400: writeln('Древнегреческий абак'); 480. . 500: begin writeln('Первые записи в десятичной'); writeln('системе счисления, которые'); writeln('были сделаны в Индии') end; 1642 : writeln('Сум. машина Б. Паскаля') else writeln(‘И прочее, прочее’) end;
Оператор перехода Назначение: передача управления оператору в программе, перед которым указана метка. Оператор должен использоваться в том блоке, где была описана метка. Причем управление должно передаваться оператору в том же блоке. Формат: goto <метка> При использовании оператора перехода в начале программы вводится Раздел описания меток. Формат: Label <имя меток через запятую>; Пример: Label met 1, met 2; Этот оператор противоречит принципам структурного программирования.
Циклы Цикл – это многократное выполнение одинаковой последовательности действий. • цикл с известным числом шагов • цикл с неизвестным числом шагов (цикл с условием) Задача. Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b). Особенность: одинаковые действия выполняются 8 раз. ? Можно ли решить известными методами? 26
Алгоритм начало задать начальное значение переменной цикла i : = 1; проверить, все ли сделали i <= 8? да i 2 : = i * i; i 3 : = i 2 * i; нет конец вычисляем квадрат и куб вывод результата i, i 2, i 3 перейти к следующему i i : = i + 1; 27
Алгоритм (с блоком «цикл» ) блок «цикл» начало конец i : = 1, 8 i 2 : = i * i; i 3 : = i 2 * i; тело цикла i, i 2, i 3 28
Программа program qq; var i, i 2, i 3: integer; begin начальное значение переменная цикла конечное значение for i: =1 to 8 do begin i 2 : = i*i; i 3 : = i 2*i; writeln(i, ’ ’, i 2, ’ ’, i 3); end. 29
Цикл с уменьшением переменной Задача. Вывести на экран квадраты и кубы целых чисел от 8 до 1 (в обратном порядке). Особенность: переменная цикла должна уменьшаться. Решение: for i: =8 downto 1 do begin i 2 : = i*i; i 3 : = i 2*i; writeln(i, ’ ’, i 2, ’ ’, i 3); end; 30
Цикл с переменной Увеличение переменной на 1: for <переменная> : = <начальное значение> to <конечное значение> do begin {тело цикла} end; Уменьшение переменной на 1: for <переменная> : = <начальное значение> downto <конечное значение> do begin {тело цикла} end; 31
Цикл с переменной Особенности: • переменная цикла может быть только целой (integer) • шаг изменения переменной цикла всегда равен 1 (to) или -1 (downto) • если в теле цикла только один оператор, слова begin и end можно не писать: for i: =1 to 8 do writeln('Привет'); • если конечное значение меньше начального, цикл (to) не выполняется ни разу (проверка условия в начале цикла, цикл с предусловием) 32
Цикл с переменной Особенности: • в теле цикла не разрешается изменять переменную цикла • при изменении начального и конечного значения внутри цикла количество шагов не изменится: n : = 8; for i: =1 to n do begin writeln('Привет'); нет n : = n + 1; зацикливания end; 33
Цикл с переменной Особенности: • после выполнения цикла во многих системах устанавливается первое значение переменной цикла, при котором нарушено условие: for i: =1 to 8 do writeln('Привет'); writeln('i=', i); for i: =8 downto 1 do writeln('Привет'); writeln('i=', i); 34 i=9 i=0
Как изменить шаг? Задача. Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9. Особенность: переменная цикла должна увеличиваться на 2. Проблема: в Паскале шаг может быть 1 или -1. Решение: for i: =1 to 9 do begin if i mod 2 = 1 then begin ? ? ? i 2 : = i*i; i 3 : = i 2*i; writeln(i, ’ ’, i 2, ’ ’, i 3); end; 35 выполняется только для нечетных i ? Что плохо?
Как изменить шаг? – II Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Начальное значение i равно 1, с каждым шагом цикла i увеличивается на 2. Решение: i : = ? ? ? 1; for k: =1 to 5 do begin i 2 : = i*i; i 3 : = i 2*i; writeln(i, ’ ’, i 2, ’ ’, i 3); ? ? ? i + 2; i : = end; 36
Как изменить шаг? – III Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Зная k, надо рассчитать i. k 1 2 3 4 5 i 1 3 5 7 9 Решение: for k: =1 to 5 do begin i ? ? ? 2*k – 1; : = i 2 : = i*i; i 3 : = i 2*i; writeln(i, ’ ’, i 2, ’ ’, i 3); end; 37 i = 2 k-1
Цикл с неизвестным числом шагов Пример: Отпилить полено от бревна. Сколько раз надо сделать движения пилой? Задача: Ввести целое число (<2000000) и определить число цифр в нем. Идея решения: Отсекаем последовательно последнюю цифру, увеличиваем счетчик. n count 123 0 12 1 1 2 0 3 Проблема: Неизвестно, сколько шагов надо сделать. Решение: Надо остановиться, когда n = 0, т. е. надо делать «пока n <> 0» . 38
Алгоритм начало обнулить счетчик цифр ввод n count : = 0; выполнять «пока n <> 0» n <> 0? нет да count : = count + 1; n : = n div 10; count конец 39
Цикл с условием while <условие> do begin {тело цикла} end; Особенности: • можно использовать сложные условия: while (a
Цикл с условием Особенности: • условие пересчитывается каждый раз при входе в цикл • если условие на входе в цикл ложно, цикл не выполняется ни разу a : = 4; b : = 6; while a > b do a : = a – b; • если условие никогда не станет ложным, программа зацикливается a : = 4; b : = 6; while a < b do d : = a + b; 41
Программа program qq; , n 1: integer; var n, count: integer; begin writeln('Введите целое число'); read(n); n 1 : = n; выполнять count : = 0; «пока n <> 0» while n <> 0 do begin count : = count 1; count : = count + +1; : = div 10; n n: = n ndiv 10; end; writeln('В числе ', n 1, ' нашли ', n, count, ' цифр'); end. Что плохо? 42 ?
Замена for на while и наоборот i : = 1; while i <= 10 do begin {тело цикла} i : = i + 1; end; for i: =1 to 10 do begin {тело цикла} end; i : = a; while i >= b do begin {тело цикла} i : = i - 1; end; for i: =a downto b do begin {тело цикла} end; Замена цикла for на while возможна всегда. Замена while на for возможна только тогда, когда можно заранее рассчитать число шагов цикла. 43
Цикл с постусловием Задача: Ввести целое положительное число (<2000000) и определить число цифр в нем. Проблема: Как не дать ввести отрицательное число или ноль? Решение: Если вводится неверное число, вернуться назад к вводу данных (цикл!). Особенность: Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием). Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла. 44
Цикл с постусловием: алгоритм начало ввод n тело цикла нет n > 0? условие ВЫХОДА да основной алгоритм блок «типовой процесс» конец 45
Программа program qq; var n: integer; begin repeat writeln('Введите положительное число'); read(n); условие ВЫХОДА until n > 0; until n. . . { основной алгоритм } end. Особенности: • тело цикла всегда выполняется хотя бы один раз • после слова until ("до тех пор, пока не…") ставится условие ВЫХОДА из цикла 46
Структура программы Pascal Program <имя программы>; Uses <имена подключаемых модулей>; label <раздел описания меток> const <раздел описаний констант>; type <раздел описаний типов>; var <раздел описаний переменных>; <описание подпрограмм>; begin <раздел операторов> end.
Раздел подключаемых модулей Используется в том случае, когда в программе применяются константы, переменные, процедуру или функции, типы данных, определяемые в стандартных модулях или модулях, созданных пользователями. Формат: Uses <имена модулей через запятую> ; В этом предложении перечисляются модули, загружаемые программой Например: uses Sys. Utils;