Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
posobie.doc
Скачиваний:
27
Добавлен:
31.03.2015
Размер:
1.43 Mб
Скачать

5. Работа с двумерными массивами (матрицами)

5.1. Схема обработки матриц

● Для цельности дальнейшего изложения воспроизведем необходимые определения из § 1.1.

Массив– совокупность однотипных данных, имеющая общее имя. Для идентификации отдельных элементов используютсяиндексы. В простейшем случае это номера элементов. Количество индексов, необходимых для однозначной идентификации элемента, определяетразмерностьмассива.

Двумерный массив (матрица)– структура из строк и столбцов, например:

Описание: цел с[3,5]; в общем случае –c[m,n].

Элементы массива: в общем виде – сi,j илис[i,j].

Первым всегда указывается индекс строки.

● Порядок обработки элементов задается порядком изменения индексов.

•• Основные схемы обработки всех элементов матрицы: просмотр по строкам (строка за строкой) или по столбцам (столбец за столбцом).

Просмотр по строкам

Просмотр по столбцам

для i от 1 до m цикл

для j от 1 до n цикл

<обработка элемента с[i,j]>

кц;

кц;

для jот 1 доnцикл

для iот 1 доmцикл

<обработка элемента с[i,j]>

кц;

кц;

•• Основные схемы обработки элементов квадратной матрицы

Просмотр элементов главной диагонали

Для элементов главной диагонали выполняется условие: i = j. Достаточно однократного цикла, например, поi, с обработкой элементовс[i,i].

Просмотр элементов над главной диагональю

При построчном просмотре для текущей i–й строки анализируется ее часть, начиная с диагонального элемента и до конца строки.

Включая диагональные элементы

Не включая диагональные элементы

для i от 1 до m цикл

для j от i до n цикл

<обработка с[i,j]>

кц;

кц;

для i от 1 до m-1 цикл

для j от i+1 до n цикл

<обработка с[i,j]>

кц;

кц;



Просмотр элементов под главной диагональю делается аналогично.

5.2. Ввод и вывод матрицы

1. Задача.Задана матрицаaизmстрок иnстолбцов. Здесь нас интересует только ввод-вывод матрицы, поэтому все остальные элементы задачи и ее решения опускаем.

2. Входные данные. Ограничения на диапазоны данных там, где они не очевидны, взяты произвольно.

цел m- число строк матрицыa; простая переменная;m<=50; формат XX (:2);

цел n- число столбцов матрицы а; простая переменная; 0<n<=50; формат XX (:2);

вещ a- исходная матрица; двумерный массив;a[i,j]<=10; точность 0,1; формат +XX.Х (:5:1).

Входная формасложнее, чем для одномерного массива, и требует более тщательной разработки.

Рассмотрим 2 варианта размещения элементов:

a) общий случай: nтаково, что строка матрицы не помещается на одной строке носителя, и волевым усилием размещаем в строке носителя фиксированное число элементов (например, пять);

б) строка матрицы умещается на одной строке носителя (либо размещаем в строке носителя произвольное число элементов, что нежелательно).

3. Выходные данные. Приведем только фрагменты выходной формы для вывода входных данных.

Пусть:

  • входные данные и результаты хранятся в файлах на диске;

  • имена входного и выходного файлов задаются как первый и второй параметры командной строки;

  • соответствующие файловые переменные программы - dat, res.

Алгоритм

На уровне алгоритма будем описывать только порядок обработки элементов и ссылаться на соответствующий образец ввода-вывода. Поэтому оба варианта здесь будут выглядеть одинаково.

Пусть i,j- текущие номера строки и столбца.

алг vvod_matr (m,n,a);

арг

цел m,n; вещ a[m,n] ;

рез

…………

нач

цел i,j;

{вывод заголовка }

вывод по обр1;

{ввод и вывод m,n согласно выходной форме}

ввод(m,n); вывод (m,n) по обр2;

{ввод по строкам элементов матрицы}

ввод ((a[i,j], j=1,n), i=1,m);

{вывод по строкам элементов матрицы}

вывод ((a[i,j],j=1,n),i=1,m) по обр3;

…………

кон;

кон vvod_matr;

Кодирование на паскале

program vvod_matr (dat,res);

const

mmax=50;

nmax=50;

var

m,n,i,j:byte;

a:array[1..mmax,1..nmax] of real;

dat,res:text;

.....................

begin

assign(dat,paramstr(1)); assign(res,paramstr(2));

reset(dat); rewrite(res);

writeln(res,' ':15,'Обработка матрицы');

{ввод m,n; вывод m,n по обр2}

readln(dat,m,n);

writeln(res,' Исходная матрица из ',m:2,' строк и ',n:2,' столбцов');

<Ввод и вывод элементов матрицы согласно варианту а или б>

end.

{вариант а}

{ввод по строкам элементов матрицы}

for i=1 to m do

for j=1 to n do

begin

read(dat,a[i,j]); {ввод из одной строки носителя}

if(jmod5)=0then{если введено 5 элементов}

readln(dat); {переход на следующую строку носителя }

end;

{вывод по строкам элементов матрицы}

for i=1 to m do

begin

write(res,' ');{вывод пробелов в начале строки}

for j=1 to n do

begin

write(res,a[i,j]:5:1,' '); {вывод в одну строку носителя }

if(jmod5)=0then{если выведено 5 элементов }

writeln(res); {переход на следующую строку носителя } end;

writeln(res); {переход к следующей строке матрицы }

end;

{вариант б}

{ввод по строкам элементов матрицы}

for i=1 to m do

begin

for j=1 to n do

read(dat,a[i,j]); {ввод из одной строки}

readln(dat); {переход на следующую строку }

end;

{вывод по строкам элементов матрицы}

for i=1 to m do

begin

write(res,' ');{вывод пробелов в начале строки}

for j=1 to n do

write(res,a[i,j]:5:1,' '); {вывод в одну строку}

writeln(res); {переход на следующую строку }

end;

Пояснение. Операции ввода и вывода в Паскале при схожих формах ввода и вывода могут быть записаны совершенно по-разному! Дело в том, что при вводе пропускаются пробелы, знаки табуляции и концы строк. Поэтому операции перехода на другую строку можно было бы не писать. Однако вывод должен быть описан полностью – без перехода на другую строку все будет выводиться подряд.

Чтобы не спотыкаться на этих тонкостях и не делать ошибок, следует придерживаться следующих рекомендаций:

  • тщательно проектировать входную и выходную формы;

  • ввод – вывод кодировать в точном соответствии с этими формами.

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