учебник по паскалю. Программа 5 Алгоритм 5 Свойства алгоритма 6 Формы записи алгоритма 6
Скачать 2.21 Mb.
|
7.7. Вложенные условные операторыКогда после ключевых слов then или else вновь используются условные операторы, они называются вложенными. Число вложений может быть произвольно, при этом действует правило: else всегда относится к ближайшему оператору if, для которого ветка else еще не указана. Часто вложением условных операторов можно заменить использование составного. В качестве примера рассмотрим программу для определения номера координатной четверти p, в которой находится точка с координатами (x,y). Для простоты примем, что точка не лежит на осях координат. Без использования вложений основная часть программы может иметь следующий вид: if (x>0) and (y>0) then p:=1 else if (x<0) and (y>0) then p:=2 else if (x<0) and (y<0) then p:=3 else p:=4; Однако использование такого количества условий представляется явно избыточным. Перепишем программу, используя тот факт, что по каждое из условий x>0, x<0 оставляет в качестве значения p только по 2 возможных четверти из 4: if x>0 then begin if y>0 then p:=1 else p:=4; end else begin if y>0 then p:=2 else p:=3; end; В первом фрагменте программе проверяется от 2 до 6 условий, во втором -- всегда только 2 условия. Здесь использование вложений дало существенный выигрыш в производительности. Рассмотренный в п. 7.6 пример с определением знака числа может быть переписан и с использованием вложения: if a>0 then n:=1 else begin if a<0 then n:=-1 else n:=0; end; Однако, как эти операторы, так и составной условный оператор из п. 7.6 проверяют не более 2 условий, так что способы примерно равноценны. 7.8. Оператор выбораДля случаев, когда требуется выбор одного значения из конечного набора вариантов, оператор if удобнее заменять оператором выбора (переключателем) case: case выражение of список1: оператор1; список2: оператор2; . . . списокN: операторN; else оператор0; end; Оператор выполняется так же, как составной условный оператор. Выражение должно иметь порядковый тип (целый или символьный). Элементы списка перечисляются через запятую, ими могут быть константы и диапазоны значений того же типа, что тип выражения. Диапазоны указываются в виде: Мин.значение .. Макс.значение Оператор диапазона записывается как два рядом стоящих символа точки. В диапазон входят все значения от минимального до максимального включительно. В качестве примера по номеру месяца m определим число дней d в нем: case m of 1,3,5,7..8,10,12: d:=31; 2: d:=28; 4,6,9,11: d:=30; end; Следующий оператор по заданному символу c определяет, к какой группе символов он относится: case c of 'A'..'Z','a'..'z': writeln ('Латинская буква'); 'А'..'Я','а'..'п','р'..'я': writeln ('Русская буква'); '0'..'9': writeln ('Цифра'); else writeln ('Другой символ'); end; Здесь отдельные диапазоны для русских букв от "а" до "п" и от "р" до "я" связаны с тем, что между "п" и "р" в кодовой таблице DOS находится ряд не-буквенных символов (см. Приложение 1). Если по ветви оператора case нужно выполнить несколько операторов, действует то же правило, что для оператора if, т. е. ветвь алгоритма заключается в операторные скобки begin ... end;. 7.9. Примеры программ с условным операторомПриведем несколько примеров законченных программ, использующих РВП. 1. Проверить, может ли быть построен прямоугольный треугольник по длинам сторон a, b, c. Проблема с решением этой задачи -- не в проверке условия теоремы Пифагора, а в том, что в условии не сказано, какая из сторон может быть гипотенузой. Подходов возможно несколько -- запрашивать у пользователя ввод данных по возрастанию длины сторон, проверять все три возможных условия теоремы Пифагора и т. п. Используем наиболее естественное решение -- перед проверкой условия теоремы Пифагора упорядочим величины a, b, c так, чтобы выполнялись соотношения a≤b≤c. Для этого применим прием с обменом значений переменных из п. 4.1. var a,b,c, {Длины сторон} s:real;{Буферная переменная для обмена} begin { Секция ввода данных } writeln; write ('Введите длину 1 стороны:'); readln (a); write ('Введите длину 2 стороны:'); readln (b); write ('Введите длину 3 стороны:'); readln (c); { Сортируем стороны по неубыванию } if (a>b) then begin s:=a; a:=b; b:=s; end; if (a>c) then begin s:=a; a:=c; c:=s; end; if (b>c) then begin s:=b; b:=c; c:=s; end; { Проверка и вывод } if abs(a*a+b*b-c*c)<1e-8 then writeln ('Прямоугольный треугольник ', 'может быть построен!') else writeln('Прямоугольный треугольник ', 'не может быть построен!') end. 2. Определить, попадает ли точка плоскости, заданная координатами (a, b) в прямоугольник, заданный координатами двух углов (x1, y1) и (x2, y2). Как и в предыдущей задаче, было бы не совсем корректно требовать от пользователя вводить данные в определенном порядке -- гораздо лучше при необходимости поменять x- и y-координаты прямоугольника так, чтобы пара переменных (x1, y1) содержала координаты левого нижнего угла прямоугольника, а (x2, y2) -- правого верхнего. var x1,y1,x2,y2,a,b:real; begin writeln ('Введите координаты 1 угла:'); read (x1,y1); writeln ('Введите координаты 2 угла:'); read (x2,y2); if x1>x2 then begin a:=x1; x1:=x2; x2:=a; end; if y1>y2 then begin a:=y1; y1:=y2; y2:=a; end; writeln ('Введите координаты точки:'); read (a,b); if (x1<=a) and (a<=x2) and (y1<=b) and (b<=y2) then writeln ('Точка попадает в прямоугольник') else writeln ('Точка не попадает в прямоугольник'); end. 3. Вводится денежная сумма в рублях и копейках. Программа печатает введенную сумму с правильной формой слов "рубли" и "копейки", например, "123 рубля 15 копеек". Окончание, используемое для слов "рубли" и "копейки", зависит от последней цифры суммы, которую можно получить, взяв остаток от деления на 10 (1058 рублей, 38 рублей и т.д.). Исключения -- суммы с последними двумя цифрами от 11 до 19 включительно, которые всегда произносятся "рублей" и "копеек" (511 рублей, но 51 рубль). Используя эту информацию, составим программу. var r,k,o10,o100:integer; begin writeln; write ('Введите количество рублей, ', 'затем пробел и количество копеек:'); read (r,k); writeln; o10:=r mod 10; {Взяли последнюю цифру} o100:=r mod 100; {...и 2 последних цифры} write ('Правильно сказать: ',r,' '); {Печатаем число рублей, затем пробел} if (o100>10) and (o100<20) or (o10>4) or (o10=0) then write ('рублей') else if (o10>1) and (o10<5) then write ('рубля') else write ('рубль'); {аналогично для копеек:} o10:=k mod 10; o100:=k mod 100; write (' ',k,' '); {печатаем число копеек с пробелами} if (o100>10) and (o100<20) or (o10>4) or (o10=0) then write ('копеек') else if (o10>1) and (o10<5) then write ('копейки') else write ('копейка'); end. 0>0> |