Попробуйте часть кода до слова main заменить на #include "stdafx.h" //1 #include <iostream> //2 using namespace std; //3 |
Системные данные числового типа
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 десятичных цифр.
Флажки | Формат %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 |
Флажки | Формат %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.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 из следующего параграфа.