Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_2013_1_часть+.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
813.57 Кб
Скачать

§ 2. Способы определения массивов

Один из способов определить массив, записать их после объявления в фигурных скобках, был рассмотрен раньше (см. § 5).

Пример 3. Ввод элементов одномерного массива.

/*Объявляем массив*/ const n=10; int a[n];

for (int i=0; i<n; i++)

{ cout<<”a[“<<i<<”]=”; /* вывод подсказки */

cin>>a[i]; } // ввод i-го элемента массива

Пример 4. Массив можно определить с помощью датчика случайных чисел. const n=5; int a[n]; randomize();

for (int j=0; j<n; j++) { a[j]=random(100); cout<<a[j]<<" "; }

Функцию randomize() рекомендуют использовать, чтобы массив был “более случайным”. Параметр функции random (в примере 100) означает, что числа массива будут любыми целыми значениями на промежутке от 0 до 99 включительно. Если надо, чтобы числа были не только положительными, но и отрицательными, можно записать, например, a[j]=random(100)-20; Тогда числа будут на промежутке от –20 до 79, то есть положительных чисел будет по теории вероятностей больше. Если надо получить случайные значения вещественного массива float b[n]; можно в цикле повторить, например, так:

b[j]=random(5)/10.-0.25; При этом константу 10 надо записать обязательно с символом “.”(точка), то есть как вещественное число. Иначе получатся все одинаковые числа (-0.25), так как при делении любого целого числа, меньшего 5, на целое число 10 получится целая часть результата, то есть нуль. На каком промежутке будут сгенерированы случайные числа? Получение массива с помощью датчика случайных чисел экономит время при отладке программы, так как не надо вводить массив. Для анализа результата массив надо обязательно выводить на экран. Заметим, однако, что не для любой задачи таким методом можно сформировать массив. Приведите такой пример.

Пример 5: Массив можно построить по некоторому правилу.

const n=5; int a[n];

for ( int j=0; j<n; j++) if (j%2) а[j]= j*10; else а[j]=j/100;

Как работает этот фрагмент программы, какой сформируем массив?

§ 3. Вывод массива. Функции 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

23

Следующий вариант, в котором вместо 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).