Название: Алгоритмы и программы (Афанасьева Т. В.)

Жанр: Информационные системы и технологии

Просмотров: 1339


3.3. программирование с оператором варианта case

 

Условный оператор позволяет при выполнении программы выбирать одно из двух возможных действий. Если же необходимо сделать много взаимоисключающих проверок, то удобней воспользоваться оператором выбора варианта.

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

В общем случае оператор имеет вид:

case <селектор> of

<метка–1>:<оператор–1>;

<метка–2>:<oператор–2>;

............................

<метка–N>:<оператор–N>

else <оператор–(n+1)>;

end;

где case (выбор), of (из), end (конец) – служебные слова;

СЕЛЕКТОР    –          выражение     любого            типа,   кроме  вещественного           и строкового;

ОПЕРАТОР – любой оператор языка, в том числе и составной;

МЕТКА – список значений выражения СЕЛЕКТОР или одно его значение.

Тип МЕТКИ совпадает с типом СЕЛЕКТОРА и состоит из любого числа отделенных друг от друга запятыми констант или диапазонов, за которыми следует двоеточие, например:

case berdsight of

'C','c': curlews := curlews+1;

'H','h': herons := herons+1;

'E','e': egrets := egrets+1;

'T','t': terns        :=         terns+1;

end;

 

Диапазоны записываются как две константы, отделенные друг от друга разделителем  диапазона  '..' . MЕТКА ВАРИАНТА – необычная метка: это не обязательно целое число, она не описывается в разделе label, на нее нельзя ссылаться в операторе goto.

ОПЕРАТОР, который следует за МЕТКОЙ, выполняется, если значение СЕЛЕКТОРА равно одной из констант или если он лежит внутри одного из диапазонов. В противном случае будет выполняться оператор, следующий за case.

Селектор иногда называют ключом выбора.

Пример 3.8. Определить день недели по его номеру. program ex;

var dayno:integer; Begin

write('введите число 1–7');

read(dayno);

case dayno of

1:writeln('monday');

2:writeln('tuesday');

3:writeln('wednesday');

4:writeln('thursday');

5:writeln('friday');

6:writeln('saturday');

7:writeln('sunday');

end;{of case}

end.

 

Когда dayno равно 1, выбирается только оператор с меткой 1:. Когда

dayno равно 2, выбирается оператор с меткой 2: и т. д.

 

Тип селектора и метки в операторе CASE

не может быть строковым или вещественным.

 

Пример 3.9. Найти остаток от деления значения  целого выражения С=K*(A+B) на 4 и вывести сообщение о величине остатка. Если остаток равен 0, то значение  переменной С оставить без изменения, если 1 или 3 – уменьшить на величину остатка, если 2 – увеличить на величину остатка . Новое значение С вывести на печать.

program ostatok;

const del=4;

var a,b,c,k:integer; ost:integer;

begin

writeln('Найти остаток от деления значения целого выражения'); writeln('С=K*(A+B) на 4 и вывести сообщение о величине остатка.'); writeln('Если остаток равен 0 , то значение переменной С'); writeln('оставить без изменения , если 1 или 3 – уменьшить на'); writeln('величину остатка , если 2 – увеличить на величину'); writeln('остатка . Новое значение С вывести на печать.'); write('Введите А=');

read(a);

write('Введите В=');

read(b); write('Введите К='); read(k);

c:=k*(a+b); ost:=c mod del; writeln('C=',c); case ost of

0:writeln('Oстаток 0');

1:begin

writeln('Oстаток 1');

c:=c–ost;

writeln ('Новое значение C=',c);

end;

2:begin

writeln('Ocтаток 2');

c:=c+ost;

writeln('Новое значение C=',c);

end;

3:begin

writeln('Oстаток 3');

с:=с–ost;

writeln('Новое значение C=',c);

end;

end;{case}

end.

 

Пример 3.10. Вывести на экран число дней в любом месяце. program mes;

var m,f,dn,d:integer; begin

writeln('Вывести на экран число дней в любом месяце ');

write('   Введите месяц:');

f:=0; read(m); case m of

1,3,5,7,8,10,12:d:=31;

2:begin

write('Сколько дней в году 365 или 366:');

read(dn);

if dn=365 then d:=28

else

 

 

end;

d:=29;

4,6,9,11: d:=30;

else f:=1;

end;

case m of

1: write( 'в январе – ');

2: write( 'в феврале – ');

3: write( 'в марте – ');

4: write( 'в апреле – ');

5: write( 'в мае – ');

6: write( 'в июне – ');

7: write( 'в июле – ');

8: write( 'в августе – ');

9: write( 'в сентябре – ');

10: write( 'в октябре – ');

11: write( 'в ноябре – ');

12: write( 'в декабре – ');

end;

case m of          1,3,5,7,8,10,12: write(d,' день');

2,4,6,9,11: write(d,' дней');

end;

end.

 

Пример  3.11.  Напечатать  заданное  слово  в  заданном  падеже,  в единственном числе.

program pad; var w,p:integer; begin

writeln(' Напечатать заданное слово в заданном падеже,');

writeln(' в единственном числе.');

writeln(' В каком падеже напечатать слово: ');

writeln(' именительный (1), родительный (2), дательный (3),'); write('      винительный (4),творительный (5), предложный (6)?: '); read(p);

writeln(' Какое слово хотите изменить:');

write('   cтепь (1), боль (2), тетрадь (3), дверь (4)? : ');

read(w);

case w of

1:writeln(' Слово «степь» в');

2:writeln(' Слово «боль» в');

3:writeln(' Слово «тетрадь» в');

 

 

end;

4:writeln(' Слово «дверь» в');

case p of

1:write(' именительном падеже ');

2:write(' родительном падеже ');

3:write(' дательном падеже ');

4:write(' винительном падеже ');

5:write(' творительном падеже ');

6:write(' предложном падеже ');

end;

case p of

1,2,4:case w of

1:writeln('– «степь»');

2:writeln('– «боль»');

3:writeln('– «тетрадь»');

4:writeln('– «дверь»');

end;

3,6:      case w of

1:writeln('– «степи»');

2:writeln('– «боли»');

3:writeln('– «тетради»');

4:writeln('– «двери»');

end;

5:         case w of

1:writeln('– «степью»');

2:writeln('– «болью»');

3:writeln('– «тетрадью»');

4:writeln('– «дверью»');

 

 

end;

end.

end;

 

 

Задания для самостоятельного выполнения

1. Составить программу, которая реализовала бы следующие действия: по введенному числу К (до 10) выдавала бы соответствующую ей римскую цифру.

2. Для целого числа К от 1 до 9 напечатать фразу «мне К лет», учитывая при этом, что при некоторых значениях К слово «лет» надо заменить на слово «год» или «года».

3. Для натурального числа К напечатать фразу «мы нашли К грибов в лесу», согласовав окончание слова «гриб» с числом К.

4. Составить программу, которая бы реализовала следующий   алгоритм:

переменной  Т  присвоить  значение  true  если  сочетание  день.месяц.год

образует правильную дату, и значение false – иначе (учитывая количество дней в месяце и название месяца).

5. Составить программу, которая бы реализовала следующий алгоритм: по порядковому номеру дня года определить дату, т. е. число и месяц.

 

Контрольные вопросы

1. Отличие оператора варианта от условного оператора.

2. Для чего служит ключ выбора и какого он может быть типа?

3. Сколько меток может быть перед оператором в списке выбора?

4.  Как выполняется оператор варианта:

а) имеющий часть ELSE,

б) не имеющий часть ELSE.

5. Использование составного оператора в операторе варианта.

6. Как работает оператор case?

7. Какой тип может иметь селектор?