Урок №9 (двумерные массивы)

advertisement
Двумерные массивы
Двумерный массив можно представить в виде совокупности одномерных массивов (каждая строка
- это одномерный массив). Каждый элемент имеет свой номер, как у одномерных массивов, но сейчас
номер уже состоит из двух чисел - номера строки, в которой находится элемент, и номера столбца.
Таким образом, номер элемента определяется пересечением строки и столбца.
Когда вы создаете двумерный массив, Pascal выделяет для него место в памяти. Затем вы можете
использовать этот массив в вашей программе так, как будто это таблица значений, как показано на
следующей иллюстрации.
J

I
1

2
1
2
3
4
5
4
9 2
0
-2 9
-7 5 -4 7
0
6
7
8
3 -5
-8 4 9
Для выделения места в памяти используются следующие команды
Var имя массива array [1..число строк] of array [1.. число столбцов] of тип данных;
Var имя массива : array [1..число строк, 1..число столбцов ] of тип данныхl;
Чаще всего при описании двумерного массива используют второй способ.
Var а : array [1..2, 1..8 ] of real;
Где а имя массива, array массив, значение в квадратных скобках размер массива, 1..2 количество
строк в, 1..8 количество элементов в строке (или столбцов ). Далее тип данных real (действительные
числа)
Const n:=2; m:=8:
Var а : array [1..n, 1..m] of real;
формирование двумерного массива можно осуществлять всеми тремя способами, описанными для
одномерных массивов, то есть: ввод с клавиатуры, через генератор случайных чисел или с помощью
формулы.
Например 1: Сформировать таблицу Пифагора (таблица умножения) и вывести ее на экран.
Р имя массива, размерность массива 9х9, тип данных целые числа, i - переменная строк, j переменная столбцов
Program Pifagor;
Uses crt;
Var p: array[1..9, 1..9] of integer; {отводит память а оперативной памяти компьютера}
i, j:integer; {переменные строк и столбцов}
Begin
Clrscr;
for i:=1 to 9 do {цикл для перебора всех строк}
for j:= 1 to 9 do {перебор всех элементов строки по столбцам}
p[i,j]:= i*j;
Writeln (таблица Пифагора)
for i:=1 to 9 do {выбор строки для печати}
begin
for j:=1 to 9 do {выбор элемента в строке для печати}
write(p[i,j], ‘ ‘); {печать элементов, стоящих в i -й строке матрицы в одной экранной строке}
Writeln {прежде, чем сменить номер строки в матрице, нужно перевести курсор на начало новой
экранной строки}
end;
end.
Пример 2. Задан двумерный массив В(5, 5), заполненный случайными числами из диапазона
[-10,10].
Program massiv;
Uses crt;
Var b: array[1..5, 1..5] of integer; i, j, k :integer;
Begin
Clrscr;
for i:=1 to 5 do
begin
for j:= 1 to 5 do
begin
b [i,j]:= random(20)-10;
write(b[i,j], ‘ ‘);
end;
writeln;
end;
End.
Пример 3. Задан двумерный массив В(5,5), заполненный случайными числами из
[-10,10]. Найти и вывести на экран те элементы массива, которые больше заданного числа k.
Program massiv;
Uses crt;
Var b: array[1..5, 1..5] of integer; i, j, k :integer;
Begin
Clrscr;
for i:=1 to 5 do
begin
for j:= 1 to 5 do
begin
b [i,j]:= random(20)-10;
write(b[i,j], ‘ ‘);
end;
writeln;
end;
write(‘Введите число k’);
readln (k);
For i:=1 to 5 do
For j:=1 to 5 do
If b[i, j] >k then write (b[i, j]);
End.
Пример 4 Найти сумму значений элементов k строки и n столбца
Program massiv;
Uses crt;
Var b: array[1..5, 1..5] of integer;
i, j, k, n, s :integer;
Begin
Clrscr;
for i:=1 to 5 do
begin
for j:= 1 to 5 do
begin
b [i,j]:= random(20)-10;
write('b[',i,j,']=',b[i,j], ' ');
end;
writeln;
end;
write('введите ном строки ==');
readln (k);
write('введите ном столбца ==');
readln (n);
s:=0;
i:=k;
For j:=1 to 5 do
s:=s+b[I,j];
j:=n;
For i:=1 to 5 do
s:=s+b[I,j];
writeln ('сумма ',k,' строки ',n,'столбца=' ,s);
End.
Самостоятельно
1. Посчитать количество положительных значений массива
2. Найти суммы всех столбцов массива
3. Посчитать количество максимальных значений массива
4. Выдать индексы максимальных значений массива
5. Найти сумму чисел расположенных по диагонали
Задача 7. Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и
поменять его местами с элементом главной диагонали.
Program Obmen;
Var N, I, J, Max,Ind, Vsp : Integer;A : Array [1..15, 1..15] Of Integer;
Begin
WRITE('Введите количество элементов в массиве: '); READLN(N);
FOR I := 1 TO N DO
FOR J := 1 TO N DO
Begin
WRITE('A[', I, ',', J, '] '); READLN(A[I, J])
End;
FOR I := 1 TO N DO
Begin
Max := A[I, 1]; Ind := 1;
FOR J := 2 TO N DO
IF A[I, J] > Max THEN
Begin
Max := A[I, J]; Ind := J
End;
Vsp := A[I, I]; A[I, I] := A[I, Ind]; A[I, Ind] := Vsp
End;
FOR I := 1 TO N DO
Begin
WriteLn;
FOR J := 1 TO N Do Write(A[I, J] : 3);
End; WriteLn
End.
Задача 8. Задана прямоугольная целочисленная таблица размером m×n. Указать столбец (назвать его
номер), где минимальное количество элементов, кратных сумме индексов.
type mas2=array[1..20, 1..20] of integer;
{Формирование массива заданного размера с помощью датчика псевдослучайных чисел}
procedure create(var m, n: byte; var a: mas2);
var i, j: byte;
begin
write('Введите размеры таблицы: '); readln(m, n);
for i:=1 to m do
for j:= 1 to n do
a[i, j]:= -20+random(41);
end;
{вывод таблицы на экран}
procedure print(const m, n: byte; const a: mas2);
var i, j: byte;
begin
for i:=1 to m do
begin
writeln;
for j:=1 to n do
write(a[i, j]:5);
end;
writeln
end;
{Поиск нужного столбца; результат - в переменной k и, далее, - значение функции}
function solution(const m, n: byte; const a: mas2): byte;
var i, j, k, ke, mke: byte;
begin
k:=1; mke:=m;
for j:=1 to n do
begin
ke:=0;
for i:=1 to m do
if abs(a[i, j]) mod (i+j) = 0 then ke:=ke+1;
if ke<mke then begin mke:=ke; k:=j end
end;
solution := k;
end;
var m, n: byte; a: mas2;
begin
randomize;
create(m, n, a);
print(m, n, a);
writeln('Ответ: ', solution(m, n, a))
end.
Download