14 / 14 / 0 Регистрация: 01.04.2015 Сообщений: 96 |
|
1 |
|
Найти сумму элементов ниже главной диагонали матрицы26.11.2015, 09:03. Показов 11936. Ответов 5
Дана матрица А размера 7*7. Найти сумму эл-ов ниже главной диагонали
1 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
26.11.2015, 09:03 |
5 |
Sergey_B 174 / 174 / 57 Регистрация: 08.01.2013 Сообщений: 335 |
||||
26.11.2015, 10:03 |
2 |
|||
РешениеЭлементы лежащие на главной диагонали в сумму не считаются, суммируются только те что лежат ниже.
1 |
Remuless 25 / 25 / 23 Регистрация: 07.06.2015 Сообщений: 142 |
||||
26.11.2015, 10:04 |
3 |
|||
1 |
14 / 14 / 0 Регистрация: 01.04.2015 Сообщений: 96 |
|
26.11.2015, 10:36 [ТС] |
4 |
Программа почему то после открытия работает 1сек и вылетает
1 |
25 / 25 / 23 Регистрация: 07.06.2015 Сообщений: 142 |
|
26.11.2015, 10:38 |
5 |
Программа почему то после открытия работает 1сек и вылетает добавь в конце Console.Readkey();
1 |
Matthew-python 0 / 0 / 0 Регистрация: 28.09.2019 Сообщений: 1 |
||||
28.09.2019, 17:32 |
6 |
|||
Добавлено через 1 минуту
Элементы лежащие на главной диагонали в сумму не считаются, суммируются только те что лежат ниже.
Какой код будет в случае размера матрицы 5*6, например?
0 |
Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в 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]);
program diagonal; var a:array[1..10,1..10] of integer; n,i,j,s:integer; {'n - размерность матрицы'} procedure inputArray; begin for i:=1 to n do for j:=1 to n do readln(a[i,j]); end; procedure printArray; begin for i:=1 to n do begin for j:=1 to n do Write(a[i,j],' '); WriteLn; end; end; function SumElem:real; var i,j,s:integer; begin for i:=1 to n do for j:=1 to n do if i>j then s:=s+a[i,j]; SumElem:=s; end; begin s:=0; writeln('Введите размерность матрицы'); readln(n); writeln('Введите элементы матрицы'); inputArray; writeln('Матрица:'); printArray; s:=SumElem; writeln('сумма элементов находящиеся ниже главной диагонали матрицы- ',s); end.
Для каждого столбца заданной матрицы найти сумму элементов, расположенных ниже главной
диагонали. Составить и напечатать матрицу.
Сделал генерирование матрицы, для удобства вывел главную диагональ, хотел для начала вывести столбцы, но оно выводит как-то не так как я думал https://i.stack.imgur.com/aizg1.png, нужно именно столбец, а потом добавить все числа с него, т.е 48 43 0 13 и добавило это, аналогично и с другим столбцом 28 21 12 и тд.
https://i.stack.imgur.com/unSRT.png
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int matr[5][5];
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{
matr[i][j] = rand() % 50;
}
}
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{
cout << matr[i][j] << " ";
}
cout << 'n';
}
cout << 'n';
cout << "Diagonal";
cout << 'n';
for (int i = 0; i < 5; ++i)
{
cout << 'n' << matr[i][i] << " ";
}
cout << 'n';
cout << "suma chisel";
cout << 'n';
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < i; ++j)
{
cout << matr[i][j] << " ";
}
}
cin.get();
return 0;
}
Here is an example case demonstrating how to find the sum in both cases, using nested loop:
matrix = [[i+j for j in range(4)] for i in range(4)]
for row in matrix:
print(" ".join(list(map(str,row))))
totalSum = 0
for i in range(1,len(matrix)):
for j in range(i):
totalSum += matrix[i][j]
print("Below sum: ", totalSum)
totalSum = 0
for i in range(len(matrix)):
for j in range(i+1,len(matrix)):
totalSum += matrix[i][j]
print("Above sum: ", totalSum)
Output:
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
Below sum: 18
Above sum: 18
You can also use these one-liners:
Below diagonal:
totalSum = sum([matrix[i][j] for i in range(1,len(matrix)) for j in range(i)])
Above diagonal:
totalSum = sum([matrix[i][j] for i in range(len(matrix)) for j in range(i+1,len(matrix))])
If you want to sum all numbers above and below the main diagonal you can perform an index check:
totalSum = 0
for i in range(len(matrix)):
for j in range(len(matrix)):
if not i==j:
totalSum += matrix[i][j]
print("Sum: ", totalSum)
Yet, another way of finding that sum (although not recommended) is to find the total sum of the matrix and the sum of the main diagonal and then perform a subtraction to find the final sum:
matrix = [[i+j for j in range(4)] for i in range(4)]
for row in matrix:
print(" ".join(list(map(str,row))))
matrixSum = sum([sum(elem for elem in row) for row in matrix])
diagonalSum = sum([matrix[i][i] for i in range(len(matrix))])
finalSum = matrixSum - diagonalSum
print("Matrix sum: ", matrixSum)
print("Diagonal sum: ", diagonalSum)
print("Final sum: ", finalSum)
Output:
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
Matrix sum: 48
Diagonal sum: 12
Final sum: 36
Note: Mind the syntax in the print
statements as you’re using Python 2 and my answer is in Python 3.