Задача

Заполнить двумерный массив по следующему правилу:

Решение

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

  1. На главной диагонали располагаются единицы. Далее по диагоналям над и под главной идут двойки, затем диагонали троек и четверок. Заканчивается все угловыми пятерками.
  2. От единиц главной диагонали по столбцам и по строкам, т. е. по вертикали и по горизонтали, натуральные числа последовательно увеличиваются на 1.
  3. Числа в строках последовательно смещаются на одну ячейку вправо. При этом освободившиеся ячейки слева заполняются числами в обратном порядке.

Ниже представлено заполнение двумерного массива с учетом второго правила. Сначала формируется главная диагональ из единиц. Затем заполняется часть матрицы, расположенная под диагональю. При этом изменяется номер строки, индекс столбца остается постоянным. Т. е. для заполнение идет по вертикали. Значение элемента вычисляется исходя из предыдущего + 1.

Далее заполняется верхняя часть матрицы. Здесь заполнение идет по строкам, так как меняется второй индекс.

Комментарии

Последовательность чисел: 2, 5, 10, 17, 26 .

Заполнить элементы массива последовательностью чисел: 2, 5, 10, 17, 26 .

Тема: Двумерные массивы. Заполнение двумерного массива по заданному правилу.

Цели:отработать навыки работы с элементами двумерного массива, научиться заполнять двумерные массивы по заданному правилу, научиться выводить зависимость между номером строки и номером столбца; развитие логического мышления учащихся.

1. Актуализация знаний

Массивы, положение элементов в которых описывается двумя индексами, называются двумерными. Структура такого массива может быть представлена прямоугольной матрицей. Каждый элемент матрицы однозначно определяется указанием номера строки и столбца, номер строки – i, номер столбца – j.
Рассмотрим матрицу А размером n*m:

а11а12а13а14
а21а22а23а24
а31а32а33а34

Матрица из 3 строк и 4 столбцов, количество строк n=3, количество столбцов m=4. Каждый элемент имеет свой номер, который состоит из двух чисел – номера строки, в которой находится элемент, и номера столбца. Например, а23 – это элемент, стоящий во второй строке и в третьем столбце.
Двумерный массив на языке Турбо Паскаль можно описать по-разному. Чтобы описать двумерный массив, надо определить какого типа его элементы, и каким образом они пронумерованы (какого типа его индекс). Существует несколько способов описания двумерного массива.

1 способ

Type Mas = array [1..maxN] of ; <Одномерный массив>
Type TMas = array [1..maxM] of Mas;

2 способ

Type TMas = array [1..maxN] of array [1..maxM] of ;

3 способ

Type = array [1..maxN, 1..maxM] of ;

Предпочтение отдается третьему способу описания двумерного массива.

Const N=3; M=4;
Type TMas= array [1..N, 1..M] of integer;

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

1) Формирование двумерного массива при помощи ввода с клавиатуры и алгоритм построчного вывода элементов матрицы.

Const N=10;M=10;
Type Tmas= array [1..N,1..M] of integer;
Var A:Tmas; i,j:integer;
Begin
<Ввод элементов матрицы>
For i:=1 to N do
For j:=1 to M do
Read(A[i,j]);
<Вывод элементов матрицы>
For i:=1 to N do begin
For j:=1 to M do
Write(A[i,j]:4); <Печатается первая строка>
Writeln <Переход на новую строку>
end;
End.

2) Фрагмент программы формирования двумерного массива через генератор случайных чисел.

2. Изучение нового материала. Заполнение массива по правилу

Рассмотрим несколько фрагментов программ заполнения двумерного массива по некоторому закону. Для этого необходимо вывести правило заполнения.

1. Заполнить массив А размером n*m следующим образом, например

1 2 3 4 5 6 7 8
16 15 14 13 12 11 10 9
17 18 19 20 21 22 23 24
32 31 30 29 28 27 26 25
33 34 35 36 37 38 39 40
48 47 46 45 44 43 42 41

Массив заполняется по принципу «змейки». Правило заполнения: если номер строки – нечетное число, то A[i,j]=(i-1)*m+j, иначе A[i,j]=i*m-j+1.

program M1А;
var A:array[1..100,1..100] of integer;
n,m,i,j: integer;
begin
readln(n,m);
for i:=1 to n do begin
for j:=1 to m do
begin
if i mod 2 = 1 then
A[i,j]=(i-1)*m+j
else
A[i,j]=i*m-j+1;
write(A[i,j]:3);
end;
writeln;
end;
readln;
end.

Приведем пример программы другого способа заполнения по заданному правилу:

program M1В;
var A:array[1..100,1..100] of integer;
n,m,i,j: integer;
c: integer;
begin
readln(n,m);
c:=1;
for i:=1 to n do
begin
for j:=1 to m do
begin
A[i,j]:=c;
if (i mod 2 = 0) and (j<>m) then
dec(c)
else
inc(c);
write(A[i,j]:3);
end;
c:=c+m-1;
writeln;
end;
readln;
end.

2. Заполнить массив A по следующему принципу:

1 0 2 0 3 0 4
0 5 0 6 0 7 0
8 0 9 0 10 0 11
0 12 0 13 0 14 0

program M2;
var A:array[1..100,1..100] of integer;
n,m,i,j: integer;
c: integer;
begin
readln(n,m);
c:=0;
for i:=1 to n do
begin
for j:=1 to m do
begin
if (i-1+j) mod 2 = 0 then
A[i,j]:=0
else
begin
inc(c);
A[i,j]:=c;
end;
write(A[i,j]:5);
end;
writeln;
end;
readln;
end.

3. Заполнить массив A по следующему принципу:

1 12 13 24 25 36
2 11 14 23 26 35
3 10 15 22 27 34
4 9 16 21 28 33
5 8 17 20 29 32
6 7 18 19 30 31

var A:array[1..100,1..100] of integer;
n,m,i,j: integer;
c: integer;
begin
readln(n,m);
c:=1;
for j:=1 to m do
begin
for i:=1 to n do
begin
A[i,j]:=c;
if (j mod 2 = 0) and (i<>n) then
dec(c)
else
inc(c);
end;
c:=c+n-1;
end;
for i:=1 to n do
begin
for j:=1 to m do
write(A[i,j]:5);
writeln;
end;
readln;
end.

4. Заполнить массив A по следующему принципу:

1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4

var i,j,m,c,d: integer;
A:array[1..100,1..100] of integer;
begin
c:=1;
readln(m);
for j:=1 to m do
begin
i:=c;
d:=1;
repeat
A[i,j]:=d;
inc(i);
if i>m then
i:=1;
inc(d);
until i=c;
dec(c);
if c 21.07.2009

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

При изучении темы советую скачать презентацию "Двумерные массивы" с "Учительского портала" http://www.uchportal.ru/load/18-1-0-27361

Заполнение двумерного массива по правилу

Самые простые задачи из этой серии, когда массив заполняется номерами строк, столбцов, их суммой или произведением. В этих задачах не используется ветвление, поэтому программирование здесь не представляет особой сложности.
Задание А. Заполнить произвольный массив размером N x N (N

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 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

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+1) then a[i,j]:=1;
if (i> n div 2) and (i

Сумма и произведение элементов двумерного массива

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

Задание А. Заполнить двумерный массив 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 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]

В заданиях В, как и в задачах на нахождение суммы и произведения элементов массива, необходимо найти наибольший (наименьший) элемент в строке (реже в столбце).
Задание В. Заполнить двумерный массив 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] max) then max:=min;
write(‘ Min = ‘,min:5);
writeln;
end;
writeln(‘Максимальный среди минимальных =’,max:5);
end.