Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

С момента определения переменной

y
вы могли забыть, что переменная
x
имеет тип
double
, или упустить из виду, что преобразование
double
в
int
приводит к усечению (округлению вниз). Результат вполне предсказуем: семь десятых потеряны. Преобразование
int
в
char
не порождает проблем с усечением — ни тип
int
, ни тип
char
невозможно представить в виде дробной части целого числа. Однако переменная типа
char
может хранить только очень небольшие целые
числа. В персональных компьютерах переменная типа
char
занимает 1 байт, в то время как переменная типа
int
— 4 байта.

Итак, мы не можем записать большое число, например 1000, в переменную типа
char
без потери информации: значение “сужается”. Рассмотрим пример.

int a = 1000;

char b = a; // переменная b становится равной –24

Не все значения типа

int
эквивалентны значению типа
char
. Точный диапазон значения типа
char
зависит от конкретной реализации. На персональных компьютерах значения типа
char
колеблются в диапазоне [–128:127], но мобильность программ можно обеспечить только в диапазоне [0:127], поскольку не каждый компьютер является персональным, и на некоторых из них значения типа
char
лежат в диапазоне [0:255].

Почему люди смирились с проблемой суживающих преобразований? Основная причина носит исторический характер: язык С++ унаследовал суживающие преобразования от предшественника, языка С. К первому дню существования языка С++ уже было множество программ, написанных на языке С и содержащих суживающие преобразования. Кроме того, многие такие преобразования на самом деле не создают никаких проблем, поскольку используемые значения не выходят за пределы допустимых диапазонов, и многие программисты жалуются, что “компиляторы указывают им, что надо делать”. В частности, опытные программисты легко справляются с проблемой опасных преобразований в небольших программах. Однако в более крупных программах и для неопытных программистов это может стать источником ошибок. Тем не менее компиляторы могут предупреждать программистов о суживающих преобразованиях — и многие из них делают это.

Итак, что делать, если вы подозреваете, что преобразование может привести к неверным результатам? Перед присваиванием проверьте значение, как это сделано в рассмотренном примере. Более простой способ такой проверки описан в разделах 5.6.4 и 7.4.

Задание

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

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

first_name
”, где
first_name
— это имя, введенное пользователем. Затем модифицируйте программу следующим образом: измените приглашение на строку “Введите имя адресата” и измените вывод на строку “Dear
first_name
,”. Не забудьте о запятой.

2. Введите одну или две вступительные фразы, например “Как дела? У меня все хорошо. Я скучаю

по тебе”. Убедитесь, что первая строка отделена от других. Добавьте еще несколько строк по своему усмотрению — это же ваше письмо.

3. Предложите пользователю ввести имя другого приятеля и сохраните его в переменной

friend_name
. Добавьте в ваше письмо следующую строку: “Видел ли ты
friend_name
недавно?”.

4. Объявите переменную типа

char
с именем
friend_sex
и инициализируйте его нулем. Предложите пользователю ввести значение
m
, если ваш друг — мужчина, и
f
— если женщина. Присвойте переменной
friend_sex
введенное значение. Затем с помощью двух инструкций
if
запишите следующее. Если друг — мужчина, то напишите строку: “Если ты увидишь
friend_name
, пожалуйста, попроси его позвонить мне”. Если друг — женщина, то напишите строку: “Если ты увидишь
friend_name
, пожалуйста, попроси ее позвонить мне”.

5. Предложите пользователю ввести возраст адресата и присвойте его переменной

age
, имеющей тип
int
. Ваша программа должна вывести на экран строку: “Я слышал, ты только что отметил день рождения и тебе исполнилось
age
лет”. Если значение переменной
age
меньше или равно 0 или больше или равно 110, выведите на экран строку
simple_error("ты шутишь!")
, используя функцию
simple_error
из заголовочного файла
std_lib_facilities.h
.

6. Добавьте в ваше письмо следующие строки Если вашему другу меньше 12 лет, напишите: “На следующий год тебе исполнится

age+1
лет”. Если вашему другу 18 лет, напишите: “На следующий год ты сможешь голосовать”. Если вашему другу больше 60 лет, напишите: “Я надеюсь, что ты не скучаешь на пенсии”. Убедитесь, что ваша программа правильно обрабатывает каждое из этих значений.

7. Добавьте строку “Искренне твой,” затем введите две пустые строки для подписи и укажите свое имя.

Контрольные вопросы

1. Что подразумевается под приглашением?

2. Какой оператор используется для ввода переменной?

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

number
?

4. Как называется символ

\n
и для чего он предназначен?

5. Что является признаком конца строки?

6. Как прекращается ввод значения в целочисленную переменную?

7. Как записать

cout << "Hello, ";

cout << first_name;

cout << "!\n";

в одной строке?

8. Что такое объект?

9. Что такое литерал?

10. Какие существуют виды литералов?

11. Что такое переменная?

12. Назовите типичные размеры переменных типов

char
,
int
и
double
?

13. В каких единицах измеряется объем памяти, занимаемой небольшими переменными, например объектами типов

int
и
string
?

14. В чем заключается разница между операторами

=
и
==
?

15. Что такое определение?

16. Что такое инициализация и чем она отличается от присваивания?

17. Что такое конкатенация строк и как она выполняется в языке С++?

18. Какие из следующих имен являются допустимыми в языке С++? Если имя является недопустимым, то укажите, по какой причине.

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец