Часть 1 Автор: учитель информатики МКОУ ИСОШ Гаджимурадов М.И Двумерный массив. Матрицы 1 В математике таблицы чисел, состоящие из строк и столбцов называются матрицами и записываются в круглых скобках. 3 45 A 91 11 56 21 17 67 89 34 78 18 65 81 54 36 22 57 20 16 Двумерный массив. Применение. Использование двумерных массивов для построения поверхностей. 2 Двумерный массив. Определение. Массив — это пронумерованная последовательность величин одинакового типа, обозначаемая одним именем. Элементы массива располагаются в последовательных ячейках памяти, обозначаются именем массива и индексом. Каждое из значений, составляющих массив, называется его компонентой (или элементом массива). Способ организации данных, при котором каждый элемент определяется номером строки и номером столбца, на пересечении которых он расположен, называется двумерным массивом 3 Двумерный массив. Определение 4 В математике: 1 1 2 3 4 5 6 7 4 2 7 5 4 2 4 1 3 8 9 9 3 1 5 0 6 0 0 Ai;j В Pascal: A[i,j] A[2,4] A[1,2] A[3,5] Двумерный массив. Описание 5 Самый простой способ описания массива a : array [1..10, 1..20] of real; Количество Имя Описание строк как массив массивов: Тип массива данных в Количество массиве a: array [1..10] ofстолбцов array [1.. 20] of real; Одномерный массив Каждый элемент которого в свою очередь является одномерным массивом Двумерный массив. Описание 6 Количество строк и столбцов через константу. Const В разделе констант указываем число m=10; n =20; строк и столбцов Var a : array [1.. m, 1.. n] of integer; Определяем пользовательский тип , двумерный Определением нового типа данных. массив type t=array[1..m,1..n] of integer; var a : t; Двумерный массив. Описание Массив констант. const a: array[1..3,1..5] of integer = ((3,-2,1,4,3), (-5,-9,0,3,7), Непосредственно в программе (-1,2,1,-4,0)); указываем значения элементов массива. 7 Двумерный массив. Заполнение 8 Цикл отвечающий за перебор строк. первую, вторую и так далее Заполнение Берем массива с клавиатуры: строки For i := 1 to 3 do begin For j := 1 to 4 do begin write('A[ ', i, ', ',j, ']= '); readln(a[i, j]) end; Цикл отвечающий за end; перебор ячеек в каждой строке. Двумерный массив. Заполнение 9 Блок-схема заполнения с клавиатуры: i , 1, N Цикл отвечающий за перебор строк. (Внешний цикл) j , 1, N Ввод a i , j Цикл отвечающий за перебор ячеек в каждой строке. (Внутренний цикл) Двумерный массив. Заполнение 10 Заполнение массива случайными числами: For i := 1 to 3 do begin For j := 1 to 4 do begin a[i, j] := random(21) - 10; write(a[i, j]:6); Когда i-я строка end; закончилась, Write без LN выводит пишем пустой writeln; элементы массива в WriteLN для строку end; перехода на новую строку Двумерный массив. Заполнение i , 1, N j , 1, N 11 Цикл отвечающий за перебор строк. (Внешний цикл) a i , j= случайное[-10;10] Вывод a i , j Цикл отвечающий за перебор ячеек в каждой строке. (Внутренний цикл) Двумерный массив. Заполнение Заполнение массива по правилу: ForЗаполнить iClrScr; := 1 to 3 do произвольный begin массив Write('ВВеди N = ');Readln(n); размером N x N (N<10) по следующему For j := 1 to 4 do begin For i:=1 to n do begin правилу: a[i, j] :=ФОРМУЛА; 11111 For j:=1 to n do begin write(a[i, j]:6); Значение 22222 a[i,j]:=i; элемента в 33333 end; write(a[i,j]:4); каждой ячейке строки равно 44444 writeln;end; номеру строки. 55555 end; writeln; end; 12 Двумерный массив. Заполнение ClrScr; 1 2 3 4 Главная диагональ: a11 a14 N = ');Readln(n); 1 Write('ВВеди I=J n do begin a22 ato 2 For i:=1 23 диагональ: to n doПобочная begin 3 For aj:=1 32 a33 4 a41 I+J=N+1 ifa44(i+j = n+1) then a[i,j]:=1 else a[i,j]:=0; Заполнить произвольный массив размером N x N (N<10) write(a[i,j]); по следующему правилу: Если побочная диагональ то end;00001 заполнить ячейку 1 00010 во всех остальных writeln; случаях 0 00100 end; 01000 10000 13 Двумерный массив. Заполнение 14 Ввод N i , 1, N j , 1, N Нет Да i+j=N+1 a i , j= 0 a i , j= 1 Вывод a i , j Фрагмент блок-схемы задачи заполнения побочной диагонали единицами Двумерный массив. Заполнение 1 1 2 3 4 5 2 3 4 15 5 Удовлетворяет неравенству a11 a22 a33 i < j a44 a55 Удовлетворяет неравенству i > j Двумерный массив. Заполнение 16 1 2 3 4 5 a15 Удовлетворяет неравенству i+j<n+1 a24 a33 a42 a51 Удовлетворяет неравенству i+j>n+1 1 2 3 4 5 Двумерный массив. Заполнение 17 Системы неравенств (i+j<n+1) And (i<j) 1 2 3 (i+j<n+1) 1 a11 2 And (i>j) 3 a22 4 5 4 5 a15 a24 (i+j>n+1) And (i<j) a33 a42 a51 a44 a55 (i+j>n+1) And (i>j) Двумерный массив. Заполнение 18 Заполнить произвольный массив размером N x N (N<10) по Write('ВВеди N = '); Readln(n); следующему правилу: For i:=1 to n do00001 begin For j:=1 to n do00011 begin 00111 if (i+j>=n+1) and (i<=j) then a[i,j]:=1 00011 00001 else a[i,j]:=0; write(a[i,j]:2); end; writeln; end; Это пересечение двух Проверяем условие множеств. Элементы принадлежности лежащие на и ниже данному множеству побочной диагонали и элементы лежащие на и выше главной диагонали Двумерный массив. Сумма элементов Один или два прохода по массиву? Второй способ. Два прохода попо массиву Первый способ. Один проход массиву Заполнить двумерный массив N x N случайными числами из Write(' ВВеди N = ');Readln(n); Первый проход. ClrScr; интервала [-10 ; 10] и найти сумму элементов массива Заполняем массив и s:=0; лежащих на главной диагонали. Write('ВВеди NЗамечание. = ');Readln(n); выводим его на Fors:=0; i:=1 to n do begin Заполняем экран случайными Если что то сделать только числами и выводим на For j:=1 to nнужно do begin экран For i:=1 to n do begin с главной диагональю, a[i,j]:=random(20)-10; For j:=1 to n do begin то можно обойтись write(a[i,j]:4);без вложенных циклов a[i,j]:=random(20)-10; For i:=1 to n do s:=s+ a[i,i]; end; write(a[i,j]:4); writeln; Второй проход. if (i=j) then s:=s+ a[i,j]; end; Находим сумму. For i:=1 to n do end; И сразу же находим For j:=1 towriteln; n do сумму элементов end;s:=s+ a[i,j]; лежащих на главной if (i=j) then диагонали writeln('Сумма элементов =',s:5); writeln('Сумма элементов =',s:5); 19 Двумерный массив. Сумма элементов 20 Нахождение суммы элементов на главной диагонали за один проход по массиву Ввод N S=0 i , 1, N j , 1, N a i , j= случайное[-10;10] Вывод a i , j i =j Нет Вывод S Да S =S + a i , j Двумерный массив. Сумма элементов Ввод N 21 Нахождение суммы элементов на главной диагонали за два прохода S=0 1 i , 1, N i , 1, N j , 1, N j , 1, N a i , j= случайное[-10;10] Вывод a i , j Нет i =j Да S =S + a i , j 1 Вывод S Двумерный массив. Сумма элементов Ввод N S=0 22 Нахождение суммы элементов на главной диагонали за два прохода (в случае когда речь идет только о главной диагонали и остальной массив не нужен) i , 1, N j , 1, N a i , j= случайное[-10;10] i , 1, N S =S + a i , i Вывод a i , j 1 Вывод S Двумерный массив. Минимальный элемент Один или два прохода по массиву? Рассуждение второе. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти минимальный элемент лежащий на главной диагонали. 23 Двумерный массив. Минимальный элемент 24 Стандартный способ без анализа задачи Write('ВВеди N = ');Readln(n); Заполняем массив For i:=1 to n do begin Замечание. случайными числами j:=1 toслучае n do begin ВFor данном можно не бегать по всему Если встречается a[i,j]:=random(21)-10; меньше m, и массиву а пройти толькоэлемент по главной он лежит на главной write(a[i,j]:4); диагонали, обойдясь без вложенных циклов. диагонали, то он end; становится минимальным Writeln; Предполагаем, что m:=a[1,1]; минимальный end; For i:=2 to n do элемент стоит в m:=a[1,1]; левом верхнем углу if (a[i,i]<m) then m:=a[i,i]; 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); Двумерный массив. Минимальный элемент С анализом исходных данных задачи Если немного по рассуждать, можно увидеть, Write('ВВеди N = ');Readln(n); Предполагаем, что что самое «маленькое» число, которое может самое маленькое m:=10; выдать генератор случайных чисел 10. число это 10, правая For i:=1 to n do begin граница исходного Все остальные числа будут меньше его. Т.к. в интервала. For j:=1 to n do begin условии задачи нам точно задан интервал a[i,j]:=random(21)-10; [-10 ; 10]. write(a[i,j]:4); if (a[i,j]<m) and (i=j) then m:=a[i,j]; end; Заполняем, выводим Writeln; на экран и сразу проверяем на end; минимальность в writeln(' Минимальный элемент лежащий главной диагонали. на главной диагонали =',m:5); 25 Двумерный массив . Максимальный элемент в строке 26 Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти максимальный элемент в каждой строке. Двумерный массив. Максимальный элемент в строке 27 Write('ВВеди N = ');Readln(n); Перебираем строки For i:=1 to n do begin Решение в один проход, Предполагаем, что Заполняем элемент самое большое число max:=-10; массива и выводим с анализом задачи - 10, левая его награница экран For j:=1 to n do begin исходного интервала. a[i,j]:=random(21)-10; write(a[i,j]:4); if (a[i,j]>max) then max:= a[i,j]; end; Если в строке write(' MAx = ',max:5); встречается элемент больше Выводим наибольший writeln; максимального, то он элемент в строке становится end; максимальным Двумерный массив. Максимальный элемент в строке Нахождение максимального элемента в каждой строке в один проход Ввод N i , 1, N Мах = - 10 j , 1, N a i , j= случайное[-10;10] Вывод a i , j Да a i , j > Max Нет Max = a i , j Вывод Max Конец 28 Двумерный массив. Максимальный элемент в строке Предполагаем, что Перебираем строки наибольший элемент в каждой строке стоит на способом, первом месте ClrScr; For i:=1 to n do begin Стандартным Write(‘Введи N = ');Readln(n); max:=a[i,1]; первый проход – заполнение, For i:=1 to n do begin For j:=2 to n do if (a[i,j]>max) then второй проход – поиск For j:=1 to n do begin max:= a[i,j]; максимального в строках a[i,j]:=random(21)-10; writeln('В ',i,' строке max = ',max:5); write(a[i,j]:4); end; Идем по строке и если Заполняем массив и находим элемент выводим его на экран end; больший чем Вывод наибольшего максимальный, то он writeln; элемента в строке становится end; максимальным 29 Двумерный массив. Максимальный элемент в строке 30 Начало 1 Ввод N i , 1, N Мах = a i , 1 i , 1, N j , 2, N j , 1, N a i , j= случайное[-10;10] Вывод a i , j Нет a i , j > Max Да Max = a i , j 1 Нахождение максимального элемента в каждой строке в два прохода Вывод Max Конец