Функции и объекты ввода/вывода



 

В языке C++ нет встроенных средств ввода/вывода – он осуществляется с помощью функций, типов и объектов, содержащихся в стандартных библиотеках. Используется два способа: функции, унаследованные из языка С, и объекты C++. Подчеркивая важность функций и объектов ввода/вывода их иногда называют операторами, хотя, по сути, это не так.

 

2.9.1 Основные функции ввода/вывода в стиле С:

 

scanf (const char* format, [адрес переменной] , [адрес переменной]... ) // ввод

printf(const char* format, [имя переменной] , [имя переменной]... )     // вывод

Они выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой формата format.

printf () является функцией стандартной библиотеки с переменным числом аргументов.Она всегда имеет, по крайней мере, один аргумент – строку формата, чаще всего строковый литерал. Строка может содержать спецификаторы преобразования. Функция сканирует строку и передает ее символы на стандартный вывод программы, по умолчанию консоль, пока не встретит спецификатор преобразования. В этом случае printf () ищет дополнительный аргумент (используя имя переменной из списка), который форматируется и выводится в соответствии со спецификацией ( спецификация в строке вывода заменяется на значение переменной). Таким образом, вызов printf () должен содержать столько дополнительных аргументов, сколько спецификаторов преобразования имеется в строке формата.

Спецификатор преобразования

Синтаксис спецификатора преобразования имеет такой вид:

%[флаги] [поле][.точность][размер]символ типа

Как видите, обязательными элементами спецификатора являются только начальный знак процента (по знаку процента легко контролировать количество переменных) и символ, задающий тип преобразования. Таблица I.5 Приложения I перечисляет возможные варианты различных элементов спецификации.

Флаги задают “стиль” представления чисел на выводе, поле и точность определяют характеристики поля, отведенного под вывод аргумента, размер уточняет тип аргумента, символ типа задает собственно тип преобразования.

В строке формата можно использовать escape-последовательности. В приведенном ниже примере используется последовательность \n, которая обеспечивает при выводе перевод строки.

 Следующий пример показывает возможности форматирования функции printf (). Если суть оператора и спецификации не понятна, выполните следующую далее программу в C++Builder.

 

Примечание: следует напомнить, что на рис. 1.2 была базовая программа. Здесь и далее будет приведен текст, который нужно поместить между линиями из звездочек в базовую программу.

 

/*

**Демонстрация форматирования вывода на консоль

**функцией printf().

*/

double p = 27182.81828;

int j = 255;

/* Вывести 4 цифры; вывести обязательный знак числа */

printf(RUS("       Позиции: 1234567891234123456789\n"));

printf(RUS("Тест целого формата: %13.4d %+8d\n"), j, j);

/* Вывести по левому краю со знаком;

заполнить нулями свободные позиции: */

printf(RUS("                Позиции: 1234567891234512345678\n"));

printf(RUS("Еще один тест целых форматов: %-+13d %08d\n"), j, j);

/* Самостоятельно определить формат вывода*/

printf(RUS("       Позиции: 1234567891234512345678\n"));

printf(RUS("Тест o и h форматов: %#13o %#8.7x\n"), j, j);

printf(RUS("      Позиции: 1234567891234512345678\n"));

printf(RUS("Тест формата e и f: %13.7e %8.2f\n"), p, p);

Обязательно, выполните эту программу в C++ Builder!

 

В языке С для ввода имеется “зеркальный двойник” printf() – функция scanf (). Функция читает данные со стандартного ввода, по умолчанию – клавиатуры. Она так же, как и printf () , принимает строку формата с несколькими спецификаторами преобразования и несколько дополнительных параметров, которые должны быть адресами переменных, куда будут записаны введенные значения.

Примером вызова scanf () может служить следующий фрагмент кода:

int age;

printf("Enter your age: ");        // Запросить ввод возраста пользователя.

scanf ("%d", &age);                // Прочитать введенное число.

Знак &означает операцию получения адреса.

Для работы с этими функциями в программу необходимо включить заголовочный файл stdio.h.

 

