Как составит двухмерный массив

На занятии будет рассмотрен двумерный массив в Pascal и примеры работы с ним. Кроме того, предстоит знакомство с понятиями побочная диагональ матрицы в Паскаль и главная диагональ

Содержание:

  • Двумерный массив в Pascal
  • Описание, ввод и вывод элементов двумерного массива
  • Главная и побочная диагональ при работе с двумерными матрицами в Pascal

Матрица или двумерный массив – это прямоугольная таблица чисел (или других элементов одного типа). Каждый элемент матрицы имеет два индекса (номер строки и номер столбца).

матрица

Исходные данные для решения многих задач можно представить в табличной форме:
двумерный массив Pascal
Таблица результатов производственной деятельности нескольких филиалов фирмы может быть представлена так:

zavod1: array [1..4] of integer;
zavod2: array [1..4] of integer; 
zavod3: array [1..4] of integer;

Или в виде двумерного массива так:

Объявление двумерного массива:

var A: array[1..3,1..4] of integer;
begin
{...}
begin
  var  a := new integer[3,4];
  {...}
end.

Описание, ввод и вывод элементов двумерного массива

Варианты описания двумерного массива (традиционный pascal)

  1. Описание массива в разделе переменных:
  2. const N = 3;
          M = 4;
    var A: array[1..N,1..M] of integer;
  3. Описание массива через раздел type:
  4. const
      M=10;
      N=5;
    type
      matrix=array [1..M, 1..N] of integer;
    var A: matrix;

Ввод двумерного массива m x n с клавиатуры:

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

for i:=1 to N do
  for j:=1 to M do begin
    write('A[',i,',',j,']=');
    read ( A[i,j] );
  end;

for var i:=0 to a.RowCount-1 do
  for var j:=0 to a.ColCount-1 do
     a[i,j]:=readinteger;

Заполнение случайными числами:

заполнение случайными числами


var a := MatrRandomInteger(3,4,0,10); // целые числа в диапазоне от 0 до 10
var a1 := MatrRandomReal(3,4,1,9) // веществ. числа в диапазоне от 1 до 9

«Красивый» вывод элементов двумерного массива m x n:

Следующий фрагмент программы выводит на экран значения элементов массива по строкам:
вывод двумерного массива

1
2
3
4
5
for i:=1 to N do begin
  for j:=1 to M do
     write ( A[i,j]:5 );
  writeln;
end;

1
2
3
4
5
6
begin
  var a := MatrRandomInteger(3,4,0,10);
  var a1 := MatrRandomReal(3,4,1,9);
  a.Println;
  a1.Println(6,1) // 6 позиций всего на вывод, 1 знак после десят. запятой
end.

Результат:

   8   2   1   3
   5   8   0   8
   6   3   9   3
   3.3   4.7   3.7   5.4
   2.9   1.7   2.3   4.0
   8.3   3.7   8.4   1.4

Рассмотрим следующую задачу: Получены значения температуры воздуха за 4 дня с трех метеостанций, расположенных в разных регионах страны:

Номер станции 1-й день 2-й день 3-й день 4-й день
1 -8 -14 -19 -18
2 25 28 26 20
3 11 18 20 25

Т.е. запись показаний в двумерном массиве выглядела бы так:

t[1,1]:=-8; t[1,2]:=-14; t[1,3]:=-19; t[1,4]:=-18;
t[2,1]:=25; t[2,2]:=28; t[2,3]:=26; t[2,4]:=20;
t[3,1]:=11; t[3,2]:=18; t[3,3]:=20; t[3,4]:=25;

Или в pascalabc.NET:

var t := Matr(3,4,-8,-14,-19,-18,25,28,26,20,11,18,20,25);  
t.Println;

Объявление двумерного массива:

var t: array [1..3, 1..4] of integer;

Задание array 1: Необходимо:

  1. Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.
  2. Распечатать показания термометров всех метеостанций за 2-й день.
  3. Определить среднюю температуру на 3-й метеостанции.
  4. Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла.

Дополните код:

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var t: array [1..3, 1..4] of integer;
s,i,j:integer;
begin
t[1,1]:=-8; 	t[1,2]:=-14; 	t[1,3]:=-19; 	t[1,4]:=-18;
t[2,1]:=25; 	t[2,2]:=28; 	t[2,3]:=26; 	t[2,4]:=20;
t[3,1]:=11; 	t[3,2]:=18; 	t[3,3]:=20; 	t[3,4]:=25;
{1. Распечатать показания термометров на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день}
writeln('1-е задание: ',t[2,4] , ' и ',t[...,...]);
 
{2. Показания термометров всех метеостанций за 2-й день}
for i:=1 to ... do 
   writeln ('2-е задание: ',t[...,...]);
 
{3. Определим среднее значение температуры на 3-й метеостанции:}
i:=3;
s:=0;
for j:=1 to 4 do 
   s:=...; {сумматор}
