Условные операторы

  • docx
  • 26.12.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л3-0025390.docx

Условные операторы

Задача 1. Вывести на экран наибольшее из двух чисел

 

Формулировка. Даны два числа. Вывести на экран то из них, которое больше.

Решение. Собственно, это самая простая задача, с помощью которой можно продемонстриро- вать использование условного оператора if. Напомним, как нужно использовать этот оператор. Мы вводим с клавиатуры числа в переменные a и b типа integer, затем в операторе if проверяем булев- ское выражение «a > b»: если оно истинно, то выполняется then-блок оператора, если ложно else- блок. Соответственно, если a больше b (условие в заголовке истинно), то в then-блоке мы выводим a, а если a не больше b (условие в заголовке ложно), то выводим b (хотя сюда попадает и случай, когда a = b, что, впрочем, не нарушает решения).

На языке Pascal мы можем записать весь оператор с if- и then-блоками в одну строчку следу- ющим образом:

  if a > b then writeln(a) else writeln(b);                            Данная строка легко понятна и читаема по причине того, что мы выполняем столь простой набор операторов в обоих блоках ветвления оператора if. Однако в более сложных примерах мы будем с первых же написанных строчек следовать принципу аккуратного оформления кода, чтобы не появ- лялось привычки «вытягивать» операторы ветвлений и другие конструкции в одну строчку, так как в будущем это может сильно сказаться на удобочитаемости и простоте понимания написанного про- граммного кода, особенно при увеличении количества вложенных в блок операторов (которые, например, тоже могут быть операторами ветвления). Не стоит забывать о том, что при вложенности в тело какого-либо оператора хотя бы одного составного оператора или другой сложной конструк- ции требуется равномерный отступ для подчиненной конструкции с адекватной расстановкой опе- раторных скобок! Например, для оператора if это распределение конструкций по мнемонической модели if-end, else-end, согласно которой эти ключевые слова должны стоять на одном уровне по вертикали, а их содержимое должно быть немного смещено вправо.

Конечно, для простейшей конструкции с условным оператором это вовсе не самоцель, и можно разместить ее в одной строке, если оби ветви оператора (и if-блок, и else-блок) не содержат составного оператора. В нашем же примере «аккуратное оформление» показывается лишь в каче- стве введения.



Код:

При таком оформлении хорошо видно, какой код выполняется при истинности условия, а ка- кой – при его ложности.

 

Задача 2. Вывести на экран наибольшее из трех чисел

 

Формулировка. Даны три числа. Вывести на экран то из них, которое больше.


Решение. Даная задача обобщает предыдущую. В ее решении также нужно использовать условный оператор if, однако в данном случае для нахождения максимального числа нам нужно выполнить минимум два сравнения. Сам механизм выбора в виде условного оператора с вложен- ными в него двумя другими условными операторами можно легко пояснить следующей блок-схе- мой:

Несмотря на то, что выполняется всего одна инструкция вывода, при написании кода мы все ветвления будем помещать в отдельный составной оператор. Напомним: это значит, что при движе- нии от более общего уровня к частному все конструкции нужно смещать на два пробела относи- тельно родительского блока/оператора.


Код:


 

 

Задача 3. Вывести название дня недели по его номеру

 

Формулировка. Вывести название дня недели по его номеру.

Решение. Задача простейшим образом решается с помощью оператора выбора case. Напом- ним, что этот оператор позволяет организовать ветвления в зависимости от значений некоторой пе- ременной, для каждого из которых можно предусмотреть выполнение различных действий. Причем если значению переменной не соответствует ни один вариант, выполняется else-блок (если он при- сутствует). Кстати, не стоит забывать, что после перечисления всех вариантов оператора case необ- ходимо написать ключевое слово end (выходит, ключевое слово case является еще и открывающей операторной скобкой).

Для того чтобы воспользоваться оператором case, нам необходимо произвести ввод номера дня недели в некоторую переменную i типа byte и по этому номеру вывести название текущего дня недели. Кстати, благодаря else-блоку в этой программке мы впервые предусмотрим сообщение об ошибке, связанной с некорректно введенным номером, которому не соответствует ни один из дней недели.


Код:


Кстати, в каждом из вариантов ветвлений может быть помещен составной оператор, но при описании вариантов мы не стали использовать операторные скобки, так как на этот раз они наоборот испортили бы все оформление кода, которое сейчас является достаточно гармоничным.

 

Задача 4. Проверить, является ли четырехзначное число палиндромом

 

Формулировка. Дано четырехзначное число. Проверить, является ли оно палиндромом.

Примечание: палиндромом называется число, слово или текст, которые одинакового читаются слева направо и справа налево. Например, в нашем случае это числа 1441, 5555, 7117 и т. д.

Примеры других чисел-палиндромов произвольной десятичной разрядности, не относящиеся к решаемой задаче: 3, 787, 11, 91519 и т. д.

Решение. Для ввода числа с клавиатуры будем использовать переменную n. Вводимое число принадлежит множеству натуральных чисел и четырехзначно, поэтому оно заведомо больше 255, так что тип byte для ее описания нам не подходит. Тогда будем использовать тип word.

