Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Занятие 1. Разветвляющиеся алгоритмы. Оператор условия If.
Разветвляющиеся алгоритмы До сих пор Вы использовали линейные алгоритмы, т.е. алгоритмы, в которых все этапы решения задачи выполняются строго последовательно. Сегодня Вы познакомитесь с разветвляющимися алгоритмами. Определение. Разветвляющимся называется такой алгоритм, в котором выбирается один из нескольких возможных вариантов вычислительного процесса. Каждый подобный путь называется ветвью алгоритма. Признаком разветвляющегося алгоритма является наличие операций проверки условия. Различают два вида условий – простые и составные. Простым условием (отношением) называется выражение, составленное из двух арифметических выражений или двух текстовых величин (иначе их еще называют операндами), связанных одним из знаков: < - меньше, чем... > - больше, чем... < = - меньше, чем... или равно > = - больше, чем... или равно < > - не равно = - равно Например, простыми отношениями являются следующие: x-y> 10; k< =sqr(c)+abs(a+b); 9< > 11; ‘мама’< > ‘папа’. В приведенных примерах первые два отношения включают в себя переменные, поэтому о верности этих отношений можно судить только при подстановке некоторых значений: если х=25, у=3, то отношение x-y> 10 будет верным, т.к. 25-3> 10 если х=5, у=30, то отношение x-y> 10 будет неверным, т.к. 5-30< 10 Проверьте верность второго отношения при подстановке следующих значений: а) k=5, a=1, b=-3, c=-8 b) k=65, a=10, b=-3, c=2 Определение. Выражения, при подстановке в которые некоторых значений переменных, о нем можно сказать истинно (верно) оно или ложно (неверно) называются булевыми (логическими) выражениями. Примечание. Название “булевые” произошло от имени математика Джорджа Буля, разработавшего в XIX веке булевую логику и алгебру логики. Определение. Переменная, которая может принимать одно из двух значений: True (правда) или False (ложь), называется булевой (логической) переменной. Например, К: =True; Flag: =False; Second: =a+sqr(x)> t Рассмотрим пример. Задача. Вычислить значение модуля и квадратного корня из выражения (х-у). Для решения этой задачи нужны уже знакомые нам стандартные функции нахождения квадратного корня - Sqr и модуля - Abs. Поэтому Вы уже можете записать следующие операторы присваивания: Koren: =Sqrt(x-y); Modul: =Abs(x-y). В этом случае программа будет иметь вид: Program Znachenia; Uses Crt; Var x, y: integer; Koren, Modul: real; Begin ClrScr; write (‘Введите значения переменных х и у через пробел ‘); read (x, y); Koren: =Sqrt(x-y); Modul: =Abs(x-y). write (‘Значение квадратного корня из выражения (х-у) равно ‘); write (‘Значение модуля выражения (х-у) равно ‘); readln; End. Казалось бы задача решена. Но мы не учли области допустимых значений для нахождения квадратного корня и модуля. Из курса математики Вы должны знать, что можно найти модуль любого числа, а вот значение подкоренного выражения должно быть неотрицательно (больше или равно нулю). Поэтому наша программа имеет свою допустимую область исходных данных. Найдем эту область. Для этого запишем неравенство х-у> =0 и решив его получим х> =у. Значит, если пользователем нашей программы будут введены такие числа, что при подстановке значение этого неравенства будет равно True, то квадратный корень из выражения (х-у) извлечь можно. А если значение неравенства будет равно False, то выполнение программы закончится аварийно. Задание. Наберите текст программы. Протестируйте программу со следующими значениями переменных и сделайте вывод. а) х=23, у=5; б) х=-5, у=15; в) х=8, у=8. Каждая программа, насколько это возможно, должна осуществлять контроль за допустимостью величин, участвующих в вычислениях. Здесь мы сталкиваемся с разветвлением нашего алгоритма в зависимости от условия. Для реализации таких условных переходов в языке Паскаль используют операторы If и Else, а также оператор безусловного перехода Goto. Рассмотрим оператор If. Для нашей задачи нужно выполить следующий алгоритм: если х> =у, то вычислить значение квадратного корня, иначе выдать на экран сообщение об ошибочном введении данных. Запишем его с помощью оператора If. Это будет выглядеть так. if x> =y Then Koren: =Sqr(x-y) Else write (‘Введены недопустимые значения переменных‘); Теперь в зависимости от введенных значений переменных х и у, условия могут выполняться или не выполняться. В общем случае полная форма конструкции условного оператора имеет вид: if < логическое выражение> Then < оператор 1> Else < оператор 2> Условный оператор работает по следующему алгоритму. Сначала вычисляется значение логического выражения, расположенного за служебным словом IF. Если его результат истина, выполняется < оператор 1>, расположенный после слова THEN, а действия после ELSE пропускаются; если результат ложь , то, наоборот, действия после слова THEN пропускаются, а после ELSE выполняется < оператор 2>. Управляющая структура if может показаться негибкой, так как выполняемые действия могут быть описаны только одним оператором. Иногда может потребоваться выполнение последовательности операторов. В этом случае хотелось бы заключить всю последовательность в воображаемые скобки. В Паскале предусмотрен этот случай. Если в качестве оператора должна выполниться серия операторов, то они заключаются в операторные скобки begin-end. Конструкция Begin... End называется составным оператором. if < логическое выражение> Then Begin оператор 1; оператор 2; ... End Else Begin оператор 1; оператор 2; ... end; Определение. Составной оператор - объединение нескольких операторов в одну группу. Группа операторов внутри составного оператора заключается в операторные скобки (begin-end). begin оператор 1; оператор 2; end; С учетом полученных знаний преобразуем нашу программу. Program Znachenia; Uses Crt; Var x, y: integer; Koren, Modul: real; Begin ClrScr; write (‘Введите значения переменных х и у через пробел ‘); read (x, y); if x> =y Then Begin Koren: =Sqr(x-y) Modul: =Abs(x-y) write (‘Значение квадратного корня из выражения (х-у) равно ‘); write (‘Значение модуля выражения (х-у) равно ‘); End Else write (‘Введены недопустимые значения переменных‘); readln; End. Составным оператором является и такой оператор begin S: =0; end. Cимвол “; ” в данном случае разделяет оператор присваивания S: =0 и пустой оператор. Пустой оператор не влечет никаких действий и в записи программы никак не обозначается. Например, составной оператор begin end. включает лишь один пустой оператор. Если Вы обратили внимание, программа на языке Паскаль всегда содержит один составной оператор – раздел операторов программы. Внимание ! Перед служебным словом Else разделитель (точка с запятой) не ставится.
Отметим, что большинство операторов в программах на языке Паскаль заканчиваются точкой с запятой, но после некоторых операторов точка с запятой не ставится. Сформулируем общие правила употребления точки с запятой: 1. Каждое описание переменной и определение константы заканчиваются точкой с запятой. 2. Каждый оператор в теле программы завершается точкой с запятой, если сразу за ним не следуют зарезервированные слова End, Else, Until. 3. После определенных зарезервированных слов, таких, как Then, Else, Var, Const, Begin, никогда не ставится точка с запятой. Рассмотрим еще один пример. Задача. Вывести на экран большее из двух данных чисел. Program Example1; Var x, y: integer; {вводимые числа} Begin writeln(‘Введите 2 числа ‘); {вводим два целых числа через пробел} readln(x, y); if x> y Then writeln (x) {если х больше y, то выводим х} Else writeln (y) {иначе выводим y} readln; End.
Можно также использовать и сокращенную (неполную) форму записи условного оператора. Эта форма используется тогда, когда в случае невыполнения условия ничего делать не надо. Неполная форма условного оператора имеет следующий вид. if < логическое выражение> Then < оператор> Тогда если выражение, расположенное за служебным словом IF. в результате дает истину, выполняются действия после слова THEN, в противном случае эти действия пропускаются. Задача. Составить программу, которая, если введенное число отрицательное меняет его на противоположное. Program Chisla; Var x: integer; {вводимое число} Begin writeln(‘Введите число ‘); {вводим целое число} readln(x); if x< 0 Then x: =-x; writeln (x); readln; End.
Выберите из предложенного ниже списка задачи для самостоятельного решения. 1. Если целое число М делится нацело на целое число N, то вывести на экран частное от деления, в противном случае вывести сообщение М на N нацело не делится. 2. Запишите условный оператор, в котором значение переменной с вычисляется по формуле a+b, если а – нечетное и a*b, если а – четное. 3. Вычислить значение функции: у= 4. Написать программу для подсчета суммы только положительных из трех данных чисел. 5. Даны три числа. Написать программу для подсчета количества чисел, равных нулю. 6. Напишите программу, упростив следующий фрагмент программы: if a> b then c: =1; if a> b then d: =2; if a< =b then c: =3; if a< =b then d: =4. 7. Каким будет значение переменной а после выполнения операторов: a: =3; if a< 4 then begin Inc(a, 2); Inc(a, 3); end; 8. Найти количество положительных (отрицательных) чисел среди четырех целых чисел A, B, C, D. 9. Составьте программу, которая уменьшает первое введенное число в пять раз, если оно больше второго введенного числа по абсолютной величине. 10. Для данного значения X вычислить значение функции, которая определяется следующим образом: Y=sin(x), если x > =1 Y=cos(x), если x < 1 11. Определить является ли введённое число чётным. 12. Компьютер спрашивает: " Что сегодня нужно всем? " и если получает ответ ЭВМ, то пишет " Ну, конечно ЭВМ! ", иначе " Это тоже нужно всем, но нужнее ЭВМ! " 13. Написать программу, по которой компьютер приветствовал бы только своего хозяина, а при попытке ввести какое-либо другое имя спрашивал бы: " А где (например) Вася? " 14. Написать программу, определяющую, есть ли в введенном числе дробная часть. 15. Написать программу, рисующую круг в случае введения пользователем числа 1 и квадрат во всех других случаях. Занятие 2. Логический тип данных. Логические операции not, and, or. Нахождение значений логических выражений. Самостоятельная работа. Логический тип данных Переменные логического типа описываются посредством идентификатора Boolean. Они могут принимать только два значения – False (ложь) и True (истина). Описываются они также в разделе описания переменных. Var Flag: Boolean; Переменные логического типа обычно получают значения в результате выполнения операций сравнения и математических операций (рассматривались в предыдущем занятии), а также с помощью специфических булевых операций. В языке Турбо Паскаль имеются логические операции, применяемые к переменным логического типа. Это операции not, and, or и хor. В этой теме Вы рассмотрите три логические операции. Обозначения и результаты этих операций приведены в таблице. Рассмотрите ее.
Операция not (не) имеет один операнд и образует его логическое отрицание. Результат операции not есть False, если операнд истинен, и True, если операнд имеет значение ложь. Так, not True False (неправда есть ложь) not False True (неложь есть правда) Результат операции and (и) есть истина, только если оба ее операнда истинны, и ложь во всех других случаях. Результат операции or (или) есть истина, если какой-либо из ее операндов истинен, и ложен только тогда, когда оба операнда ложны. Задание. Попробуйте определить значение булевых операций для высказываний: 1. Школьник на зимних каникулах остается дома или уезжает куда-либо отдыхать. 2. Филипп Киркоров является певцом и комбайнером. 3. Школьниками являются мальчики и девочки. Придумайте и запишите в тетрадь три подобных высказывания.
Логические операции, операции отношения и арифметические операции часто встречаются в одном выражении. При этом отношения, стоящие слева и справа от знака логической операции, должны быть заключены в скобки, поскольку логические операции имеют более высокий приоритет. Вообще принят следующий приоритет операций: • not • and, *, /, div, mod • or, +, - • операции отношения. Примечание. Логическую операцию and еще называют логическим умножением, а логическую операцию or - логическим сложением. Кроме того, порядок выполнения операций может изменяться скобками. Например, в логическом выражении расставим порядок действий 4 3 2 1 A or B and not (A or B) Сначала выполняется заключенная в скобки операция or, а затем операции not, and, or. Если подставить вместо переменных А и В значения True и False, то, используя уже рассмотренный порядок действий, получим значение всего выражения равное True. Задание. Запишите в тетрадь и вычислите значения выражений при a=10, b=20, c=true, d=false: а) (a> 5) and (b> 5) and (a< 20) and (b< 30); b) not (a< 15) or not (b< 30); c) c or d and (b=20); Внимание! В языке Паскаль нет возможности ввода логических данных с помощью оператора read. Однако предусмотрен вывод значений переменных логического типа с помощью оператора write. Например, после выполнения оператора write (5> 2) на экран будет выведено True. Самостоятельная работа Выберите с учителем задание для выполнения самостоятельной работы из ниже предложенных упражнений. 1. Вычислите значения выражения: а) sqr(x)+sqr(y)< =4 при x=0.3, y=-1.6; б) k mod 7 = k div5-1 при k=15; в) odd(trunc(10*p)) при p=0.182; г) not odd(n) при n=0; д) t and (p mod 3=0) при t=true, p=101010; е) (x*y< > 0) and (y> x) при x=2, y=1; ж) (x*y< > 0) or (y> x) при x=2, y=1; з) a or (not b) при a=False, b=True; 2. Записать на Паскале отношение, истинное при выполнении указанного условия и ложное в противном случае: а) целое k делится на 7; б) уравнение не имеет вещественных корней; в) точка (х, у) лежит вне круга радиуса R с центром в точке (1, 0); г) натуральное число N является квадратом натурального числа; д) 0< x< 1; е) x=max(x, y, z); ж) (операцию not не использовать)ж з) хотя бы одна из логических переменных а и b имеет значение True; и) обе логические переменные а и b имеют значение True. 3. Указать порядок выполнения операций при вычислении выражений: а) a and b or not c and d; б) (x> =0) or not c and d. 4. Вычислить следующие выражения при a=True, b=False: а) a or b and not a; б) (a or b) and not a; в) not a and b; г) not (a and b) 5. Записать на Паскале выражение, истинное при выполнении указанного условия и ложное в противном случае: а) х принадлежит отрезку [0, 1]; б) х лежит вне отрезка [0, 1]; в)* х принадлежит отрезку [2, 5] или [-1, 1]; г)* х лежит вне отрезков [2, 5] и [-1, 1]; д) каждое из чисел х, у, z положительно; ж) ни одно из чисел х, у, z не является положительным; з) только одно из чисел х, у, z положительно; и) логическая переменная а имеет значение True, логическая переменная b имеет значение False; к)* год с порядковым номером у является високосным (год високосный, если его номер кратен 4, однако из кратных 100 високосными являются лишь кратные 400, например, 1700, 1800 и 1900 – невисокосные годы, 2000 – високосный). 6. Нарисовать на плоскости (х, у) область, в которой и только в которой истинно указанное выражение: а)* (y> =x) and (y+x> =0) and (y< =1); б) (sqr(x)+sqr(y)< 1) or (y> 0) and (abs(x)< =1); в) (trunc(y)=0 and (round(x)=0); г)* (abs(x)< =1)> (abs(y)> =1); д) (sqr(x)+sqr(y)< =4)=(y< =x). 7) Имеется условный оператор: if d< > 10 then writeln (‘ура! ’) else writeln (‘плохо...’) Можно ли заменить его следующими операторами: а) if d=10 б) if not (d=10) then then writeln (‘ура! ’) writeln (‘ура! ’) else else writeln (‘плохо...’); writeln (‘плохо...’);
в) if not (d=10) г) if not (d< > 10) then then writeln (‘плохо...’) writeln (‘плохо...’) else else writeln (‘ура! ’); writeln (‘ура! ’);
8) Какими будут значения переменных j, k после выполнения условного оператора: if j> k then j: =k-2 else dec (k, 2); если исходные значения переменных равны: а) j=3, k=5; b) j=3, k=3; c) j=3, k=2. Примечание. В результате выполнения оператора dec (k, 2) значение переменной k уменьшается на 2. |
Последнее изменение этой страницы: 2017-03-17; Просмотров: 1354; Нарушение авторского права страницы