Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
while (getchar() != '\n')
continue; /* пропустить оставшуюся часть входной строки */
Этот цикл читает символы из входной последовательности вплоть до символа новой строки, генерируемого нажатием клавиши , включительно. Обратите внимание, что возвращаемое значение getchar() не присваивается переменной ch, поэтому программа просто читает символы и отбрасывает их. Так как последним отброшенным будет символ новой строки, то очередной подлежащий чтению символ будет первым символом следующей строки. Функция getchar() считывает его и присваивает переменной ch во внешнем цикле while.
Предположим, что пользователь начинает с нажатия , так что первым прочитанным оказывается символ новой строки. Следующий код учитывает эту возможность:
if (ch == ‘\n')
continue;
Множество меток
В операторе switch можно использовать множество меток case, как показано в листинге 7.12.
Управляющие операторы С: ветвление и переходы 281
Листинг 7.12. Программа vowels. с
Если ch содержит, скажем, букву i, оператор switch переходит в место, помеченное как case 1i ' :. Поскольку с этой меткой не связан оператор break, управление переходит к следующему оператору, которым является i_ct++,*. Если значение ch равно I, управление переходит прямо на этот оператор. В сущности, обе метки ссылаются на один и тот же оператор.
Строго говоря, оператор break для case * U' не нужен, т.к. благодаря его отсутствию управление в программе перемещается на следующий оператор внутри switch, которым является break для случая default. Следовательно, break для case ' U' можно было убрать, тем самым сократив код. С другой стороны, если позже будут добавляться другие случаи, то наличие оператора break там, где он должен быть, позволит не забыть о необходимости его добавления.
Ниже показан пример выполнения программы:
Введите текст или # для завершения программы.
I see under the overseer.#
Количество гласных: А Е I О U
0 7 111
282 Глава 7
В рассматриваемом случае можно избежать множества меток за счет применения функции toupper() из семейства ctype.h (см. табл. 7.2), преобразовав перед провер кой условия все строчные буквы в прописные:
Либо при желании значение ch можно было бы оставить неизменным и использовать toupper (ch) в качестве условия проверки:
Сводка: выбор из множества вариантов с помощью оператора switch Ключевое слово
switch
Общий комментарий
Поток управления программы переходит к метке case, содержащей значение конструкции выражение. Затем программа выполняет все оставшиеся операторы, если только управление снова не будет перенаправлено посредством оператора break. Как выражение, так и метки case должны иметь целочисленные значения (включая тип char), а метки должны быть константами или выражениями, состоящими только из констант. Если ни одна из меток case не совпадает со значением выражения, управление передается оператору, помеченному как default, если таковой предусмотрен. В противном случае управление переходит к оператору, следующему за switch.
Форма
switch(toupper(ch)) switch (выражение)
{
case метка! : оператор1 || используйте break, чтобы пропустить все
// операторы до конца switch
case метка2 : оператор2 default : операторЗ
}
Помеченных операторов может быть более двух, а случай default является необязательным. Пример
switch (choice)
{
case 1 :
Управляющие операторы С: ветвление и переходы 283
case 2 : printf("Великолепно!\n"); break;
case 3 : printf("Совершенно верно!\n" );
case 4 : printf("На все сто!\n"); break;
default : printf("Удачного дня.\n");
}
Если переменная choice имеет целое значение 1 или 2, выводится первое сообщение, если
3 — второе и третье сообщения. (Управление переходит на следующий оператор, поскольку
после case 3 не указан оператор break.) Если значение choice равно 4, то выводится третье сообщение. Другие значения приводят к выводу только последнего сообщения.
Операторы switch И if else
Когда должен применяться оператор switch, а когда конструкция if else? Часто выбор попросту отсутствует. Оператор switch нельзя использовать, если выбор основан на значении переменной или выражения с плавающей запятой. Точно гак же применять оператор switch затруднительно, если переменная должна входить в определенный диапазон. Написать следующий код просто:
if (integer < 1000 && integer > 2)
К сожалению, охват этого диапазона посредством оператора switch предполагает установку меток case для каждого целого числа в промежутке от 3 до 999. В то же время, когда есть возможность использовать switch, программа зачастую выполняется немного быстрее и имеет более компактный вид.
Оператор goto
Оператор goto, своего рода оплот ранних версий языков BASIC и FORTRAN, доступен и в С. Тем не менее, в отличие от BASIC и FORTRAN, язык С вполне может обойтись без этого оператора. Керниган и Ритчи отзываются об операторе goto как о потенциальном источнике ошибок и советуют применять его как можно реже или вообще не применять. Сначала мы объясним, как использовать goto, а затем покажем, что обычно в нем нет нужды.
Оператор goto состоит из двух частей — ключевое слово goto и имя метки. Именование меток производится по тому же соглашению, которое применяется для имен переменных,например:
goto part2;
Для корректной работы этого оператора в программе должен присутствовать другой оператор, снабженный меткой part2. Это делается путем помещения перед оператором имени метки с двоеточием:
part2: printf("Уточненный анализ:\n");
избегайте goto
В принципе в программе С никогда не возникает потребность в goto, но если ваш опыт программирования основан на языке FORTRAN или BASIC, где этот оператор обязателен, то вполне возможно, что использование goto вошло в привычку. Чтобы помочь вам избавиться от этой зависимости, мы рассмотрим несколько знакомых случаев применения goto и продемонстрируем подход к их решению, характерный для языка С.
284 глава 7
• Поддержка ситуации с оператором if, требующей выполнения более одного оператора:
if (size > 12) goto а; goto b;
a: cost = cost * 1.05; flag = 2;
b: bill = cost * flag;
В ранних версиях BASIC и FORTRAN к оператору if относился только один оператор, непосредственно следующий за условием. Не было никаких средств для реализации блоков или составных операторов. Ниже приведен эквивалент этой структуры на языке С. Стандартный для С подход с использованием составного оператора или блока существенно облегчает понимание программы: if (size > 12)
{
cost = cost * 1.05; flag = 2;
}
bill = cost * flag;
• Выбор из двух альтернатив:
if (ibex > 14) goto a; sheds = 2; goto b; a: sheds = 3; b: help = 2 * sheds;
Наличие в С структуры if else позволяет выразить выбор более ясно:
if (ibex > 14) sheds = 3; else
Читать дальшеИнтервал:
Закладка: