Операторы ввода исходных данных с клавиатуры
Работа оператора ввода
Операторы ввода обеспечивают чтение данных с клавиатуры, преобразование их из внешнего представления во внутреннее и присваивание значений переменным, указанным в списке.
Потоковый ввод данных числового типа
Для начинающих программистов проще всего организовать в программе ввод числовой информации из буфера потока, связанного с так называемым стандартным устройством ввода (stdin). Данные в этом буфере оказываются в тот момент, когда программа обращается к пользователю и ждет окончания набора затребованных числовых значений с клавиатуры. Программа может запросить одно или несколько значений:
cin >> d;........... cin >> x1 >> x2 >> x3;Первая строка соответствует запросу на ввод значения единственной переменной d. Следующая строка программы представляет запрос на ввод трех числовых значений, первое из которых будет присвоено переменной x1, второе значение будет предназначаться для переменной x2, третье значение - для переменной x3. В ответ на запрос программы пользователь должен набрать на клавиатуре затребованные числа, разделяя их, по крайней мере, одним пробелом. Набор данных завершается нажатием клавиши Enter. Количество числовых значений, набираемых пользователем в пределах строки, может оказаться как меньше, так и больше, чем требуется программе. В первом случае продолжение программы задержится до тех пор, пока пользователь не введет дополнительные строки с недостающими значениями. Если пользователь наберет слишком много значений во вводимой строке, то лишние числовые данные сохранятся в буфере ввода и будут переданы программе при выполнении следующего оператора cin.
Тип набираемого числового значения и его величина должны соответствовать типу переменной, в которую это значение должно быть введено. Забота об этом целиком возлагается на программиста.
Для обеспечения потокового ввода к программе следует подключить заголовочный файл iostream и применить директиву using namespace.
using namespace std позволяет использовать имена из пространства имен std.
std - это имя стандартной библиотеки C++.
#include <iostream>using namespace std; int main(){ int i; float f; double d;.......... cin >> i >> f >> d;..........return 0;}В переменные типа char или unsigned char из потока числовые значения ввести невозможно, т.к. они в данном случае воспринимаются системой не как числовые данные, а как символьные. В такие переменные попадет только первый символ набранного значения.
Если в последнем примере убрать строку подключения пространства имен using namespace std, то надо будет указывать наименование пространства имен явно:
std::cin >> i >> f >> d;Тема «Пространство имен» не входит в круг вопросов, освещаемых в данном пособии. Для самостоятельного изучения данного вопроса рекомендуем воспользоваться источником [3].
Форматный ввод
Гораздо более сложным для начинающих программистов является ввод числовых данных, организуемый с помощью функции scanf, использующей так называемую форматную строку:
Общий вид записи оператора ввода
scanf(" форматная строка ", cпиcoк адресов переменных);
форматы ввода адреса вводимых переменных
Форматы ввода - это строка в кавычках, в которой перечислены один или несколько форматов (спецификаторов) ввода данных (% - признак спецификатора):
%d - ввод целого числа ( для переменной типа int)
%f - ввод вещественного числа ( для переменной типа float)
%с - ввод одного символа ( для переменной типа char)
После форматов ввода через запятую перечисляются адресаячеек памяти, в которые надо записать введенные значения. Почувствуйте разницу:
a - значение переменной a
&a - адрес переменной a
Например:
#include "stdafx.h"
int main(){ int p; float k; double m;.......... scanf("%d %f %lf",&p,&k,&m);..........}Для обеспечения форматного ввода к программе следует подключить заголовочный файл stdio.h. Строка вводимых данных поступает со стандартного устройства ввода (stdin), которым по умолчанию считается клавиатура. Завершение набора строки ввода - нажатие клавиши Enter.
Первый аргумент функции scanf представляет форматную строку, управляющую процессом преобразования числовых данных, набранных пользователем в строке ввода, в машинный формат, соответствующий типам переменных, адреса которых указаны вслед за форматной строкой.
В приведенном примере переменной p (в списке ввода указан ее адрес - &p), объявленной с помощью спецификатора типа int, соответствует спецификатор %d. Это означает, что первым числовым значением, набранным на клавиатуре, может быть только целое десятичное число со знаком (d - от decimal, десятичный). Вещественной переменной k типа float в форматной строке соответствует формат %f. Это означает, что второе числовое значение в строке ввода должно принадлежать диапазону, предусмотренному для коротких вещественных данных. Для переменной m типа double использован формат %lf (l (это буква эль)- от long).
Количество форматов в строке должно быть равно количеству адресов в списке.
Кроме того, тип переменных должен совпадать с указанным форматом: например, если a и b - целые переменные, то следующие вызовы функций ошибочны
scanf ( "%d %d", &a );
неясно, куда записывать второе введенное число;
scanf ( "%d %d", &a, &b, &c );
переменная c не будет введена, так как для нее не задан спецификатор;
scanf ( "%f %f", &a, &b );
нельзя вводить целые переменные по вещественному формату.
Если значения данных вводятся в одной строке, то они отделяются друг от друга одним или несколькими пробелами.
Пример ввода:
Пусть в задаче определены следующие исходные данные:
а = 4; х = 3,8; у =1,2*104; к=5; т = 74
Оператор ввода:
scanf("%d %f %f %d %d", &a, &х, &у, &k, &m);
вызывает чтение данных с клавиатуры, набранных следующим образом:
4 3.8 1.2Е4 5 74 [Enter]
%d %f %f %d %d - такой список форматов будет соответствовать следующему описанию переменных в программе:
main()
{ int a,k,m;
float x,y;