Скачать презентацию Лекция 25 Тема 6 АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ Скачать презентацию Лекция 25 Тема 6 АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ

Лекция 25.pptx

  • Количество слайдов: 48

Лекция 25 Тема № 6 АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ Лекция 25 Тема № 6 АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ

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

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

Вариант 1. Программа program qq; var a, b, max: integer; begin writeln('Введите два целых Вариант 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 Условный оператор if <условие> then begin {что делать, если условие верно} end else begin {что делать, если условие неверно} end; Особенности: • перед else НЕ ставится точка с запятой • вторая часть (else …) может отсутствовать (неполная форма) • если в блоке один оператор, можно убрать слова begin и end 5

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

Вариант 2. Программа program qq; var a, b, max: integer; begin writeln('Введите два целых Вариант 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('Введите два Вариант 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 лет включительно. Ввести возраст Сложные условия Задача. Фирма набирает сотрудников от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он фирме (вывести ответ «подходит» или «не подходит» ). Особенность: надо проверить, выполняются ли два условия одновременно. ? Можно ли решить известными методами? 9

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

Вариант 1. Программа program qq; var x: integer; begin writeln('Введите возраст'); read ( x Вариант 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? Вариант 2. Алгоритм начало ввод x да x >= 25 и x <= 40? 'подходит' нет 'не подходит' конец 12

Вариант 2. Программа program qq; var x: integer; begin сложное writeln('Введите возраст'); условие read Вариант 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 • Сложные условия Порядок выполнения (приоритет = старшинство) • выражения в скобках • 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) Обобщенный порядок выполнения операций: 1) вычисления в круглых скобках; 2) вычисления значений функций; 3) унарные операции; 4) операции *, /, div, mod, and; 5) операции +, —, or, xor; 6) операции отношения =, <>, <, >, <=, >=.

Оператор выбора Структура оператора имеет следующий вид: case S of c 1: insruction 1; Оператор выбора Структура оператора имеет следующий вид: 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 Оператор выбора позволяет выбирать одно из нескольких возможных действий (операторов). Формат: case <выражение> of <список значений 1>: <оператор 1>; . . . <список значений n>: <оператор n>; [else <оператор>] end;

Правила оформления оператора выбора выражение (переключатель) должно иметь порядковый тип после списка значений должен Правила оформления оператора выбора выражение (переключатель) должно иметь порядковый тип после списка значений должен быть один оператор. Если в какой – либо ветви необходимо выполнить несколько операторов, то используется составной оператор.

Списки значений 1. могут содержать одно или несколько разделенных 2. 3. 4. 5. запятыми Списки значений 1. могут содержать одно или несколько разделенных 2. 3. 4. 5. запятыми возможных значений константных выражений; а также диапазоны значений; константы и константные выражения должны быть совместимы по типу с объявленным выражением; не могут включать переменные и многие функции; не должны пересекаться; должны располагаться в возрастающем порядке (рекомендовано для получения оптимального кода).

Определить порядок целого числа N от 0 до 999 Var N: integer; … Randomize; Определить порядок целого числа 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’. . ’ Определить тип символа 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. . 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 : = 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 : = 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 начальное значение переменная Программа 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 Цикл с переменной Увеличение переменной на 1: for <переменная> : = <начальное значение> to <конечное значение> do begin {тело цикла} end; Уменьшение переменной на 1: for <переменная> : = <начальное значение> downto <конечное значение> do begin {тело цикла} end; 31

Цикл с переменной Особенности: • переменная цикла может быть только целой (integer) • шаг Цикл с переменной Особенности: • переменная цикла может быть только целой (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 изменяется Как изменить шаг? – 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 изменяется Как изменить шаг? – 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 Алгоритм начало обнулить счетчик цифр ввод n count : = 0; выполнять «пока n <> 0» n <> 0? нет да count : = count + 1; n : = n div 10; count конец 39

Цикл с условием while <условие> do begin {тело цикла} end; Особенности: • можно использовать Цикл с условием 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('Введите целое Программа 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 Замена 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) и определить число цифр в Цикл с постусловием Задача: Ввести целое положительное число (<2000000) и определить число цифр в нем. Проблема: Как не дать ввести отрицательное число или ноль? Решение: Если вводится неверное число, вернуться назад к вводу данных (цикл!). Особенность: Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием). Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла. 44

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

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

Структура программы Pascal Program <имя программы>; Uses <имена подключаемых модулей>; label <раздел описания меток> Структура программы Pascal Program <имя программы>; Uses <имена подключаемых модулей>; label <раздел описания меток> const <раздел описаний констант>; type <раздел описаний типов>; var <раздел описаний переменных>; <описание подпрограмм>; begin <раздел операторов> end.

Раздел подключаемых модулей Используется в том случае, когда в программе применяются константы, переменные, процедуру Раздел подключаемых модулей Используется в том случае, когда в программе применяются константы, переменные, процедуру или функции, типы данных, определяемые в стандартных модулях или модулях, созданных пользователями. Формат: Uses <имена модулей через запятую> ; В этом предложении перечисляются модули, загружаемые программой Например: uses Sys. Utils;