Листинг 4. Работа программы основывается на указаниях пользователя.

Если на ваш взгляд программа написана вполне корректно, посмотрите ее текст еще раз более внимательно — там есть серьезное упущение. Программа написана так, что пользователь должен в ответ на запрос ввести прописную букву Y, если товар облагается налогом. Если пользователь вводит строчную букву y, программа будет считать, что налог в данном случае не взимается, ведь в инструкции if в качестве правильного условия рассматривается только прописная буква.

 

 

Замечания по использованию функции getchar()
Некоторые компиляторы помещают значения, введенные функцией getchar(), в буфер. Это означает, что введенный символ хранится в памяти компьютера до тех пор, пока пользователь не нажмет клавишу Enter. Проверьте документацию вашего компилятора, чтобы выяснить, использует ли он функции getch() или getche(). Как правило, введенные с их помощью значения не помещаются в буфер, так что можно ввести значение простым нажатием нужной клавиши, без нажатия Enter. Кроме того, использование функции getchar() после ввода с помощью scanf() может создать дополнительную проблему. Данные, формат которых не соответствует ожидаемому (указанному в строке формата), функция scanf() игнорирует, и они остаются в буфере. Функция getchar() может прочитать один из этих символов еще до того, как будет введен нужный символ. Можно избежать подобной опасности, если вместо scanf() использовать функцию gets() либо, если ваш компилятор позволяет это, применить функции ввода символов без буферизации, такие как getch() или getche(). Другим возможным решением является очистка буфера перед каждой функцией getchar(). Добавьте в начало программы директиву #include , а затем вставьте функцию fflush(stdin) перед вызовом getchar(). Функция fflush() удаляет все символы, которые могли остаться в буфере стандартного устройства ввода.

 

В подобной ситуации правильнее было бы проверять оба возможных варианта ввода, то есть и строчную и прописную буквы Y. Можно сделать это с помощью двух инструкций if. А можно использовать логический оператор ИЛИ, который выглядит как две вертикальные черты:

if (taxable == 'Y' || taxable == 'y')

В данной инструкции сказано: «Если переменная taxable имеет значение Y ИЛИ y, то...» Таким образом, мы добьемся того, что товар будет рассматриваться как облагаемый налогом, если выполняется одно из этих двух условий. Если не выполняется ни одно из них, то есть пользователь ввел любой другой символ, товар будет считаться не облагаемым налогом. Условие должно быть целиком помещено в круглые скобки, причем имя переменной taxable следует повторить дважды. Запись условия как (taxable == 'Y' || 'y') приведет к ошибке компиляции.

Есть три логических оператора: ИЛИ (||), И (&&) и отрицания (!). Оператор ИЛИ означает, что для выполнения инструкции if достаточно истинности одного из двух (или обоих вместе) заданных условий. Оператор И указывает на то, что должны быть истинными оба условия одновременно. Оператор отрицания означает, что инструкция if выполняется, если некое условие оказалось ложным.

Операторы Ии ИЛИ можно использовать не только для проверки равенства переменной одному из двух значений (как мы уже делали), но и для тестирования значений различных переменных. Например, вы пишете программу, в которую вводится размер годового дохода пользователя и количество иждивенцев (Листинг 5).