ЛЕКЦИЯ 5 «ЯЗЫКИ ПРОГРАММИРОВАНИЯ. ОПЕРАТОРЫ ВЕТВЛЕНИЯ И ОРГАНИЗАЦИИ ЦИКЛА» 1 СОСТАВНОЙ ОПЕРАТОР Составной оператор представляет собой совокупность произвольного числа операторов, отделенных друг от друга точкой с запятой, ограниченную операторными скобками begin и end: begin оператор 1; оператор 2; … end; Эта конструкция рассматривается в программе как один оператор. 2 ПОЛНЫЙ УСЛОВНЫЙ ОПЕРАТОР IF Формат: if <условие> then <оператор 1> else <оператор 2> ; Схема выполнения оператора: да оператор 1 <условие> нет оператор 2 <оператор 1> и <оператор 2> могут быть как простыми, так и составными операторами Условие – это некоторое логическое выражение. Например: A+B <> 0 K Mod 5 = 0 (A + 1 > B) or ( X = C ) 3 ПОЛНЫЙ УСЛОВНЫЙ ОПЕРАТОР IF: ПРИМЕРЫ 1) if a>=b then Max:=a else Max:=b; 2) if (х<= 0) And (y>5) then begin u:=х*х–2*y+3; v:=1/2*х+1 end else begin u:=1/3*х+2; v:=х*х+3*y–2 end; ! Перед словом else символ «;» не ставится НИКОГДА - ведь это разорвало бы оператор на две части 4 НЕПОЛНЫЙ УСЛОВНЫЙ ОПЕРАТОР IF Формат: if <условие> then <оператор 1>; Если условие истинно, то выполняется <оператор 1>, если ложно – оператор, следующий сразу за оператором if. Схема выполнения оператора: да <условие> нет оператор 1 5 НЕПОЛНЫЙ УСЛОВНЫЙ ОПЕРАТОР IF: ПРИМЕРЫ 1) If F mod 3 = 0 then write(i); 2) If (х<= 0) And (y>5) then begin u:=х*х–2*y+3; v:=1/2*х+1 end; 6 ПРИМЕР Задача. Ввести два целых числа и вывести на экран наибольшее из них. начало ввод a,b да a > b max:= a; нет max:= b; полная форма ветвления вывод max конец ? Если a = b? 7 ВАРИАНТ 1. ПРОГРАММА program qq; var a, b, max: integer; begin writeln('Введите два целых числа'); read ( a, b ); полная форма if a > b then условного max := a оператора else max := b; writeln ('Наибольшее число ', max); end. 8 ВАРИАНТ 2. БЛОК-СХЕМА начало ввод a,b max:= a; да b > a нет неполная форма ветвления max:= b; вывод max конец 9 ВАРИАНТ 2. ПРОГРАММА program qq; var a, b, max: integer; begin writeln('Введите два целых числа'); read ( a, b ); неполная форма max := a; условного if b > a then оператора max := b; writeln ('Наибольшее число ', max); end. 10 СЛОЖНЫЕ УСЛОВИЯ Сложное условие – это условие, состоящее из нескольких простых условий (отношений), связанных с помощью логических операций: •not – НЕ (отрицание, инверсия) •and – И (логическое умножение, конъюнкция, одновременное выполнение условий) •or – ИЛИ (логическое сложение, дизъюнкция, выполнение хотя бы одного из условий) •xor – исключающее ИЛИ (выполнение только одного из двух условий, но не обоих) Простые условия (отношения) < <= > равно >= = не равно <> 11 СЛОЖНЫЕ УСЛОВИЯ Порядок выполнения (приоритет) • выражения в скобках • not • and • or, xor • <, <=, >, >=, =, <> Особенность – каждое из простых условий обязательно заключается в скобки. Пример 4 1 6 2 5 3 if not (a > b) or (c <> d) and (b <> a) then begin ... end 12 СЛОЖНЫЕ УСЛОВИЯ Истинно или ложно логическое выражение при a := 2; b := 3; c := 4; 1) not (a > b) True 2) (a < b) and (b < c) True 3) not (a >= b) or (c = d) 4) (a < c) or (b < c) and (b < a) 5) (a < b) xor not (b > c) True True FALSE 13 СЛОЖНЫЕ УСЛОВИЯ: ПРИМЕР ИСПОЛЬЗОВАНИЯ Задача. Фирма набирает сотрудников в возрасте от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он фирме (вывести ответ «подходит» или «не подходит»). Особенность задачи. Необходимо проверить, выполняются ли одновременно два условия: возраст 25 и возраст 40. 14 СЛОЖНЫЕ УСЛОВИЯ АЛГОРИТМ: ВАРИАНТ 1 начало ввод x да да 'подходит' x <= 40? x >= 25? нет нет 'не подходит' 'не подходит' конец 15 СЛОЖНЫЕ УСЛОВИЯ ПРОГРАММА: ВАРИАНТ 1 program qq; var x: integer; begin writeln('Введите возраст'); read ( x ); if x >= 25 then if x <= 40 then writeln ('Подходит') else writeln ('Не подходит') else writeln ('Не подходит'); end. 16 СЛОЖНЫЕ УСЛОВИЯ АЛГОРИТМ: ВАРИАНТ 2 начало ввод x да x >= 25 и x <= 40? нет 'не подходит' 'подходит' конец 17 СЛОЖНЫЕ УСЛОВИЯ ПРОГРАММА: ВАРИАНТ 2 program qq; var x: integer; begin сложное writeln('Введите возраст'); условие read ( x ); if (x >= 25) and (x <= 40) then writeln ('Подходит') else writeln ('Не подходит') end. 18 ЗАДАЧА Телекомпания принимает заказы на размещение рекламы в телеэфире. Существует базовая цена на показ в эфире рекламного ролика длительностью 1 мин. Стоимость показа зависит от длительности показа ролика и от времени выхода в эфир. Если время выхода в эфир попадает в интервал от 17 до 24 час, к базовой цене применяется коэффициент 2. Если время выхода в эфир от 7 до 17 час, коэффициент равен 1, в ночное время от 24 до 7 час цена снижается на 40% от базовой. Составить программу определения стоимости показа рекламного ролика, если известна длительность показа ролика, базовая цена на показ 1 мин и время выхода в эфир. Исходные данные: С – базовая цена 1 мин рекламы в телеэфире; D – длительность показа ролика в минутах; T – время выхода рекламы в эфир. Требуется определить: ST – стоимость показа рекламного ролика . 19 РАСЧЕТНЫЕ ФОРМУЛЫ Стоимость показа рекламного ролика определяется как произведение длительности показа (в мин) на цену 1 мин показа. Цена 1 мин показа (C1) определяется как значение следующей функции от переменной T: C, если 7 T 17 C 1 C* 2, если 17 T 24 С* 0.6, если 0 T 7 0, если T 0 или T 24 Если время выхода в эфир попадает в интервал от 17 до 24 час, к базовой цене применяется коэффициент 2. Если время выхода в эфир от 7 до 17 час, коэффициент равен 1, в ночное время от 24 до 7 час цена снижается на 40% от базовой. Значение С1, равное нулю, означает, что время показа рекламы введено неверно. В этом случае результатом вычислений будет вывод на экран соответствующего сообщения. 20 АЛГОРИТМ С – базовая цена 1 мин рекламы в телеэфире; D – длительность показа ролика в минутах; T – время выхода рекламы в эфир. C, если 7 T 17 C 1 C* 2, если 17 T 24 С* 0.6, если 0 T 7 0, если T 0 или T 24 Начало C, D, T нет да T<0 или T>24 нет да C1 := 0 T<7 да C1 := C нет T <= 17 C1 := C*0.6 C1 := C*2 нет ST := C1*D да C1= 0 «Время введено неверно» ST Конец 21 Программа program Lab_2; var c , d , t , c1, st : real ; begin Writeln ( ' Введите базовую цену 1 мин рекламы ' ); Readln ( с ); Writeln ( ' Введите длительность рекламы в минутах ' ); Readln ( d ); Writeln ( ' Введите время начала демонстрации рекламы ' ); Readln ( t ); {выбор формулы для расчета значения c1} if (t < 0) or (t > 24) then c1 := 0 else if t < 7 then с1 := с * 0.6 else if t <= 17 then c1 := c else c1 := c * 2; if c1 = 0 then Writeln ( ' Время введено неверно ' ) else begin st := c1 * d; Writeln ( 'Стоимость рекламы =' , st:8:2) end; end. 22 ЦИКЛЫ Цикл – это последовательность операторов, которая может выполняться более одного раза. Для реализации циклических алгоритмов в языке Паскаль используются операторы повторения: оператор цикла с параметром (со счетчиком); оператор цикла с предусловием; оператор цикла с постусловием. Если количество повторов известно заранее, используется оператор цикла с параметром. Если количество повторов неизвестно, а задано некоторое условие окончания или продолжения цикла применяются оператор цикла с предусловием или оператор цикла с постусловием. 23 ЦИКЛ FOR Оператор For состоит из заголовка и тела цикла. Оператор может быть представлен в двух форматах: for <имя> := N1 to N2 do <оператор>; for <имя> := N1 downto N2 <оператор>; Цикл по возрастанию параметра do Здесь for … to … do (for … downto … do ) – заголовок цикла; <имя> – имя переменной–параметра цикла ; N1 – начальное значение параметра цикла; N2 – конечное значение параметра цикла; <оператор> – тело цикла. Цикл по убыванию параметра Тело цикла может быть простым или составным оператором. 24 СХЕМА ВЫПОЛНЕНИЯ ОПЕРАТОРА FOR Цикл по возрастанию параметра (for … to … do). Параметр цикла <имя> изменяется от N1 до N2 с шагом 1. вход <имя>:= N1, N2, 1 Цикл по убыванию параметра (for … downto… do). Параметр цикла <имя> изменяется от N1 до N2 с шагом -1. вход <имя>:= N1, N2, -1 <оператор> <оператор> выход выход При каждом значении параметра выполняется <оператор>. 25 ПРИМЕР ИСПОЛЬЗОВАНИЯ ОПЕРАТОРА FOR Вывести на экран числа от 1 до 10 сначала в прямом порядке, затем – в обратном порядке. program Prim ; var k : byte; begin {В прямом порядке} for k := 1 to 10 do Writeln ( k ) ; {В обратном порядке} for k := 10 downto 1 do Writeln ( k ) ; end. 26 ПРИМЕРЫ 1.Сколько раз выполнится цикл? 2. Чему будет равно значение переменной a после выполнения цикла? a := 1; for i:=1 to 3 do a := a+1; 3 раза a= 4 a := 1; for i:=3 to 1 do a := a+1; 0 раз a= 1 a := 1; for i:=1 downto 3 do a := a+1; 0 раз a= 1 a := 1; for i:=3 downto 1 do a := a+1; 3 раза a= 4 27 КАК ИЗМЕНИТЬ ШАГ? Задача. Вывести на экран значения нечётных целых чисел от 1 до 9. Особенность: переменная цикла должна изменяться с шагом 2. Проблема: в Паскале шаг может быть равен 1 или -1. Решение for i:=1 to 9 do if i mod 2 = 1 then writeln(i); ? выполняется только для нечетных i Что плохо? 28 КАК ИЗМЕНИТЬ ШАГ? Идея. Для хранения нечетных чисел используем переменную k, отличную от переменной i (параметра цикла). Переменная i изменяется от 1 до 5. Начальное значение k равно 1, с каждым шагом цикла k увеличивается на 2. Решение k := 1; for i := 1 to 5 do begin writeln(k); k := k + 2; end; 29 ОПЕРАТОР ЦИКЛА С ПРЕДУСЛОВИЕМ Формат оператора: while <условие> do begin {тело цикла} end; Схема выполнения оператора: Последовательность действий при выполнении цикла: 1. Проверяется истинно ли <условие>. <условие> да оператор нет 2. Если это так, то выполняется оператор тела цикла. 3. Пункты 1 и 2 выполняются до тех пор, пока <условие> не станет ложным. 30 ОПЕРАТОР ЦИКЛА С ПРЕДУСЛОВИЕМ Особенности оператора: • условие окончания цикла может быть выражено переменной, константой или выражением, имеющим логический тип. • можно использовать сложные условия: while (a<b) and (b<c) do begin {тело цикла} end; • если в теле цикла только один оператор, слова begin и end можно не писать: while a < b do a := a + 1; 31 ОПЕРАТОР ЦИКЛА С ПРЕДУСЛОВИЕМ Особенности оператора: • условие пересчитывается каждый раз при входе в цикл; • если условие на входе в цикл ложно, цикл не выполняется ни разу: a := 4; b := 6; while a > b do a := a – b; • если условие никогда не станет ложным, программа зацикливается: a := 4; b := 6; while a < b do d := a + b; 32 ПРИМЕРЫ 1.Сколько раз выполнится цикл? 2. Чему будет равно значение переменной a после выполнения цикла? 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; зацикливание 33 ОПЕРАТОР ЦИКЛА С ПОСТУСЛОВИЕМ Оператор используется, когда количество повторений заранее неизвестно, а задано некоторое условие выхода из цикла. Формат оператора: Repeat <оператор 1>; ... <оператор K> Until <условие>; Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла. 34 ОПЕРАТОР ЦИКЛА С ПОСТУСЛОВИЕМ Схема выполнения оператора: Последовательность действий при выполнении цикла: оператор 1 1. Выполняются <оператор 1>, … <оператор K>. оператор K 2. Проверяется <условие>. Если оно ложно, то выполняется возврат к метке Repeat, т.е. к выполнению операторов тела цикла. <условие> нет да 3. Пункты 1 и 2 выполняются до тех пор, пока <условие> не станет истинным. 35 ОПЕРАТОР ЦИКЛА С ПОСТУСЛОВИЕМ Пример. С клавиатуры вводится целое число x. По условию задачи требуется, чтобы число было в диапазоне от 10 до 50. Организовать проверку вводимого значения на соответствие условию. Комментарий Программа При входе в цикл выполняется оператор program Prim; Write, который выводит на экран подсказку «Ввод числа». Оператор var x : integer; Readln ( x ) вводит в переменную x begin число. Затем проверяется выполнение repeat условия (x >= 10) and (x <= 50). Если введено число из диапазона 10 – 50, Write('Ввод числа'); условие выполняется и происходит Readln ( x ) ; выход из цикла. Если введено число, не until (x >= 10) and удовлетворяющее заданному условию, управление передается на начало цикла. (x<= 50); Вновь выводится подсказка, вводится . . . новое число, и так будет продолжаться end. до тех пор, пока не будет введено число из диапазона 10 – 50. 36 СКОЛЬКО РАЗ ВЫПОЛНИТСЯ ЦИКЛ? a := 4; b := 6; repeat a := a + 1; until a > b; a := 4; b := 6; repeat a := a + b; until a > b; a := 4; b := 6; repeat a := a + b; until a < b; 3 раза a=7 1 раз a = 10 зацикливание 37 МАССИВЫ Массив – это последовательность однотипных данных, объединенная общим именем, элементы которой отличаются индексами. Индекс элемента указывает место (номер) элемента в массиве. Особенности: • все элементы имеют один тип; • весь массив имеет одно имя; • все элементы расположены в памяти рядом. Примеры: • список студентов в группе; • номера квартир в доме; • данные о температуре воздуха за год. 38 ОДНОМЕРНЫЕ МАССИВЫ 4 5 10 33 15 15 20 25 A[2] A[3] A[4] A[5] 1 2 5 A[1] ЗНАЧЕНИЕ элемента массива НОМЕР (ИНДЕКС) элемента массива: 2 A[2] ЗНАЧЕНИЕ элемента массива: 10 39 ОБЪЯВЛЕНИЕ ОДНОМЕРНЫХ МАССИВОВ Зачем объявлять? • определить имя массива; • определить тип массива; • определить число элементов; • выделить место в памяти. Массив целых чисел: Имя массива начальный индекс конечный индекс тип элементов var A : array[ 1..5 ] of integer ; 40 ОБЪЯВЛЕНИЕ ОДНОМЕРНЫХ МАССИВОВ Массивы других типов: var X, Y: array [1..10] of real; C: array [1..20] of char; Другой диапазон индексов: var Q: array [0..9] of real; C: array [-5..13] of char; 41 ЧТО НЕПРАВИЛЬНО? var a: array[1..10] of integer; ... A[5] := 4.5; var a: array [0..9] of integer; ... A[10] := 5; 42 ОДНОМЕРНЫЕ МАССИВЫ Объявление: var a: array[1..100] of integer; i, n: integer; Вывод на экран: for i:=1 to n do begin write('a[',i,']='); read (a[i]); end; Ввод с клавиатуры: writeln('Массив A:'); for i:=1 to N do write(a[i]:4); a[1] = a[2] = a[3] = a[4] = a[5] = 5 12 34 56 13 ? Почему write? Массив A: 10 24 68 112 26 43 ДВУМЕРНЫЕ МАССИВЫ Двумерный массив – это массив, у которого в описании указаны два индекса. Двумерный массив можно рассматривать как матрицу или таблицу, в которой каждый элемент однозначно определяется номером строки и номером столбца, на пересечении которых он находится. Первый индекс – номер строки, второй индекс – номер столбца. a [ 1, 1 ] a [ 1, 2 ] a [ 1, 3 ] a [ 2, 1] a [ 2, 2 ] a [ 2, 3 ] a [ 3, 1 ] a [ 3, 2 ] a [ 3, 3 ] 44 ДВУМЕРНЫЕ МАССИВЫ Доступ к каждому конкретному элементу массива осуществляется по имени с указанием значений индексов элемента: a [ 1, 2 ] – элемент массива, расположенный на пересечении строки с номером 1 и столбца с номером 2. Двумерный массив можно объявить, например, следующим образом: var a : array [ 1 .. 10, 1 .. 10 ] of integer; Здесь объявляется двумерный массив a, содержащий данные типа integer, состоящий из 10 строк и 10 столбцов. 45