- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Шрифт:
Интервал:
Закладка:
Проблема заключается в том, что вы не можете предотвратить ввод неверной информации. Программа предполагает, что пользователь всегда вводит правильные данные. Условие 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;
}
}
Синтаксис оператора switch архаичен, но он намного яснее вложенных инструкций if, особенно если необходимо сравнить значение со многими константами. Значение, указанное в скобках после ключевого слова switch, сравнивается с набором констант. Каждая константа представлена как часть метки case. Если значение равно константе в метке case, то выбирается инструкция из данного раздела case. Каждый раздел case завершается ключевым словом break. Если значение не соответствует ни одной метке case, то выбирается оператор, указанный в разделе default. Этот раздел не обязателен, но желателен, чтобы гарантировать перебор всех альтернатив. Если вы еще не знали, то знайте, что программирование приучает человека сомневаться практически во всем.
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;
}
}
Для

