Простейшие средства ввода/вывода

Любая программа каким-либо образом взаимодействует с внешним миром. В простейшем случае это работа с консолью: ввод с клавиатуры и вывод на экран. В языке С++ нет встроенных средств ввода/вывода - он осуществляется с помощью средств, содержащихся в стандартных библиотеках. Рассмотрим два примера.

// используются классы стандартной библиотеки#include <iostream> // 1using namespace std; // 2int main() // 3{ const double course = 35.8; // 4 double sum; // 5 cout << "Введите сумму в рублях: "; // 6 cin >> sum; // 7 double euro = sum / course; // 8 cout << "В рублях: " << sum << " В евро: " << euro << " "; // 9 return 0; // 10}

Листинг 2.1. Программа перевода рублей в европейскую валюту (html, txt)

Это первый пример законченной программы, поэтому рассмотрим его подробно. В первой строке записана директива препроцессора. Директива вида

#include <имя_файла>

вставляет содержимое указанного файла (он называется заголовочным ) в ту точку исходного файла, где она расположена. В данном случае директива задает включение файла <iostream>, в котором содержатся описания используемых в программе элементов стандартной библиотеки ввода/вывода.

Строка 2 является описанием, по которому программе становятся доступными все имена, определенные в стандартном заголовочном файле <iostream>. Дело в том, что внутри этого файла все описания спрятаны в так называемую поименованную область (пространство имен) с именем std. Это касается всех стандартных заголовочных файлов и сделано для того, чтобы стандартные имена не конфликтовали с теми, которые ввел программист.

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

ПРИМЕЧАНИЕДля многих заголовочных файлов, содержимое которых определено в пространстве имен std, существуют их двойники "старого стиля" с расширением .h,описания, находящиеся в которых, доступны без дополнительных усилий - например, <iostream.h>, <stdio.h>. Заголовочные файлы, унаследованные из языка С, записываются при этом без ведущей буквы c. Этот способ использования заголовочных файлов считается устаревшим.

Строка 3 представляет собой заголовок главной (и единственной) функции, в строках 4 и 5 описаны две величины с плавающей точкой: константа course и переменная sum. Строка 6 является приглашением к вводу. В результате выполнения этого оператора на экран выводится строка "Введите сумму в рублях:" и курсор переводится на следующую строку в соответствии с управляющей последовательностью . Стандартному объекту cout с помощью операции << передается то, что мы хотим вывести, в данном случае строковый литерал. Для вывода нескольких элементов используется цепочка операций, как в строке 9. Все величины, кроме символов и строк, при выводе преобразуются из внутренней формы представления в последовательность символов. Под величину отводится ровно столько позиций, сколько требуется для ее вывода.

В процессе ввода ( строка 7 ) происходит обратный процесс: величина преобразуется из последовательности символов, набранных на клавиатуре, во внутреннее представление числа с плавающей точкой и помещается в ячейку памяти, зарезервированную для переменной sum. Как видите, семантика ввода проста и интуитивно понятна: значение со стандартного ввода передается в переменную, указанную справа от знака операции. Если требуется ввести несколько величин, используется цепочка операций >>.

В строке 8 определяется переменная euro, которая инициализируется результатом деления переменной sum на переменную course. В строке 10 в вызывающую среду возвращается значение 0 - признак успешного завершения программы. Оператор return 0 в главной функции записывать не обязательно, поскольку при его отсутствии значение 0 будет возвращено автоматически. Во всех последующих примерах этот оператор опущен для экономии места.

Другой вариант записи той же программы приведен в листинге 2.2.

// используются функции ввода/вывода в стиле С#include <сstdio> // 1using namespace std; // 2int main() // 3{ const double course = 36.5; // 4 double sum; // 5 printf( "Введите сумму в рублях " ); // 6 scanf( "%lf", &sum ); // 7 double euro = sum / course; // 8 printf( "В рублях: %lf В евро: %lf ", sum, euro ); // 9}

Листинг 2.2. Программа перевода рублей в европейскую валюту (html, txt)

По директиве препроцессора, расположенной в первой строке, в текст программы вставляется заголовочный файл <cstdio>, содержащий описание использованных в программе функций ввода/вывода. Функция printf в строке 6 выводит приглашение "Введите сумму в рублях:" и переходит на новую строку в соответствии с управляющей последовательностью n. Функция scanf в строке 7 заносит введенное с клавиатуры число в переменную sum. Знак & обозначает операцию получения адреса переменной sum. Это нужно чтобы функция scanf могла записать в эту переменную введенное с клавиатуры значение.

Формат основных функций ввода-вывода, унаследованных из С:

int scanf ( строка_формата, список адресов вводимых величин ) // вводint printf( строка_формата, список выводимых величин ) // вывод

Функции выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой формата. Она содержит символы, которые копируются на экран при выводе или запрашиваются с клавиатуры при вводе, и спецификации преобразования, начинающиеся со знака %, которые при вводе и выводе заменяются конкретными величинами. Каждой величине должна соответствовать своя спецификация.

Спецификация %d означает целое десятичное число, %f используется для величин типа float, %lf - для величин типа double. Оператор в строке 9 выводит на экран указанную в нем строку, заменив спецификации преобразования %lf на значения переменных sum и euro.

Для каждой программы необходимо выбрать один из способов вывода (либо с помощью классов, либо с помощью функций), поскольку смешивать оба варианта не рекомендуется. Функции ввода/вывода в стиле С имеет смысл использовать в тех программах, где требуется тщательное форматирование результатов, а классы - в остальных случаях.