Двумерные массивы
Во всем курсе программирования задачи на двумерные массивы вызывают наибольшую трудность у учащихся. Изучение этой темы лучше всего начать с задач на заполнение двумерного массива по определенному правилу. Это помогает лучше понять, как происходит работа с двумерным массивом, как и в каком из вложенных циклов происходит обработка столбцов и строк, как определить главную и побочную диагонали, и элементы лежащие выше и ниже их и т.д.
При изучении темы советую скачать презентацию "Двумерные массивы" с "Учительского портала" http://www.uchportal.ru/load/18-1-0-27361
Заполнение двумерного массива по правилу
Самые простые задачи из этой серии, когда массив заполняется номерами строк, столбцов, их суммой или произведением. В этих задачах не используется ветвление, поэтому программирование здесь не представляет особой сложности.
Задание А. Заполнить произвольный массив размером N x N (N<10) по следующему правилу:
11111
22222
33333
44444
55555
Program n1;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,n: integer;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=i;
write(a[i,j]);
end;
writeln;
end;
end.
Для решения следующей группы задач, нужно знать, как определяется главная и побочная диагонали, и уметь применять оператор ветвления. Задания могут содержать как один, так и несколько условных операторов.
Задание В. Заполнить произвольный массив размером N x N (N<10) по следующему правилу:
00001
00010
00100
01000
10000
Program n2;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,n: integer;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
if (i+j = n+1) then a[i,j]:=1;
write(a[i,j]);
end;
writeln;
end;
end.
Для решения задач С, необходимо в одном цикле поделить массив на две части используя операцию целочисленного деления DIV. Можно решать подобные задачи, используя два цикла, программа будет работать и задача будет решена, но такое решение нельзя назвать рациональным.
Задание С. Заполнить произвольный массив размером N x N (N<10) по следующему правилу:
00001
00011
00111
00011
00001
Program n3;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,n: integer;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
if (i<= n div 2) and (i+j >= n+1) then a[i,j]:=1;
if (i> n div 2) and (i<=j) then a[i,j]:=1;
write(a[i,j]);
end;
writeln;
end;
end.
Сумма и произведение элементов двумерного массива
В заданиях А, требуется найти сумму элементов массива удовлетворяющих условию, здесь можно провести аналогию с одномерным массивом. Задача может быть решена как в один, так и в два цикла. Проще всего решить задачу сначала одним вложенным циклом заполняя массив, а затем другим вложенным циклом найти сумму элементов массива. Но более рационально использовать для решения задачи один вложенный цикл.
Задание А. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти сумму элементов массива лежащих на главной диагонали.
Program n4;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,n,s: integer;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
s:=0;
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=random(20)-10;
write(a[i,j]:4);
if (i=j) then s:=s+ a[i,j];
end;
writeln;
end;
writeln('Сумма элементов лежащих на главной диагонали =',s:5);
end.
В заданиях В, необходимо выполнить более сложные действия в нутрии цикла, осуществляющего перебор строк. Нужно правильно расположить обнуление суммы и вывод суммы элементов строки. Для этого необходимо четкое понимание, что обработка элементов массива осуществляется построчно. Можно придумать задачи, когда необходимо будет находить сумму элементов в каждом столбце. Такие задания потребуют еще более глубокого понимания алгоритма обработки двумерного массива.
Задание В. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти сумму элементов в каждой строке.
Program n5;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,n,s: integer;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
For i:=1 to n do begin
s:=0;
For j:=1 to n do begin
a[i,j]:=random(20)-10;
write(a[i,j]:4);
s:=s+ a[i,j];
end;
write(' Сумма = ',s:5);
writeln;
end;
end.
К заданиям С, я отношу задачи, когда найденную величину необходимо с чем ни будь сравнивать.
Задание С. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и определить сколько элементов в данном массиве, больших среднего арифметического элементов массива лежащих под главной диагональю.
Program n6;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,k,s,n: integer; sr:real;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
s:=0;
k:=0;
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=random(20)-10;
write(a[i,j]:4);
if (i>j) then begin
s:=s+ a[i,j];
k:=k+1;
end;
end;
writeln;
end;
sr:=s/k;
writeln(' Среднее арифметическое элементов под главной диагональю = ',sr:10:5);
k:=0;
For i:=1 to n do
For j:=1 to n do if (sr<a[i,j]) then k:=k+1;
writeln(' Ответ = ',k:5);
end.
В этой задаче необходим двойной проход по массиву. Первая пара циклов заполняет массив случайными числами и находит, среднее арифметическое элементов массива лежащих под главной диагональю. Вторая пара циклов определяет, сколько элементов в данном массиве, больших среднего арифметического элементов массива лежащих под главной диагональю.
Поиск максимального (минимального) элемента в двумерном массиве
Эти задачи так же можно классифицировать по усложнению алгоритма. При решении всех предлагаемых задач, нужно хорошо понимать, что элемент двумерного массива определяется двумя индексами, номером строки и столбца. По этому, когда определяется положение максимального или минимального элемента необходимо определять две переменные одну под номер строки, другую под номер столбца. Решать эти задачи можно, так же как и предыдущие, в один цикл. Но необходимо знать какое минимальное или максимальное значение может принимать элемент массива стоящий в первой строке первого столбца. Точно это можно сделать, только если массив заполняется случайными числами из интервала, (точно известна левая и правая границы). А если массив заполняется с клавиатуры, то лучше использовать два цикла, в одном происходит заполнение, в другом поиск элемента. Такое решение будет проще и нагляднее.
Задание А. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти минимальный элемент лежащий на главной диагонали.
Program n7;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,n,m: integer;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=random(20)-10;
write(a[i,j]:4);
end;
Writeln;
end;
m:=a[1,1];
For i:=1 to n do
For j:=1 to n do if (a[i,j]<m) and (i=j) then m:=a[i,j];
writeln(' Минимальный элемент лежащий на главной диагонали =',m:5);
end.
В заданиях В, как и в задачах на нахождение суммы и произведения элементов массива, необходимо найти наибольший (наименьший) элемент в строке (реже в столбце).
Задание В. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти максимальный элемент в каждой строке.
Program n8;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,n,max: integer;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
For i:=1 to n do begin
max:=-10;
For j:=1 to n do begin
a[i,j]:=random(20)-10;
write(a[i,j]:4);
if (a[i,j]>max) then max:= a[i,j];
end;
write(' MAx = ',max:5);
writeln;
end;
end.
В заданиях С, усложняется задание В, добавляя необходимость среди минимальных найти наибольший или наоборот самый маленький. Подобную задачу можно решить с использованием дополнительного массива, размер которого равен количеству строк двумерного массива, но возможно решение без использования дополнительного массива.
Задание С. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти максимальный элемент среди минимальных элементов ее строк.
Program n9;
Uses Crt;
var a:array[1..10,1..10] of integer;
i,j,n,min,max: integer;
begin
ClrScr;
Write('ВВеди N = ');Readln(n);
max:=-10;
For i:=1 to n do begin
min:=10;
For j:=1 to n do begin
a[i,j]:=random(20)-10;
write(a[i,j]:4);
if (a[i,j]<min) then min:= a[i,j];
end;
if (min>max) then max:=min;
write(' Min = ',min:5);
writeln;
end;
writeln('Максимальный среди минимальных =',max:5);
end.