2.9.2 Основные объекты ввода/вывода в стиле С++:

 

cin>>[имя переменной] >> [имя переменной]... //ввод

cout<<[имя переменной] << [имя переменной]... //вывод

 

Программа с использованием для ввода/вывода библиотеки классов C++ выглядит так:

 

int i;

cout << RUS("Введите целое число\n");

cin >> i;

cout<<RUS("Вы ввели число ")<<i;

cout<<RUS(", спасибо!");

 

Примечание.К сожелению, следует избегать двух функций RUS в одной строке с объектом cout. Это приводит к неправильному выводу. Поэтому фраза “, спасибо” выведена отдельным объектом cout.

 

Заголовочный файл <iostream.h> содержит описание набора классов для управления вводом/выводом. В нем определены стандартные объекты-потоки cin для ввода с клавиатуры и cout для вывода на экран, а также операции помещения в поток << и чтения из потока >>.

Для вывода информации в стандартный поток используется формат

 

cout << выражение ;

 

где выражение может быть представлено переменной или некоторым смысловым выражением:

 

cout << Z ;

cout <<RUS("Сумма =");

cout << 7+3;

 

 Последовательно можно выводить несколько выражений:

 

cout << выражение 1 <<выражение 2;

 

или

 

cout << выражение 1

   << выражение 2

   << выражение 3

   << выражение 4;

 

При выводе можно использовать escape-последовательности:

 

cout << RUS("Введите целое число\n");

cout << z <<" \n";

 

Для ввода данных с клавиатуры используется формат записи:

 

cin >> переменная ;

или

 

cin >> переменная 1>> переменная2;

 

При этом тип вводимого значения и тип переменной в программе, которой передается значение, должны совпадать.

Можно вводить несколько значений для разных переменных. Переменные отделяются пробелом или нажатием клавиши Enter. Если введенных значений больше, чем ожидается в программе, часть вводимых данных останется во входном буфере.

В случае если вводится строка символов, ввод продолжается до первого символа пробела или нажатия клавиши Enter. Если при следующем коде

char String[80];

cin>> String;

будет введена строка "Да здравствует С++", то переменная String примет значение "Да". Остальная часть строки останется в буфере до тех пор, пока в программе не встретится следующий оператор ввода.

Для работы с объектами cin и cout в программу необходимо включить заголовочный файл iostream.h.

В дальнейшем изложении будут использоваться оба способа ввода/вывода, но в одной программе смешивать их не рекомендуется.

 

Операции

 

В таблице 1.5 приложения I приведен список основных операций, определенных в языке C++, в соответствии с их приоритетами (по убыванию приоритетов, операции с разными приоритетами разделены чертой). В соответствии с количеством операндов, которые используются в операциях, они делятся на унарные (один операнд), бинарные (два операнда) и тернарную (три операнда).

Пробелы между символами внутри операции не допускаются.

Рассмотрим основные операции подробнее.

 

2.10.1 Операции увеличения и уменьшения на 1 (++ и - -)

 

Эти операции, называемые также инкрементом ++ и декрементом --, имеют две формы записи – префиксную, когда операция записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется операнд, а затем его значение становится результи­рующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется. Например:

 

int x=3,y=3;

printf(RUS("Значение префиксного выражения: %d\n"), ++x);

printf(RUS("Значение постфиксного выражения: %d\n"), y++);

printf(RUS("Значение х после приращения: %d\n"), x);

printf(RUS("Значение у после приращения: %d\n"), y);

 

Результат работы программы:

 

Значение префиксного выражения: 4

Значение постфиксного выражения: 3

Значение х после приращения: 4 .

Значение у после приращения: 4

 

Если непонятно, выполните программу в C++ Builder!

 

Операндом операции инкремента в общем случае является так называемое L-значение (L-value). Так обозначается любое выражение, адресующее некоторый участок памяти, в который можно занести значение. Название произошло от операции присваивания, поскольку именно ее левая (Left) часть определяет, в какую область памяти будет занесен результат операции. Переменная является частным случаем L-значения.

 


Дата добавления: 2018-11-24; просмотров: 176; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!