Помогите задать условие “ниже побочной диагонали”.
#include <iostream>
using namespace std;
int main()
{
int M;
int N;
int i, j;
double** matrix;
cout << endl << "M = " ;
cin >> M;
cout << endl << "N = " ;
cin >> N;
matrix = new double*[M];
for (i = 0; i < M; i++)
matrix[i] = new double[N];
for (i = 0; i < M; i++) // ввод
for (j = 0; j < N; j++)
{
cout << "Inter element " << "[" << i << "][" << j << "] ";
cin >> matrix[i][j];
}
cout << endl;
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++)
cout << matrix[i][j] << "t";
cout << "n";
}
int sum = 0;
for (i = 0; i < M; i++) {
for (j = 0; j < N ; j++) {
}
}
cout << endl << sum << endl;
system("pause");
}
задан 21 дек 2017 в 19:14
2
что такое побочная диагональ – это диагональ, которая идет сверху-права на низ-лево. Нужная “диагональ ниже” – это просто плюс единица по высоте. Но есть одна проблема – у не квадратной матрицы нужно точно определить, что называть диагональю.
Итак, если бы это была квадратная матрица размером size x size, и нумерация с нуля, то побочная диагональ это (схематически)
s=0;
for (int i = 1; i <= size; i++) {
s+=m[size-i][i-1]
}
А с диагональню ниже, будет так (заметье, что размер этой диагонали на 1 меньше)
s=0;
for (int i = 1; i <= size-1; i++) {
s+=m[size-i][i]
}
ответ дан 21 дек 2017 в 19:29
KoVadimKoVadim
112k6 золотых знаков91 серебряный знак158 бронзовых знаков
5
Элементы ниже побочной диагонали в матрице с M
строками и N
столбцами – те a[i][j]
, для которых i+j > M-1
.
Можно просто перебором по всем элементам и отсеивать ненужные, а можно – по каждой строке i
от M-i
-го элемента до N-1
-го…
ответ дан 21 дек 2017 в 19:28
HarryHarry
214k15 золотых знаков117 серебряных знаков228 бронзовых знаков
Формулировка задачи:
Написал метод для нахождения суммы элементов выше побочной диагонали, нужно, чтобы находило сумму элементов ниже. Помогите, пожалуйста
public int GetSumOfElementsAbove(int[,] matrix) { int sum = 0; for (int q = 0; q < matrix.GetLength(0) - 1; q++) for (int z = 0; z < matrix.GetLength(1) - q - 1; z++) { sum += matrix[q, z]; } return sum; }
Код к задаче: «Элементы ниже побочной диагонали матрицы»
textual
public static int GetSumOfElementsBelow(int[,] matrix) { int m = matrix.GetLength(0); int n = matrix.GetLength(1); int sum = 0; for (int q = m - 1; q > 0; q--) for (int z = n - 1; z > n - q - 1; z--) sum += matrix[q, z]; return sum; }
Полезно ли:
5 голосов , оценка 4.000 из 5
Проблема в том, как оббежать элементы матрицы, расположенные ниже побочной диагонали, верно?
Понятно, что нам в любом случае понадобится два индекса, i будет бегать по строкам, а j по элементам внутри строки. Если мы внимательно присмотримся к элементам, лежащим ниже главной диагонали, то заметим, что они не входят в первую строку матрицы, так что внешний цикле у нас будет от первой строки (нулевую пропускаем) до последней.
А вот внутренний цикл по j, который будет оббегать необходимые элементы внутри i-ой строки, очевидно уже будет зависеть от значения i. Для i равного 1, мы должны взять всего один элемент с индексом [1][3]. Для i равного 2, мы должны взять уже два элемента с индексами [2][2] и [2][3]. И так далее. То есть чем больше i, тем больше элементов из строки мы должны взять. Следует заметить, что последний элемент строки в любом случае входит в искомые, значит правая граница цикла по j нами известна – это N-1. Левая же граница, очевидно, зависит от i. Чем i больше, тем граница меньше, а значит в интервал попадает больше элементов. Не сложно сообразить, что левая граница должна быть N-1-(i-1), иными словами N-i.
Всё вышесказанное выливается в следующую простенькую программу, которая выводит все элементы, расположенные ниже главной диагонали матрицы:
Код: Выделить всё
#include <iostream>
const int N = 4;
const int a[N][N] =
{
{ 4, 2, 3, 4 },
{ 0, 7, 5, -2 },
{-4, 3, 2, 8 },
{ 4, -2, 8, 3 }
};
int main()
{
for (int i = 1; i < N; ++i)
for (int j = N-i; j < N; ++j)
std::cout << a[i][j] << " ";
return 0;
}
Результат работы:
-2 2 8 -2 8 3
P.S. Ты уже второй раз создаёшь тему с неинформативным названием. В этот раз я её переименовал. Спешу напомнить, что подобные темы могут быть удалены основываясь на соглашении, которое ты подписал при регистрации. Уважай труд людей, которые тебе помогают – делай понятные темы.
Entites should not be multiplied beyond necessity @ William Occam
—
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
—
Сообщение “Спасибо” малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой “Reputation” в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в 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]);
Дана квадратная матрица размером nxn
. Найти минимальный элемент среди элементов, расположенных ниже главной диагонали, найти максимальный элемент, среди элементов расположенных выше побочной диагонали. Найденные минимальный и максимальный элементы поменять местами и вывести их индексы.
// main_secondary_diagonal.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; int main(int argc, char* argv[]) { srand(time(NULL)); int size_array; // размер квадратной матрицы setlocale(LC_ALL, "rus"); cout << "Введите размер квадратной матрицы: "; cin >> size_array; // динамическое создание двумерного массива int **arrayPtr = new int* [size_array]; for (int count = 0; count < size_array; count++) arrayPtr[count] = new int [size_array]; for (int counter_rows = 0; counter_rows < size_array; counter_rows++) { for (int counter_columns = 0; counter_columns < size_array; counter_columns++) { arrayPtr[counter_rows][counter_columns] = rand() % 100; // заполнение массива случайными числами cout << setw(2) << arrayPtr[counter_rows][counter_columns] << " "; // вывод на экран двумерного массива } cout << endl; } cout << endl; int min = arrayPtr[1][0], // минимальный елемент массива, ниже главной диагонали row_min = 1, // номер строки минимального элемента column_min = 0; // номер столбца минимального элемента // поиск минимального элемента в массиве, ниже главной диагонали for (int counter_rows = 1; counter_rows < size_array; counter_rows++) { for (int counter_columns = 0; counter_columns < counter_rows ; counter_columns++) { if ( arrayPtr[counter_rows][counter_columns] < min ) { min = arrayPtr[counter_rows][counter_columns]; row_min = counter_rows; column_min = counter_columns; } } } cout << "min" << "[" << (row_min + 1) << "][" << (column_min + 1) << "]" << " = " << min << endl; int max = arrayPtr[0][0], // максимальный элемнет массива, выше побочной диагонали row_max = 0, // номер строки максимального элемента column_max = 0; // номер столбца максимального элемента for (int counter_rows = 0; counter_rows < size_array - 1; counter_rows++) { for (int counter_columns = 0; counter_columns < (size_array - counter_rows - 1); counter_columns++) { if ( arrayPtr[counter_rows][counter_columns] > max ) { max = arrayPtr[counter_rows][counter_columns]; row_max = counter_rows; column_max = counter_columns; } } } cout << "max" << "[" << (row_max + 1) << "][" << (column_max + 1) << "]" << " = " << max << endl; //////////////////перестановка элементов//////////////////////////////////////////////// arrayPtr[row_min][column_min] = max; arrayPtr[row_max][column_max] = min; //////////////////////////////////////////////////////////////////////////////////////// cout << "nМассив после перестановки максимального и минимального элементов:n"; for (int counter_rows = 0; counter_rows < size_array; counter_rows++) { for (int counter_columns = 0; counter_columns < size_array; counter_columns++) { cout << setw(2) << arrayPtr[counter_rows][counter_columns] << " "; // вывод на экран двумерного массива } cout << endl; } cout << endl; cout << "min" << "[" << (row_max + 1) << "][" << (column_max + 1) << "]" << " = " << min << endl; cout << "max" << "[" << (row_min + 1) << "][" << (column_min + 1) << "]" << " = " << max << endl; // удаление двумерного динамического массива for (int count = 0; count < size_array; count++) delete []arrayPtr[count]; system("pause"); return 0; }
Результат работы программы показан ниже: