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

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

19.12.2015, 00:16. Показов 2869. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru