Pascal как найти диагональ матрицы

На занятии будет рассмотрен двумерный массив в 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.

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

    проверь себя

    Вы уверены что нужно найти именно диагональ?
    У вас матрица то не квадратная.
    Да и в самом коде есть ошибки.

    Pascal
    1
    2
    3
    
    p:=1;
     for j:= 1 to m do
     p:=p+a[i,j];

    возможно не плюс а умножить вам нужно в коде выше.

    Вы уверены, что 13 строка кода вам нужна?
    writeln(a[i,j]:3);
    без нее матрица как то больше на матрицу похожа.

    readln в самом конце пустой то зачем?

    Pascal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    for i:=1 to n do
     begin
     if (i mod 2=0) then
     begin
     s:=0;
     for j:= 1 to m do
     s:=s+a[i,j];
     write(s);
     write(' ');
     end
     else
     begin
     p:=1;
     for j:= 1 to m do
     p:=p+a[i,j];
     write(p);
     write(' ');
     end;
     end;

    Ну и на последок.
    Если я правильно понял, то если вы поменяете знак + на *, в месте, где я писал в начале, то при условии, что столбец четный посчитается сумма его элементов, иначе их произведение.

    Что вы имели в виду под не считает столбики?
    Количество столбцов в массиве у вас фиксированно, а значения если, то только сумма как раз и считается, причем в вашем коде, при условии, что столбец не четный к сумме еще прибавляется лишняя еденица.

    Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в 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]); 

    На уроке рассматриваются возможности работы с двумерными массивами в Pascal, разбираются формулы главной и побочной диагоналей матрицы

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

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

    матрица

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

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

    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;

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

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

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

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

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

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

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

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

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

    Ссылки

    • Программы для начинающих
    • Сайт PascalABC.NET: Программы и алгоритмы для начинающих

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

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

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

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

    Главная и побочная диагональ при работе с двумерными матрицами в 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

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

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

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

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

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

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

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

    12345678910111213141516171819202122 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+j1) then a[i,j]:=0; write(a[i,j]:3) end; writeln; end;end.

    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.

    Задание array 5:

    Найти отдельно

    сумму элементов

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

    1 7 3 72 1 8 35 7 6 48 2 3 1——-sum1 = 9sum2 = 30

    Пример:

    Дана матрица 5х5. Найти

    сумму элементов

    , стоящих на двух соседних диагоналях с главной и параллельных ей.

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

    Для решения задачи воспользуйтесь

    таблицей

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

    1234567891011121314151617181920212223242526272829 varA:array[1..5,1..5] of integer;i,j:integer;sum,sum1,sum2:integer;beginrandomize;for i:=1 to 5 dofor 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 (ij=1) then sum1:=sum1+A[i,j];sum2:=0;for i:=1 to 5 do for j:=1 to 5 do if (ji=1) then sum2:=sum2+A[i,j];sum:=sum1+sum2;writeln;writeln(‘Сумма = ‘,sum);end.

    varA:array[1..5,1..5] of integer;i,j:integer;sum,sum1,sum2:integer;beginrandomize;for i:=1 to 5 dofor 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 определить среднее значение элементов. Найти индекс элемента массива, наиболее близкого к среднему значению.

    1234567891011121314151617181920212223242526272829 var index1,index2,i,j,N,M:integer;s,min,f:real;a:array[1..300,1..300] of real;beginN:=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.

    var index1,index2,i,j,N,M:integer;s,min,f:real;a:array[1..300,1..300] of real;beginN:=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.

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

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

    проверь себя

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

    Для поочередного ввода элементов в матрицу необходимо перебрать элементы с 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. Некоторые задачи требуют содержание выражений в матрице. Не забывайте, что в любом случае должен быть определен каждый элемент в каждых строках и столбцах.

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

    В памяти ЭВМ элементы двумерного массива располагаются последовательно и занимают несколько байт. Например, элементы массива типа 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) — смещение относительно начала массива.

    На чтение 10 мин Просмотров 2.2к. Опубликовано 06.06.2021

    Содержание

    1. Задача
    2. Решение
    3. Двумерный массив в Pascal
    4. Описание, ввод и вывод элементов двумерного массива
    5. Главная и побочная диагональ при работе с двумерными матрицами в Pascal

    Задача

    Задана матрица A (n, n) действительных чисел. «Перевернуть» в ней главную и побочную диагонали (переписать цифры в обратном порядке).

    Решение

    Чтобы у матрицы были диагонали, она должна быть квадратной, т.е. n = m.

    Элементы главной диагонали имеют индекс [i,i]. Побочной [i,n-i+1].

    Для того, чтобы «перевернуть» диагонали, не надо перебирать всю матрицу. Достаточно перебрать половину

    лабораторные работы и задачи по программированию и информатике, егэ по информатике

    Двумерный массив в 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;

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

    Варианты описания двумерного массива

      Описание массива в разделе переменных:

    const N = 3; M = 4; var A: array[1..N,1..M] of integer;

    const M=10; N=5; type matrix=array [1..M, 1..N] of integer; var A: matrix;

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

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

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

    Рассмотрим следующую задачу: Получены значения температуры воздуха за 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;

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

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

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

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

    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 (‘————‘); <для оформления>. . <поиск суммы столбцов>. <поиск общей суммы>. . <вывод массива>write (‘ | sum = ‘, sum); readln end.

    Главная и побочная диагональ при работе с двумерными матрицами в 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

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

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

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

    Решение:

    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.

    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.

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

    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) Поделитесь уроком с коллегами и друзьями:

    Двумерные массивы (матрицы)

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

    Каждый элемент матрицы описывается, как

    где:
    A(i,j) — значение элемента матрицы
    А — имя матрицы
    i — номер строки
    j — номер столбца

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

    Прямоугольная матрица

    A(l,l) A(l,2) A(l,3) A(l,4)
    A(2,l) A(2,2) A(2,3) A(2,4)
    A(3,l) A(3,2) A(3,3) A(3,4)

    Квадратная матрица

    A(l,l) A(l,2) A(l,3)
    A(2,l) A(2,2) A(2,3)
    A(3,l) A(3,2) A(3,3)

    Соотношение индексов в квадратной матрице

    i=j элементы матрицы находятся на главной диагонали
    i элементы матрицы находятся над главной диагональю
    i>j элементы матрицы находятся под главной диагональю
    i+j=n+1 элементы матрицы находятся на побочной диагонали
    i+j элементы матрицы находятся над побочной диагональю
    i+j>n+1 элементы матрицы находятся под побочной диагональю

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

    1 способ:

    где:
    — идентификатор массива
    array — массив
    — количество строк в матрице — количество столбцов в матрице
    of — для
    — описание типа переменных в массиве (real, integer и т. д.)

    Пример:
    Массив А состоит из 4 столбцов и 3 строк, значение каждого элемента матрицы представляет собой вещественное число.
    а : array [1..3,1..4] of real;

    Массив В и С состоят из 3 строк и 3 столбцов, значение каждого элемента матрицы представляет собой целое число.
    b, с : array [1..3,1..3] of integer;

    2 способ:

    Пример:
    Массив А состоит из 4 столбцов и 3 строк, значение каждого элемента матрицы представляет собой вещественное число.
    а : array [1..3] of array [1..4] of real;

    Массив В и С состоят из 3 строк и 3 столбцов, значение каждого элемента матрицы представляет собой целое число.
    b,c : array [1..3] of array [1..3] of integer;

    Ввод — вывод значений элементов матрицы

    Заполнение элементов матрицы с клавиатуры

    program zadacha (input, output); (ввод с клавиатуры, вывод в столбик>
    var
    a: array[1..10,1..10] of real;
    j, i: integer;
    begin
    for i:=1 to 10 do
    for j:=1 to 10 do
    begin
    readln (a[i, j]);
    writeln ( ‘a(‘, i, ‘,’, j, ‘)=’, a[i,j])
    end
    end.

    Заполнение элементов матрицы по формуле

    program zadacha (input, output) ; <ввод по формуле, вывод таблицей>
    var
    a: array[1..10,1..10] of real;
    i,j: integer;
    begin
    for i:=1 to 10 do
    begin
    for j:=1 to 10 do
    begin
    a[i,j]: = (i + 0.5)/(j + sin(j));
    write ( a[i,j], ‘ ‘)
    end;
    writeln
    end
    end.

    Заполнение элементов матрицы случайными числами

    program zadacha (input,output); <ввод случайных чисел, вывод в строчку>
    var
    a: array[1..10,1..10] of integer;
    i,j: integer;
    begin
    randomize;
    for i:=1 to 10 do
    for j:=1 to 10 do
    begin
    a[i,j]:=random(30);
    write ( ‘а(‘, i, ‘,’, j, ‘)=’, a[i,j])
    end
    end.

    Типовые задачи на матрицы

    Нахождение экстремумов
    Дана прямоугольная матрица A(10,15), заполненная случайными числами в диапазоне от 0 до 29 включительно. Выдать на печать максимальное значение элементов данной матрицы.

    program zadacha (input, output); <нахождение наибольшего значения>
    var
    a: array[1..10,1..15] of integer;
    i,j,max: integer;
    begin
    randomize;
    for i:=1 to 10 do
    for j:=1 to 15 do a[i,j]:=random(30);
    max:=a [1,1];
    for i:=1 to 10 do
    for j:=1 to 15 do
    if a[i,j]>max then max:=a[i,j]; writeln ( ‘максимальное значение=’,тах)
    end.

    Суммирование значений элементов матрицы
    Дана матрица A(l,15), заполненная датчиком случайных чисел. Найти сумму значений всех элементов данной матрицы.

    program zadacha (input, output) ; <сумма значений элементов матрицы>
    var
    a: array[1..10,1..l5] of integer;
    i,j,s: integer;
    begin
    s:=0;
    randomize;
    for i:=1 to 10 do
    for j:=1 to 15 do
    begin
    a [i,j]:=random(30);
    s:=s + a[i,j]
    end;
    writeln ( ‘сумма значений=’,s)
    end.

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

    program zadacha (input, output) ; <кол-во знач. элементов в каждой строке матрицы>
    var
    a: array[1..10,1..20] of integer;
    i,j,k: integer;
    begin
    for i:=1 to 10 do
    begin
    k:=0;
    for j:=1 to 20 do
    begin
    a[i,j]:=random (30)-10;
    if a[i,j]>0 then k:=k+1
    end;
    writeln ( ‘кол-во полож. знач. в ‘, i, ‘ строке=’,k)
    end;
    end.

    Формирование нового одномерного массива из значений элементов матрицы
    Дана матрица, состоящая из 10 строк и 5 столбцов и заполненная случайными числами в диапазоне от 0 до 29. Сформировать одномерный массив SUM из сумм значений элементов каждого столбца матрицы.

    program zadacha (input, output); <формирование одномерного массива из сумм по столбцам>
    var
    a: array[1..10,1..5] of integer;
    sum: array[1..5] of integer;
    i,j,s: integer;
    begin
    for i:=1 to 10 do
    for j:=1 to 5 do
    begin
    a [i,j] :=random (30) ;
    writeln (‘эл-нт мас-ва=’,a[i,j])
    end;
    for j:=1 to 5 do
    begin
    s:=0;
    for i:=1 to 10 do s:=s + a[i,j];
    sum[j]:=s
    end;
    for i:=1 to 5 do writeln ( ‘sum(‘, i,’)=’,sum(i))
    end.

    Понравилась статья? Поделить с друзьями:
  • Как оформить реферат найти
  • Как найти эдс индукции через площадь
  • Как в либре офис найти текст
  • Как найти фото прадедушки
  • Пусть говорят как найти свою мать