Двумерные массыви

реклама
Часть 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
Конец
Скачать