Шрифт:
Интервал:
Закладка:
Мы разделяем обучение на две части: сначала изучаем основы новых инструментов на примере тривиальных программ, а затем исследуем более сложные программы, уже не обращая внимания на инструменты, с помощью которых они написаны. Одновременное изучение инструментов программирования и языка программирования намного сложнее, чем овладение этими предметами по отдельности. Этот подход, предусматривающий разделение сложной задачи на ряд более простых задач, не ограничивается программированием и компьютерами. Он носит универсальный характер и используется во многих областях, особенно там, где важную роль играют практические навыки.
Глава 3
Объекты, типы и значения
“Фортуна благоволит подготовленному уму”.
Луи Пастер (Louis Pasteur)
В этой главе излагаются основы хранения и использования данных в программе. Сначала мы сосредоточим внимание на вводе данных с клавиатуры. После введения основных понятий объектов, типов, значений и переменных рассмотрим несколько операторов и приведем много примеров использования переменных типов char, int, double и string.
3.1. Ввод
Программа “Hello, World!” просто записывает текст на экран. Она осуществляет вывод. Она ничего не считывает, т.е. не получает ввода от пользователя. Это довольно скучно. Реальные программы, как правило, производят результаты на основе каких-то данных, которые мы им даем, а не делают одно и то же каждый раз, когда мы их запускаем.
Для того чтобы считать данные, нам необходимо место, куда можно ввести информацию; иначе говоря, нам нужно какое-то место в памяти компьютера, чтобы разместить на нем то, что мы считаем. Мы называем такое место объектом. Объект — это место в памяти, имеющее тип, который определяет вид информации, разрешенной для хранения. Именованный объект называется переменной. Например, строки символов вводятся в переменные типа string, а целые числа — в переменные типа int. Объект можно интерпретировать как “коробку”, в которую можно поместить значение, имеющее тип объекта.
Например, на рисунке изображен объект типа int с именем age, содержащий целое число 42. Используя строковую переменную, мы можем считать строку с устройства ввода и вывести ее на экран, как показано ниже.
// считать и записать имя
#include "std_lib_facilities.h"
int main()
{
cout << "Пожалуйста, введите ваше имя (затем нажмите 'enter'):n";
string first_name; // first_name — это переменная типа string
cin >> first_name; // считываем символы в переменную first_name
cout << "Hello, " << first_name << "!n";
}
Директива #include и функция main() известны нам из главы 2. Поскольку директива #include необходима во всех наших программах (вплоть до главы 12), мы отложим ее изучение, чтобы не запутывать ситуацию. Аналогично иногда мы будем демонстрировать код, который работает, только если поместить его в тело функции main() или какой-нибудь другой.
cout << "Пожалуйста, введите ваше имя (затем нажмите 'enter'):n";
Будем считать, что вы понимаете, как включить этот код в полную программу, чтобы провести ее тестирование.
Первая строка функции main() просто выводит на экран сообщение, предлагающее пользователю ввести свое имя. Такое сообщение называется приглашением (prompt), поскольку оно предлагает пользователю предпринять какое-то действие. Следующие строки определяют переменную типа string с именем first_name, считывают данные с клавиатуры в эту переменную и выводят на экран слово Hello. Рассмотрим эти строки по очереди.
string first_name; // first_name — это переменная типа string
Эта строка выделяет участок памяти для хранения строки символов и присваивает ему имя first_name.
Инструкция, вводящая новое имя в программе и выделяющая память для переменной, называется определением.
Следующая строка считывает символы с устройства ввода (клавиатуры) в переменную:
cin >> first_name; // считываем символы в переменную first_name
Имя cin относится к стандартному потоку ввода (читается как “си-ин” и является аббревиатурой от haracter put), определенному в стандартной библиотеке. Второй операнд оператора >> (“ввести”) определяет участок памяти, в который производится ввод. Итак, если мы введем некое имя, например Nicolas, а затем выполним переход на новую строку, то строка “Nicolas” станет значением переменной first_name.
Переход на новую строку необходим для того, чтобы привлечь внимание компьютера. Пока переход на новую строку не будет выполнен (не будет нажата клавиша <Enter>), компьютер просто накапливает символы. Эта “отсрочка” дает нам шанс передумать, стереть некоторые символы или заменить их другими перед тем, как нажать клавишу <Enter>. Символ перехода на новую строку не является частью строки, хранящейся в памяти.
Введя входную строку в переменную first_name, можем использовать ее в дальнейшем.
cout << "Hello, " << first_name << "!n";
Эта строка выводит на экран слово Hello за которым следует имя Nicolas (значение переменной first_name) с восклицательным знаком (!) и символом перехода на новую строку экрана ('n').
Hello, Nicolas!
Если бы мы любили повторяться и набирать лишний текст, то разбили бы эту строку на несколько инструкций.
cout << "Hello, ";
cout << first_name;
cout << "!n";
Однако мы не страдаем графоманией и, что еще важнее, — очень не любим лишние повторы (поскольку любой повтор создает возможность для ошибки), поэтому объединили три оператора вывода в одну инструкцию.
Обратите внимание на то, что мы заключили выражение Hello в двойные кавычки, а не указали имя first_name. Двойные кавычки используются для работы с литеральными строками. Если двойные кавычки не указаны, то мы ссылаемся на нечто, имеющее имя.
cout << "Имя " << " — " << first_name;
Здесь строка "Имя" представляет собой набор из трех символов, а имя first_name позволяет вывести на экран значение переменной first_name, в данном случае Nicolas. Итак, результат выглядит следующим образом:
Имя — Nicolas
3.2. Переменные
В принципе, не имея возможности хранить данные в памяти так, как показано в предыдущем примере, с помощью компьютера невозможно сделать ничего интересного. Место, в котором хранятся данные, называют объектами. Для доступа к объекту необходимо знать его имя. Именованный объект называется переменной и имеет конкретный тип (например, int или string), определяющий, какую информацию можно записать в объект (например, в переменную типа int можно записать число 123, а в объект типа string — строку символов "Hello, World!n", а также какие операции к нему можно применять (например, переменные типа int