0 / 0 / 0 Регистрация: 30.12.2019 Сообщений: 5 |
|
1 |
|
Найти сумму всех диагоналей и сравнить между с собой22.01.2020, 23:48. Показов 4755. Ответов 4
Вводится прямоугольный массив. Рассмотрим в нем линии, параллельные главной диагонали. На
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
22.01.2020, 23:48 |
4 |
Модератор 2546 / 1643 / 895 Регистрация: 16.10.2013 Сообщений: 4,864 Записей в блоге: 13 |
|
23.01.2020, 09:35 |
2 |
Вводится прямоугольный массив. Рассмотрим в нем линии, параллельные главной диагонали. раз есть главная диагональ, значит это квадратный массив, все же.
0 |
0 / 0 / 0 Регистрация: 30.12.2019 Сообщений: 5 |
|
23.01.2020, 10:38 [ТС] |
3 |
да, думай что тебе дан квадратная матрица и ты должен найти сумму *всех диагоналей этой матрицы и найти самую большую из этих сумм.
0 |
long399 Модератор 2546 / 1643 / 895 Регистрация: 16.10.2013 Сообщений: 4,864 Записей в блоге: 13 |
||||
23.01.2020, 11:14 |
4 |
|||
Kanatbekov_24, это вы должны думать, а не я Добавлено через 31 минуту
0 |
analogov net 2120 / 948 / 439 Регистрация: 17.11.2018 Сообщений: 2,494 |
||||
23.01.2020, 22:51 |
5 |
|||
раз есть главная диагональ, значит это квадратный массив Это не обязательно. Главная диагональ не потому главная, что массив квадратный, а потому, что начинается в левом верхнем углу и продолжается вправо-вниз до “пересечения” либо с последней строкой, либо с последним столбцом, либо с обоими сразу. Индексы элементов, которые находятся на ней равны ( i == j ).
1 |
for (row=0; row<SIZE; row++)
{
for (col=0; col<SIZE; col++)
{
if (row == 0 && col == 0) {
answer+=my_data[row][col];
}
else if ((row)/(col) == 1) //1 is slope of array
{
answer+=my_data[row][col];
}
}
}
printf("The diagonal sum of the 8x8 array is: %in",answer);
starting from [0,0]
and ending at [8,8]
“Sum the diagonal values inside the
8×8 array starting at [0,0]”
I realize I can do a single for loop since the shape is just 1:1 but how would I do it just in case I need to sum a diagonal 8×10 array?
codaddict
443k81 gold badges492 silver badges528 bronze badges
asked Mar 2, 2011 at 8:09
2
Diagonal element(s) and main diagonal are defined only for a square matrix.
if rowcount == colcount
sum = 0
for i = 0 to rowcount
sum += matrix[i][i]
end-for
else
print Diagonal sum not defined
end-if
For a non-square matrix if you want to sum the elements at position with equal row and column number you can do:
sum = 0
for i = 0 to min(rowcount,colcount)
sum += matrix[i][i]
end-for
print sum
answered Mar 2, 2011 at 8:13
codaddictcodaddict
443k81 gold badges492 silver badges528 bronze badges
1
Depends how you will define diagonal elements. If we define diagonal elements as – cells through which diagonal line passes somewhere NEAR the center of cell, then diagonal elements of matrix:
(0,0);(1,0);(2,1);(3,1);(4,2);(5,2) will be perfectly valid.
answered Mar 2, 2011 at 10:12
Well the primary concern over here is, what’s the definition of diagonal elements if it’s not a square matrix. If it’s a square matrix then it should be RowCount==ColCount. But what if it’s not a square matrix??
answered Mar 2, 2011 at 8:14
NirmalGeoNirmalGeo
7734 silver badges12 bronze badges
3
codaddict is right; only square matrixes have diagonal elements.
I suppose you want addition of elements where rownum==colnum?
answered Mar 2, 2011 at 8:16
CyprUSCyprUS
4,1299 gold badges48 silver badges93 bronze badges
My guess would be to ignore the excess rows or columns if it’s non-square; that seems like the most reasonable approach, although that is just a guess since the diagonal of a non-square matrix isn’t defined, but since you’re asking about 2-dim array instead of a matrix, I presume the context of the question is a programming assignment, rather than linear algebra.
To do this, you can get the min length of row & column and then iterate from 0 to that min length:
diag_len = min (row_size, col_size);
for (int i = 0; i < /* or <= */ diag_len; i++) {
answer += my_data[i][i];
}
This works in both the square and lossy non-square cases. Your example code ends up considering the coordinates of every cell which is wasteful when you know you only care about the cases where row == col. (It also obviates the need for a special case when row & col are both 0 and avoids division, which is a slower CPU operation than addition.)
answered Mar 2, 2011 at 8:29
Wil CooleyWil Cooley
9006 silver badges18 bronze badges
1
include
int main(){
int a[10][10],i,j,sum=0,m,n;
printf(“nEnter the row and column of matrix: “);
scanf(“%d %d”,&m,&n);
printf(“nEnter the elements of matrix: “);
answered Mar 29, 2014 at 17:13
1
int s = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j< n; ++j) {
s += A[i][j][i];
}
}
вот часть кода для нахождения суммы элементов главной диагонали трёхмерного массива. в чем ошибка? подскажите пожалуйста
Harry
214k15 золотых знаков117 серебряных знаков229 бронзовых знаков
задан 25 окт 2021 в 17:47
2
для трехмерной матрицы это будет выглядеть как
int sum = 0
for (int i = 0; i < n; i ++) {
sum += matrix[i][i][i];
}
а вот побочных диагоналей, как я понимаю должно быть много?
sum1 += matrix[n-1-i][i][i];
sum2 += matrix[i][n-1-i][i];
sum3 += matrix[i][i][n-1-i];
ну и если массив одномерный (как обычно и делается), то тогда надо вычислять индекс по типу
const int index = i*n*n + i*n + i;
sum += matrix[index];
ответ дан 25 окт 2021 в 18:28
ZhiharZhihar
36.9k4 золотых знака25 серебряных знаков67 бронзовых знаков
ну для начала нужно, чтобы в массиве реально существовали эти диагонали, попадающие на конкретные числа. Ещё возможно в перекрестии ты дважды учитываешь одно число – стандартная ошибка при программировании.
п. с. упрощай до минимума для анализа – 3х3. И заполняешь к примеру нулями, а в центре 1 и посмотри что получится. Проверяй. Должно быть кконечно 1, А вот если 2, то как раз тот самый косяк и есть. Эксперементируй в общем.
п. п. с. алгоритм определения диагоналей какой ?!
1. Ну ты парень прост как валенок! Ныне уже надо “защиту от дураков” ставить – делать вначале проверку, что диагонали корректные существуют !
2. Язык программирования твой не изучал ни разу. Не вижу ввода изнального всех значений массива. Ты совем новичОк? Хорошо допустим он как-то уже был задан !
3. if i==j: – это что такое? Проверка на равенство элементов или что? Зачем? после этого суммирование? таковых ?
Если проверка на равенство нумерации, то в любом случае ты забываешь вторую диагональ! Ведь вторая диагональ пойдёт справа-налево и сверху вниз. (снизу врятли кто её вверх “потянет”:))) Опять же центральный элемент будет посчитан дважды, возможно проще всего попросту его будет вычесть один раз.
4. такое чувство что в начале ты таким образом не можешь ввести двумерный массив никак! Там ж чисел будет n*n, а у тебя “строка” вроде как получается.
п. с. лет 20 назад изучал разные языки програмирования. По моему тут делаешь чего попало (честно говоря). Тебе надо брать поэлементно каждую диагональ и вот как ты складываешь в конце! s. Ты чего-то ненужное складываешь с этой проверкой – личное мнение.
Источник: подкорректировал ответ.
Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в 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]);