Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

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

  • Ввод элементов массива с экрана (см. выше) или с заранее подготовленного файла (2-й семестр).

  • Значения элементов массива можно задать (проинициализировать) во время объявления следующим образом:

тип имя [N]={список значений};

где в фигурных скобках записываются константы соответствующего типа, разделённые запятыми. Например:

const N=5; float A[N]={-1.1, 22, 3, -4.4, 50};

При этом если в списке меньше N значений, то недостающие элементы массива примут нулевое значение. Наоборот, если указать больше N значений, “компилятору это не понравится”.

Массив символов (строку) без явного использования указателей можно объявить и инициализировать поразному. Можно указать размерность, достаточную для размещения текста и символа конца строки (‘\0’). Этот символ надо явно записать в конце списка, например:

char T[11]={‘м’,’а’,’т’,’е’,’м’,’а’,’т’,’и’,’к’,’а’,’\0’};

Второй способ проще и удобнее: char T[11]=“математика”; В этом случае нулевой символ добавляется к концу строки автоматически.

Кроме того, как для числовых, так и для символьных массивов необязательно указывать размерность. Она будет определена в зависимости от количества записанных элементов или длины строки. Например, int V[]={11, 2, -3, 44, -5}; объявляет и инициализирует целочисленный массив из пяти элементов, а сhar S[]=”ММФ”; — строку из четырёх символов, так как добавлен символ конца строки.

Указанный способ определения массива удобен для отладки программы, так как не надо тратить время на многократный ввод его элементов. При тестировании достаточно изменить несколько элементов массива.

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

const n=5; int Y[n]; randomize();

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

{ Y[j]=random(100);

cout<<Y[j]<<" ";

}

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

Если надо получить вещественные числа, можно в цикле записать, например, так: A[i]=random(5)/10.-0.25; При этом массив A объявляется как float, а константу 10 надо записать обязательно с символом “.”, то есть как вещественное число. Иначе получатся все одинаковые числа (-0.25), так как при делении любого целого числа, меньшего 5, на целое число 10 получится целая часть результата, то есть нуль.

  • Массив можно построить по некоторому правилу, например:

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

if (j%2) A[j]= j*10;

else A[j]=j/100.;

Упражнение. Как работает этот фрагмент программы?

6.3. Вывод одномерного массива. Функции printf и сprintf

Простой вывод элементов небольшого массива в одну строку экрана можно выполнить так:

cout<< “\n Масссив: \n“;

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

cout<<A[i]<<" ";

cout<<endl;

Замечание. Первая и последняя строки будут дальше во всех вариантах.

Вывод массива относительно большой размерности N (например, 50), который не вмещается в одну строку, по K элементов в строке выглядит так:

int K=10;

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

{ cout<<A[i]<<" ";

if ((i+1) %K == 0) cout<<endl;

// или if ( ! ( (i+1) % K ) ) cout << endl;

}

В этом варианте числа не выровнены. Поэтому следующий вариант устраняет этот недостаток:

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

{ printf("%7.2f", A[i]);

if (! ((i+1) %K)) printf("\n");

}

Упражнение для изучения printf.

Пусть float x=1.11; int y=–2; Вывод

cout<<“ The first number “<< x<<endl<<” y= “<<y<<endl;

можно записать так:

printf (“ The first number %f\n y= %d\n”, x, y);

Функция printf имеет следующий общий вид:

printf (строка, список);

В строке можно записать:

  • любую последовательность символов, включая и пробелы, которые точно в таком же виде будут отображаться при выводе на экран;

  • управляющие символы или символьные константы с обратным слэшем:

\n — переход на следующую строку;

\r — возврат каретки, то есть переход в начало текущей строки;

\t — горизонтальная табуляция, то есть вывод с определённых стандартных позиций;

\a — непродолжительный звуковой сигнал и другие;

  • форматы, или спецификаторы формата, перед которыми записывается символ “%”. Он никак не связан ни с соответствующей операцией получения остатка при целочисленном делении, ни с вычислением процента. Форматы указывают способ вывода соответствующих элементов списка и зависят от типов выводимых значений:

%f — для вывода вещественных чисел;

%d — для вывода целых чисел;

%E или %e — для вывода вещественных чисел в экспоненциальной форме (научной нотации), например, 0.5E4 или 0.5e-4;

%G — выбирает в зависимости от значения числа формат %f или %E;

%g — выбирает в зависимости от значения числа формат %f или %e;

%X или %x — для вывода числа в шестнадцатеричной системе счисления (число 17110 будет выведено как AB или ab);

— для вывода символа;

%s — для вывода строки и другие форматы.

Вся строка с указанными выше элементами записывается, как правило, в виде текстовой константы. Можно использовать для этих целей переменную строкового типа.

В списке через символ “,” (запятая) указываем выражения, значения которых выводятся. Как частный случай выражения можно записать константу или переменную. Между элементами списка и спецификаторами формата с символом “%” должно быть соответствие в количестве, порядке следования и типе.

Любой из элементов строки или список могут отсутствовать. Например, printf (” выводимый текст”); или

printf (“%s”, ”выводимый текст”); выводит только текст.

Перед спецификаторами формата можно использовать модификаторы форматов для изменения способа представления выводимых значений:

%nd, где целая константа n определяет ширину поля для выводимого целого числа. Например, printf (“%5d%05d”, j, num) выводит значения справа поля шириной 5 с впереди стоящими пробелами для j и c впереди стоящими нулями для num ;

%n.kf, %n.ke, %n.kE, где целая константа n задаёт общее количество позиций, отводимых для вывода вещественного числа, включая точку и знак числа; целая константа к определяет количество позиций, отводимых для дробной части. Например: float a, b, c; printf (“%f\n%10f\n%10.3f”, a, b, c);

Если n положительное, то выравнивание выполняется по правому краю, если n отрицательное, то по левому краю.

Функцию printf удобно использовать для вывода табличных данных, например:

for (float x=-1.6; x<1.6001; x+=0.2)

printf("%10.2G %-10.4f %10.4f\n", x, x*x, x*x*x);

Проведите эксперимент с этим фрагментом.

Следующий фрагмент демонстрирует цветной вывод массива. Программа находит наибольшее число массива и выводит его белым цветом (textcolor(15)) на зелёном фоне (textbackground(2)), а остальные числа, наоборот, зелёным цветом на белом фоне.

float MyMax; MyMax=A[0];

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

if (A[i]>MyMax) MyMax=A[i];

// или MyMax = A[i]>MyMax ? A[i] : MyMax;

cout<<"\nColor output ";

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

{ if (A[i]==MyMax)

{ textcolor(15); textbackground(2);

}

else { textcolor (2); textbackground (15);

}

cprintf("%7.2f",A[i]);

}

Из двух цветов можно задавать только цвет выводимых символов с помощью textcolor. Обратим внимание, что задать только цвет недостаточно. При “цветном выводе” вместо cout или функции printf необходимо использовать функцию cprintf!

Упражнение. Вывести разным цветом отрицательные, нулевые и положительные числа целочисленного массива, не используя цвет фона.

Рассмотрим вывод массива в специальном виде (порядке). Например, вывести элементы массива в порядке A[n-1], A[n-2], …, A[0] слева направо вверху в первой строке. Затем вывести этот же массив снизу вверх примерно посередине экрана с одинаковым расстоянием справа и слева так, чтобы можно было наблюдать вывод, то есть с задержкой.

textbackground(0);

/* Надо выполнить эту функцию, если раньше использовали цвет фона, иначе экран будет закрашен в ранее установленный цвет фона.*/

clrscr(); // Очищает и закрашивает экран.

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]);

for (int t=0;t<100000000;t++); // Задержка при выводе.

}

Функция gotoxy (x, y) переводит курсор в позицию с указанными текстовыми координатами, где y — номер строки (нумерация сверху вниз от 1 до 25), x — номер символа в строке (нумерация слева направо от 1 до 80). То есть направление как текстовых, так и графических “компьютерных” координат отличается от известных в геометрии декартовых координат. Символ в левом верхнем углу окна вывода имеет координаты (1,1), а в нижнем правом углу — (80, 25).

Упражнение. Вывести элементы массива по одной из диагоналей экрана.