Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 25.11.2008 | Доступ: свободный | Студентов: 9592 / 1296 | Оценка: 4.06 / 3.66 | Длительность: 21:16:00
Лекция 4:

Системные данные числового типа

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >

3.6. Вывод числовых результатов

3.6.1. Форматный вывод

Форматный вывод числовых результатов на стандартное устройство вывода ( stdout ), которым по умолчанию является экран дисплея, осуществляется с помощью функции printf. Например:

#include <stdio.h>
  int main()
{ int i;
  float f;
  double d;
..........
  printf("%d %f %lf", i+1, f, f*d);

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

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

%[флажки][ширина][.точность][{l|h|L}]{d|i|u|o|x|X|f|e|E|g|G}

Поле ширина определяет количество знакомест на экране, где будет размещено выводимое значение. Как правило, его задают с некоторым запасом, чтобы смежные значения не сливались друг с другом. Выводимое число прижимается младшим разрядом к правой границе указанного поля. Это обеспечивает общепринятый способ вывода числовых таблиц, когда в столбцах одноименные разряды чисел располагаются друг под другом. Если заданная ширина меньше, чем это требуется для выводимого значения, то оно все равно будет выведено полностью, но стройность колонок в таблицах при этом будет нарушена.

Поле флажков может содержать до четырех управляющих символов из набора [ -,+,пробел,0,# ]. Символ " минус " устанавливает прижим выводимого значения к левой границе выделенного поля (по умолчанию действует правый прижим). Символ " плюс " устанавливает обязательный режим вывода знака числа (даже если оно положительно). Символ " пробел " устанавливает такой режим, при котором вместо знака " + " выводится пробел. Символ " нуль " устанавливает режим вывода чисел, при котором старшие незначащие позиции поля вывода заполняются нулями.

Символ # влияет на формат вывода восьмеричных, шестнадцатеричных и вещественных чисел. При его использовании перед восьмеричными числами выводится лидирующий нуль, перед шестнадцатеричными числами - префикс 0x или 0X. Для форматов f, e, и E обязательно отображается десятичная точка после целой части (по умолчанию, числа, у которых дробная часть равна 0, выводятся без десятичной точки). Для форматов g и G не удаляются лидирующие нули и всегда выводится десятичная точка.

В табл. 3.4 и 3.5, заимствованных из файла помощи, показаны способы вывода целочисленного значения I=555 и вещественного значения R=5.5 при различных комбинациях флажков.

Необязательное поле точность задает для целочисленных значений обязательное количество цифр (если число меньше, то перед его старшим разрядом добавляется необходимое количество нулей). Например, вывод целочисленного значения -5 по формату %8.4d выделяет в строке вывода поле из восьми символов, на котором первые три позиции заполнены пробелами, а следующие пять символами -0005.

Для данных вещественного типа поле точность определяет количество цифр в дробной части числа. Не забывайте о количестве значащих цифр, хранение которых обеспечивает тот или иной тип данных. Например, если переменной типа float присвоить значение 3.14159265, то на выводе по формату %10.8f мы увидим результат 3.14159274. Двум последним цифрам результата доверять нельзя, т.к. формат float обеспечивает хранение 7-8 десятичных цифр.

Таблица 3.4.
Флажки Формат %6d Формат %6o Формат %8x
%-+#0 +555 01053 0x22b
%-+# +555 01053 0x22b
%-+0 +555 01053 22b
%-+ +555 01053 22b
%-#0 555 01053 0x22b
%-# 555 01053 0x22b
%-0 555 1053 22b
%- 555 1053 22b
%+#0 +00555 001053 0x00022b
%+# +555 01053 0x22b
%+0 +00555 001053 0000022b
%+ +555 1053 22b
%#0 000555 001053 0x00022b
%# 555 01053 0x22b
%0 000555 001053 0000022b
% 555 1053 22b
Таблица 3.5.
Флажки Формат %10.2e Формат %10.2f
%-+#0 +5.50e+00 +5.50
%-+# +5.50e+00 +5.50
%-+0 +5.50e+00 +5.50
%-+ +5.50e+00 +5.50
%-#0 5.50e+00 5.50
%-# 5.50e+00 5.50
%-0 5.50e+00 5.50
%- 5.50e+00 5.50
%+#0 +005.50e+00 +0000005.50
%+# +5.50e+00 +5.50
%+0 +005.50e+00 +0000005.50
%+ +5.50e+00 +5.50
%#0 005.50e+00 0000005.50
%# 5.50e+00 5.50
%0 005.50e+00 0000005.50
% 5.50e+00 5.50

Разница между форматами %0x и %0X заключается в том, что в первом случае шестнадцатеричная запись числа формируется из малых букв [ a,b,c,d,e,f ], а во втором случае - из больших букв [ A,B,C,D,E,F ].

Для вывода однобайтовых целочисленных данных со знаком (типа char ) можно пользоваться одним из следующих форматов - %o, %0x, %0X, %i, %d, %ho, %hx, %hX, %hi, %hd. Для вывода однобайтовых целых без знака наряду с перечисленными указателями допустим формат %u. Однако следует иметь ввиду, что однобайтовые значения расширяются до двухбайтовых, сохраняя знак числа. Поэтому попытка вывести однобайтовое значение 127 по формату %u приведет к правильному результату. Но если мы по такому же формату выдадим число -5, то результатом будет число 65531 (дополнение до максимального двухбайтового числа).

Вывод числовых результатов вещественного типа предусматривает две формы отображения - с фиксированной запятой (форматные указатели %f и %lf ) или с плавающей запятой (форматные указатели %e и %E ). Форматные указатели %g и %G предлагают системе самой выбрать один из этих форматов, который окажется более компактным для выводимого значения. Большая или маленькая буква в форматных указателях с плавающей запятой приводит к тому, что порядку числа предшествует большая или маленькая буква " e ".

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

x1=127;  x2=-350;
  printf("x1=%d x2=%d",x1,x2);

на экране дисплея появится строка:

x1=127 x2=-350

Если мы хотим расположить выводимую информацию на экране дисплея с начала следующей строки, то в начале форматных указателей обычно вставляют управляющий символ " \n ":

printf("\nx1=%d x2=%d",x1,x2);

Такой же управляющий символ может быть включен в середину или в конец форматной строки. В языках C, C++ с помощью символа " \ " в форматную строку могут быть включены и другие управляющие символы (так называемые Escape-последовательности), список которых приведен в табл. 3.6.

Таблица 3.6.
Символ Назначение Символ Назначение
\a Звуковой сигнал (код 0x07, BEL) \\ Отображение символа \
\b Забой предыдущего символа (код 0x08, Backspace) \' Отображение символа '
\f Переход на новую страницу (код 0x0C, FF) \" Отображение символа "
\n Переход на следующую строку (код 0x0A, LF) \? Отображение символа ?
\r Возврат в начало текущей строки (код 0x0D, CR) \0xxx Отображение символа с восьмеричным кодом xxx
\t Горизонтальная табуляция (код 0x09, HT) \xhh Отображение символа с шестнадцатеричным кодом hh
\v Вертикальная табуляция (код 0x0B, VT) \xHH Отображение символа с шестнадцатеричным кодом HH

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

3.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 из следующего параграфа.

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >
Alexey Ku
Alexey Ku

Попробуйте часть кода до слова main заменить на 

#include "stdafx.h" //1

#include <iostream> //2
#include <conio.h>

using namespace std; //3

Александр Талеев
Александр Талеев

#include <iostream.h>
#include <conio.h>
int main(void)
{
int a,b,max;
cout << "a=5";
cin >> a;
cout <<"b=3";
cin >> b;
if(a>b) max=a;
else max=b;
cout <<" max="<<max;
getch();
return 0;
}

при запуске в visual express выдает ошибки 

Ошибка    1    error C1083: Не удается открыть файл включение: iostream.h: No such file or directory    c:\users\саня\documents\visual studio 2012\projects\проект3\проект3\исходный код.cpp    1    1    Проект3

    2    IntelliSense: не удается открыть источник файл "iostream.h"    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    1    1    Проект3

    3    IntelliSense: идентификатор "cout" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    6    1    Проект3

    4    IntelliSense: идентификатор "cin" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    7    1    Проект3

при создании файла я выбрал пустой проект. Может нужно было выбрать консольное приложение?