Скачать 449.68 Kb.
|
При вводе выполняется преобразование символов из потока (с клавиатуры) в двоичные коды внутреннего представления данных, при этом происходит автоматическое распознавание типов вводимых данных.При выводе из оперативной памяти извлекается значение выражения и помещается в выходной поток cout (на экран). При этом происходит преобразование двоичных кодов типизированного значения выражения в последовательность символов алфавита, изображающих значение на внешнем устройстве. Интерпретация выводимого значения производится автоматически. При выводе байты (коды) потока преобразуются в последовательность символов, выводимых на экран. В языке Си необходимо с помощью средств форматирования указать правила преобразования и форму представления вводимой и выводимой информации. В С++ имеется новый механизм автоматического распознавания типов вводимых и выводимых данных. Забегая вперед, операции ввода (>>) и вывода (<<) перегружены так, что при той же форме они выполняются по-разному в зависимости от типа правого операнда. Операция вывода << Операция вывода должна уметь распознавать тип выводимых данных. Операция вывода перегружена, применима в той же форме к данным типа: char, unsigned shot, singed shot , unsigned int, singed int , unsigned long, singed long , float , double, long double, char* , void*. Операция определена только для двух указателей, и этого достаточно т.к. все указатели, отличные от char* , автоматически приводятся к типу void*. Операция ввода >> Подобная ситуация и при вводе данных. Операция извлечения >> перегружена, т.е. с одинаковым обозначением существуют три по-разному выполнимые операции: 1) для целых чисел, 2) для вещественных чисел и 3) для строк Все они по умолчанию игнорируют ведущие пробелы, и считывание идет до пробела или до первого недопустимого символа. Чтение начинается с первого не пробельного символа и для чисел заканчивается при появлении нечислового символа Для целых читаются также следующие символы + , - , и при 0x - A, a ,B, b, C, c D, d, E ,e, F ,f Для вещественных чисел читаются символы + , - , E , e , и точка. Для строк чтение происходит до первого пробельного символа. Напр., название инструмента char line [40] cin>>line С клавиатуры набирается название отбойный молоток В line считается только первое слово и вместо пробела заносится нулевой код ‘\0’. Таким образом, объекты cin и cout с операциями >> и <<, знают, как выполнять ввод-вывод значений различных типов. При организации выводимых выражений следует учитывать низкий приоритет сдвиговых операций, т.к. операции ввода-вывода имеют тот же приоритет: cout<< a+ b+ c; cout << (a + b < c); cout << ( 7<<1) ; cout << ( x<0 ? –x : x); Выражения с операциями >> и << должны возвращать значение (любая операция должна возвращать значение). В соответствии с описанием перегрузок этих операций в файле <iostream> значением выражения cout<< выражение является ссылка на поток cout (фактически сам поток) и к результату операции включения как к объекту cout опять можно применить операцию включения <<. Аналогично и с операцией извлечения из потока cin >> (или ввода данных). Позволительно при одном обращении к потоку несколько раз применять операции ввода (извлечения из потока) и вывода ( включения в поток): cout << … << … << « \n Cтроковое значение \t « <<…; int i, j, k; cin >> i >> j >> k ; Значения для этих переменных во входном потоке должны разделяться обобщенными пробелами 1 2 3 < enter> либо 1 < enter> 2< enter> 3 < enter> Можно ввести и больше данных, но почитается столько, сколько надо: 1 2 3 4 5 6 < enter> Извлечение из потока cin происходит после сигнала от клавиши enter. В процессе набора данных на клавиатуре они отражаются на экране, но не извлекаются из потока. Это дает возможность исправить ошибки ввода. После нажатия enter и происходит выполнение операции извлечения. Набранные данные помещаются в буфер, из буфера происходит их интерпретация и чтение. При вводе вещественных значений допустимы все формы их записи и с фиксированной точкой и с плавающей точкой. Если затем мы выведем значение переменной. Оно будет выведено по возможности с фиксированной точкой и по умолчанию будет использовано 7 цифр. Исключение составляют очень большие и очень маленькие числа. float a; cin >> a; cout <<”a=”<< a; 1.23456789 a=1.234568 0.123456789e+1 a=1.234568 123456789 a= 1.234567e+08 0.0000000000112345678 a=1.123457e-11 В операции ввода - вывода целых чисел данные можно представлять в восьмеричном и шестнадцатеричном виде. В каком бы виде данные не вводились, по умолчанию они всегда выводятся в десятеричном виде. Также, если в операторе вывода стоят восьмеричные или шестнадцатеричные константы, выведутся десятеричные величины: cout << 077777 << « « << -0x7fff 32767 -32767 Ввод значений должен соответствовать диапазону значений данного типа. Например, если вводится слишком большое для данного типа значение, данное не будет введено целиком, а будет обрезано в соответствии с внутренним представлением данного типа. Значения указателей (адреса) выводятся в шестнадцатеричном формате, как было рассмотрено выше. Вывод (ввод) данных числовых массивов производится поэлементно float A[3]; for ( int i=o ; i<3; i++) { cin>> A [i]; cout << A[i] << « « ;} cout<< A - выведется значение указателя - адрес cin>> A // Ошибка на этапе компиляции! Имя массива – константный указатель. Вводить с клавиатуры значение константного указателя нельзя. Но ввести значение символьного массива – строку, используя указатель – имя массива можно. Ввод – вывод символьных массивов: char H [ ] = « Миру – мир» cout << H; - выведется строка char * ph =H; cin>>ph ; вводится новое значение с клавиатуры cout << ph - выведется строка сout << (void*) ph - выведется значение указателя – адреса строки сhar name[20]; cin >> name; - ввод строки. Форматирование данных при обмене с потоками При применении операций ввода – вывода к стандартным потокам по умолчанию устанавливаются стандартные форматы внешнего представления пересылаемых данных. Например, при выводе данные занимают ровно столько позиций, сколько надо для их представления. Форматы представления могут быть изменены программистом с помощью:
Флаги Флаги – представляют собой отдельные фиксированные биты чисел типа long . Эти фиксированные биты входят в компонент класса ios типа long: long x_flags; // переменная, представляющая флаги – форматы //наследуется всеми производными потоковыми классами //флаги наследуются всеми потоками Эта переменная анализируется при обменах, ее значение влияет на преобразование информации. Флаги объединяются с помощью логических битовых операций, по- разному комбинируя свойства потока. В последних стандартах флагам присвоен тип fmtflags, отнесенный к типам битовых масок (bitmask types) Компонентные функции класса ios : flags( ) и setf( ) предназначены для проверки значений флагов, для их установки и для их сбрасывания в исходные умалчиваемые значения. Флаги могут обрабатываться как по отдельности, так и группами, когда отдельные флаги связаны побитовой логической операцией – дизъюнкцией ( ‘ | ’). fmtflags flags( ) – возвращает как значение дизъюнкцию всего набора форматных флагов; fmtflags flags(флаги ) – устанавливает флаги со значением аргумента и возвращает предыдущее значение флагов; fmtflags setf(флаги ) – устанавливает флаги со значением аргумента возвращает предыдущее значение ; fmtflags setf(флаги ) – устанавливает флаги в соответствии со значением первого аргумента, второй аргумент указывает какие флаги надо сбросить перед установкой; void unsetf(флаги ) – сбрасывает флаги, указанные аргументом; Рассмотрим некоторые флаги: skipws = 0x0001 - пропуск (игнорирование) при операции извлечении из потока обобщенных пробельных символов - действует по умолчанию left =0x0002 – вывод с левым выравниванием right = 0x0004 – вывод с правым выравниванием internal=0x0008 - принятый в качестве заполнителя символ помещается между числом и знаком числа или признаком системы счисления. dec = 0x0010 - десятичная система счисления oct = 0x0020 - восьмеричная система счисления hex = 0x0040 - шестнадцатеричная система счисления showbase =0x0080 - выводить признак системы счисления ( 0x и 0); showpoint = 0x0100 – печатать обязательно десятичную точку и следующие за ней нули, даже для числа имеющего нулевую дробную часть; uppercase = 0x0200 – при выводе чисел использовать буквы верхнего регистра (0X , E, ABCDEF ) scientific = 0x0800 – представление чисел в формате с плавающей точкой мантисса имеет одну ненулевую цифру перед точкой fixed = 0x1000 - представление в формате с фиксированной точкой , причем количество цифр после запятой определяется заданной по умолчанию точностью; unitbuf = 0x2000 – очищает все потоки ( сбрасывает содержимое буферов) после каждого ввода или вывода и т. д . Можно использовать имена флагов, естественно с указанием их принадлежности классу ios ( ios::left ) или непосредственно значения флагов Как установить и проверить значения флагов рассмотрим ниже. Компонентные функции (методы) класса ios для форматирования char fill ( ) ; – возвращает символ заполнения пустых позиций вывода char fill (char) ;– замещает символ заполнения пустых позиций вывода, возвращает предыдущий символ заполнения Значение символа (кода символа) заполнения хранится в компонентной переменной класса int x_fill long flags ( ) ; – возвращает текущий набор битов флагов форматирования long flags ( long) ;– устанавливает флаги в соответствии со значением параметра, возвращает предыдущее значение флагов int precision ( ) ; -возвращает текущее значение точности вывода вещественных чисел int precision ( int n) ; - устанавливает по значению параметра точность представления вещественных чисел, т.е. количество цифр дробной части при выводе, передает значение в переменную int x_precision, возвращает предыдущее значение точности long setf ( long ) ; - устанавливает набор флагов в соответствии с параметром, возвращает значение старого набора; long setf ( long setbits , long field ) ; - устанавливает флаги в соответствии со значением параметра setbits ; биты, которые дает параметр field ,сбрасываются и устанавливаются новые биты. int width (); - возвращает текущее значение ширины поля вывода int width (int ); - устанавливает значение ширины поля вывода, в соответствие со значением параметра, значение сохраняется в переменной int x_width , функция возвращает старое значение и т. д. В классе ios имеются три компонента – статические константы ( общие для всех объектов класса ( обращение : ios:: имя) , объединяющие несколько флагов static const long adjustfield ; // left |right | internal static const long basefield ; // dec | oct | hex static const long floatfield; // scientific | fixed Используются в качестве второго параметра в функции setf ( ) для сбрасывания флагов. Обращения к функциям void main() {clrscr(); cout.width(15); // ширины вывода cout.fill('*'); // установка символа заполнителя cout.setf(ios::internal); // заполнить между знаком и значением cout<<-5.35< cout.setf(ios::left,ios::adjustfield); //сбросили правое выравнивание, //установили левое cout.width(15); cout<<-32767< cout.setf(ios::hex,ios::basefield); //сбросили старую систему, установили // новую систему счисления cout.width(15); cout<<32767< cout.setf(0x0200|0x0080); //показать признаки системы и верхн. рег. cout.width(15); cout<<32767< cout.setf(ios::right,ios::adjustfield); // правое выравнивание cout.width(15); cout<<32767< cout.fill('.'); cout.setf(ios::internal,ios::adjustfield); cout.width(15); cout<<32767< cout.fill('+'); cout.setf(ios::right,ios::adjustfield); cout.width(15); cout<<32767< Манипуляторы Более простой способ форматирования – это использования манипуляторов. Манипуляторы – это специальные функции позволяющие изменять флаги потока. Имена манипулятора, если манипулятор без параметров, и вызовы функции-манипулятора с параметрами можно использовать в качестве правого операнда операции ввода-вывода. Манипуляторы можно включать в цепочки включений в поток и извлечений из потока. Манипуляторы изменяют состояние потока. Манипуляторы без параметров dec - действует при вводе и выводе, устанавливает флаг десятичной системы hex - действует при вводе и выводе , устанавливает флаг шестнадцатеричной системы oct - действует при вводе и выводе, устанавливает флаг восьмеричной системы endl - действует только при выводе, обеспечивает включение в поток символа новой строки и сбрасывает буфер ends - действует только при выводе, обеспечивает включение в поток нулевого признака конца строки flush - действует только при выводе, обеспечивает сбрасывание буфера ws - действует только при вводе, обеспечивает извлечение из входного потока пробельных символов ( пробел, ' \t’, ‘\v’ , ‘\n’, ‘\r’, ‘\f’) hex, oct, dec изменяют состояние потока до следующего явного изменения Манипуляторы с параметрами ( определены в файле <iomanip> ) setbase ( int n) - устанавливает основание системы счисления cout << setbase (8) << 255 < setiosflags (long L) - устанавливает отдельные флаги cout< 5 setfill( int n) - значение параметра – код заполнителя for (int i=0; i<3; i++) cout < |
Федеральной налоговой службы от 27 июня 2005 г. N 7н/саэ-3-10/285 "Об обмене информацией в электронном виде между управлениями Федерального... | Ректор фгбоу впо “Саратовский государственный университет имени Н. Г. Чернышевского” | ||
Установите соответствие между высказываниями каждого говорящего a-f и утверждениями^ данными в списке 1-7, Используйте каждое утверждение,... | Установите соответствие между высказываниями каждого говорящего a f и утверждениями, данными в списке 1 Используйте каждое утверждение,... | ||
Установите соответствие между высказываниями каждого говорящего A–F и утверждениями, данными в списке 1 Используйте каждое утверждение,... | Настоящие Правила определяют порядок заполнения заявления о ввозе товаров и уплате косвенных налогов (далее Заявление) по форме Приложения... | ||
Вы услышите 6 высказываний. Установите соответствие между высказываниями каждого говорящего A–F и утверждениями, данными в списке... | |||
Установите соответствие между высказываниями каждого говорящего 1–6 и утверждениями, данными в списке A–G. Используйте каждое утверждение,... | Установите соответствие между высказываниями каждого говорящего 1–6 и утверждениями, данными в списке A–G. Используйте каждое утверждение,... |
Поиск Главная страница   Заполнение бланков   Бланки   Договоры   Документы    |