Какими же свойствами обладают числа-палиндромы? Из указанных примеров легко увидеть, что в силу своей одинаковой «читаемости» с двух сторон в них равны первый и последний разряд, второй и предпоследний и т. д. вплоть до середины. Причем если в числе нечетное количество раз- рядов, то серединную цифру можно не учитывать при проверке, так как при выполнении названного правила число является палиндромом вне зависимости от ее значения.

В нашей же задаче все даже несколько проще, так как на вход подается четырехзначное число. А это означает, что для решения задачи нам нужно лишь сравнить 1-ю цифру числа с 4-й и 2-ю цифру с 3-ей. Если выполняются оба эти равенства, то число – палиндром. Остается только полу- чить соответствующие разряды числа в отдельных переменных, а затем, используя условный опе- ратор, проверить выполнение обоих равенств с помощью булевского (логического) выражения.

Однако не стоит спешить с решением. Может быть, мы сможем упростить выведенную схему? Возьмем, например, уже упомянутое выше число 1441. Что будет, если разделить его на два числа двузначных числа, первое из которых будет содержать разряд тысяч и сотен исходного, а второе – разряд десятков и единиц исходного. Мы получим числа 14 и 41. Теперь, если второе число заме- нить на его реверсную запись (это мы делали в задаче 4), то мы получим два равных числа 14 и 14! Это преобразование вполне очевидно, так в силу того, что палиндром читается одинаково в обоих направлениях, он состоит из дважды раза повторяющейся комбинации цифр, и одна из копий просто повернута задом-наперед.

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

Теперь опишем сам алгоритм:

1)      Вводим число n;

2)      Присваиваем разряд единиц числа n переменной a, затем отбрасываем его. После присва- иваем разряд десятков n переменной b и также отбрасываем его:

a := n mod 10; n := n div 10; b := n mod 10; n := n div 10;

3)      Присваиваем переменной a число, представляющее собой реверсную запись хранящейся в переменных a и b второй части исходного числа n по уже известной формуле:

  a := 10 * a + b;                                                   


4)      Теперь мы можем использовать проверку булевского выражения равенства полученных чисел n и a помощью оператора if и организовать вывод ответа с помощью ветвлений:

  if n = a then writeln('Yes') else writeln('No');                    

Так как в условии задачи явно не сказано, в какой форме необходимо выводить ответ, мы будем считать логичным вывести его на интуитивно понятном пользователю уровне, до- ступном в средствах самого языка Pascal. Напомним, что с помощью оператора write (writeln) можно выводить результат выражения булевского типа, причем при истинности этого выражения будет выведено слово 'TRUE' («true» в пер. с англ. означает «истин- ный»), при ложности – слово 'FALSE' («false» в пер. с англ. означает «ложный»). Тогда предыдущая конструкция с if может быть заменена на

  writeln(n = a);                                                    


Код:

 

Задача 5. Проверить, является ли четырехзначное число счастливым билетом

 

Формулировка. Дано четырехзначное число. Проверить, является ли оно «счастливым биле-

том».

Примечание: счастливым билетом называется число, в котором: а) при четном количестве

цифр в числе сумма цифр его левой половины равна сумме цифр его правой половины; б) при не- четном количестве цифр то же самое, но с отбрасыванием серединной цифры. Например, рассмот- рим число 1322. Его левая половина равна 13, а правая 22, и оно является счастливым билетом (т. к. 1 + 3 = 2 + 2). Аналогично: 1735 (1 + 7 = 3 + 5), 1111 (1 + 1 = 1 + 1) и т. д.

Примеры других счастливых билетов за рамками условия текущей задачи: 7 (отбросили един- ственную цифру), 39466 (3 + 9 = 6 + 6, а 4 отбросили), 11 (1 = 1), и т. д.

Решение. Для ввода достаточно одной переменной n типа word. Все, что необходимо сделать для решения – это последовательно получить все разряды исходного числа, причем из двух млад- ших разрядов (единиц и десятков) сформировать первую сумму, а из двух старших разрядов – вто- рую, после чего вывести на экран результат булевского выражения равенства полученных сумм. Первую сумму будем хранить в переменной right, а вторую в переменной left (выбрано по распо- ложению цифр в записи числа). Значение обоих из них не может превосходить 18 (т. к. для наиболь- шего допустимого числа 9999 обе суммы равны 9 + 9 = 18), поэтому для их описания используем тип byte.

Более детальный разбор алгоритма:

1)      Вводим число n;


2)     

right := n mod 10; n := n div 10;
right := right + n mod 10; n := n div 10;

Присваиваем переменной right значение последней цифры числа n, потом отбрасываем эту цифру, затем повторяем то же самое, но на этот раз уже прибавляем добытую цифру к прежнему значению right:

3)      Присваиваем переменной left последнюю цифру n, отбрасываем ее и прибавляем к right

left := n mod 10; n := n div 10; left := left + n;

единственную оставшуюся в переменной n цифру:

4)      Выводим на экран результат сравнения накопленных сумм:

  writeln(left = right);                                             


Код:

 


 

Скачано с www.znanio.ru