Лекция: Вывод массива. Функции printf и cprintf
Пример 6. Простой вывод элементов небольшого массива в одну строку экрана:const n=5; int a[n]; cout<< “\n Масссив: \n“;
for (int i=0; i<n; i++) cout<<a[i]<<" "; cout<<endl;
Заметим, что первая (вывод заголовка) и последняя (переход на новую строку) строки выполняются один раз вне цикла. Вывод пробелов в cout нужен для того, чтобы числа не сливались.
Пример 7. Вывод массива относительно большой размерности n, который не вмещается в одну строку, по K элементов в строке выглядит так:
const n=21; int K, a[n]=
{ 111, 1234, 22, 7000, 800, 2, 3, 4, 5, -7, -1234, 8888,
-3456, 6789, 333, -12345, 789789, 555555, 777777, -222222, 23 };
cout <<”K=”; cin>>K; cout<< “\n Массив: \n“;
for (int i=0; i< n; i++) { cout<<a[i]<<" ";
if ((i+1) %K == 0) cout<<endl;
// илиif (! ( (i+1) % K ) ) cout << endl;
// илиcout<<((i+1)%K? ‘ ‘: ‘\n’); }
Если числа массива имеют различное количество цифр в записи числа (например, от одной до шести), то при выводе они будут сдвинуты вправо или влево и вывод будет некрасивым. При K=5 получим:
111 1234 22 7000 800
2 3 4 5 -7
-1234 8888 -3456 6789 333
-12345 789789 555555 777777 -222222
Следующий вариант, в котором вместо cout используется стандартная функция printf, устраняет этот недостаток:
… … … // Объявления и ввод K без изменений
printf(“\n Массив: \n“);
// илиprintf(“\n%s\n”,“Массив:“);
for (int i=0; i< n; i++) { printf("%8d", a[i]);
// или printf("%-8d", a[i]);
if ((i+1) %K == 0) printf(“\n”);
//или if (! ( (i+1) % K ) ) printf(“\n”);
// илиprintf("%c”, (i+1)%K? ‘ ‘: ‘\n’); }
Приведём вспомогательный пример.
Пусть float x=1.11; int y=–2; Вывод
cout<<endl<<“The first number “<< x <<endl<<” y= “ <<y;
можно записать так:
printf ("\nThe first number %4.2f\n y= %d", x, y);
Функция printfимеет следующий общий вид: printf (строка, список);
В строке можно записать:
· любую последовательность символов, включая и пробелы, которые точно в таком же виде будут отображаться при выводе на экран;
· управляющие символы или символьные константы с обратным слешем:
\n — переход на следующую строку;
\r — возврат каретки, то есть переход в начало текущей строки;
\t — горизонтальная табуляция, то есть вывод с определённых стандартных позиций;
\a — непродолжительный звуковой сигнал
и другие;
· форматы, или спецификаторы формата, перед которыми записывается символ “%”. Он никак не связан ни с соответствующей операцией получения остатка при целочисленном делении, ни с вычислением процента. Форматы указывают способ вывода соответствующих элементов списка и зависят от типов выводимых значений:
%f — для вывода вещественных чисел;
%d — для вывода целых чисел;
%E или %e— для вывода вещественных чисел в экспоненциальной форме (научной нотации), например, 0.5E4 или 1e-6;
%G — выбирает в зависимости от значения числа формат %f или %E;
%g — выбирает в зависимости от значения числа формат %f или %e;
%X или %x — для вывода числа в шестнадцатеричной системе счисления (число 17110 будет выведено как AB илиab);
%с — для вывода символа;
%s — для вывода строки и другие форматы.
Вся строка с указанными выше элементами записывается, как правило, в виде текстовой константы. Можно использовать для этих целей переменную строкового типа.
В списке через символ “,” (запятая) указываем выражения, значения которых выводятся. Как частный случай выражения можно записать константу или переменную. Между элементами списка и спецификаторами формата с символом “%” должно быть соответствие в количестве, порядке следования и типе.
Любой из элементов строки или список могут отсутствовать. Например, printf (”Text”); или printf (“%s”,”Text”); выводит только “Text”.
Перед спецификаторами формата можно использовать модификаторы форматовдля изменения способа представления выводимых значений:
— %Ld, где целочисленное выражение L, которое чаще всего является константой, определяет ширину поля для выводимого целого числа. Значение L может быть как положительным, так и отрицательным. Например,
int num1, num2, i, j;
printf ("\n%-5d%-05d%03d%3d", num1=123, num2=45, i=6, j=11);
выводит значения слева поля шириной пять для num1 и для num2. Справа поля шириной трис впереди стоящими нулями выводится значение i и справа поля шириной трис впереди стоящим одним пробелом j. Т. е. выведем:
123 45 006 11. Как видим, в выражениях можно использовать и операцию присваивания;
— %n.kf, где целочисленное выражение n задаёт общее количество позиций, отводимых для вывода вещественного числа, включая точку и знак числа, а к определяет количество позиций, отводимых для дробной части. Например, float a=1.23, b=-456, c=-.7899, d=55.6666, e=55.6666;
printf ("\n%f %10f %-10.3f %10.3f %3.2f", a, b, c,d, e);
выведет 1.230000 -456.000000 -0.790 55.667 55.67. Если для последнего значения трёх позиций мало для всего числа, этот параметр формата проигнорировался. При положительном n выравнивание выполняется по правому краю, при отрицательном — по левому краю поля шириной n. Например, вывод табличных данных можно выполнить так:.
for (float x=-1.6; x<1.6001; x+=0.2)
printf("\n %10.2G %-10.4f %10.4e ", x, x*x, x*x*x);
Проведите компьютерный эксперимент с этим фрагментом. Кроме этого, предлагается провести эксперимент для понимания аналогичных модификаторов %LX, %Lx, %Ls, %n.ke, %n.kE, %n.kg, %n.kG.
Следующий фрагмент демонстрирует цветной вывод массива.
Пример 8. Найти наибольшее число массива и вывести его цветом, отличным от цвета остальных чисел.
const n=5; float A[n]={33.3, 0.2 ,33.3,-.4}; float Mx=A[0];
for (int i=1; i<n; i++)
Mx =A[i]> Mx? A[i]: Mx; // или if (A[i]> Mx) Mx =A[i];
cout<<"\nColor output "; for (int i=0; i<n; i++)
{ if (A[i]== Mx) { textcolor(11); /* Цвет для максимального числа.*/
textbackground(13); } /* Цвет фона для максимального числа.*/
else { /*Для остальных чисел цвета для чисел и фона меняются.*/
textcolor (13); textbackground (11); }
cprintf("%7.2f", A[i]); /* Вывод с учётом цветов. */
}
Функция textcolor(с1) устанавливает цвет выводимых символов, а функция textbackground(с2) — фон. В текстовом режиме в отличие от визуального графического используется бедная цветовая гамма, состоящая всего из шестнадцати цветов. Номера 0 — 7 представляют тёмные цвета, а 8 — 15 светлые. Из двух цветов можно задавать только один. Обратим внимание, что задать только цвет недостаточно, необходимо вывести информацию. При “цветном выводе” вместо cout или функции printf необходимо использовать функцию cprintf с тем же форматом, что и printf.
Упражнение. Вывести разным цветом отрицательные, нулевые и положительные числа целочисленного массива, не используя цвет фона.
Рассмотримвывод массива в специальном виде.
Пример 9. Вывести элементы массива в обратном порядке A[n-1], A[n-2], …, A[0] слева направо вверху в первой строке. Затем вывести этот же массив снизу вверх примерно посередине экрана с одинаковым расстоянием справа и слева так, чтобы можно было наблюдать вывод, то есть с задержкой.
int main () { const n=5; float A[n]={33.3, 0.2 ,33.3,-.4};
textbackground(11); /* Надо выполнить эту функцию, иначе экран будет закрашен в ранее установленный цвет фона. */
clrscr(); /* Очиcтили и закрасили экран цветом, определённым в textbackground(11) */
for (int I=n-1; I>=0; I--) cout<<A[I]<<" ";
/* Вывели массив в обратном порядке в строку.*/
int y; y=wherey()+1; /* Функция wherey() возвращает номер текущей строки окна вывода. */
for (int I=0; I<n; I++)
{ // Переводим курсор в указанную позицию.
gotoxy(37, y+n-I); printf("%7.2f", A[I]); // Выводим A[I]
// Задержка в цикле при выводе (можно getch();)
for (int t=0; t<100000000; t++); }
getch(); return 0; }
Функция gotoxy (x, y) переводит курсор в окне вывода в позицию с указанными текстовыми координатами, где y — номер строки (нумерация сверху вниз от 1 до 25), x — номер символа в строке (нумерация слева направо от 1 до 80). То есть направление как текстовых, так и графических “компьютерных” координат отличается от известных в геометрии декартовых координат. Символ в левом верхнем углу окна вывода имеет координаты (1,1), а в нижнем правом углу — (80, 25).