Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кетков.doc
Скачиваний:
17
Добавлен:
27.09.2019
Размер:
2.22 Mб
Скачать

4.6.2. Потоковый вывод

Для начинающих программистов организация потокового вывода числовой информации на стандартное устройство вывода (stdout) представляется более простой:

#include <iostream.h>

int main()

{ int i;

float f;

double d;

..........

cout << i+1 << f << f*d;

Здесь на первых порах не надо заботиться о форматах выводимых результатов. Для каждого типа данных существуют соответствующие системные соглашения. Переход в начало следующей строки здесь осуществляется путем включения в список вывода либо упомянутого выше управляющего символа '\n', либо аналогичного ему признака конца строки endl:

cout << i+1 << f << f*d << endl;

В список выводимых данных могут быть вкраплены и пояснительные подписи:

cout << "x1="<< x1 << "x2=" << x2 << '\n';

В потоковом выводе тоже имеются средства управления форматом вывода числовых результатов. Однако научиться пользоваться ими почти так же сложно, как и овладеть нюансами работы с форматными указателями. Дело в том, что потоки вывода в языке C++ организованы двумя способами – старым и новым. Поэтому в управлении потоком вывода можно встретить различные синтаксические конструкции – традиционные функции (hex – установка режима вывода шестнадцатеричного числа, setw – установка ширины поля вывода, setprecision – установка количества отображаемых цифр и т.п.) и более современные обращения к методам класса (cout.fill(…), cout.width(...)). Некоторые из установленных режимов действуют только на вывод следующего значения, другие сохраняют свое действие до следующей установки. С некоторыми деталями управления форматами числовых данных в потоковом выводе можно познакомиться на примере 4 из следующего параграфа.

4.7. Примеры программ вывода числовых данных

Пример 1. Вывод однобайтовых числовых значений

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

int main()

{ char ch1 = 69;

char ch2 = -128;

unsigned char uch1 = 70;

unsigned char uch2 = 129;

__int8 i8_1 = 71;

__int8 i8_2 = -127;

printf("\nch1=%d ch2=%d",ch1,ch2);

printf("\nuch1=%u uch2=%u",uch1,uch2);

printf("\ni8_1=%i i8_2=%i\n",i8_1,i8_2);

cout << "ch1=" << ch1 << endl;

cout << "ch1=" << (int)ch1 << endl;

cout << "ch2=" << ch2 << endl;

cout << "ch2=" << (int)ch2 << endl;

cout << "i8_1=" << i8_1 << endl;

cout << "i8_1=" << (int)i8_1 << endl;

cout << "i8_2=" << i8_2 << endl;

cout << "i8_2=" << (int)i8_2 << endl;

getch();

return 0;

}

//=== Результаты работы ===

ch1=69 ch2=-128

uch1=70 uch2=129

i8_1=71 i8_2=-127

ch1=E

ch1=69

ch2=А

ch2=-128

i8_1=G

i8_1=71

i8_2=Б

i8_2=-127

По результатам работы примера 1 видно, что форматный вывод однобайтовых числовых данных никаких затруднений не вызывает. Однако попытка вывести эти же значения в потоке без приведения значений символьных переменных к целочисленному типу (преобразование (int)) разумных результатов не дает. Вместо этого в поток выводятся символы, коды которых совпадают с однобайтовыми числовыми значениями.

Пример 2. Вывод однобайтовых числовых значений

#include <stdio.h>

#include <conio.h>

int main()

{

char ch1 = -5, ch2 = -127;

unsigned char uch1 = 25, uch2 = 255;

printf("With sign :\n");

printf("-5=%3d(10) 127=%3d(10)",ch1,ch2);

printf("\nOhne sign :\n");

printf("25=%#3o(8) %#3x(16) %3d(10)",uch1,uch1,uch1);

printf("\n255=%#3o(8) %#3x(16) %3d(10)",uch2,uch2,uch2);

getch();

return 0;

}

//=== Результаты работы ===

With sign :

-5= -5(10) 127=-127(10)

Ohne sign :

25=031(8) 0x19(16) 25(10)

255=0377(8) 0xff(16) 255(10)

В примере 2 однобайтовые числовые значения выданы по формату в виде десятичных, восьмеричных и шестнадцатеричных данных (основание системы записано в круглых скобках после самого значения).

Пример 3. Вывод коротких и длинных вещественных данных

#include <stdio.h>

#include <conio.h>

int main()

{

float f1=3.14159265, f2=20000000;

double d1=3.14159265, d2=20E+125;

printf("\nf1=%10.8f f2=%f", f1,f2);

printf("\nf1=%e f2=%e", f1,f2);

printf("\nf1=%g f2=%g", f1,f2);

printf("\nd1=%12.9f f2=%g", d1,d2);

printf("\nd1=%12.9e f2=%G", d1,d2);

getch();

return 0;

}

//=== Результаты работы ===

f1=3.14159274 f2=20000000.000000

f1=3.141593e+00 f2=2.000000e+07

f1=3.14159 f2=2e+07

d1= 3.141592650 f2=2e+126

d1=3.141592650e+00 f2=2E+126

Пример 4. Управление форматом при выводе в поток

#include <iostream.h>

#include <iomanip.h>

#include <conio.h>

int main()

{ int i=15, j=6, k;

float v=1.23456, x=3.149;

cout << hex;

cout << "i=" << i << " j=" << j << " x=" << x << " v=" << v;

cout.fill('*');

cout << "\ni=" << setw(6) << i << " j=" << j << endl;

cout << setprecision(3) << x << " v=" << v << endl;

cout.width(10);

cout << x << ' ' << j << endl;

for(k=0; k<8; k++)

cout << setprecision(k) << v << endl;

getch();

return 0;

}

//=== Результаты работы ===

i=f j=6 x=3.149 v=1.23456

i=*****f j=6

3.15 v=1.23

******3.15 6

1.23456

1

1.2

1.23

1.235

1.2346

1.23456

1.23456