Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы


Скачать 449.68 Kb.
НазваниеЗадача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы
страница3/6
ТипЗадача
1   2   3   4   5   6

При вводе выполняется преобразование символов из потока (с клавиатуры) в двоичные коды внутреннего представления данных, при этом происходит автоматическое распознавание типов вводимых данных.


При выводе из оперативной памяти извлекается значение выражения и помещается в выходной поток 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; - ввод строки.

Форматирование данных при обмене с потоками
При применении операций ввода – вывода к стандартным потокам по умолчанию устанавливаются стандартные форматы внешнего представления пересылаемых данных.

Например, при выводе данные занимают ровно столько позиций, сколько надо для их представления.

Форматы представления могут быть изменены программистом с помощью:

  1. флагов форматирования класса базового ios

  2. компонентных функций для управления форматами класса ios

  3. с помощью манипуляторов потоков без параметров и с параметрами


Флаги

Флаги – представляют собой отдельные фиксированные биты чисел типа 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 <resetiosflags (long L) -сбрасывает отдельные флаги
setiosflags (long L) - устанавливает отдельные флаги
cout<resetiosflags( ios::left) <<5; 5

5
setfill( int n) - значение параметракод заполнителя
for (int i=0; i<3; i++) cout <
1   2   3   4   5   6

Похожие:

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconПриказ от 7 сентября 2005 года об утверждении структуры и форматов...
Федеральной налоговой службы от 27 июня 2005 г. N 7н/саэ-3-10/285 "Об обмене информацией в электронном виде между управлениями Федерального...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconПрограмма (задача, мероприятие): Федеральная целевая программа развития...
Ректор фгбоу впо “Саратовский государственный университет имени Н. Г. Чернышевского”

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconВы услышите 6 высказываний. Установите соответствие между высказываниями каждого говорящего
Установите соответствие между высказываниями каждого говорящего a-f и утверждениями^ данными в списке 1-7, Используйте каждое утверждение,...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы icon1 Вы услышите 6 высказываний. Установите соответствие между высказываниями каждого говорящего A
Установите соответствие между высказываниями каждого говорящего a f и утверждениями, данными в списке 1 Используйте каждое утверждение,...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconАудирование вы услышите 6 высказываний. Установите соответствие между...
Установите соответствие между высказываниями каждого говорящего A–F и утверждениями, данными в списке 1 Используйте каждое утверждение,...

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

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconМежду службами третьих доверенных сторон стран участников Конвенции...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconВы услышите 6 высказываний. Установите соответствие между высказываниями...
Вы услышите 6 высказываний. Установите соответствие между высказываниями каждого говорящего A–F и утверждениями, данными в списке...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconВы услышите 6 высказываний. Установите соответствие между высказываниями...
Установите соответствие между высказываниями каждого говорящего 1–6 и утверждениями, данными в списке A–G. Используйте каждое утверждение,...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconВы услышите 6 высказываний. Установите соответствие между высказываниями...
Установите соответствие между высказываниями каждого говорящего 1–6 и утверждениями, данными в списке A–G. Используйте каждое утверждение,...

Вы можете разместить ссылку на наш сайт:


Все бланки и формы на filling-form.ru




При копировании материала укажите ссылку © 2019
контакты
filling-form.ru

Поиск