Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Yazyk_Turbo-Paskal.doc
Скачиваний:
17
Добавлен:
15.04.2015
Размер:
754.69 Кб
Скачать

Вывод массива

Включает обычно вывод заголовка массива, возможно с указанием его длины, и затем вывод заполненных элементов массива в удобной для просмотра на экране (и при распечатке) форме. При выводе на дисплей можно ориентироваться на ширину экрана (80 позиций), при печати – на 60 (вдоль тетрадного листа), 76 (поперек тетрадного листа или при выводе на стандартный лист).

Обычно для распечатки результатов работы используют вывод в текстовый файл, который затем выводят на принтер, как и текст программы. Работа с файлами будет рассмотрена в 9 главе, здесь мы остановимся на моментах, связанных с форматным выводом массивов в виде таблиц.

Оформление вывода следует выполнять с использованием формата, размер которого определяется максимальными размерами выводимых значений.

Например, если числа целые и находятся в диапазоне от –999 до +999, формат должен быть не менее :5 (с учетом разделяющих пробелов). Если диапазон целых чисел неизвестен, следует рассчитывать на максимум. Для самых длинных целых чисел (–32768) он составит :7 и выводить удобно по 10 значений в строке.

Для вещественных чисел, если использовать экспоненциальную форму записи, достаточно оставлять три значащие цифры, что с учетом знака, точки и порядка числа составит :10 и дополнительный пробел, например, _–0.836Е-02, а выводить имеет смысл по пять чисел в строке.

Конечно, удобнее числа выводить в форме с фиксированной точкой (что можно делать, если порядки чисел известны и они не сильно отличаются от нулевого). Например, по формату :8:2 вывод идет с точностью до сотых.

При выводе в конце каждой строки следует давать команду Writeln для перехода на новую строку. Определить, что пора менять строку, можно по остатку от деления текущего номера элемента на количество значений в строке. Ниже приведен пример вывода на печать одномерного вещественного массива по "k" значений в строке:

. . .

Writeln(' Исходный массив из ',N,' элементов');

for i:=1 to N do

if i mod k = 0 then { если номер элемента

WriteLn(A4[i]:8:2)кратен "к", переходим на новую строку}

else

Write(A4[i]:8:2){ печать в текущей строке}

Writeln; {переход на новую строку в конце печати}

. . .

Вышесказанное относится к выводу одномерных массивов. Для двумерных массивов, количество чисел на строке дисплея определяется числом столбцов массива. Если число столбцов не позволяет разместить массив на экране целиком, его приходится распечатывать по несколько столбцов, организуя не двойной, а тройной цикл. Пример распечатки целочисленного двумерного массива представлен ниже:

. . .

Writeln(' Исходный массив из ',M,'x',N,' элементов');

for i:=1 to M do

begin

for j:=1 to N do

Write(A[i,j]:6); {печать текущей строки }

Writeln; {переход на новую строку экрана перед новой строкой массива}

end;

. . .

Примеры программ работы с массивами

Перестановка целочисленного массива из N элементов (N<=100) в обратном порядке.

Метод решения задачи предлагается следующим: Чтобы массив оказался записанным в обратном порядке, первый элемент (A[1]) надо поменять местами с последним (A[N]), второй (A[2]) – с предпоследним (A[n-1]) и т.д. (A[i],< A[N+1-i]). Перестановку будем выполнять, используя рабочую переменную (R). Количество переставляемых пар – N div 2.

Таким образом, при условии заполнения массива из файла (подробно работа с файлами будет рассмотрена позже), программа будет выглядеть так:

Program Revers;

{ VGI, MIT }

Var Fin,Fout:text;

A : array[1..100] of integer;

i,N,R: integer;

BEGIN

Repeat

WriteLn(’Задайте длину массива’);

ReadLn(N);

if N>100 then

WriteLn(’Нельзя больше 100’);

Until N<=100;

Assign(Fin,’S:\kurs_1\_data\DatI.txt’);

Reset(Fin);

for i:=1 to N do

Read(Fin,A[i]);

Close(Fin);

Assign(Fout,’Revers.txt’);

ReWrite(Fout);

WriteLn(Fout,’Исходный массив’);

for i:=1 to N do

if i mod 10 = 0 then { печатаем по десять чисел в строке }

WriteLn(Fout,A[i]:7)

else

Write(Fout,A[i]:7);

WriteLn(Fout);

for i:=1 to N div 2 do

begin

R:=A[i];

A[i]:=A[N+1-i];

A{N+1-i]:=R;

end;

WriteLn(’Измененный массив’);

for i:=1 to N do

if i mod 10 = 0 then

WriteLn(Fout,A[i]:7)

else

Write(Fout,A[i]:7);

WriteLn(Fout);

Close(Fout);

END.

Второй пример. Удаление строки с минимальным значением из двумерного вещественного массива размерами M x N элементов, где M и N не превосходят 7.

Алгоритм решения состоит из следующих частей:

1. Ввод числа строк

2. Ввод числа столбцов

3. открытие файла с числами и заполнение массива значениями

4. Открытие выходного файла и распечатка в него исходного массива

5. Поиск места, где расположен минимальный элемент массива

6. удаление строки с минимальным элементом. Удаление производится, путем переписывания на место удаляемой строки, строки, лежащей ниже (следующей). Затем, в строку, которую откопировали в вышележащую, переписывается следующая строка и т.д. Наконец, M-я строка копируется на (M-1)-е место.

7. количество строк исправленного массива уменьшается на 1.

8. Полученный массив распечатывается

Реализация алгоритма (с некоторыми пропусками) выглядит так:

Program DelLine;

{ VGI, MIT }

Var Fin,Fout:text;

A : array[1..7,1..7] of real;

i,j,N,M,imin,jmin: integer;

Amin : real;

BEGIN

Repeat

WriteLn(’Задайте число строк’);

ReadLn(N);

if N>7 then

WriteLn(’Нельзя больше 7’);

Until N<=7;

{ аналогично задается число столбцов N}

. . .

Assign(Fin,’S:\Kurs_1\_Data\DatF.txt’);

Reset(Fin);

for i:=1 to M do

for j:=1 to N do

Read(Fin,A[i,j)’

Close(fin);

Assign(Fout,’DelLine.txt’);

ReWrite(Fout);

WriteLn(Fout,’Исходный массив’);

for i:=1 to M do

begin

for j:=1 to N do

Write(Fout, A[i,j]);

WriteLn(Fout);

end;

{ поиск места минимального элемента }

imin:=1;

jmin:=1; { сначала считаем минимальным 1-й элемент массива}

for i:=1 to M do

for j:=1 to N do

if A[i,j]<A[imin,jmin] then

begin

imin:=i;

jmin:=j;

end;

{ Удаление строки с номером imin }

for i:=imin to M-1 do

for j:=1 to N do

A[i,j] := A{i+1,j];

M:=M-1;

{ печатаем измененный массив, также, как и исходный и закрываем

файл с протоколом}

. . .

Close(Fout);

END.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]