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
444k81 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
444k81 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
0 / 0 / 0 Регистрация: 30.12.2019 Сообщений: 5 |
|
1 |
|
Найти сумму всех диагоналей и сравнить между с собой22.01.2020, 23:48. Показов 4785. Ответов 4
Вводится прямоугольный массив. Рассмотрим в нем линии, параллельные главной диагонали. На
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
22.01.2020, 23:48 |
4 |
Модератор 2547 / 1646 / 896 Регистрация: 16.10.2013 Сообщений: 4,874 Записей в блоге: 13 |
|
23.01.2020, 09:35 |
2 |
Вводится прямоугольный массив. Рассмотрим в нем линии, параллельные главной диагонали. раз есть главная диагональ, значит это квадратный массив, все же.
0 |
0 / 0 / 0 Регистрация: 30.12.2019 Сообщений: 5 |
|
23.01.2020, 10:38 [ТС] |
3 |
да, думай что тебе дан квадратная матрица и ты должен найти сумму *всех диагоналей этой матрицы и найти самую большую из этих сумм.
0 |
long399 Модератор 2547 / 1646 / 896 Регистрация: 16.10.2013 Сообщений: 4,874 Записей в блоге: 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 |
Нужно найти сумму элементов под главной диагонали матрицы.
К примеру,дана матрица
1 2 3 4
5 6 7 8
2 4 3 2
5 6 7 8
Нужна сумма цифр 5,2,4,5,6,7.
Я написал программу для вычисления главной диагонали.
Вот код:
int main()
{
int sizeN,sizeM;
cin >> sizeN;
sizeM = sizeN;
int array[sizeN][sizeM] = {};
int total = 0;
for (int i = 0; i < sizeN; i++) {
for (int j = 0; j < sizeM; j++) {
cin >> array[i][j];
}
}
for (int i=0;i<sizeN;i++)
for (int j=0;j<sizeM;j++)
if (i==j){
total+=array[i][j];
}
cout << total;
return 0;
}
Как вычислить сумму цифр под диагональю?
Как найти сумму на обратной дагонали двухмерного массива?
Имеется двухмерный массив 5×5, нужно найти сумму на обратной диагонали.
Помогите пожалуйста никак не могу придумать алгоритм.
var result = document.getElementById("result");
var arr = [] , rand, sum = 0;
for(var i = 0; i < 5; i++) {
arr.push([]);
arr[i].push(rand);
for(var j = 0; j < 5; j++) {
rand = Math.floor(Math.random()*91 + 10);
arr[i][j] = rand;
result.innerHTML += arr[i][j]+ " | ";
}
}
JSFiddle
Пример:
-
Вопрос заданболее трёх лет назад
-
259 просмотров
«Обратные диагонали» характерны тем, что сумма координат X и Y в рамках одной диагонали постоянна. Алгоритм:
- подготовить массив сумм из (5 * 2 — 1) элемента, заполненный нулями.
- пройтись по всем элементам массива. Сложив координаты получаем id диагонали – он же индекс в массиве сумм.
- прибавляем текущий элемент к нужной сумме.
// суммы – где сумма координат X + Y = N, для каждой диагонали N постоянно
var side = 5,
sum = Array.apply(null, Array(side * 2 - 1)).map(Number.prototype.valueOf,0),
row, col
;
for( row = 0; row < side; row++) {
for( col = 0; col < side; col++) {
sum[row + col] += arr[row][col];
}
}
result.innerHTML += '<pre>' + JSON.stringify(sum) + '</pre>';
fiddle
Пригласить эксперта
arr[0][4] + arr[1][3] + arr[2][2] + arr[3][1] + arr[4][0]
?
для произвольного «квадратного» двумерного массива
let arr = [[1,2,3],[2,3,4],[3,4,5]];
let res = arr.reduce((res, curr, ind)=>{
return res + curr[curr.length - ind - 1];
},0);
console.log(res);
-
Показать ещё
Загружается…
29 мая 2023, в 23:21
2000 руб./за проект
29 мая 2023, в 22:30
10000 руб./за проект
29 мая 2023, в 21:41
2000 руб./за проект
Минуточку внимания
На занятии будет рассмотрен двумерный массив в 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)
- Описание массива в разделе переменных:
- Описание массива через раздел type:
const N = 3; M = 4; var A: array[1..N,1..M] of integer;
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: Необходимо:
- Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.
- Распечатать показания термометров всех метеостанций за 2-й день.
- Определить среднюю температуру на 3-й метеостанции.
- Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 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
). Дополните код.
Показать решение:
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. |
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме: