Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Листинг 7.8. Программа paint.с
Ниже показан пример выполнения программы:
Введите число квадратных футов, которые необходимо покрасить:
349
Для этого потребуется 1 банка краски.
Введите следующее значение (или q для завершения) :
351
Для этого потребуется 2 банки краски.
Введите следующее значение (или q для завершения) :
q
Поскольку в программе применяется тип int, дробная часть результата от деления усекается, т.е. 351/350 дает 1. Таким образом, количество банок округляется до ближайшего меньшего целого. Если sq feet % COVERAGE равно 0, то sq feet делится на
272 глава 7
COVERAGE без остатка, поэтому значение cans остается без изменений. В противном случае имеется остаток, и значение cans увеличивается на 1. Это достигается с помощью следующего оператора:
cans += ((sq_feet % COVERAGE == 0)) ? 0: 1;
Он добавляет к cans значение выражения, указанного справа от знака +=. Выражение справа — это условное выражение, принимающее значение 0 или 1 в зависимости от того, делится ли sq_feet на COVERAGE без остатка.
Последний аргумент функции printf() также является условным выражением:
cans == 1 ? "банка" : "банки");
Если значение переменной cans равно 1, используется строка "банка", в противном случае — строка "банки". Это демонстрирует возможность применения в условной операции строк в качестве второго и третьего операндов.
Сводка: условная операция Условная операция
О;
Общий комментарий
Эта операция принимает три операнда, каждый из которых является выражением: Операция имеет следующую форму:
выражение1 ? выражение2 : выражениеЗ
Значение всего выражения равно значению выражение2, если выражение1 истинно, и значению выражениеЗ в противном случае.
Примеры
(5 > 3) ? 1 : 2 получает значение 1.
(3 > 5) ? 1 : 2 получает значение 2.
(а > b) ? а : b получает большее значение среди а и ь.
Вспомогательные средства для циклов:
continue И break
Обычно после входа в тело цикла программа выполняет все находящиеся там операторы, прежде чем проводить очередную проверку условия цикла. Операторы continue и break позволяют пропускать часть цикла и даже прекращать его выполнение в зависимости от результатов проверки, производимой внутри тела цикла.
Оператор continue
Этот оператор может использоваться во всех трех формах циклов. Когда он встречается, он вызывает пропуск оставшейся части итерации и начало новой итерации. Если оператор continue указан внутри вложенной структуры, он воздействует только на самую внутреннюю структуру, содержащую его. Давайте опробуем continue в короткой программе, показанной в листинге 7.9.
Листинг 7.9. Программа skippart.c
Управляющие операторы С: ветвление и переходы 273
В листинге 7.9 цикл while читает входные данные до тех пор, пока не будет введено нечисловое значение. Оператор if внутри цикла отсеивает недопустимые значения результатов. Если вы, скажем, вводите число 188, программа сообщает о том, что оно является недопустимым. Затем оператор continue заставляет программу пропустить оставшуюся часть цикла, которая предназначена для обработки допустимого входного значения. Взамен программа начинает новую итерацию, считывая очередное входное значение.
Следует отметить, что избежать применения оператора continue можно двумя путями. Один из них предполагает устранение оператора continue и заключение оставшейся части итерации в блок else:
if (score < 0 || score > 100)
/* оператор printf() */
else
{
/* операторы */
}
В качестве альтернативы можно было бы воспользоваться следующим форматом:
if (score >= 0 && score <= 100)
{
/* операторы */
}
274 Глава 7
Преимущество использования continue в этом случае связано с возможностью устранения одного уровня отступа в главной группе операторов. Краткая форма способствует читабельности в ситуации, когда иначе операторы получаются громоздкими и глубоко вложенными.
Оператор continue может также применяться как заполнитель. Например, в следующем цикле читаются и отбрасываются вводимые символы, включая конец строки:
while (getchar() != '\n')
Такой прием удобен, когда программа уже прочитала некоторые символы в строке и ей необходимо пропустить оставшиеся символы до начала следующей строки. Проблема этого кода в том, что одиночный символ точки с запятой трудно заметать. Код станет более читабельным, если воспользоваться оператором continue:
while (getchar() != '\n') continue;
He применяйте оператор continue, если он вместо упрощения усложняет код. Взгляните на следующий фрагмент:
while ((ch = getchar()) != '\n')
{
if (ch = ‘\t') continue; putchar(ch);
}
В этом цикле пропускаются символы табуляции, а сам цикл завершается, только когда встретится символ новой строки. Такой цикл можно выразить более экономно:
while ((ch = getchar()) != '\n ') if (ch != ‘\t') putchar(ch);
Часто, как и в данном случае, обращение проверки в if устраняет потребность в
continue.
Вы уже видели, что оператор continue приводит к пропуску оставшейся части тела цикла. Где в точности возобновляется выполнение цикла? В случае while и do while следующим действием после continue будет вычисление условия проверки цикла. Рассмотрим для примера следующий цикл:
count = 0;
while (count < 10)
{
ch = getchar(); if (ch = ‘\n') continue; putchar(ch); count++;
}
Цикл считывает 10 символов (исключая символы новой строки, т.к. оператор count++; пропускается, когда значением ch является символ новой строки) и выводит их на экран кроме символа новой строки. После выполнения оператора continue следующим вычисляется проверочное выражение цикла.
В цикле for следующим действием будет вычисление обновляющего выражения и затем проверочного выражения цикла. Взгляните на показанный ниже пример цикла:
Управляющие операторы С: ветвление и переходы 275
for (count = 0; count < 10; count++)
{
ch = getchar(); if (ch == ‘\n ') continue; putchar(ch);
}
В этом случае после выполнения оператора continue переменная count сначала инкрементируется, а затем сравнивается со значением 10. Следовательно, данный цикл ведет себя несколько иначе цикла while в рассмотренном выше примере. Как и ранее, отображаются только символы, отличные от символа новой строки. Однако на этот раз при подсчете учитываются символы новой строки, так что цикл читает ровно 10 символов, включая символы новой строки.
Оператор break
Оператор break в цикле заставляет программу прервать цикл и перейти к выполнению следующего оператора. В листинге 7.9 замена continue оператором break приводит к выходу из цикла при вводе, скажем, числа 188, а не к пропуску оставшихся операторов внутри цикла и переходу к следующей итерации. На рис. 7.3 приведено сравнение операторов break и continue. Если оператор break находится внутри вложенных циклов, его действие распространяется только на самый внутренний цикл, в котором он содержится.
Читать дальшеИнтервал:
Закладка: