Сипаренко О. И. Программирование на






















































2_Условный оператор 2 часть.ppt
- Количество слайдов: 54
Сипаренко О. И. Программирование на Паскале Часть 2
Условный оператор Урок 1
Линейный алгоритм Все рассмотренные ранее задачи имеют линейный алгоритм решения. Линейный алгоритм – алгоритм, в котором все действия (операторы) выполняются в том порядке, в котором они записаны (в программе). Одним из способов записи алгоритмов является графический – в виде блок-схем.
Блок-схема линейного алгоритма действие 1 действие 2 . . . действие n
Блок-схемы (основные блоки) Наименование Обозначение Содержание Процесс Обработка информации (присваивание, вычисление) Принятие решения Логический блок проверки истинности или ложности некоторого решения Ввод/вывод данных Ввод или вывод информации Начало, конец Начало или конец программы Цикл (подготовка) Организация циклического процесса
Пример Задача Даны стороны прямоугольника. Найти его периметр. начало ввод a, b p: =(a+b)*2 вывод p конец
Разветвляющийся алгоритм Полное ветвление да нет условие действие 1 действие 2
Разветвляющийся алгоритм Неполное ветвление да нет условие действие
Условный оператор позволяет реализовать ветвление. Полное ветвление If <условие> then <оператор 1> else <оператор 2>; Неполное ветвление If <условие> then <оператор>; На месте оператора может стоять любой из операторов, в том числе и условный, но оператор должен быть только один.
Примеры Полное ветвление Неполное ветвление readln (x); x: =0; if x>0 then y: =y+x if x>0 then writeln (‘x=‘, else y: =y-x; x);
Решение задач Задача 1. Напишите программу, которая будет считывать значение целой переменной k и определить, является k четным числом или нечетным. var k: integer; begin readln(k); if k mod 2 = 0 then writeln (‘четное’) else writeln (‘нечетное’); end.
Решение задач Задача 2. Напишите программу, которая будет считывать значение переменных a и b и распечатывать сначала меньшее из двух значений, а потом большее. var a, b: integer; begin readln(a, b); if a
Составной оператор В условном операторе как после then, так и после else может стоять только один оператор, поэтому если необходимо использовать не один оператор, а несколько, то используется составной оператор. Пример: if x<0 then begin i: =i+1; x: =x-1; end else i: =i-1; Слова begin и end называются операторными скобками.
Решение задач Задача 3. Напишите программу, которая из двух введенных целых чисел будет удваивать меньшее из чисел и уменьшать на 2 значение большего из чисел. var a, b: integer; begin readln (a, b); if a
Если после then в качестве оператора стоит условный оператор, то возможна такая конструкция: if <условие 1> then if <условие 2> then <оператор 1> else <оператор 2>; К какому if относится else? else всегда относится к ближайшему if В данной конструкции первый оператор неполный (без else), а второй полный.
Если требуется, чтобы первый оператор был полным, а второй – неполным: If <условие 1> then begin if <условие 2> then <оператор 1> end else <оператор 2>; If <условие 1> then if <условие 2> then <оператор 1> else <оператор 2>;
Правила применения 1. Перед else знак ; не ставится никогда! 2. Рассмотрим фрагмент программы: if <условие> then ; begin s 1; s 2; s 3; end; Составной оператор будет выполняться всегда, так как условный оператор пустой.
Правила применения 3. Пусть n условий исчерпывают все возможные случаи, например, x<2, x=2, x>2. Тогда вызов операторов, соответствующих каждому из случаев, можно запрограммировать двумя способами: if x<2 then s 1; if x<2 then s 1 if x=2 then s 2; else if x=2 then s 2 if x>2 then s 3; else s 3; Первый способ нагляднее, но во втором не делаются лишние проверки. Почему во втором случае не проверяется условие x>2?
Решение задач Задача 4. Напишите программу, которая будет считывать значение нецелой переменной x и будет печатать значение следующей функции от x: readln(x); if x<0 then sign: =-1 else if x=0 then sign: =0 else sign: =1; writeln (x);
Решение задач Задача 5. Напишите программу для решения уравнения ax=b относительно x. Учтите, что a может принимать любые значения, в том числе и 0. readln(a, b); if a<>0 then writeln (b/a: 0: 2); else if b=0 then writeln (‘x-любое’) else writeln (‘корней нет’);
Решение задач Тесты к задаче 5: № a b x 1 2 4 2 2 0 3 нет решения 3 3 0 0 4 0 0 x - любое 5 -2 1 -0. 5 6 2 -3 -1. 5
Решение задач Задача 6. Напишите программу, которая будет считывать значение переменных a, b и c и распечатывать их в порядке возрастания. Решите задачу двумя способами: не используя операторы присваивания; используя операторы присваивания. В первом случае нужно в зависимости от значений переменных печатать их в соответствующем порядке, а во втором – значения нужно переместить так, чтобы в переменной a оказалось минимальное значение, в c – максимальное, а в b – среднее. Оператор печати в этом случае должен быть один: writeln (a, b, c).
Решение задач Тесты к задаче 6: № a b c 1 1 2 2 2 1 3 2 3 2 1 3 4 2 3 1 5 3 1 2 6 3 2 1
Решение задач Задача 6. Первый способ: if a
Решение задач Задача 6. Второй способ: if a>b then begin d: =a; a: =b; b: =d; end; if b>c then begin d: =c; c: =b; b: =d; end; If a>b then begin d: =a; a: =b; b: =d; end;
Логический тип данных Урок 2
Логический тип данных Множество значений логического тип boolean содержит всего два элемента – false (ложь) и true (истина). Логические значения получаются также в результате выполнения операций сравнения: =, <>, <, >, <=, >=. Условия – частный случай выражения со значениями логического типа. Подобные выражения можно присваивать переменным типа boolean и выводить на экран.
Логический тип данных Кроме операций сравнения В Паскале имеются 4 логические операции: отрицание – NOT, логическое умножение – AND, логическое сложение – OR, исключающее «или» - XOR. Приоритеты логических операций: 1) NOT 2) AND 3) OR 4)XOR Логический результат дает стандартная функция odd(x), для целого x. odd(x)=true, если x нечетно; odd(x)=false, если x четно.
Операция НЕ (инверсия) 29 Если высказывание A истинно, то «не А» ложно, и наоборот. также: , А не А not A (Паскаль), ! A (Си) 0 1 таблица истинности 1 0 операции НЕ Таблица истинности логического выражения Х – это таблица, где в левой части записываются все возможные комбинации значений исходных данных, а в правой – значение выражения Х для каждой комбинации.
Операция И (логическое умножение, конъюнкция) Высказывание «A и B» истинно тогда и только тогда, когда А и B истинны одновременно. также: A·B, A B, A and B (Паскаль), A B Аи. B A && B (Си) 0 0 1 0 2 1 0 0 3 1 1 1 A B конъюнкция – от лат. conjunctio — соединение
Операция ИЛИ (логическое сложение, дизъюнкция) 31 Высказывание «A или B» истинно тогда, когда истинно А или B, или оба вместе. также: A+B, A B, A or B (Паскаль), A B А или B A || B (Си) 0 0 0 1 1 0 1 1 1 дизъюнкция – от лат. disjunctio — разъединение
Операция «исключающее ИЛИ» 32 Высказывание «A B» истинно тогда, когда истинно А или B, но не оба одновременно. также: A xor B (Паскаль), A B А B A ^ B (Си) 0 0 0 1 арифметическое сложение, 1+1=2 1 0 1 остаток 1 1 0 сложение по модулю 2: А B = (A + B) mod 2
Логические выражения В логических выражениях могут встречаться как арифметические операции, так и логические. Порядок выполнения операций определяется их приоритетом: 1. not; 2. *, /, div, mod, and; 3. +, -, or, xor; 4. =, <>, <, >, <=, >=. Операции с одинаковым приоритетом выполняются по порядку слева направо. Для изменения приоритета операций применяют круглые скобки.
Логические выражения Нередко при составлении программ со сложными логическими условиями нужно строить их отрицания. Полезно воспользоваться таблицей: Условие Противоположное условие a= b a>b a <= b a=b a <> b not a = a; not (a and b) = not a or not b; not (a or b) = not a and not b
Упражнения Определить значение следующих выражений при x=0 y=-1 z=1 1. (x<0) or (y<0) 1. true 2. (x=0) and (y<>0) 2. true 3. (y<>1) and (z<>1) 3. false 4. (y<>1) and (z<>1) or (x<>1) 4. true 5. (y=1) or (x<>1) and (z<>1) 5. false
Упражнения Запишите на Паскале логические выражения, истинные, если: 1. x лежит на отрезке от a до b 2. числа a и b имеют разные знаки 3. числа a и b равны нулю 4. только одно из чисел a или b равно нулю 5. хотя бы одно из чисел a или b равно нулю. 1. (x>=a) and (x<=b) 2. (a*b)<0 3. (a=0) and (b=0) 4. (a=0) and (b<>0) or (b=0) and (a<>0) 5. (a=0) or (b=0)
Вычислить значение логического выражения при следующих значениях логических величин A, B и C: А = истина, В = ложь, С = ложь: 1) А или В, 2) А и В, 3) В или С истина ложь Вычислить значение логического выражения при следующих значениях логических величин A, B и C: А = истина, В = ложь, С = ложь: 1) А или В и не С истина 2) не А и не В ложь 3) не (А и С) или В истина 4) А и не В или С истина 5) А и (не В или С) истина 6) А и (не (В или С)) истина
Записать условие, которое является истинным, когда 1. Каждое из чисел А и В больше 100; (А>100) and (B>100) 2. Только одно из чисел А и В четное (А mod 2=0) and (B mod 2 <>0) or (А mod 2=<>0) and (B mod 2 =0) 3. Хотя бы одно из чисел А и В положительно (А>0) or (B >0) 4. Каждое из чисел А, В , С кратно трем (А mod 3=0) and (B mod 3=0) and (C mod 3 =0) 5. Только одно из чисел А, В, С меньше 50 (А <50) and (B >50) and (C >50) or (А >50) and (B <50) and (C >50) or (А >50) and (B >50) and (C <50) 6. Хотя бы одно из чисел А, В, С отрицательно (А <0) or (B <0) or (C <0)
Правила применения 4. Рассмотрим условный оператор: if a=c then b: =true else b: =false Такая запись – избыточна. Надо применять выражение: b: =a=c Аналогично, вместо if b=true then <оператор> Нужно писать if b then <оператор>
Упражнения Взаимное расположение точки и прямой y > f(x) Если уравнение прямой y=f(x), то в зависимости от координат точки (x 0, y 0): 1. точка лежит на прямой, y < f(x) если y 0=f(x 0); 2. точка лежит в верхней y = f(x) полуплоскости, если y 0>f(x 0) 3. точка лежит в нижней полуплоскости, если y 0
Решение задач Задача 1. Напишите программу, которая позволит определять, принадлежит ли точка с координатами (x, y) заштрихованной области, включая ее границы. y readln (x, y); x if (x>=-3) and (y>=0) and (y<=-x) then writeln (‘принадлежит’) y=−x else writeln (‘не принадлежит’); x=− 3
Решение задач Задача 2. По введенному номеру года – положительному целому числу, не превосходящему 10000, требуется определить, является ли данный год високосным. Напомним, что високосными являются года, номера которых кратны 4, но не кратны 100, а также года, номера которых кратны 400. Выведите YES или NO в зависимости от ответа задачи. readln (a); if (a mod 400=0) or ((a mod 4=0) and (a mod 100<>0)) then writeln (‘YES’) else writeln (‘NO’);
Решение задач Задача 3. Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит 8. По введенным координатам двух полей (k, l) и (m, n) выясните угрожает ли ферзь, расположенный на поле (k, l), полю (m, n). 8 7 6 k 5 f 1. горизонталь m=k 4 2. вертикаль n=l 3 3. диагонали abs(k-m)=abs(l-n) 2 1 2 3 4 5 6 7 8 l
Решение задач Задача 3. readln (k, l); readln (m, n); if (abs(k−m) = abs(l−n)) or (k=m) or (l=n) then writeln (‘yes’) else writeln (‘no’);
Решение задач Задача 4. Решить в действительных числах уравнение ax 2 + bx + c = 0. Вводятся значения a, b, c (a, b, c целые, по модулю не превосходят 100). Выдать код ситуации и значения корней: − 1 – бесконечное множество решений; 0 – нет действительных корней; 1 – уравнение вырождается в линейное, выдать x; 2 – уравнение квадратное, два различных корня, выдать x 1 и x 2; 3 – уравнение квадратное, кратный корень, выдать x.
Решение задач Задача 4. Тесты № a b c выход 1 0 0 0 − 1 2 0 0 1 0 3 0 2 4 1 x=− 2 4 1 2 3 0 5 1 2 1 3 x=− 1 6 1 4 3 2 x 1=− 1 x 2=− 3 7 0 2 0 1 x=0 8 3 5 2 2 x 1=− 0. 67 x 2=− 1
if a=0 then if b=0 then if c=0 then writeln (− 1) else writeln (0) else writeln (‘ 1 ‘, −c/b) else {a<>0} begin d: =b*b− 4*a*c; if d<0 then writeln (0) else {d>=0} if d>0 then begin x 1: =(−b+sqrt(d))/(2*a); x 2: =(−b−sqrt(d))/(2*a); writeln (‘ 2 ‘, x 1: 0: 2, ’ ‘, x 2: 0: 2) end else writeln (‘ 3 ‘, −b/(2*a): 0: 2) end;
Решение задач Задача 5. Задание C 1 КИМ ЕГЭ 2008 г. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы.
Решение задач Программист торопился и написал программу неправильно. var x, y: real; begin readln (x, y); if y<=4–x then if y>=1 then if y<=x*x then write('принадлежит') else write('не принадлежит') end.
Последовательно выполните следующее: Приведите пример таких чисел x, y, при которых программа работает неправильно. if y<=4–x then if y>=1 then if y<=x*x then write('принадлежит') else write('не принадлежит') Пример: x= – 2, y=3 Любая пара (x, y), для которой выполняется: y>4–x или y<1 или (y<=4–x и y>=1 и y<=x 2 и x<=– 1)
Последовательно выполните следующее: Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. Необходимо исправить две ошибки: 1. Неправильное использование условного оператора, в результате чего при невыполнении первого или второго условия программа не выдавала ничего (отсутствуют случаи else). 2. Приведенным трем ограничениям удовлетворяют также те точки плоскости, у которых (y<=4–x) и (y>=1) и (y<=x 2) и (x<= – 1). if (y<=4–x) and (y>=1) and (y<=x*x) and (x>=1) then write('принадлежит') else write('не принадлежит')
Домашняя работа Задача 1. Напишите программу, которая позволит определять, принадлежит ли точка с координатами (x, y) заштрихованной области, включая ее границы. y readln (x, y); x if (x<=2)and(y>=0)and(x>=0)and((x*x+y*y)<=4) or (x<=0)and(y<=0)and((x*x+y*y)<=4) then writeln (‘принадлежит’) x 2+y 2= 4 x=2 else writeln (‘не принадлежит’);
Домашняя работа Задача 3. Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит 8. По введенным координатам двух полей (k, l) и (m, n) выясните являются ли эти полями одного цвета. 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8
Домашняя работа Задача 3. Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит 8. По введенным координатам двух полей (k, l) и (m, n) выясните являются ли эти полями одного цвета. Сумма координат клеток одного цвета обладает одной и той же четностью (для одних клеток эта сумма четная, а для клеток другого цвета − нечетная) if ((k+l) mod 2) = ((m+n) mod 2) then writeln (‘YES’) else writeln (‘NO’);

