Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Глава 8. Позвольте компьютеру принимать решения

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

Начиная с этой главы, мы будем придавать особое значение изучению логики построения программы. Так как вы уже достаточно хорошо знакомы с синтаксисом и структурой языка Си/Cи++, то отметите эту смену акцентов. Теперь, вместо того чтобы тратить время на каждую точку с запятой или скобку, вам предлагается сконцентрировать внимание на алгоритмах и способах решения проблем. Вы узнаете, что обычно не существует «единственно верного» способа написать программу, решение одной и той же задачи может идти различными путями.

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

If — маленькое слово с большими возможностями

Все эти чудеса выполняются с помощью ключевого слова if. Это короткое слово имеет, однако, большой вес. Инструкция if используется в тех случаях, когда необходимо решить, должна ли быть выполнена конкретная инструкция программы (if по-английски значит «если»). Структура if выглядит следующим образом:

if (condition)

instruction;

Этой записью мы говорим: «Если некоторое условие выполняется (является истинным), инструкция должна быть выполнена» (рис.8.1). То есть, компьютер, встретив ключевое слово if, выполняет инструкцию, следующую за ним, если условие в скобках является истинным.

Рис. 8.1. Структура инструкции if

Если условие не выполняется, компьютер пропускает инструкцию, записанную после if, и переходит к следующим строкам программы. Использование if не будет вызывать у вас затруднений, как только вы запомните основные моменты:

  • условие заключается в круглые скобки;

  • точку с запятой ставят не после условия, а только в конце инструкции;

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

Условия

Условием в инструкции if является сравнение значений: значение переменной или константы сравнивается с литералом, или со значением другой переменной или константы. Сравнение выполняется с помощью одного из следующих операторов отношения:

Оператор

Значение

Пример

==

равно

if (tax == 0.06)

>

больше

if (hours > 40)

<

меньше

if (hours < 40)

>=

больше или равно

if (salary >= 10000)

<=

меньше или равно

if (cost <= limit)

!=

не равно

if (count != 1)

Обратите внимание: когда вы хотите узнать, равны ли два значения друг другу, то должны использовать оператор отношения, состоящий из двух знаков равенства (==) подряд. Если поставить только один знак равенства, компилятор сгенерирует предупреждение, или, реже, ошибку. Единичный знак равенства (=) используется для обозначения присваивания значения переменной.

Простейшая инструкция с использованием if выглядит примерно так:

if (time > 11)

puts("Уже поздно, ступайте домой.");

Здесь говорится: «Если значение переменной time больше 11, тогда следующее сообщение должно быть выведено на дисплей». Если значение переменной time окажется меньше 11, сообщение не появится.

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

gets(name);

if (name == "Адам")

puts("Позвоните домой");

Строковые переменные являются темой отдельного разговора и подробно обсуждаются в главе 10.

В программе, приведенной в Листинге 8.1, используется инструкция if. Эта программа является вариантом программы, которую мы уже видели в предыдущей главе. В ней рассчитывалась общая стоимость наименования товара с учетом налога на продажи. Здесь добавлен расчет специального налога на предметы роскоши для товаров, цена которых превышает 40000 долларов. Расчет этого налога выполняется в инструкции:

if (cost > 40000.00)

luxury = cost * 0.005;

Листинг 8.1. Программа расчета стоимости товаров с учетом налога на предметы роскоши.

/*luxury1.c*/

main()

{

float cost, tax, luxury, total;

luxury = 0.0;

printf("Введите цену товара: ");

scanf("%f", &cost);

tax = cost * 0.06;

if (cost > 40000.00)

luxury = cost * 0.005;

total = cost + tax + luxury;

printf("Стоимость единицы товара с учетом налогов составляет %.2f", total);

}

В этих инструкциях говорится: «Если значение переменной cost больше 40000, то переменной luxury присваивается значение, равное значению cost, умноженному на 0.5 процента». Последние две строки инструкций в программе выполняются в любом случае, независимо от того, присутствует налог на предметы роскоши или нет, так как эти строки расположены после точки с запятой, завершающей инструкцию if.

Заметьте, что в начале программы переменной luxury присваивается начальное значение, равное 0, в отличие, например, от переменной tax. Причина в том, что переменной tax в любом случае будет присвоено значение, полученное в результате выполнения математических операций tax = cost * 0.06, а расчет и присваивание значения переменной luxury осуществляется только в том случае, если стоимость превышает 40тысяч долларов. Если условие не соблюдается, расчет не производится. В этом случае, если бы переменная luxury не была инициализирована, в выражение расчета общей стоимости было бы подставлено случайное значение, хранящееся в памяти. Поэтому представляется в высшей степени разумным, если вы всегда будете присваивать начальное значение переменным, которые используются в инструкции if, так же, как это делается при использовании счетчика и аккумулятора.

Используя операторы отношения больше и меньше, удостоверьтесь, что с их помощью вы составили именно те условия, которые необходимы. В приведенном примере налог на предметы роскоши добавляется только в том случае, если цена товара хотя бы на один цент превышает 40 тысяч долларов, то есть если вещь стоит 40 тысяч долларов 1 цент и больше. Если стоимость товара составляет ровно 40 тысяч долларов, налог на предметы роскоши не добавляется. Если бы налогом облагались товары, стоимостью 40 тысяч долларов и выше, следовало бы указать условие:

if (cost >= 40000.00)

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