Шрифт:
Интервал:
Закладка:
Проблема заключается в том, что вы не можете предотвратить ввод неверной информации. Программа предполагает, что пользователь всегда вводит правильные данные. Условие unit=='i' отличает единицу измерения 'i' от любых других вариантов. Она никогда не проверяет его для единицы измерения 'c'.
Что произойдет, если пользователь введет 15f (футов) “просто, чтобы посмотреть, что будет”? Условие (unit=='i') станет ложным, и программа выполнит часть инструкции else (вторую альтернативу), преобразовывая сантиметры в дюймы. Вероятно, это не то, чего вы хотели, вводя символ 'f'.

Приведем улучшенную версию программы.
// преобразование дюймов в сантиметры и наоборот
// суффикс 'i' или 'c' означает единицу измерения на входе
// любой другой суффикс считается ошибкой
int main()
{
const double cm_per_inch = 2.54; // количество сантиметров
// в дюйме
double length = 1; // длина в дюймах или сантиметрах
char unit = ' '; // пробел - не единица измерения
cout<< "Пожалуйста, введите длину и единицу измерения (c или i):n";
cin >> length >> unit;
if (unit == 'i')
cout << length << "in == " << cm_per_inch*length << "cmn";
else if (unit == 'c')
cout << length << "cm == " << length/cm_per_inch << "inn";
else
cout << "Извините, я не знаю, что такое '" << unit << "'n";
}
Сначала мы проверяем условие unit=='i', а затем условие unit=='c'. Если ни одно из этих условий не выполняется, выводится сообщение "Извините, ...". Это выглядит так, будто вы использовали инструкцию "else-if", но такой инструкции в языке С++ нет. Вместо этого мы использовали комбинацию двух инструкций if. Общий вид инструкции if выглядит так:
if (выражение) инструкция else инструкция
Иначе говоря, за ключевым словом if следует выражение в скобках, а за ним — инструкция, ключевое слово else и следующая инструкция. Вот как можно использовать инструкцию if в части else инструкции if:
if (выражение) инструкция else if (выражение) инструкция else инструкция
В нашей программе этот примем использован так:
if (unit == 'i')
... // 1-я альтернатива
else if (unit == 'c')
... // 2-я альтернатива
else
... // 3-я альтернатива

ПОПРОБУЙТЕ
Используя приведенный выше пример, напишите программу для перевода йен, евро и фунтов стерлингов в доллары. Если вы любите реальные данные, уточните обменные курсы в веб.
4.4.1.2. Инструкции switch
Сравнение единиц измерения с символами 'i' и 'c' представляет собой наиболее распространенную форму выбора: выбор, основанный на сравнении значения с несколькими константами. Такой выбор настолько часто встречается на практике, что в языке C++ для него предусмотрена отдельная инструкция: switch. Перепишем наш пример в ином виде
int main()
{
const double cm_per_inch = 2.54; // количество сантиметров
// в дюйме
double length = 1; // длина в дюймах или сантиметрах
char unit = 'a';
cout<< "Пожалуйста, введите длину и единицу измерения (c или i):n";
cin >> length >> unit;
switch (unit) {
case 'i':
cout << length << " in == " << cm_per_inch*length << " cmn";
break;
case 'c':
cout << length << " cm == " << length/cm_per_inch << " inn";
break;
default:
cout << "Извините, я не знаю, что такое '" << unit << "'n";
break;
}
}

4.4.1.3. Технические подробности инструкции switch
Здесь под техническими подробностями подразумеваются следующие детали, касающиеся инструкции switch.
1. Значение, которое определяет выбор варианта, должно иметь тип int, char или enum (см. раздел 9.5). В частности, переключение по строке произвести невозможно.
2. Значения меток разделов case должны быть константными выражениями (см. раздел 4.3.1). В частности, переменная не может быть меткой раздела case.
3. Метки двух разделов case не должны иметь одинаковые значения.
4. Один раздел case может иметь несколько меток.
5. Не забывайте, что каждый раздел case должен завершаться ключевым словом break. К сожалению, компилятор не предупредит вас, если вы забудете об этом.
Рассмотрим пример.
int main() // переключение можно производить только по целым
// числам и т.п.
{
cout << "Вы любите рыбу?n";
string s;
cin >> s;
switch (s) { // ошибка: значение должно иметь тип int,
// char или enum
case " нет ":
// ...
break;
case " да ":
// ...
break;
}
}
Для