Отсутствие элементов в определении цикла



 

В C++ разрешается опустить любой элемент заголовка цикла (инициализация , условное выражение , инкремент ) или даже все сразу. Например, мы хотим написать цикл, который должен выполняться до тех пор, пока с клавиатуры не будет введено число 123 . Вот как выглядит такая программа.

 

 

Здесь в заголовке цикла for отсутствует выражение инкремента. Это означает, что при каждом повторении цикла выполняется только одно действие: значение переменной х сравнивается с числом 123 . Но если ввести с клавиатуры число 123 , условное выражение, проверяемое в цикле, станет ложным, и цикл завершится. Поскольку выражение инкремента в заголовке цикла for отсутствует, управляющая переменная цикла не модифицируется.

Приведем еще один вариант цикла for, в заголовке которого, как показано в следующем фрагменте кода, отсутствует раздел инициализации.

 

 

Здесь пустует раздел инициализации, а управляющая переменная х инициализируется значением, вводимым пользователем с клавиатуры до входа в цикл.

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

 

Бесконечный цикл

 

Бесконечный циклэто цикл, который никогда не заканчивается.

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

 

 

Этот цикл будет работать без конца. Несмотря на существование некоторых задач программирования (например, командных процессоров операционных систем), которые требуют наличия бесконечного цикла, большинство "бесконечных циклов" – это просто циклы со специальными требованиями к завершению. Ближе к концу этой главы будет показано, как завершить цикл такого типа. (Подсказка: с помощью инструкции break .)

 

Циклы временной задержки

 

В программах часто используются так называемые циклы временной задержки. Их задача – просто "убить время". Для создания таких циклов достаточно оставить пустым тело цикла, т.е. опустить те инструкции, которые повторяет цикл на каждой итерации. Вот пример:

 

 

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

Прежде чем двигаться дальше, не помешало бы поэкспериментировать с собственными вариациями на тему цикла for. Это вам поможет убедиться в его гибкости и могуществе.

 

Инструкция switch

 

Инструкция switchэто инструкция многонаправленного ветвления, которая позволяет выбрать одну из множества альтернатив.

Прежде чем переходить к изучению других циклических С++‑конструкций, познакомимся с еще одной инструкцией выбора – switch . Инструкция switch обеспечивает многонаправленное ветвление. Она позволяет делать выбор одной из множества альтернатив. Хотя многонаправленное тестирование можно реализовать с помощью последовательности вложенных if ‑инструкций, во многих ситуациях инструкция switch оказывается более эффективным решением. Она работает следующим образом. Значение выражения последовательно сравнивается с константами из заданного списка. При обнаружении совпадения для одного из условий сравнения выполняется последовательность инструкций, связанная с этим условием. Общий формат записи инструкции switch таков.

 

 

Элемент выражение инструкции switch должен при вычислении давать целочисленное или символьное значение. (Выражения, имеющие, например, тип с плавающей точкой, не разрешены.) Очень часто в качестве управляющего switch ‑выражения используется одна переменная.

Инструкция break завершает выполнение кода, определенного инструкцией switch.

Последовательность инструкций default ‑ветви выполняется в том случае, если ни одна из заданных case ‑констант не совпадет с результатом вычисления switch ‑выражения. Ветвь default необязательна. Если она отсутствует, то при несовпадении результата выражения ни с одной из case ‑констант никакое действие выполнено не будет. Если такое совпадение все‑таки обнаружится, будут выполняться инструкции, соответствующие данной case ‑ветви, до тех пор, пока не встретится инструкция break или не будет достигнут конец switch ‑инструкции (либо в default ‑, либо в последней case ‑ветви).

Инструкции default‑ветви выполняются в том случае, если ни одна из case констант не совпадет с результатом вычисления switch‑выражения.

Итак, для применения switch ‑инструкции необходимо знать следующее.

■ Инструкция switch отличается от инструкции if тем, что switch ‑выражение можно тестировать только с использованием условия равенства (т.е. на совпадение switch ‑выражения с заданными case ‑константами), в то время как условное if ‑выражение может быть любого типа.

■ Никакие две case ‑константы в одной switch ‑инструкции не могут иметь идентичных значений.

■ Инструкция switch обычно более эффективна, чем вложенные if‑инструкции.

■ Последовательность инструкций, связанная с каждой case ‑ветвью, не является блоком. Однако полная switch ‑инструкция определяет блок. Значимость этого факта станет очевидной после того, как вы больше узнаете о C++.

Согласно стандарту C++ switch‑конструкция может иметь не более 16 384 case ‑инструкций. Но на практике (исходя из соображений эффективности) обычно ограничиваются гораздо меньшим их количеством.

Использование switch ‑инструкции демонстрируется в следующей программе. Она создает простую "справочную" систему, которая описывает назначение for ‑, if ‑ и switch ‑инструкций. После отображения списка предлагаемых тем, по которым возможно предоставление справки, программа переходит в режим ожидания до тех пор, пока пользователь не сделает свой выбор. Введенное пользователем значение используется в инструкции switch для отображения информация по указанной теме. (Вы могли бы в качестве упражнения дополнить информацию по имеющимся темам, а также ввести в эту "справочную" систему новые темы.)

 

 

Вот один из вариантов выполнения этой программы.

 

 

if ‑ это инструкция условного ветвления.

Формально инструкция break необязательна, хотя в большинстве случаев использования switch‑конструкций она присутствует. Инструкция break , стоящая в последовательности инструкций любой case‑ветви, приводит к выходу из всей switch‑конструкции и передает управление инструкции, расположенной сразу после нее. Но если инструкция break в case‑ветви отсутствует, будут выполнены все инструкции, связанные с данной case‑ветвью, а также все последующие инструкции, расположенные под ней, до тех пор, пока все‑таки не встретится инструкция break, относящаяся к одной из последующих case‑ветвей, или не будет достигнут конец switch‑конструкции.

Рассмотрим внимательно следующую программу. Попробуйте предугадать, что будет отображено на экране при ее выполнении.

 

 

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

 

 

Как видно по результатам, если инструкция break в одной case‑ветви отсутствует, выполняются инструкции, относящиеся к следующей case‑ветви.

Как показано в следующем примере, в switch‑конструкцию можно включать "пустые" case‑ветви.

 

 

Если переменная i в этом фрагменте кода получает значение 1 , 2 или 3 , вызывается функция do_something() . Если же значение переменной i равно 4 , делается обращение к функции do_something_else() . Использование "пачки" нескольких пустых case‑ветвей характерно для случаев, когда они используют один и тот же код.

 

Вложенные инструкции switch

 

Инструкция switch может быть использована как часть case ‑последовательности внешней инструкции switch. В этом случае она называется вложенной инструкцией switch. Необходимо отметить, что case‑константы внутренних и внешних инструкций switch могут иметь одинаковые значения, при этом никаких конфликтов не возникнет. Например, следующий фрагмент кода вполне допустим.

 

Цикл while

 

Инструкция whileеще один способ организации циклов в C++.

Общая форма цикла while имеет такой вид:

 

 

Здесь под элементом инструкция понимается либо одиночная инструкция, либо блок инструкций. Работой цикла управляет элемент выражение , который представляет собой любое допустимое С++‑выражение. Элемент инструкция выполняется до тех пор, пока условное выражение возвращает значение ИСТИНА. Как только это выражение становится ложным, управление передается инструкции, которая следует за этим циклом.

Использование цикла while демонстрируется на примере следующей небольшой программы. Практически все компиляторы поддерживают расширенный набор символов, который не ограничивается символами ASCII . В расширенный набор часто включаются специальные символы и некоторые буквы из алфавитов иностранных языков. ASCII ‑символы используют значения, не превышающие число 127 , а расширенный набор символов– значения из диапазона 128‑255 . При выполнении этой программы выводятся все символы, значения которых лежат в диапазоне 32‑255 (32 – это код пробела). Выполнив эту программу, вы должны увидеть ряд очень интересных символов.

 

 

Рассмотрим while ‑выражение из предыдущей программы. Возможно, вас удивило, что оно состоит всего лишь из одной переменной ch . Но "ларчик" здесь открывается просто. Поскольку переменная ch имеет здесь тип unsigned char , она может содержать значения от 0 до 255 . Если ее значение равно 255 , то после инкрементирования оно "сбрасывается" в нуль. Следовательно, факт равенства значения переменной ch нулю служит удобным способом завершить while ‑цикл.

Подобно циклу for, условное выражение проверяется при входе в цикл while, а это значит, что тело цикла (при ложном результате вычисления условного выражения) может не выполниться ни разу. Это свойство цикла устраняет необходимость отдельного тестирования до начала цикла. Следующая программа выводит строку, состоящую из точек. Количество отображаемых точек равно значению, которое вводит пользователь. Программа не позволяет "рисовать" строки, если их длина превышает 80 символов. Проверка на допустимость числа выводимых точек выполняется внутри условного выражения цикла, а не снаружи.

 

 

Тело while‑цикла может вообще не содержать ни одной инструкции. Вот пример:

 

 

Этот цикл выполняется до тех пор, пока случайное число, генерируемое функцией rand() , не окажется равным числу 100 .

 

Цикл do‑while

 

Цикл do‑whileэто единственный цикл, который всегда делает итерацию хотя бы один раз.

В отличие от циклов for и while , в которых условие проверяется при входе, цикл do‑while проверяет условие при выходе из цикла. Это значит, что цикл do‑while всегда выполняется хотя бы один раз. Его общий формат имеет такой вид.

do {

инструкции;

}while(выражение);

Несмотря на то что фигурные скобки необязательны, если элемент инструкции состоит только из одной инструкции, они часто используются для улучшения читабельности конструкции do‑while , не допуская тем самым путаницы с циклом while . Цикл do‑while выполняется до тех пор, пока остается истинным элемент выражение , который представляет собой условное выражение.

В следующей программе цикл do‑while выполняется до тех пор, пока пользователь не введет число 100 .

 

 

Используя цикл do‑while, мы можем еще более усовершенствовать программу "Угадай магическое число". На этот раз программа "не выпустит" вас из цикла угадывания, пока вы не угадаете это число.

 


Дата добавления: 2018-09-22; просмотров: 522; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!