С Новым годом! Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 19.10.2015
Сообщений: 23

Вычислить суммы элементов главных диагоналей массивов с использованием подпрограмм

19.12.2015, 00:16. Показов 2863. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ввести 2 двумерных массива и в каждом массиве вычислить сумму элементов главной диогонали. Как я понял, нужно сделать впрограмму в которой вводится массив, а подпрограмму сунуть процесс вычисления суммы. Прошу помочь)))
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2015, 00:16
Ответы с готовыми решениями:

Процедуры и функции. Вычислить Y=C-D, где C и D суммы элементов главных диагоналей матриц A и B
даны две матрицы A(M,M) и "B(N,N).вычислить" значения функции "Y=C-D,где" C и D суммы элементов главных диагоналей матриц A и B...

Вычислить суммы элементов, стоящих выше главных диагоналей матриц A(n,n) и B(m,m)
Помогите пожалуйста написать программу! заранее спасибо!

Сформировать одномерные массивы из элементов главных диагоналей матриц (с использованием подпрограмм)
Даны две квадратные матрицы:A размером 6х6 и B размером 10х10. Сформировать одномерные массивы А1 и B1 из элементов главных диагоналей...

10
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
19.12.2015, 00:21
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
type TMyArray=array[1..100,1..100] of Integer;
 
function SumMainCross(M : TMyArray; MSize : Integer):Integer;
var sum, i : Integer;
begin
  sum:=0;
  for i:=1 to MSize do sum:=sum+M[i,i];
  SumMainCross := sum;
end;
достаточно?
1
1 / 1 / 0
Регистрация: 19.10.2015
Сообщений: 23
20.12.2015, 02:16  [ТС]
Мне нужно чтобы использовалась процедура, препод сказал что программа по объему и впринципе верна по написанию, но она не работает. Можете посмотреть?

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
Program Pr_1;
uses crt;
type mass=array[1..10, 1..10] of integer;
var a,b:mass;
i,j,n,m,k:integer;
   procedure summ(c:mass; var n,m,s:integer);
   begin
   s:=0;
   for i:=1 to n do
   for j:=1 to m do 
   if i=j then 
   s:=s+c[i,j];
   end;
begin 
clrscr;
randomize;
writeln(' vvedite kol-vo n i m');
readln(n,m);
  for i:=1 to n do begin
  for j:=1 to m do
  A[i,j]:=random(15);
  summ(a,k,n,m,i,j);
  writeln('summ =' , k);
  writeln;
  end;
    writeln('vvedite n i m');
    readln(n,m);
  for i:=1 to n do begin
  for j:=1 to m do 
  B[i,j]:=random(15);
  
  summ(b,m,n,i,j,k);
    writeln('summ=', k);
    end;
   
    readln;
    end.
0
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
20.12.2015, 08:36
SABIRCHIK, ну ты две большие ошибки делаешь.
одна даже откомплировать код не позволяет.

смотри, в Паскале формальные параметры в процедуре/функции (те, что ты описал в объявлении процедуры) должны
В ТОЧНОСТИ соответствовать фактических параметрам (что ты передаёшь, когда вызываешь процедуру в коде.
Посчитай, сколько у тебя параметров в процедуре summ и сколько ты туда передаёшь.

а второе. твоя процедура считает сумму по всем элементам массива. а ты её в цикле вызываешь.
по видимому, ты там раньше считал сумму (и это было правильно). а теперь вынес подсчёт в процедуру,
в процедуре свои циклы, поэтому так делать нельзя!

Добавлено через 8 минут
я бы тебе предложил так написать:
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
54
program Pr_1;
uses crt;
type mass = array[1..10, 1..10] of integer;
 
procedure summ(c: mass; n, m : integer; var s: integer);
var i,j :integer;
begin
  s := 0;
  for i := 1 to n do
    for j := 1 to m do
      if i = j then
        s := s + c[i, j];
end;
 
procedure printmass(c: mass; n, m: integer);
var i,j :integer;
begin
  for i := 1 to n do begin
    for j := 1 to m do
      Write(C[i,j]:2,' ');
    WriteLn
  end;  
end;
 
var A, B: mass;
  i, j, n, m, sumdiag : integer;
 
begin
  clrscr;
  randomize;
  writeln('Massiv A. Vvedite kol-vo n i m');
  readln(n, m);
  for i := 1 to n do
    for j := 1 to m do
      A[i, j] := random(15);
 
  printmass(A, n, m);
  summ(A, n, m, sumdiag);
  writeln('summ =', sumdiag);
  writeln;
 
  writeln('Massiv B. vvedite n i m');
  readln(n, m);
  for i := 1 to n do 
    for j := 1 to m do
      B[i, j] := random(15);
 
  printmass(B, n, m);
  summ(B, n, m, sumdiag);
  writeln('summ =', sumdiag);
  writeln;
 
  readln;
end.
Добавлено через 2 минуты
Как ты видишь, для заполнения массивов используется однотипный код. Было бы неплохо сделать процедуру заполнения массива и вынести её в отдельную процедуру. чтобы в главной программе не было циклов (и переменные i и j тогда не нужны).
Но пусть это будет твоим домашним заданием!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
20.12.2015, 10:23
И еще один момент. По условию считать надо сумму элементов главной диагонали, а не всех элементов матрицы.
Pascal
1
2
3
4
5
procedure sumgd(const a: mass; m, n: Integer; var s: Integer);
begin
  if n>m then n:=m;
  s:=0; for n:=1 to n do s:=s+a[n];
end;
0
1 / 1 / 0
Регистрация: 19.10.2015
Сообщений: 23
20.12.2015, 14:18  [ТС]
я прошу прощения за грубые ошибки. хочу спросить, получается в этом коде что Вы мне прислали, 2 процедуры, одна вычисляющая сумму элементов главной диагонали, а вторая заполнение массива? Зачем нужна вторая процедура, меня когда препод спросить этот вопрос я ничего не смогу ответить, я могу убрать ее? И еще, мы прошли эту тему "подпрограммы, основную суть я понял, но не могу никак разобраться с параметрами. Если я правильно понимаю, то в процедуре, то что мы обсчитываем мы обозначаем за переменную и записываем после слова var, затем когда нам нужно в главной программе написать мы пишем имя процедуры и ту переменную, за которую мы приняли результат своих вычислений??? Я как бы хочу разобраться в чем дело, потому что просто так списать, это не дело, как показала практика и дотошный препод)))))))

Добавлено через 1 минуту
всмысле, я нарисовал множество матриц на бумажке, проверил у элементов главной диагонали всегда число строк равно числу столбцов.
Я не прав в чем-то?
0
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
20.12.2015, 14:56
Цитата Сообщение от SABIRCHIK Посмотреть сообщение
а вторая заполнение массива?
нет.
printmass - вывести содержимое массива на экран.
Иначе нельзя проверить, правильно программа считает или нет. Массив случайными числами заполняется.
А какими - снаружи не видно. Вот я и добавил вывод на экран.

Цитата Сообщение от SABIRCHIK Посмотреть сообщение
я могу убрать ее?
ты же "программист", всё в твоих руках - хочешь, убирай. Посмотришь, как программа изменится, кстати.

Цитата Сообщение от SABIRCHIK Посмотреть сообщение
но не могу никак разобраться с параметрами. Если я правильно понимаю, то в процедуре, то что мы обсчитываем мы обозначаем за переменную и записываем после слова var
ну, если очень грубо - то да, все переменные, которые описаны в параметрах процедуры через var передаются по ссылке и могут быть внутри процедуры изменены. Таким образом можно верхнуть значения из процедуры.
Вот, например, если ты напишешь процедуру, которая должна изменять твой массив, то в перечне параметров перед именем массива нужно будет написать var

А вообще, по Паскалю мульён книжек и статей, неужели ты не можешь прочитать, что такое параметры и как они задаются?

Цитата Сообщение от SABIRCHIK Посмотреть сообщение
всмысле, я нарисовал множество матриц на бумажке, проверил у элементов главной диагонали всегда число строк равно числу столбцов.
прости, я не понял, что ты этим предложением хотел сказать?!
Что у элементов главной диагонали номер строки всегда равен номеру столбца?
Это так. я же тебе сразу написал, достаточно ОДНОГО цикла
вместо
Pascal
1
2
3
4
5
s := 0;
* for i := 1 to n do
* * for j := 1 to m do
* * * if i = j then
* * * * s := s + c[i, j];
можно (и нужно) писать просто
Pascal
1
2
3
  s := 0;
  for i := 1 to n do
    s := s + c[i, i];
именно потому, что i должно быть равным j
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
20.12.2015, 20:41
У неквадратных матриц тоже есть главная и побочная диагонали.
Внутри процедуры менять можно любые параметры, кроме константных (const), но в вызывающую программу будут возвращены изменения только тех параметров, что переданы по ссылке (var).

Добавлено через 3 минуты
В подпрограммы обычно убирают повторяющиеся действия, чтобы не дублировать их в основном коде, а вызвать выполняющую действие подпрограмму. Поскольку массивов 2, однотипные действия с каждым будут повторены минимум дважды, во избежание дублирования разумно вынести их в отдельные процедуры.
0
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
20.12.2015, 22:39
Цитата Сообщение от bormant Посмотреть сообщение
У неквадратных матриц тоже есть главная и побочная диагонали.
вот меня всегда это изумляло.
Если несложно, покажите, пожалуйста, элементы главной и побочной диагонали
в матрице, например, 3 на 10
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
20.12.2015, 23:00
Sergio Leone,
полагаю, 3х5 и 5х3 будет достаточно наглядно:
Code
1
2
3
4
5
6
Главная диагональ:     Побочная диагональ:
5x3:     3x5:          5x3:     3x5:
1 0 0    1 0 0 0 0     0 0 0    0 0 1 0 0
0 1 0    0 1 0 0 0     0 0 1    0 1 0 0 0
0 0 1    0 0 1 0 0     0 1 0    1 0 0 0 0
0 0 0                  1 0 0
По определению главная диагональ начинается в левом верхнем углу и заканчивается по достижении правой или нижней границы. Побочная диагональ начинается в левом нижнем углу, далее аналогично.

Для квадратной матрицы и то, и другое заканчивается одновременно.
1
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
20.12.2015, 23:20
спасибо.
тогда, конечно, нужно использовать либо код автора темы
Pascal
1
2
3
4
s := 0;
  for i := 1 to n do
    for j := 1 to m do
       if i=j then s := s + c[i, j];
либо искать min(n,m) и цикл крутить до этого значения:
Pascal
1
2
3
s:=0;
if n<m then k:=n else k:=m;
for i := 1 to k do s:= s+c[i,i];

по поводу главной и побочной диагонали в неквадратных матрицах существуют разные мнения.
Тут на форуме была такая цитата из " В.А. Ильин, Э.Г. Позняк "Линейная алгебра", издание четвёртое, 1999"
https://www.cyberforum.ru/post5182895.html


а Тут, допускает:
Понятие диагональных элементов используется также и для неквадратных матриц.
странно это всё...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2015, 23:20
Помогаю со студенческими работами здесь

Вычислить суммы главных элементов диагоналей матриц
1. Вычислить суммы главных элементов диагоналей матриц A, B (M≤20,N≤30) 2. Вычислить и запомнить количество отрицательных элементов...

Вычислить суммы элементов главных диагоналей матриц A(5x5), B(7x7)
Вычислить суммы элементов главных диагоналей матриц A(5x5), B(7x7). Для ввода матрицы и вычисления суммы элементов главной диагонали...

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

Вычеслить суммы элементов главных диагоналей матриц
Вычеслить суммы элементов главных диагоналей матриц A(N,N) B(M,M).M и N(&lt;=20)

Вычисление суммы элементов главных диагоналей матриц
Написать программу вычисления суммы элементов главных диагоналей матриц А (10,10), В (15,15), С (20,10)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru