Предисловие дорогие друзья !

Вид материалаДокументы

Содержание


Program Ex25; Var
Входной файл (input.txt).
§17. Оператор выбора CASE … OF.
Program Ex27; Var
Program Ex28; Var
Подобный материал:
1   ...   6   7   8   9   10   11   12   13   ...   29

§16. Âëîæåíûå óñëîâíûå îïåðàòîðû


Ïðè ðåøåíèè çàäà÷ ÷àñòî ïðèõîäèòñÿ ðàññìàòðèâàòü íå äâà, à áîëüøåå êîëè÷åñòâî âàðèàíòîâ. Ýòî ìîæíî ðåàëèçîâàòü, èñïîëüçóÿ íåñêîëüêî óñëîâíûõ îïåðàòîðîâ.  ýòîì ñëó÷àå ïîñëå ñëóæåáíûõ ñëîâ Then è Else çàïèñûâàåòñÿ íîâûé óñëîâíûé îïåðàòîð. Такие конструкции называются вложенными условными операторами. Количество (глубина) вложений может быть ограничена в различных версиях языка по-разному.

Ïðèìåð 25. Äàíû öåëûå ÷èñëà a, b, c. Åñëè a<=b<=c, òî êàæäîå ÷èñëî çàìå­íèòü åãî êâàäðàòîì, åñëè a>b>c, òî êàæäîå ÷èñëî çàìåíèòü íàèìåíüøèì èç íèõ, â ïðîòèâíîì ñëó÷àå ñìåíèòü çíàê êàæäîãî ÷èñëà.

Ðåøåíèå. Óñëîâèå çàäà÷è запèøåì ñëåäóþùèì îáðàçîì:

a:=a2, b:=b2, c:=c2, åñëè a<=b<=c

a:=c, b:=c, åñëè a>b>c

a:=-a, b:=-b, c:=-c — â других ñëó÷àÿõ.

Блок-схема решения задачи и программа на языке Паскаль изображены на рисунке 15.





Program Ex25;

Var a,b,c: integer;

Begin

Write('Ââåäèòå ÷èñëà a,b,c:');

Readln (a,b,c);

If (a<=b) and (b<=c) Then

Begin

a:=sqr(à);

b:=sqr(b);

c:=sqr(c)

End

Else If (a>b) and (b>c) Then

begin

a:=c;

b:=c

End

Else

begin

a:=-a;

b:=-b;

c:=-c

End;

Writeln (a:10,b:10,c:10);

Readln;

End.

Ïðèìå÷àíèå. Åñëè âëîæåííûìè óñëîâíûìè îïåðàòîðàìè ÿâëÿþòñÿ íå­ïîëíûå óñëîâíûå îïåðàòîðû (êàê, íàïðèìåð, â çàäà÷å, ðàññìîòðåííîé âûøå), òî ìîãóò âîçíèêàòü íåÿñíîñòè, ñâÿçàííûå ñ óñòàíîâëåíèåì ãðàíèö óñëîâíûõ îïåðàòîðîâ.  òàêèõ ñëó÷àÿõ ñëóæåáíîå ñëîâî Else îòíîñòèòñÿ ê áëèæàéøåìó If.

Çàäàíèå. Â ïðèâåäåííîé âûøå ïðîãðàììå Ех25 èçìåíèì óñëîâíûé îïåðàòîð ñëåäóþ­ùèì îáðàçîì:

If (a<=b) and (b<=c) Then

Begin

a:=sqr(à); b:=sqr(b); c:=sqr(c)

If (a>b) and (b>c) Then

Begin c:=a; b:=a End

Else Begin a:=-a; b:=-b; c:=-c End;

End;

Êàê èçìåíèòñÿ âûïîëíåíèå äàííîé ïðîãðàììû? Ñôîðìóëèðóéòå óñëî­âèå çàäà÷è, êîòîðóþ òåïåðü ðåøàåò äàííàÿ ïðîãðàììà.

Ïðèìåð 26. Записать условный оператор, с помощью которого можно вычислить значение Х, определённым следующим образом:

Õ =1 ïðè À = Â è Ñ < D,

Õ =2 ïðè À = Â è Ñ >= D,

Õ =3 при A <> B.

Такую конструкцию в математике принято записывать так:



Решение. Блок-схема решения задачи и оператор IF приведены на рисунке 16:





if a=b then if cthen x:=1

else x:=2

else x:=3;


Äëÿ óäîáñòâà âîñïðèÿòèÿ ïðîãðàììû ðåêîìåíäóåòñÿ ñëîâî else ïè­ñàòü ïîä ñîîòâåòñòâóþùèì åìó ñëîâîì then.

Вопросы и задания.
  1. Может ли условный оператор содержать в себе другие условные операторы?
  2. В каких случаях в программе используется вложенный условный оператор? Как он оформляется?
  3. Даны два прямоугольника, стороны которых параллельны или перпендикулярны осям координат. Известны координаты левого нижнего угла каждого из них и длины их сторон. Найти координаты левого нижнего и правого верхнего углов минимального прямоугольника, содержащего указанные прямоугольники.
  4. Âû÷èñëèòü çíà÷åíèÿ ôóíêöèè:


  1. Äàíû òðè ðàçëè÷íûõ öåëûõ ÷èñëà, íàéòè ñðåäíåå èç íèõ. Ñðåäíèì íàçîâåì ÷èñëî, êîòîðîå áîëüøå íàèìåíüøåãî èç äàííûõ ÷èñåë, íî ìåíüøå íàèáîëüøåãî.
  2. Íàïèñàòü ïðîãðàììу äëÿ ïîäñ÷åòà ñóììû òîëüêî ïî­ëîæèòåëüíûõ èç òðåõ äàííûõ ÷èñåë.
  3. Äàíû òðè ÷èñëà. Íàïèñàòü ïðîãðàììу äëÿ ïîäñ÷åòà êîëè÷åñòâà ÷èñåë, ðàâíûõ íóëþ.
  4. Èñïîëüçóÿ ñîñòàâíîé îïåðàòîð, óïðîñòèòå ñëåäóþùèé ôðàã­ìåíò ïðîãðàììû:

if a>b then c:=1;

if a>b then d:=2;

if a<=b then c:=3;

if a<=b then d:=4;
  1. Составить программу, которая печатает сообщения о возрасте ребенка (например, «ребенку 1 год», «ребенку 2 года», «ребенку 9 лет») по введенному значению лет k (1
  2. Составьте алгоритм вычисления значений функции

а)

б) А= max(1, b+2)+min(b+2,1).

с) С=.

Для любознательных

Напишите программу, которая по введенным целым числам A и B (0≤A≤B≤30000) находит сумму S всех целых чисел X таких, что A≤X≤B.

Входной файл (input.txt). Ваша программа должна вводить с файла числа A и B в указанном порядке. Каждое число будет вводиться в отдельной строке.

Выходной файл (output.txt). Ваша программа должна вывести на экран число S.

Пример.

Ввод Вывод

5 45

10

§17. Оператор выбора CASE … OF.


Свобода заключается в праве делать все,

что не вредит другим.

( Клаудиус )

В условном операторе очень строгое ограничение: либо условие истинно, либо ложно. Но часто приходится иметь дело с более многообразными ситуациями. Например, из многих возможных вариантов выбрать что-то одно или выполнить ряд действий в зависимости от многих условий. Конечно, можно воспользоваться условным оператором. Правда, он будет выглядеть довольно сложно: одни условия вложены в другие. Именно для таких ситуаций в языке Паскаль имеется специальный оператор — оператор выбора.

Оператор выбора (варианта) используется в тех случаях, когда в зависимости от значения какого-либо выражения необходимо выполнить один из нескольких последовательных операторов. Оператор выбора имеет следующую форму записи:

case âûðàæåíèå of

ñïèñîê_êîíñòàíò_1: îïåðàòîð_1;

ñïèñîê_êîíñòàíò_2: îïåðàòîð_2;

...

ñïèñîê_êîíñòàíò_n-1: îïåðàòîð_n-1;

else îïåðàòîð_n;

end;

Здесь CASE (в случае), OF (из), ELSE (иначе), END (конец) — служебные слова. В качестве оператора может быть и составной оператор.

Îïåðàòîð âûáîðà äåéñòâóåò ñëåäóþùèì îáðàçîì. Сначала вычисляется значение «выражения». Åñëè çíà÷åíèå âûðàæåíèÿ ðàâíî îäíîé èç êîíñòàíò, òî âûïîëíÿåòñÿ ñîîòâåòñòâóþùèé åé îïåðàòîð. Если выражение не равно ни одной из констант и присутствует оператор ELSE, то выполняется оператор, стоящий после слова ELSE, если же оператор ELSE отсутствует, то никаких действий не выполняется. Çàòåì óïðàâëåíèå ïåðåäàåòñÿ çà ïðåäåëû îïåðàòîðà âû­áîðà. Оператор выбора заканчивается словом END.

Ïðèìåð 27. По заданному номеру месяца определить, какая это пора года.

Решение. Исходными данными задачи является номер месяца. Январь — 1, февраль —2, март —3 и т.д. Обозначим его буквой N. Месяцы с номерами 12, 1, 2 соответствуют зиме, 3, 4, 5 — весне, 6, 7, 8 — лету, 9, 10, 11 — осени. Теперь в зависимости от введённого значения N определим пору года. Если
значение месяца не соответствует перечисленным, то сообщим об этом. Проще всего это сделать при помощи оператора CASE.

Блок-схема решения задачи изображена на рисунке 17. Чтобы реализовать её с помощью условного оператора потребовалось бы написать оператор IF с многократным вложением, и каждый из них содержал бы составные условия. Как видно из приведенной ниже программы, оператор CASE позволяет найти более простое решение.

Program Ex27;

Var n: integer; {Номер месяца}

Begin

Write('Ââåäèòå номер месяца: '); {}

Readln(n); {Вводим значение с клавиатуры}

Case n Of {В зависимости от N}

12, 1, 2: Writeln('Ýòî зима'); {выдаём сообщение}

3, 4, 5: Writeln('Ýòî весна'); {о том, какая это}

6, 7, 8: Writeln('Ýòî лето'); {пора года}

9, 10, 11: Writeln('Ýòî осень'); {}

else Writeln('Неверно набран номер месяца'); {или сообщаем об ошибке}

End; {Конец оператора CASE}

Readln; {Задержка изображения рабочего окна}

End.

После запуска программы на экране появится сообщение:

Введите номер месяца:

Если задать значение N, равное 7, то на экране появится надпись:

Это лето.

Если же задать номер 15, то на экране появится надпись:

Неверно набран номер месяца

Çàìå÷àíèå. Ìåòêè îïåðàòîðà CASE íå îïèñûâàþòñÿ â ðàçäåëå label, è íà íèõ íåëüçÿ ïåðåõîäèòü îïåðàòîðîì goto.

Ïðèìåð 28. Ñîñòàâüòå ïðîãðàììó, â êîòîðîé îïðåäåëÿåòñÿ, êàêîé áóêâîé - ãëàñíîé èëè ñîãëàñíîé - ÿâëÿåòñÿ ââåäåííûé ñèìâîë àíãëèéñêîãî àëôàâèòà.

Ðåøåíèå. Ðàçäåëèì âñå ñèìâîëû íà òðè ãðóïïû:

* ãëàñíûå áóêâû àíãëèéñêîãî àëôàâèòà;

* ñîãëàñíûå áóêâû àíãëèéñêîãî àëôàâèòà;

* ñèìâîëû, íå ÿâëÿþùèåñÿ áóêâàìè àíãëèéñêîãî àëôàâèòà.


Из приведённой блок-схемы решения задачи (рисунок 18) видно, что реализовать её с помощью условного оператора IF достаточно сложно. Использование оператора CASE позволяет упростить решение.

Program Ex28;

Var ch: Char;

Begin

Write('Ââåäèòå ñèìâîë ');

Readln(ch);

Case Upcase(ch) Of {Стандартная процедура Upcase(ch) переводит строчные буквы в прописные}

'A','E','I','O','U': Writeln('Ýòî ãëàñíàÿ áóêâà àíãëèéñ­êîãî àëôàâèòà ');

'A'..'Z': Writeln('Ýòî ñîãëàñíàÿ áóêâà àíãëèéñêîãî àëôà­âèòà');

Else Writeln('Ýòîò ñèìâîë íå ÿâëÿåòñÿ áóêâîé àíãëèéñêîãî àëôàâèòà');

End;

Readln;

End.

Îáðàòèòå âíèìàíèå íà òî, ÷òî â ïåðâîì ñëó÷àå êîíñòàíòû ïå­ðå÷èñëÿþòñÿ ÷åðåç çàïÿòóþ, à âî âòîðîì èñïîëüçóåòñÿ èíòåðâàë çíà­÷åíèé. Если значения идут подряд, то достаточно указать первое и последнее значение интервала, поставив между ними знак интервала «..» (две подряд идущие точки).

При использовании оператора выбора нужно помнить, что если значение переменной может совпадать с несколькими возможными значениями, расположенными в разных метках, то выполняется тот оператор, который расположен раньше. Эта ситуация иллюстрируется примером 28.

Вопросы и задания.
  1. Для чего служит оператор выбора?
  2. Могут ли выполниться несколько ветвей оператора CASE за один раз?
  3. Сколько операторов можно написать после возможного значения переменной?
  4. может ли сразу несколько констант фигурировать в качестве возможного значения переменной?
  5. Напишите программу, которая вводит время (только часы) и печатает соответствующее этому времени приветствие: “Доброе утро”, “Добрый день”, “Добрый вечер”, “Доброй ночи”. (Считать, что 6<=утро<12, 12<=день<17, 17<=вечер<23, 23<=ночь<=24, 0<=ночь<6).
  6. Составить программу, которая в зависимости от порядкового номера месяца (1, 2, ..., 12) выводит на экран количество дней в этом месяце. Рассмотреть два случая:
  1. год не является високосным;
  2. год високосный (информация об этом вводится с клавиатуры).
  1. Дата некоторого дня определяется двумя натуральными числами m (порядковый номер месяца) и n (число). По заданным m и n определить:
  1. дату предыдущего дня;
  2. дату следующего дня.

Предусмотреть варианты, когда год високосный и не високосный.
  1. Дано целое число n (1n99), определяющее возраст человека (в годах). Для этого числа напечатать фразу «мне n лет», учитывая при этом, что при некоторых значениях n слово «лет» надо заменить на слово «год» или «года».
  2. Дано целое число K (1  K  365). Определить, каким будет К-й день года: понедельником, вторником, …, воскресеньем, если 1 января — понедельник.
  3. Даны целое число K (1  K  180) и последовательность, состоящая из подряд выписанных чисел от 10 до 99. Определить К-ю цифру.