Типовые алгоритмы обработки двумерных массивов

Вид материалаДокументы

Содержание


Типовые алгоритмы обработки двумерного массива отдельно по строкам
Типовые алгоритмы обработки двумерного массива отдельно по столбцам
Обработка двумерных массивов
Составить программу подсчета суммы и произведения элементов двумерного массива вещественных чисел.
Задача. Задана квадратная матрица целых чисел. Составить программу подсчета суммы элементов, расположенных над главной диагональ
Задана целочисленная квадратная матрица. Определить является ли она симметричной относительно главной диагонали.
Задана матрица вещественных чисел. Образовать одномерный массив, где каждый j – й элемент равен произведению элементов j-ого сто
Задача. Задана целочисленная матрица a(m*n). Упорядочить элементы каждой строки по возрастанию.
Подобный материал:
ТИПОВЫЕ АЛГОРИТМЫ ОБРАБОТКИ ДВУМЕРНЫХ МАССИВОВ

• Обработка всего массива.

• Обработка отдельно по строкам и столбцам.

• Обработка относительно диагоналей.

Обработка всего массива

Типовой алгоритм

Программная реализация

Заполнение

...

for i:=1 to n do

for j:=1 to m do

readln (x[i,j]);

...

Вывод

...

for i:=1 to n do

begin

for j:=1 to m do

write (x[i,j], ' ');

writeln;

end;

...

Сумма, произведение

...

s:=0;

p:=1;

for i:=1 to n do

for j:=1 to m do

begin

s:=s+x[i,j];

p:=p*x[i,j];

end;

writeln (s, p);

...

Максимальный (минимальный) элемент

...

max:=x[1,1];

min:=x[1,1];

for i:=1 to n do

for j:=1 to m do

begin

if x[i,j]>max then max:=x[i,j];

if x[i,j]
end;

writeln (max, min);

...

Выбор по условию

...

for i:=1 to n do

for j:=1 to m do

if {условие} then {действие}

...


Типовые алгоритмы обработки двумерного массива отдельно по строкам

Типовой алгоритм

Программная реализация

Сумма

...

for i:=1 to n do

s[i]:=0;

for i:=1 to n do

for j:=1 to m do

s[i]:=s[i]+x[i,j];

for i:=1 to n do

write (s[i]);

...

Произведение

...

for i:=1 to n do

p[i]:=1;

for i:=1 to n do

for j:=1 to m do

p[i]:=p[i]*x[i,j];

for i:=1 to n do

write (p[i]);



Максимальный (минимальный) элемент

...

for i:=1 to n do

begin

max[i]:=x[i,1];

min[i]:=x[i,1];

end;

for i:=1 to n do

for j:=1 to m do

begin

if x[i,j]>max[i] then

max[i]:=x[i,j];

if x[i,j]
min[i]:=x[i,j];

end;

for i:=1 to n do

write (max[i]);

writeln;

for i:=1 to n do

write (min[i]);

...

Выбор по условию

...

for i:=1 to n do

begin

rez[i]:=0;

end;

for i:=1 to n do

for j:=1 to m do

if {условие} then {rez[i]:=...};

for i:=1 to n do

write (rez[i]);

...


Типовые алгоритмы обработки двумерного массива отдельно по столбцам

Типовой алгоритм

Программная реализация

Сумма

...

for j:=1 to m do

s[j]:=0;

for j:=1 to m do

for i:=1 to n do

s[j]:=s[j]+x[i,j];

for j:=1 to m do

write (s[j]);

...

Произведение



for j:=1 to m do

p[j]:=1;

for j:=1 to m do

for i:=1 to n do

p[j]:=p[j]*x[i,j];

for j:=1 to m do

write (p[j]);

...

Максимальный (минимальный) элемент

...

for j:=1 to m do

begin

max[j]:=x[i,1];

min[j]:=x[i,1];

end;

for j:=1 to m do

for i:=1 to n do

begin

if x[i,j]>max[j] then max[j]:=x[i,j]

if x[i,j]
end;

for j:=1 to m do

write (max[j]);

writeln;

for j:=1 to m do

write (min[j]);

...

Выбор по условию

...

for j:=1 to m do

rez[j]:=0;

for j:=1 to m do

for i:=1 to n do

if {усл.} then {rez[i]:=...};

for j:=1 to m do

write (rez[j]);





Обработка двумерных массивов














Рассмотрим типовые задачи обработки двумерных массивов с использованием вложенных циклов.

Задача.

Т
Составить программу подсчета суммы и произведения элементов двумерного массива вещественных чисел.
аблица идентификаторов



Наименование переменной

Обозначения в программе

1

Имя массива

a

2

Количество строк

n

3

Количество столбцов

m

4

Индексы массива

I,j

5

Сумма элементов

s

6

Произведение элементов

p

program matr;

uses

crt;

var

a:array [1...10, 1...10] of real;

i, j, n, m: integer;

s,p :real;

begin

clrscr;

writeln(‘ Введите n<=10 , m<=10 ’);

readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln(a[i, j]);

s:=0; p:=1;

{ поиск суммы и произведения }

for i:=1 to n do

for j:=1 to m do

begin

s:=s + a[i,j];

p:=p * a[i,j];

end;

writeln(‘ Сумма элементов s=’,s:8:3);

writeln(‘ Произведение элементов p=’,p:8:3);

readln;

end.


Задача.

Задана квадратная матрица целых чисел. Составить программу подсчета суммы элементов, расположенных над главной диагональю.

Таблица идентификаторов



Наименование переменной

Обозначения в программе

1

Имя массива

a

2

Количество строк и столбцов

n

3

Индексы массива

I,j

4

Сумма элементов над главной диагональю

s

program matr_1;

uses

crt;

var

a:array [1..10, 1..10] of real;

i, j, n, m : integer;

s,p : real;

begin

clrscr;

writeln(‘ Введите n<=10 , m<=10 ’);

readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln(a[i,j]);

for i:=1 to 3 do

for j:=i +1 to 3 do

s:=s+a[i,j];

writeln('Сумма элементов s=', s);

readln;

end.

Для ввода элементов массива используются вложенные циклы с указанием номера вводимого элемента.

Для поиска суммы элементов над главной диагональю во внутреннем цикле задан закон изменения параметра внутреннего цикла:

j:=i+1.


Задача.

Задана целочисленная квадратная матрица. Определить является ли она симметричной относительно главной диагонали.

Таблица идентификаторов



Наименование переменной

Обозначения в программе

1

Имя массива

a

2

Количество строк и столбцов

n

3

Индексы массива

I,j

4

Флажок

f

program matr_2;

uses

crt;

var

a : array [1..10, 1..10] of integer;

i, j, n, f : integer;

begin

clrscr;

writeln(‘ Введите n<=10 ’);

readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to n do

readln(a[i,j]);

f:=0

for i:=1 to n do

for j:=i to n do

if a[i,j]<>a[j,i] then f:=1;

if f=0 then writeln(‘ матрица симметрична’)

else writeln (‘матрица не симметрична’);

readln;

end.

При решении этой задачи сравниваются элементы расположенные над главной диагональю ( a[ i,j ] ) с элементами, расположенными под главной диагональю ( a[ j,i ] ) .


Задача.

Задана матрица вещественных чисел. Образовать одномерный массив, где каждый j – й элемент равен произведению элементов j-ого столбца двумерного массива.

 

Таблица идентификаторов



Наименование переменной

Обозначения в программе

1

Имя двумерного массива

a

2

Имя одномерного массива

b

3

Количество строк

n

4

Количество столбцов

m

5

Индексы массива

I,j

 

program matr_3;

uses crt;

var

a: array [1...10, 1...10] of integer;

b: array [ 1..10 ] of integer;

i, j, n, f : integer;

begin

clrscr;

writeln(‘ Введите n<=10 , m<=10 ’); readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln (a[i, j]);

writeln(‘ Исходная матрица ’);

for i:=1 to n do

begin

for j:= 1 to n do

write( a[I,j] , ‘ ‘);

writeln;

end;

writeln(‘ Образованный одномерный массив ’);

for j:=1 to m do

begin

b[ j ]:=1;

{ накапливается произведение элементов j столбца }

for i:=1 to n do

b[ j ]:= b[ j ] * a[ i, j ];

write( b[ j] , ‘ ‘);

end;

readln;

end.

 


Задача.

Задана целочисленная матрица a(m*n). Упорядочить элементы каждой строки по возрастанию.

 

Таблица идентификаторов



Наименование переменной

Обозначения в программе

1

Имя двумерного массива

a

2

Количество строк, столбцов

n, m

3

Индексы массива

I,j

4

Флажок

f

5

Дополнительная переменная для обмена соседних элементов

p

program mart_4;

uses crt;

var

a: array[1...10, 1...10] of integer;

i,j,n,f : integer;

begin clrscr;

writeln(‘ Введите n<=10 , m<=10 ’); readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln(a[i, j]);

writeln(‘ Исходная матрица ’);

for i:=1 to n do

begin

for j:=1 to n do

write(a[I,j],‘ ‘);

writeln;

end;

{ переход от строки к строке }

for i:=1 to n do

{ сортировка i-ой строки }

repeat

f:=0;

for j:=1to m-1 do

if a[i,j]>a[i,j+1] then

begin p:=a[i,j]; a[i,j]=a[i,j+1]; a[i,j+1]:=p; f:=1; end;

until f=0;

writeln(‘ Преобразованная матрица ’);

for i:=1 to n do

begin

for j:= 1 to n do

write( a[I,j] , ‘ ‘);

writeln;

end;

readln;

end.

f =0 – признак того, что все элементы данной строки упорядочены.









Задача.

Составить программу нахождения максимального среди элементов двумерного массива вещественных чисел. Определить номер строки и номер столбца, на пересечении которых был найден максимальный элемент.

Таблица идентификаторов.



Наименование переменной

Обозначения в программе

1

Имя двумерного массива

a

2

Количество строк

n

3

Количество столбцов

m

4

Индексы массива

I,j

5

Значение максимального элемента

max

6

Номер строки, где найден максимальный элемент

kmax

7

Номер столбца, где найден максимальный элемент

lmax

Листинг программы.

program lab6;

uses

crt;

var

a: array [1...10, 1...10] of real;

i, j, n, m , kmax , lmax: integer;

max :real;

begin

clrscr;

writeln(‘ Введите n<=10 , m<=10 ’);

readln(n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln(a[i,j]);

{за максимальный принимается элемент a11 }

max:=a[1,1];

kmax:=1;

lmax:=1;

for i:=1 to n do

for j:=1 to m do

if a[i,j]>max then

begin

max:=a[i,j];

kmax:=i;

lmax:=j;

end;

writeln(‘max=’, max:8:3);

writeln(‘строка - ‘, kmax,’ столбец - ’,lmax);

readln; end.