Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Оператор if






Управляющие операторы С: ветвление и переходы

Давайте начнем с простого примера применения оператора if, представленного в листинге 7.1. Эта программа считывает список показаний минимальных дневных температур (по шкале Цельсия) и выводит общее количество элементов, а также про­цент значений, меньших точки замерзания (т.е. ниже нуля по Цельсию). Для чтения значений используется функция scanf () в цикле. На каждой итерации цикла инкре­ментируется счетчик, отслеживая количество показаний. С помощью оператора if идентифицируются значения температуры ниже нуля, ведется отдельный подсчет та­ких случаев.

Листинг7.1. Программа colddays.c

// colddays.c - вычисляет процент случаев, когда температура опускается ниже нуля

#include < stdio.h>

int main(void)

{

const int FREEZING = 0;

float temperature;

int cold_days = 0;

int all_days = 0;

 

printf(" Введите список минимальных дневных температур.\n");

printf(" Используйте шкалу Цельсия; для завершения введите q.\n");

while (scanf(" %f", & temperature) == 1)

{

all_days++;

if (temperature < FREEZING)

cold_days++;

}

if (all_days! = 0)

printf(" %d общее количество дней: %.1f%% с температурой ниже нуля.\n",

all_days, 100.0 * (float) cold_days / all_days);

if (all_days == 0)

printf(" Данные не введены! \n");

 

return 0;

}

 

Ниже показан результат выполнения этой программы:

Введите список минимальных дневных температур.

Используйте шкалу Цельсия, для завершения введите q.



12 5 -2.5 0 6 8 -3 -10 5 10 q

10 - общее количество дней: 30.0% дней с температурой ниже нуля.

 

В условии проверки цикла while значение, возвращаемое функцией scanf (), ис­пользуется для завершения цикла, когда встречается нечисловое значение. За счет применения типа float вместо int для переменной temperature программа получа­ет возможность принимать такие показания температуры, как -2.5, а также 8.

Вот новый оператор в блоке while:

if (temperature < FREEZING) cold_days++;

Этот оператор if инструктирует компьютер увеличить значение cold days на 1, если только что считанное значение (temperature) меньше нуля. Что произойдет, если значение temperature не меньше нуля? Тогда оператор cold_days++; пропуска­ется, а выполнение цикла while продолжается и читается следующее значение темпе­ратуры. Оператор if еще два раза используется в программе для управления выводом. Если данные в наличии, программа выводит результаты. Если данные отсутствуют, программа сообщает об этом.

Чтобы избежать целочисленного деления при вычислении процентного отноше­ния, в примере выполняется приведение к типу float. На самом деле в этом приве­дении нет необходимости, т.к. входящее в выражение 100.0 * cold days / all days подвыражение 100.0 * cold days вычисляется первым и принудительно приводится к типу с плавающей запятой правилами автоматического преобразования типов. Тем не менее, явное указание приведения типа документирует ваше намерение и помогает защитить программу от ошибочных переделок. Оператор if называется оператором ветвления или оператором выбора, потому что он представляет собой узловой пункт, где программа должна выбрать один из двух путей для дальнейшего следования. Общая форма оператора if имеет вид:

if (выражение) оператор

Если выражение имеет истинное (ненулевое) значение, то оператор выполняется. В противном случае он пропускается. Как и в цикле while, оператор может быть как одиночным, так и составным оператором. Его структура очень похожа на структуру while. Основное различие заключается в том, что в операторе if проверка условия и (возможное) выполнение производится всего лишь один раз, в то время как в цикле while проверка условия и выполнение могут повторяться многократно.

Обычно выражение является выражением отношения, т.е. в нем сравниваются две количественных величины, как в выражениях х > у и с == 6. Если выражение истинно (х больше у либо с равно 6), оператор выполняется, иначе оператор игнорируется. В общем случае можно применять любое выражение, при этом выражение, принима­ющее значение 0, трактуется как ложное.

Часть оператор может быть простым либо составным оператором или блоком, за­ключенным в фигурные скобки:

if (score > big)

printf(" Джекпот! \n"); // простой оператор

if (joe > ron)

{

// составной оператор

joecash++;

printf (" Ты проиграл, Ron.W);

}

Обратите внимание, что вся структура if считается одним оператором, даже если в ней присутствует составной оператор.

 

Добавление к оператору if конструкции else

Простая форма оператора if предоставляет выбор между выполнением оператора (возможно, составного) и пропуском его. Язык С также позволяет выбирать один из двух операторов с использованием формы if else. Давайте применим форму if else, чтобы улучшить показанный ниже неуклюжий фрагмент кода из листинга 7.1:

if (all_days! = 0)

printf(" %d - общее количество дней: с температурой ниже нуля\n",

all_days, 100.0 * (float) cold_days / all_days);

if (all_days == 0)

printf(" Данные не введены! \n");

Когда проверка значения all days на неравенство 0 не проходит, то и без повторной проверки должно быть ясно, что оно равно нулю. Форма if else позволяет воспользоваться преимуществом этого знания, переписав данный фрагмент следующим образом:

if (all_days! = 0)

printf(" %d - общее количество дней: %.lf%% с температурой ниже нуля\n",

all_days, 100.0 * (float) cold_days / all_days);

else

printf(" Данные не введены! \n");

Здесь выполняется только одна проверка. Если проверочное выражение оператора if истинно, данные о температуре выводятся. Если же оно ложно, выводится предупреждающее сообщение. Вот общая форма оператора if else:

if (выражение)

оператор1

else

оператор2

Если выражение истинно (не равно нулю), выполняется оператор1. Если выражение ложно (равно нулю), выполняется оператор, следующий за else. Операторы могут быть простыми либо составными. Отступы в С не являются обязательными, но это стандартный стиль записи. Отступы зрительно выделяют операторы, выполнение которых зависит от условия проверки. Если между if и else нужно поместить более одного оператора, необходимо указать фигурные скобки, чтобы создать единый блок. В приведенной ниже конструкции нарушается синтаксис языка С, поскольку компилятор ожидает встретить между if и else только один оператор (простой или составной):

if (х > 0)

printf(" Инкрементирование х: \n");

х ++;

else // здесь возникнет ошибка

printf(" х < = 0 \n");

Компилятор трактует оператор printf () как часть оператора if, но оператор х++; — как отдельный оператор, а не часть if. Поэтому компилятор считает, что else не принадлежит if, что является ошибкой. Взамен воспользуйтесь следующей формой:

if (х > 0)

{

printf(" Инкрементирование х: \n");

х++;

}

else

printf(" х < = 0 \n");

Оператор if позволяет выбрать между выполнением или не выполнением одного действия. Оператор if else позволяет делать выбор между двумя действиями. На рис. 7.1 приведено сравнение этих двух операторов.

 

Еще один пример: знакомство С ФУНКЦИЯМИ getchar () И putchar ()

В большинстве рассмотренных до сих пор примеров применялись числовые вход­ные данные. Чтобы попрактиковаться с данными других типов, рассмотрим пример, ориентированный на обработку символов. Вы уже знаете, как использовать функции scanf() и printf() со спецификатором %с для чтения и вывода символов, но в этом примере мы будем иметь дело с парой функций С, специально предназначенных для символьного ввода-вывода — getchar () и putchar ().

Функция getchar () не принимает аргументов и возвращает очередной символ из входного потока. Например, показанный далее оператор читает следующий входной символ и присваивает его значение переменной ch:

ch = getchar();

Этот оператор дает тот же самый результат, что и оператор

scanf(" %c", & ch);

Функция putchar () выводит переданный ей аргумент. Например, следующий опе­ратор выводит в виде символа значение, ранее присвоенное переменной ch:

putchar(ch);

Этот оператор обеспечивает такой же результат, что и оператор

printf (" %c", ch);

Поскольку эти функции работают только с символами, они быстрее и компактнее, чем более универсальные функции scanf () и printf (). Обе функции обычно определены в файле stdio.h.

Давайте посмотрим, как эти функции работают, написав программу, которая отображает введенную строку, но заменяет каждый отличный от пробела символ следующим за ним символом в последовательности кодов ASCII. Пробелы будут выводиться без изменений. Результат можно сформулировать так: “Если символ является пробелом, он выводится, в противном случае выводится символ, следующий за ним в последовательности кодов ASCII”.

Код программы представлен в листинге 7.2.

Листинг 7.2. Программа cypher1.с

// cypher1.c -- вносит изменения во входные данные, сохраняя пробелы

#include < stdio.h>

#define SPACE ' ' // кавычка, пробел, кавычка

int main(void)

{

char ch;

 

ch = getchar(); // читать символ

while (ch! = '\n') // пока не встретится конец строки

{

if (ch == SPACE) // оставить пробел

putchar(ch);

else

putchar(ch + 1); // изменить символы

ch = getchar();

}

putchar(ch); // вывести символ новой строки

return 0;

}

 

Ниже показан результат выполнения программы:

CALL ME HAL.

DBMM NF IBM/

Сравните этот цикл с циклом из листинга 7.1. В листинге 7.1 для определения мо­мента прекращения цикла применялось возвращаемое значение scanf (), а не значе­ние введенного элемента. Однако в листинге 7.2 для этой цели используется значение самого введенного элемента. Такое отличие в результате приводит к несколько другой структуре цикла, с одним оператором чтения перед циклом и еще одним оператором чтения в конце цикла. Тем не менее, гибкий синтаксис языка С позволяет эмулировать программу из листинга 7.1 за счет объединения чтения и проверки в одно выражение. То есть цикл следующего вида:

ch = getchar (); /* читать символ */

while (ch! = ‘\n’) /* пока не встретится конец строки */

{

/* обработать символ */

ch = getchar(); /* получить следующий символ */

}

 

можно заменить таким циклом:

while ((ch = getchar ())! = '\n')

{

/*обработать символ */

}

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.