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

Darina_Ferliy

1

Сумма элементов матрицы

18.05.2010, 20:30. Показов 8276. Ответов 14


Студворк — интернет-сервис помощи студентам

Надо написать программу в ПАСКАЛЕ!!!
Вычислить сумму всех элементов двумерного массива X(10,10) (элемент массива Xij,где i=1,2,..10; j=1,2,..10).

Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

18.05.2010, 20:30

14

Inadequate

Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.05.2010, 20:32

2

Pascal
1
2
3
4
sum := 0;
for i := 1 to N do
  for j := 1 to M do
    Inc(sum, a[i, j]);



0



good91

8 / 8 / 2

Регистрация: 03.03.2010

Сообщений: 90

18.05.2010, 23:11

3

По-моему так :

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
Program Matr;
 Uses crt;
 Const n=10;m=10;
 Type
  Mas=array[1..n,1..m] of real;
 Var
  A:Mas;
  i,j:integer;
  S:real;
 
 Procedure Vvod (Var A:mas);
 Begin
  For I:=1 to n do
   For j:=1 to m do
    A[i,j]:=random;
 End;
 
 Procedure sum (Var A:mas);
 Begin
  S:=0;
   For i:=1 to n do
    for j:=1 to m do
      S:=S+A[i,j];
       Writeln ('Сумма всех элементов матрицы = ',S:2:1);
  End;
 
  Begin
   ClrScr;
   vvod (a);
   Sum (a);
   Readln
  End.



0



Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.05.2010, 23:14

4

good91, по-моему тебе надо бы почитать о параметрах процедур/функций, потому как везде вставлять var некорректно.



0



8 / 8 / 2

Регистрация: 03.03.2010

Сообщений: 90

18.05.2010, 23:18

5

Цитата
Сообщение от Inadequate
Посмотреть сообщение

потому как везде вставлять var некорректно.

Как учили, так и вставляю… По-моему это не на что не влияет .



0



Inadequate

Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.05.2010, 23:25

6

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

Цитата
Сообщение от Справка

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

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

Если параметр передается по значению, то при вызове подпрограммы значения фактических параметров присваиваются соответствующим формальным параметрам. Например, пусть имеется следующее описание процедуры:

Pascal
1
2
3
4
procedure PrintSquare(i: integer);
begin
  writeln(i*i);
end;

Тогда при вызове PrintSquare(5*a-b) значение 5*a-b будет вычислено и присвоено переменной i, после чего выполнится тело процедуры.
Если параметр передается по ссылке, то при вызове подпрограммы фактический параметр заменяет собой в теле процедуры соответствующий ему формальный параметр. В итоге любые изменения формального параметра-переменной внутри процедуры приводят к соответствующим изменениям фактического параметра. Например, если описана процедура

Pascal
1
2
3
4
procedure Mult2(var a: integer);
begin
  a:=a*2;
end;

то после вызова Mult(d) значение d увеличится в 2 раза.



1



good91

8 / 8 / 2

Регистрация: 03.03.2010

Сообщений: 90

18.05.2010, 23:34

7

Цитата
Сообщение от Inadequate
Посмотреть сообщение

то хреновые у тебя преподы

Да уж верно… Теперь всё понятно. Спасибо.

Добавлено через 2 минуты
Т. е. , когда я задал сразу:

Цитата
Сообщение от good91
Посмотреть сообщение

Var

Pascal
1
2
3
A:Mas;
 i,j:integer;
 S:real;

Потом в процедуре можно не задавать?



0



Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.05.2010, 23:37

8

Нет, если в процедуре/функции собираешься изменять массив, то ставишь var, а если не собираешься, то не ставишь. Т.е в случае с процедурой ввода использование var корректно, а в случае подсчета суммы нет.



1



8 / 8 / 2

Регистрация: 03.03.2010

Сообщений: 90

18.05.2010, 23:40

9

Цитата
Сообщение от Inadequate
Посмотреть сообщение

Нет, если в процедуре собираешься изменять массив, то ставишь var, а если не собираешься, то не ставишь.

Ясненько…Т. е. в этом случае можно не ставить, так как я же его не изменяю, а нахожу сумму элементов матрицы



1



Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.05.2010, 23:41

10

good91, да, именно так



0



CeKaC

-2 / 14 / 1

Регистрация: 13.05.2010

Сообщений: 94

18.05.2010, 23:44

11

Цитата
Сообщение от good91
Посмотреть сообщение

По-моему так :

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
Program Matr;
 Uses crt;
 Const n=10;m=10;
 Type
  Mas=array[1..n,1..m] of real;
 Var
  A:Mas;
  i,j:integer;
  S:real;
 
 Procedure Vvod (Var A:mas);
 Begin
  For I:=1 to n do
   For j:=1 to m do
    A[i,j]:=random;
 End;
 
 Procedure sum (Var A:mas);
 Begin
  S:=0;
   For i:=1 to n do
    for j:=1 to m do
      S:=S+A[i,j];
       Writeln ('Сумма всех элементов матрицы = ',S:2:1);
  End;
 
  Begin
   ClrScr;
   vvod (a);
   Sum (a);
   Readln
  End.

солидарен. проще способа я невижу.



0



Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.05.2010, 23:45

12

CeKaC, с чем ты солидарен ? Этот вариант далеко не самый простой и далеко не самый полный. Нет вывода матрицы, переменные i,j,S описаны вне процедур (что делать не рекомендуется) да и процедуры тут не нужны. А ты солидарен…



0



good91

8 / 8 / 2

Регистрация: 03.03.2010

Сообщений: 90

18.05.2010, 23:51

13

Вот окончательная прога, что бы было солидарно и корректно

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
Program Matr;
 Uses crt;
 Const n=10;m=10;
 Type
  Mas=array[1..n,1..m] of real;
 Var
  A:Mas;
  i,j:integer;
  S:real;
 
 Procedure Vvod;
 Begin
  For I:=1 to n do
   For j:=1 to m do
    A[i,j]:=random;
 End;
 
 Procedure sum;
 Begin
  S:=0;
   For i:=1 to n do
    for j:=1 to m do
      S:=S+A[i,j];
       Writeln ('Сумма всех элементов матрицы = ',S:2:1);
  End;
 
  Begin
   ClrScr;
   vvod;
   Sum;
   Readln
  End.

CeKaC, нравятся сложные способы, пожалуйста решай сложным способом… Главное, что бы правильно было



0



Inadequate

Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

19.05.2010, 00:05

14

А зачем ты убрал параметры вообще ? Да и потом настоятельно рекомендуется заносить вспомогательные переменные в тело процедуры/функции. Твой код должен выглядеть в по-хорошему так

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
program Matr;
uses
  Crt;
 
const
  N = 3;
  M = 4;
 
type
  MyArr = array [1..N, 1..M] of integer;
 
var
  a: MyArr;
procedure Writing(var a: MyArr);
var
  i,j: integer;
begin
  for i := 1 to N do
    for j := 1 to N do
      a[i, j] := Random(8) - 4;
end;
 
procedure Print(a: MyArr);
var
  i,j: integer;
begin
  for i := 1 to N do
  begin
    for j := 1 to M do
      Write(a[i, j]);
    WriteLn;
  end;
end;
 
procedure Sum;
var
  i,j,s: integer;
begin
  s := 0;
  for i := 1 to N do
    for j := 1 to M do
      Inc(s, a[i, j]);
  Writeln ('Result:  ', S:2:1);
end;
 
begin
  ClrScr;
  Randomize;
  Writing(a);
  Print(a);
  Sum;
  ReadLn;
end.

А вообще как я и писАл тут процедуры не нужны, достаточно вот этого

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
uses
  Crt;
 
const
 N = 3;
 M = 3;
 
var
  a: array [1..N, 1..M] of integer;
  i,j,sum: integer;
 
begin
  ClrScr;
  Randomize;
  for i := 1 to N do
  begin
    for j := 1 to M do
    begin
      a[i, j] := Random(8) - 4;
      Inc(sum, a[i, j]);
      Write(a[i, j]:2, ' ');
    end;
    WriteLn;
  end;
  WriteLn('Result: ', sum);
  ReadLn;
end.



2



-2 / 14 / 1

Регистрация: 13.05.2010

Сообщений: 94

19.05.2010, 00:09

15

Цитата
Сообщение от Inadequate
Посмотреть сообщение

CeKaC, с чем ты солидарен ? Этот вариант далеко не самый простой и далеко не самый полный. Нет вывода матрицы, переменные i,j,S описаны вне процедур (что делать не рекомендуется) да и процедуры тут не нужны. А ты солидарен…

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

процедуры и функции использовать никто же не запрещает. это всего лишь стиль и почерк программиста. и в конце-то концов можно все засунуть в отдельные подключаемые можули и непариться особо)) главное же пашет )))



1



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

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

матрица

Исходные данные для решения многих задач можно представить в табличной форме:
двумерный массив 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.

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

    проверь себя

    Общая часть

    Во всех задачах будем считать, что матрица описана следующим образом:

    const 
      SzM = 10; 
      SzN = 10; 
    
    type Matrix = array [1..SzM,1..SzN] of integer;
    

    Кроме того, во всех задачах будем использовать следующие процедуры для заполнения и вывода:

    procedure FillMatrixByRandom(var a: Matrix; m,n: integer); // Заполнение случайными
    begin
      for var i:=1 to M do 
      for var j:=1 to N do 
        a[i,j] := Random(10);
    end;
    
    procedure PrintMatrix(const a: Matrix; m,n: integer); // Вывод матрицы
    begin
      for var i:=1 to M do 
      begin
        for var j:=1 to N do 
          write(a[i,j]:4);
        writeln;  
      end;
    end;
    

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

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

    var a: Matrix;
    
    begin
      var m := 4;
      var n := 5;
      FillMatrixByRandom(a,m,n);
        
      writeln('Элементы матрицы: ');
      PrintMatrix(a,m,n);
    end.
    

    Перемена местами двух строк

    var a: Matrix;
    
    begin
      var m := 5;
      var n := 9;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      var k1 := 2; // поменять местами строки с номерами k1 и k2
      var k2 := 4;
      for var j:=1 to n do
        Swap(a[k1,j],a[k2,j]);
      
      writeln('Преобразованная матрица: ');
      PrintMatrix(a,m,n);
    end.
    

    Поиск минимумов в строках

    var 
      a: Matrix;
      mins: array [1..SzN] of integer;
    
    begin
      var m := 5;
      var n := 9;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      for var i:=1 to m do
      begin
        var min := a[i,1];
        for var j:=2 to n do
          if a[i,j]<min then
            min := a[i,j];
        mins[i] := min;    
      end;
      
      writeln('Минимумы в строках: ');
      for var i:=1 to m do
        write(mins[i]:4);
    end.
    

    Поиск максимумов в столбцах

    var 
      a: Matrix;
      maxs: array [1..SzN] of integer;
    
    begin
      var m := 5;
      var n := 9;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      for var j:=1 to n do
      begin
        var max := a[1,j];
        for var i:=2 to m do
          if a[i,j]>max then
            max := a[i,j];
        maxs[j] := max;    
      end;
      
      writeln('Максимумы в столбцах: ');
      for var j:=1 to n do
        write(maxs[j]:4);
    end.
    

    Поиск сумм в строках

    var 
      a: Matrix;
      sums: array [1..SzM] of integer;
    
    begin
      var m := 4;
      var n := 5;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      for var i:=1 to m do
      begin
        var sum := 0;
        for var j:=1 to n do
          sum += a[i,j];
        sums[i] := sum;    
      end;
      
      writeln('Суммы в строках: ');
      for var i:=1 to m do
        write(sums[i]:4);
    end.
    

    Поиск произведений в столбцах

    var 
      a: Matrix;
      products: array [1..SzN] of integer;
    
    begin
      var m := 3;
      var n := 4;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      for var j:=1 to n do
      begin
        var p := 1;
        for var i:=1 to m do
          p *= a[i,j];
        products[j] := p;    
      end;
      
      writeln('Произведения в столбцах: ');
      for var j:=1 to n do
        writeln(products[j]:4);
    end.
    

    Наличие нуля в матрице

    var 
      a: Matrix;
      HasZero: boolean;
    
    label 1;
    
    begin
      var m := 3;
      var n := 4;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      HasZero := False;
      for var i:=1 to m do
      for var j:=1 to n do
        if a[i,j]=0 then
        begin
          HasZero := True;
          goto 1;
        end;
    1:
      if HasZero then
        writeln('В матрице есть нули')
      else writeln('В матрице нулей нет')  
    end.
    

    Сумма чисел на главной диагонали

    var 
      a: Matrix;
      sum: integer;
    
    begin
      var m := 5;
      var n := m;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      sum := 0;
      for var i:=1 to m do
        sum += a[i,i];
      writeln('Сумма элементов главной диагонали: ',sum);
    end.
    

    Сумма чисел на побочной диагонали

    var 
      a: Matrix;
      sum: integer;
    
    begin
      var m := 5;
      var n := m;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      sum := 0;
      for var i:=1 to m do
        sum += a[i,m-i+1];
      writeln('Сумма элементов побочной диагонали: ',sum);
    end.
    

    Заполнение нулями ниже главной диагонали

    var 
      a: Matrix;
      sum: integer;
    
    begin
      var m := 5;
      var n := m;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      for var i:=2 to m do
      for var j:=m-i+2 to m do
        a[i,j] := 0;
    
      writeln('Преобразованная матрица: ');
      PrintMatrix(a,m,n);
    end.
    

    Заполнение нулями выше побочной диагонали

    var 
      a: Matrix;
      sum: integer;
    
    begin
      var m := 5;
      var n := m;
      FillMatrixByRandom(a,m,n);
        
      writeln('Исходная матрица: ');
      PrintMatrix(a,m,n);
      
      for var i:=1 to m-1 do
      for var j:=i+1 to m do
        a[i,j] := 0;
    
      writeln('Преобразованная матрица: ');
      PrintMatrix(a,m,n);
    end.
    

    Ссылки

    • Программы для начинающих
    • Сайт PascalABC.NET: Программы и алгоритмы для начинающих
    uses crt;
    var a:array[1..3,1..3] of integer;
    i,j,s,n:integer;
    begin
    clrscr;
    write('n = ');
    readln(n);
    for i:=1 to n do
    begin
    for j:=1 to n do
    begin
    write('Vvedite a[',i,',',j,'] = ');
    readln(a[i,j]);
    end;
    end;
    writeln;
    for i:=1 to n do
    begin
    for j:=1 to n do
    begin
    write(a[i,j]:3);
    end;
    writeln;
    end;
    s:=0;
    for i:=1 to n do
    begin
    for j:=1 to n do
    begin
    s:=s+a[i,j];
    end;
    end;
    writeln('Summa = ',s);
    readln;
    end.
    end.

    Понравилась статья? Поделить с друзьями:

    Не пропустите также:

  • Как составить конкуренцию в бизнесе
  • Как найти коттедж на сутки
  • Floppy disks fail 40 как исправить
  • Как найти соотношение длины к ширине
  • Как найти квадрат радиуса круга по рисунку

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии