Лекция: Вывод массива. Функции 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).

 

еще рефераты
Еще работы по информатике