writeln('3-е задание: ', s/4);
{распечатаем всю таблицу}
for i:=1 to 3 do
    for j:=1 to 4 do
        writeln(t[i,j]);
{4. Распечатаем станции и дни с температурой 24-26 гр}
writeln('4-е задание: ');
for i:=1 to 3 do
    for ... ... do
        if (...) and (...) then
           writeln('станция ', i, ' день ', j)
end.

Самостоятельно подумайте, как находится сумма элементов массива pascal.

Задание array 2. Найти сумму элементов массива (прямоугольной таблицы) размером [m x n]

Задание array 4.
Найти сумму всех элементов массива (переменная sum) 5 x 4, а также сумму элементов, составляющих столбцы таблицы (двумерного массива). Для хранения сумм столбцов чисел использовать одномерный массив (s). Дополните код.
двумерный массив в pascal

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const  m = 5;
       n = 4;
var
    a: array[1..m,1..n] of byte;
    s: array[1..n] of byte;
    i,j, sum: byte;
begin
    randomize;
    for i := 1 to m do begin
        for j := 1 to n do begin
            ... {инициализация элементов массива случайными числами}
            ... {вывод элементов массива}
        end;
        writeln
    end;
    writeln ('------------'); {для оформления}
    {обнуление значений массива суммы s[]:}
    ...
    {поиск сумм элементов по столбцам:}
    for i := 1 to n do begin
         for j := 1 to m do begin
           s[i]:=...;
        end;
     write(...)  ; 
    end;
    {поиск общей суммы:}
    sum:=0;
    ...
    {вычисление суммы элементов массива значений сумм по столбцам:}
    for ...
        ...
    write (' | sum = ', sum);
readln
end.

Задание array 4_1.
Найти сумму элементов двумерного массива [m x n] по строкам:

2 8 1 9  : sum = 20
3 1 7 2  : sum = 13
4 5 6 2  : sum = 17

Методы матриц для работы со строками и столбцами:

begin
  var a := MatrRandomInteger(3,4);  
  a.Println;
 
  a.Row(0).Sum.Println();
  a.Row(1).Average.Println;
  a.Row(2).Product.Println;
 
  a.Col(0).Min.Println;
  a.Col(1).Max.Println;
end.

Результат:

  86  62  80  33
  51   4  36  65
  78  30   5  16
261 
39 
187200 
51 
62 

Главная и побочная диагональ при работе с двумерными матрицами в Pascal

Главная диагональ квадратной матрицы n x n (т.е. той, у которой количество строк равно количеству столбцов) проходит с верхнего левого угла матрицы (элемент 1,1) до правого нижнего угла матрицы (элемент n,n).

Побочная диагональ квадратной матрицы n x n проходит с нижнего левого угла матрицы (элемент n,1) до правого верхнего угла матрицы (элемент 1,n).

Формулу поиска элементов диагоналей проще всего искать, нарисовав элементы матрицы:
Если индексы начинаются с единицы (традиционный Паскаль):

1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4

Если индексы начинаются с нуля (pascalAbc.NET):

0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
3,0 3,1 3,2 3,3

 
Учитывая, что первая цифра в программе будет соответствовать счетчику i, а вторая — счетчику j, то из таблицы можно вывести формулы:

Главная диагональ матрицы в Паскаль имеет формулу:
i=j
Побочная диагональ матрицы в Паскале традиционном имеет формулу:
n=i+j-1 (или j=n-i+1)

где n — размерность квадратной матрицы

Побочная диагональ матрицы в pascalAbc.Net имеет формулу:
n=i+j+1

где n — размерность квадратной матрицы

Пример: Вывести на экран сначала главную диагональ квадратной матрицы из N строк и N столбцов, а затем ее побочную диагональ.

Решение:
Вывод элементов главной диагонали
Вывод элементов побочной диагонали

Пример: Заменить элементы главной и побочной диагонали квадратной матрицы нулями

Показать решение:

Паскаль:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var i,j,n:integer;
a: array[1..100,1..100]of integer;
begin
   randomize;
   writeln ('введите размерность матрицы:');
   readln(n);
   for i:=1 to n do begin
        for j:=1 to n do  begin
            a[i,j]:=random(10);
            write(a[i,j]:3);
        end;
        writeln;
   end;
   writeln;
   for i:=1 to n do begin
        for j:=1 to n do  begin
            if (i=j) or (n=i+j-1) then a[i,j]:=0;
            write(a[i,j]:3)
        end;
        writeln;
   end;
end.

PascalAbc.Net

1
2
3
4
5
6
7
8
9
10
11
12
begin
  var n := readinteger('введите размерность матрицы:');
  var a := matrRandomInteger(n, n, -10, 10);
  a.Println(6);
  for var i := 0 to n - 1 do
  begin
    a[i, i] := 0;
    a[i, n - i - 1] := 0;
  end;
  writeln();
  a.Println(6);
end.

Задание array 5:
Найти отдельно сумму элементов главной и побочной диагонали квадратной матрицы

1 7 3 7
2 1 8 3
5 7 6 4
8 2 3 1
-------
sum1 = 9
sum2 = 30

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

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var
A:array[1..5,1..5] of integer;
i,j:integer;
sum,sum1,sum2:integer;
begin
randomize;
for i:=1 to 5 do
for j:=1 to 5 do
    A[i,j]:=random(10);
write ('Исходный массив A: ');
for i:=1 to 5 do begin
    writeln;
    for j:=1 to 5 do
        write (A[i,j]:2,' ');
    end;
sum1:=0;
for i:=1 to 5 do
    for j:=1 to 5 do
        if (i-j=1) then
            sum1:=sum1+A[i,j];
sum2:=0;
for i:=1 to 5 do
    for j:=1 to 5 do
        if (j-i=1) then
           sum2:=sum2+A[i,j];
sum:=sum1+sum2;
writeln;
writeln('Сумма = ',sum);
end.

Задание array 6: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
главная и побочная диагональ матрицы паскаль

Задание array 7: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
главная и побочная диагональ матрицы паскальдиагонали матрицы Паскаль

Задание array 8: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
диагонали матрицы Паскаль
главная и побочная диагональ матрицы паскаль

Задание array 9: Составить программу, позволяющую с помощью датчика случайных чисел сформировать матрицу размерностью N. Определить:

  • минимальный элемент, лежащий ниже побочной диагонали;
  • произведение ненулевых элементов последней строки.
  • Рассмотрим еще один пример работы с двумерным массивом.

    Пример: В двумерном массиве размером N х M определить среднее значение элементов. Найти индекс элемента массива, наиболее близкого к среднему значению.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    var index1,index2,i,j,N,M:integer;
    s,min,f:real;
    a:array[1..300,1..300] of real;
    begin
    N:=10;
    M:=5;
    for i:=1 to N do begin
      for j:=1 to M do begin
        a[i,j]:=random(20);
        s:=s+a[i,j];
        write(a[i,j]:3);
       end;
       writeln;
    end;
     
    f:=s/(N*M);
    writeln('srednee znachenie ',f);
    min:=abs(a[1,1]-f);
    for i:=1 to N do begin
      for j:=1 to M do begin
        if abs(a[i,j]-f)<min then begin
          min:=abs(a[i,j]-f);
          index1:=i;
          index2:=j;
        end;
      end;
    end;
    writeln('naibolee blizkiy ',index1,' ',index2);
    end.

    Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

    проверь себя

    Просмотров 8.4к. Обновлено 23 ноября 2020

    Двумерный массив в Паскале представляет собой таблицу, состоящую из нескольких одномерных массивов. Двумерные массивы Pascal называют матрицей. Положение элементов в матрице обозначается двумя индексами.

    Рассмотрим матрицу 3*3, то есть она будет состоять из 3 строк и 3 столбцов:

    двухмерный массив paskal

    Каждый элемент обладает 2-мя индексами. Первый —  номер строки, в котором располагается элемент, а второй – номер столбца. Следовательно, индекс элемента определяется местом пересечением столбца и строки . Например, a13 – это элемент, стоящий в первой строке и в третьем столбце массива.

    Содержание

    1. Описание двумерного массива Паскаля.
    2. Основные действия с двумерными массивами Паскаля
    3. Ввод двумерного массива Паскаля.
    4. Вывод двумерного массива Паскаля на экран.
    5. Представление двумерного массива Паскаля в памяти
    6. Какой размер памяти выделяется для массива?
    7. Решим задачу с двумерным массивом Паскаля.

    Описание двумерного массива Паскаля.

    Имеется ряд методов объявления двумерного массива.

    Рассмотри способ, в котором указывается тип элемента и переменные.

    Type
    Vector = array [1..9] of <тип элементов>;
    Matrix= array [1..4] of vector;
    Var mas: matrix;

    В данном варианте матрица mas состоит из 4 строк, в каждой из которых 9 столбцов. При этом мы можем обратиться к любой i -й строке через mas [ i ], а к j -му элементу внутри i строки – m [ i , j ].

    Во втором и третьем способе матрицу можно задать в одну строку.

    Type
    Matrix= array [1..4] of array [1..9] of < тип элементов >;
    или еще проще:
    type
    matrix = array [1..4, 1..9] of <тип элементов>;

    Как и в предыдущем варианте, матрица имеет 4 строки и 9 столбцов, обращение к какому-либо элементу массива имеет вид: mas [ i , j ]. Значит, что элемент, расположен в i -й строке и j -м столбце. Важно не перепутать строки со столбцами, иначе произойдет ошибка в ответе.

    Основные действия с двумерными массивами Паскаля

    Все основные действия над матрицами выполняются поэлементно, причем типы данных элементов должны быть одинаковыми. То есть, если матрица состоит из чисел, то действия можно выполнять только с числами. Однако для реализации операции присваивания массивам достаточно быть одного размера. Например, дан массив

    type
    matrix= array [1..4, 1..9] of integer;
    var
       a , b : matrix ;

    в ходе выполнения такой программы матрице а можно присвоить значения матрицы b ( a := b ).

    Ввод двумерного массива Паскаля.

    Для поочередного ввода элементов в матрицу необходимо перебрать элементы с 1-го столбца 1-ой строки до последнего столбца последней строки. Для этого используется два оператора цикла for, причем один вложен в другой.

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

    type
       matrix= array [1..4, 1..9] of integer;
    var
       a, : matrix;
       i, j: integer; { индексы массива }
    begin
       for i :=1 to 4 do {цикл перебора всех строк}
          for j :=1 to 9 do {цикл перебора элементов строки по столбцам}
             readln ( a [ i , j ]); {ввод с клавиатуры элемента, стоящего в i -й строке и j -м столбце}

    Способ заполнения двумерного массива Паскаля зависит от поставленной задачи. Например, функцию random (N) позволяет заполнять матрицу случайными величинами a[i,j]:=random(25)-10. Некоторые задачи требуют содержание выражений в матрице. Не забывайте, что в любом случае должен быть определен каждый элемент в каждых строках и столбцах.

    Вывод двумерного массива Паскаля на экран.

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

    for i :=1 to 4 do {цикл перебора всех строк}
    begin
       for j :=1 to 9 do {цикл перебора всех элементов строки по столбцам}
          write ( a [ i , j ]:3); {печать элементов, стоящих в i -й строке матрицы в одной экранной строке, при этом для вывода каждого элемента отводится 3 позиции}
       writeln ; 
    end ;

    Примечание! Использовать операторы readln ( a [ i , j ]), writeln именно в таком виде, в противном случае компилятор не сможет считать и напечатать элемент. Ввод в программу операторов в таком виде readln (a), writeln (a) не допустим, так как а – это переменная типа массив.

    Представление двумерного массива Паскаля в памяти

    В памяти ЭВМ элементы двумерного массива располагаются последовательно и занимают несколько байт. Например, элементы массива типа integer, будут занимать по 2 байта. А весь массив займет S^2 байта, где S – количество элементов в массиве.

    В матрице для каждого элемента типа integer потребуется 2 байта памяти. Рассмотрим пример.

    Matrix = array [1..4, 1..3] of integer ;

    В данном случае необходимо 24 байт памяти.

    Модель размещения массива M типа matrix в памяти.

    массив Паскаля в памяти

    Для  любого элемента предоставляется две ячейки памяти, размещение осуществляется от первой строки до нижней, в порядке изменения индекса.

    Между переменной и адресом ячейки устанавливается соответствие, однако, при объявлении матрицы программе известно только адрес начала массива, к остальным элементам адрес вычисляется по формуле:

    Addres + SizeElemt * sum *( I -1)+ SizeElem *( J -1),

    где Addres – местоположение первого элемента, выделенного для массива; I , J – индексы элемента в двумерном массиве; SizeElemt – размер элемента массива (например, 2 байта для элементов типа integer ); sum – количество элементов в строке.

    SizeElemt * sum *( I -1)+ SizeElemt *( J -1) — смещение относительно начала массива.

    Какой размер памяти выделяется для массива?

    Чтобы программа работала нормально, компьютер выделят память сегментами по 64 Кбайт. Один из сегментов отводится для данных, которые обрабатываются программой. Для каждой переменной отводится свой сегмент. Например, если переменная состоит из массива, то он не сможет занимать места больше, чем 65536 байт. Естественно, кроме массива в сегменте могут находится и другие переменные, поэтому объем памяти вычисляется по формуле 65536- S , где S – размер памяти, ранее отведенные под другие переменные.

    Рассмотрим пример, в котором:

    Type myArray= array [1..50000] of integer;

    С точки зрения синтаксиса запись верная, но компилятор выдаст ошибку об объявлении слишком длинного массива.

    Можно без труда подсчитать количество элементов, которые допустимы по формуле: 65536/2 –1=32767. Однако, других переменных не должно быть. Матрицы обладают еще меньшими пределами индексов.

    Решим задачу с двумерным массивом Паскаля.

    Задача: Вычислить  произведение ненулевых элементов матрицы.

    Решение:

    • Для начала нужно установить переменные: матрицу, состоящую из целочисленных элементов; P – произведение элементов, не равное 0; I , J – индексы массива; N , M – количество строк и столбцов в матрице.
    • Входные данные N , M пусть вводятся с клавиатуры, а матрица зададим с помощью функции random ().
    • Выходными параметром получим P (произведение).
    • Выведем матрицу на экран, для проверки работы программы.

    А теперь поговорим о процедурах.

    Примечание! Тип массива должен быть определен заранее. Например:

    Type
    Matrix=array [1..10, 1..10] of integer;
    ..............................
    procedure primer (a: matrix);
    ..............................

    Для того чтобы вводимая матрица была передана в программу как результат следует воспользоваться процедурой vvod , В таком случае матрица будет передаваться по ссылке. В таком случае процедура выглядит следующее:

    Procedure vvod ( var m : matrix );

    Print – процедуры вывода на экран матрицы, которая передается по значению.

    Procedure print ( m : matrix );

    Для реализации вложенных циклов внутри процедуры нужно ввести счетчики – k и h . Алгоритм вывода матрицы на экран был описан выше, используем это описанием.

    Итак, опишем ход выполнения программы.

    • Ввод значений N и M ;
    • Обращаемся к процедурам vvod ( a ) и print ( a ) для ввода и вывода матрицы соответственно, где а – матрица;
    • Переменной, которая отвечает за произведение P, присвоим значение 1;
    • Поочередно перебираем элементы матрицы с индексом 11 до элемента с индексом Каждый элемент матрицы должен удовлетворять условию: если a ij ? 0, то произведение P умножаем на элемент a ij ( P = P * a ij );
    • Выводим на экран результат произведения ненулевых элементов матрицы – P
    Program proizvedenie;
    Type
       Matrix=array [1..10, 1..10] of integer;
    Var
       a: matrix;
       n, m, i, j: byte;
       P: integer;
    Procedure vvod (var m: matrix);
    Var k , h : byte ;
    Begin
       For i :=1 to n do 
          For j :=1 to m do 
             M[i,j]:= random(10);
    End;
    Procedure print (m: matrix);
    Var k, h: byte;
    Begin
       For i:=1 to n do
       begin
          For j:=1 to m do
             Write (M[i, j]: 4);
          Writeln;
       end ;
    End ;
    Begin {начало основной программы}
       Writeln ('Введите размерность матрицы:');
       Readln(N, M);
       Vvod(a);
       Print(a);
       P:=1;
       For i:=1 to N do
          For j:=1 to M do
             If a[i, j]<>0 then p:=p*a[i, j];
       Writeln ( p );
    End .

    Добрый день друзья.

    Сегодня затронем новую тему. Двумерные массивы. Или их еще
    называют матрицы.   

    Прочитайте улучшенную версию этого урока «Двумерные массивы».

    В новой версии:

    • Ещё более доступное объяснение
    • Дополнительные материалы
    • 10 задач на программирование с автоматической проверкой решения

    Что такое двумерный массив?

    Двумерный массив это прямоугольная таблица с определенным
    количеством строк и столбиков.  Каждая
    строка и каждый столбик имеют свой порядковый номер. На рисунке изображен
    двумерный массив, который имеет 6 строк и 7 столбцов.

    Рис.1. Двумерный массив. Общий вид.

    Обратите внимание, что столбцы и строки нумеруются, начиная
    с нуля, как и в одномерных массивах.

    Сразу же покажу, как объявить двумерный массив. В сущности,
    ничего нового. Синтаксис прост и очень похож на объявление обычного массива и
    любой другой переменной.  Сначала
    указываем тип данных, затем имя массива, а после в квадратных скобках его
    размерность, то есть количество строк и количество столбиков.  На рисунке ниже мы объявили двумерный массив
    размерностью 6 на 7.

    Рис.2 Двумерный массив, объявление.

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

    Кстати, нельзя путать местами строки и столбики. Сначала
    записывается количество строк, потом количество столбиков.

    Следующий естественный вопрос:

    Как работать с двумерным массивом?

    Как и другие переменные, двумерные массивы мы можем
    инициализировать  при их объявлении. Для
    этого нам нужно указать все элементы массива. Делается это следующим образом.

    Листинг 19.1

    int arr [2][4]
    = {{1,2,4,29},{3,4,6,1}};

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

    Рис.3. Двумерный массив инициализированный при объявлении

    Кроме того, мы можем задать только некоторые элементы
    массива, тогда остальные будут заполнены нулями. Например:

    Листинг 19.2

    int arr [2][4]
    = {{1,2,4},{3,4}};

    При таком объявлении мы получим массив, который изображен на
    следующем рисунке.

    Рис.4. Двумерный массив, инициализированный не полностью.

    Понятно, что если у нас будет большой массив, то мы
    замучаемся так все записывать. Да и редко такое бывает нужно.  

    Как работать с отдельным элементом
    массива.

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

    Рис.5. Обращение к элементу двумерного массива.

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

    Помните, когда мы хотели пройтись по всему одномерному
    массиву, мы использовали цикл for,
    который изменял наш индекс. Так как в двумерном массиве у нас два индекса (
    один для строки и один для столбца), то для того, чтобы пройтись по всему
    массиву нам потребуется два вложенных цикла for. Разберите следующий пример. 

    Листинг
    19.3

    #include <stdio.h> 

    int main (){ 

          int arr [2][4] = {{1,2,4},{3,4}}; 

          for (int i=0; i<2;
    i++){ // 1
    цикл
     

                for (int j=0; j<4;
    j++) // 2
    цикл
     

                      printf(«%dt»,arr[i][j]); 

                printf(«n»); 

          } 

    return 0; 

    }  

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

    Рис.6. Двумерный массив. Поэлементный вывод на экран.

    Как  работает
    вложенный цикл, вам уже должно быть понятно.

    Сначала переменной i присваивается значение нуль,
    проверяется условие 0<2, и так как оно выполняется, программа начинает
    выполнять тело первого цикла. В теле первого цикла программа опять попадает в
    цикл, теперь уже второй. Переменной j присваивается значение 0 и проверяется
    условие 0<4. Оно истинно, поэтому выполняется тело второго цикла. Оно состоит
    из одной инструкции вывода на экран элемента arr[i][j]. Так как на данном шаге у
    нас i=0 j=0, то выводится значение элемент
    из нулевой строки и нулевого столбика. В нашем примере это элемент число 1.
    Тело второго цикла закончилось, происходит увеличение j на единицу j=1.

    Проверка условия 1<4. Выполнение тела второго цикла:
    вывод на экран элемента arr[0][1]
    в нашем случае это 2. И так далее …

    Используя вложенные циклы, мы можем и заполнять двумерные
    массивы.  

    Зачем нужны двумерные массивы?

    Двумерные массивы используются для хранения данных одинакового
    типа и одинаковой структуры. Приведу пример. В одном из практических заданий к
    прошлым урокам,  необходимо было
    составить программу, которая хранила оценки ученика по разным предметам. Для их
    хранения в памяти компьютера мы использовали несколько одномерных массивов. Это
    было не очень удобно. Для этих же целей, мы могли использовать двумерный
    массив. Например, нам нужно хранить оценки ученика по русскому, математике,
    физике и информатике, за целый месяц. Для этого мы создадим массив с 4 строками
    и 30 столбиками (или наоборот, 30 строк и 4 столбика, кому как больше нравится),
    и в каждую отдельную строчку будем записывать оценки по какому либо предмету. Это
    гораздо удобнее и практичнее.

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

    Но это еще не всё. Представьте, что вы хотите добавить один
    предмет и снова посчитать среднюю арифметическую оценку для всех предметов.   Сколько мороки будет, если вы храните оценки
    в одномерных массивах. Вам придется кучу изменений вносить, дописывать еще один
    цикл (а вдруг добавилось 7 предметов?). Потом еще среднее искать между этими цифрами.

    Другое дело если вы храните оценки в двумерном массиве. Всего
    лишь изменить условие в одном из циклов. Поменять одно число, представляете как
    удобно?

    Напишите в комментариях пожалуйста, понятен ли вам этот пример, или лучше его подробно расписать?

    Если этот материал кажется вам полезным, расскажите о нем друзьям используя кнопки основных социальных сетей, расположенные ниже.

    Практическое задание.

    Напишите программу, работающую следующим образом. Создайте массив 10 на 10. Заполните его нулями. Считайте два произвольных целых числа с клавиатуры, меньших либо равных 10. Первое число количество строк, второе — количество столбцов.  Напишите функцию, которая заполняет массив по спирали и выводит его на экран. Т.е. если бы мы ввели 6 и 7, то получили бы следующий массив.

    При этом табличка  приблизительно должна быть выровнена по центру окна вывода.

    Готовое решение пользователя с ником «Дмитрий». За проявленное упорство и трудолюбие, и как первый выполнивший правильно практическое задание, Дмитрий награждается печенькой:

    Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в Pascal. Матрица – это математический объект, представляющий собой прямоугольную таблицу. Таблица состоит из элементов, которые находятся на пересечении строк и столбцов, определяющих их, то есть i-ая строка и j-ый столбец задают адрес k-ому элементу матрицы (kij). Двумерные массивы абсолютно аналогичны математическим матрицам.

    В отличие от одномерных массивов, двумерные характеризуются в программе парой индексов, один из которых соответствует номеру строки, другой – столбца:

    Mas[m, n], где Mas – имя массива, n – номер строки, а m – номер столбца.

    Описать матрицу в программе можно несколькими способами:

    1) В разделе описания переменных:

    Var Mas: Array[1..n, 1..m] of <тип элементов>;

    2) При помощи одномерного массива, элементами которого являются одномерные массивы.
    Пример:

    Const
    n = 5; m = 10;
    Type
    Arr1 = Array[1..m] of <тип элементов >;
    Arr2 = Array[1..n] of arr1;
    Var Mas: arr2;

    Переменная Mas – матрица, состоящая из пяти строк, в каждую из которых включено по десять элементов.

    3) Предыдущий способ можно упростить так:

    Const n = 5; m = 10;
    Турe arr=Array[1..n] Of Аrrау[1..m] of <тип элементов>;
    Var Mas: arr;

    4) И снова сократив запись, получим:

    Const n = 5; m = 10;
    Type arr = Array[1..n,1..m] of <тип элементов>;
    Var Mas: arr;

    Для обработки содержимого матрицы, удобно пользоваться вложенными циклами:

    For i:= 1 To n Do
      For j:= 1 To m Do

    Например, для заполнения массива случайнми числами:

    for i:=1 to n do
      for j:=1 to n do 
        x[i,j]:=random(100); 

    Для вывода двумерного массива вещественных чисел размером n строк, m столбцов:

    for i:=1 to n do begin
      for j:=1 to m do 
        write(x[i,j]:5:2);
      writeln;
    end;

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

    program input_and_output_array;
    uses crt;
    const n=3; m=3;
    var i, j: integer;
    mas: array[1..n, 1..m] of integer;
    begin
      {ввод массива}
      for i:=1 to n do
        for j:=1 to m do
        begin
          write(' Элемент ', i,' строки, ',j,' столбца = ');
          readln(mas[i, j]);
        end;
      writeln(' Получившаяся матрица: ');
      {вывод массива}
      for i:=1 to n do
      begin
        for j:=1 to m do
        begin
          write(mas[i, j]:5);
        end;
      writeln
      end;
    end.

    Количество элементов в массиве (его размерность) можно узнать, умножив количество строк на количество столбцов.

    Сумма всех элементов квадратной матрицы:

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum); 

    Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы -x[1,1], x[2,2] и т.д.):

    sum:=0;
    
    for i:=1 to n do 
      sum:=sum+x[i,i];
    
    writeln('Сумма=',sum);

    Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны n+1, т.е. i+j=n+1 или j=n+1-i:

    sum:=0;
    
    for i:=1 to n do 
      sum:=sum+x[i,n+1-i];
    
    writeln('Сумма=',sum);

    Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже):

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        if i>j then 
          sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Можно не просматривать весь массив, а брать только нужные элементы:

    sum:=0;
    
    for i:=2 to n do
      for j:=1 to i-1 do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Сумма элементов выше и на главной диагонали квадратной матрицы:

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do
        if i<=j then 
          sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Здесь также можно не просматривать весь массив, а брать только нужные элементы:

    sum:=0;
    
    for i:=1 to n do
      for j:=i to n do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже) :

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do
        if i+j>n+1 then 
          sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Можно не просматривать весь массив, а брать только нужные элементы:

    sum:=0;
    
    for i:=2 to n do
      for j:=n+2-i to n do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Если надо посчитать сумму элемсентов ниже побочной диагонали и на ней, то в предыдущем примере, при просмотре всего массива в предыдущем примере надо заменить знак отношения > на >=, а при просмотре толко нужных элементов применить такой код:

    sum:=0;
    
    for i:=1 to n do
      for j:=n+1-i to n do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали возможно применине такого кода:

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do
        if (i<=j) and (i+j<=n+1) then
          sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Подсчет сумм элементов по строкам:

    for i:=1 to n do begin
      sum:=0;
    
      for j:=1 to n do 
        sum:=sum+x[i,j];
    
      writeln('Сумма ',i,'-й строки',sum);
    end;

    Подсчет сумм элементов по столбцам:

    for j:=1 to n do begin
      sum:=0;
    
      for i:=1 to n do 
        sum:=sum+x[i,j];
    
      writeln('Сумма ',j,'-го столбца ',sum);
    end;

    Безусловно суммы по строкам и столбцам можно записывать в одномерный массив. Например, для сумм по столбцам:

    for i:=1 to n do 
      sum[j]:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        zum[j]:=sum[j]+x[i,j];
    
    {вывод сумм по столбцам}
    for i:=1 to n do 
      write(sum[i]:4);
    writeln; 

    Суммы элементов по диагоналям, параллельным главной диагонали.

    Очевидно, что таких сумм будет 2n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду разность «номер строки минус номер столбца». Эти разности будут меняться от -n+1 для самой верхней диагонали s1, содержащей всего лишь один элемент, до n-1 для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив:

    Var sum:array[-n+1..n-1] of integer;

    Число элементов в этом массиве будет 2n-1. Код для подсчета этих сумм:

    for i:=-n+1 to n-1 do 
      sum[i]:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        sum[i-j]:=sum[i-j]+x[i,j];
    
    for i:=-n+1 to n-1 do 
      write(sum[i]); 

    Суммы элементов по диагоналям, параллельным побочной диагонали.

    for i:=2 to 2*n do 
      sum[i]:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        sum[i+j]:=sum[i+j]+x[i,j];
    
    for i:=2 to 2*n do 
      write(sum[i]);

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

    Cледует различать четный или нечетный порядок матрицы n. Число сумм будет равно k=n div 2 при четном n и k=n div 2 +1 при нечетном значении n.

    Счет суммы начинается по строке i от столбца j равного i и заканчивается столбцом n-i+1, т.е. начинается с элемена находящегося на главной диагонали и заканчивается элементом на побочной диагонали.

    Одновременно учитываются элементы из параллельной строки, индекс которой равен n-i+1.

    Затем считаем элементы по двум паралельным столбцам i и n-i+1 (не учитывая элементы, стоящие в строках). Если n -нечетное число, то выводим значение центрального элемента массива x[k+1,k+1].

    k:=n div 2;
    
    for i:=1 to k do begin
      sum:=0;
    
      {строки}
      for j:=i to n-i+1 do
        sum:=sum+x[i,j]+x[n-i+1,j];
    
      {столбцы}
      for j:=i+1 to n-i do
        sum:=sum+x[j,i]+x[j,n-i+1];
    
      writeln(sum); {вывод суммы}
    end;
    
    if n mod 2=1 then
      writeln(x[k+1,k+1]); 

    Содержание

    1. Двумерные массивы
    2. Главная и побочная диагонали матрицы
    3. Пример двумерного массива
    4. Заполнение и вывод на экран
    5. Сумма элементов двумерного массива
    6. Задачи с решением

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

    Двумерный массив является разновидностью многомерных. Визуально двумерный массив можно представить в виде таблицы. Положение элемента задается двумя индексами:

    • i — порядковый номер строки
    • — порядковый номер столбца

    В качестве примера на рисунке ниже приведен двумерный массив из целых чисел размером 5 на 5 элементов. Его называют квадратным или матрицей. В прямоугольном — количество строк и столбцов отличаются.

    двумерный массив паскаль

    Описание двумерного массива на Паскале отличается от одномерного только добавлением второй размерности в квадратных скобках.

    Главная и побочная диагонали матрицы

    Большое количество задач на обработку связано с элементами главной и побочной диагонали. Они обладают особыми свойствами.

    Посмотрите на рисунок ниже. Элементы главной диагонали располагаются в ячейках оранжевого цвета. Главный признак, по которому можно их идентифицировать — значения индексов одинаковы.

    главная и побочная диагональ - двумерный массив

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

    Пример двумерного массива

    Заполнение и вывод на экран

    Рассмотрим  пример программы на паскале. Заполнение будем проводить случайными числами, так как ручной ввод для отладки программы на Паскале не удобен.

    План действий:

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

    Текст программы

    var i,j:integer;
    a: array [1..5,1..5]of integer;
    begin
      {заполнение случайными числами}
    for i:=1 to 5 do 
      for j:=1 to 5 do
          a[i,j]:=random(10);
     {вывод на экран} 
    for i:=1 to 5 do 
      begin
      for j:=1 to 5 do
          write(a[i,j]:3);
          writeln;
      end;
    end.

    Второй вариант немного короче. Отличается от первого тем, что заполнение и вывод проходит в одном цикле. Можно использовать в качестве шаблона для решения однотипных задач на Паскаль.

    const n=5; m=5;
    var 
    i,j:integer;
    a: array [1..n,1..m] of integer;
    begin
      {заполнение случайными числами и вывод на экран}
    for i:=1 to n do 
      begin
      for j:=1 to m do 
        begin
          a[i,j]:=random(10);
          write(a[i,j]:3);
        end;
          writeln;
      end;
    {здесь будет код обработки по условию задачи}
    end.

    При составлении программ, этот код будет присутствовать практически в каждой задаче. Здесь происходит подготовка исходного массива, заданного случайными числами.

    двумерный массив паскаль

    Результат работы программы

    Обработка элементов по условию задачи будет различаться и записываться в продолжении указанного выше текста программы на Паскаль. После обработки следует код вывода результата работы программы.

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

    Запишем код обработки элементов, который вычислит их сумму.

    Для правильной работы программы на Паскале, необходимо в раздел описания переменных добавить переменную для вычисления суммы S.

    Код обработки и вывода результата. Его нужно добавить в текст программы на Паскаль, указанной выше.

    s:=0;
      for i:=1 to 5 do 
      for j:=1 to 5 do 
          s:=s+a[i,j];
      write('Сумма элементов = ',s);

    Задачи с решением

    Задача 1. Вычислить сумму и количество положительных элементов целочисленного массива A[1..n,1..n], находящихся над главной диагональю.

    Посмотреть решение

    Решение: В этом примере размер матрицы задается через константу, что удобно использовать при отладке программы. Постоянные величины в Паскаль записывают перед разделом Var.

    const n=4;
    var i,j,s,k:integer;
    a: array [1..n,1..n]of integer; 
    begin 
    {заполнение случайными числами и вывод на экран} 
    for i:=1 to n do 
      begin 
      for j:=1 to n do 
        begin a[i,j]:=random(10); 
        write(a[i,j]:3); 
        end; writeln; 
      end; 
      {код обработки по условию задачи} 
      s:=0;k:=0;
      for i:=1 to n do 
      begin 
      for j:=i+1 to n do 
        begin 
          s:=s+a[i,j];
          k:=k+1; 
        end;  
      end; 
      writeln('Сумма элементов = ',s);
      write('Количество элементов = ',k);
    end.

    Задача 2. Задана квадратная матрица. Получить транспонированную матрицу (перевернутую относительно главной диагонали).

    Посмотреть решение

    Решение:

    const n=5;
    var i,j:integer;
    a,b: array [1..n,1..n]of integer; 
    begin 
    {заполнение случайными числами и вывод на экран}
    writeln('Исходная матрица'); 
    for i:=1 to n do 
      begin 
      for j:=1 to n do 
        begin a[i,j]:=random(10); 
        write(a[i,j]:3); 
        end; writeln; 
      end; 
      {код обработки по условию задачи} 
      for i:=1 to n do 
      for j:=1 to n do   
          b[i,j]:=a[j,i];
      writeln('Транспонированная матрица');
      for i:=1 to n do 
      begin 
      for j:=1 to n do 
        begin  
        write(b[i,j]:3); 
        end; writeln; 
      end;  
    end.

    Понравилась статья? Поделить с друзьями:
  • Как исправить формулы в word
  • Как составить жалобу в прокуратуру на бездействие сотрудников полиции образец
  • Как найти редиректы на сайте
  • Как найти место засора
  • Как найти скрытые значки на рабочем столе