C++ Ввести матрицу с помощью диагоналей
Ввести квадратную матрицу с помощью диагоналей. То есть, сначала вводится основная диагональ, затем диагональ на одну сроку ниже а последний элемент данной строки (который не войдет в диапазон матрицы необходимо перенести в верхний правый угол) и т.д. Просьба в решении задачи не использовать ф-цию vector.
Пример (цифры представлены просто для наглядности работы диагоналей, матрица может быть любого размера ):
1*** 1**2 1*32
*1** 21** 21*3
**1* *21* 321*
***1 **21 *321
Мой код но без переноса элементов не входящих в диапазон матрицы:
#include <iostream>
int main()
{
int n;
cin>>n;
int mat[n][n];
for(int i=0; i<(n); i++)
for(int j=0; j<(n); j++)
{
if (j+i>j+j){i=0;} //Данная часть не работает
cin>>mat[j+i][j];
}
}
Ответы (1 шт):
Автор решения: gitlng
→ Ссылка
Можно и без функций обнуления массива и его вывода.
#include <iostream>
using namespace std;
// контроль выхода индекса за размер массива
int ControlIndex(int matrixIndex, uint sizeMatrix)
{
if (matrixIndex >= sizeMatrix)
{
return 0;
}
else
{
// то есть, ничего не делаем с индексом
return matrixIndex;
}
}
// показать матрицу
void ShowMatrix(int** matrix, int sizeMatrix)
{
for (int i = 0; i < sizeMatrix; i++)
{
for (int j = 0; j < sizeMatrix; j++)
{
cout << matrix[i][j];
}
cout << endl;
}
}
// заполнить матрицу нулями
void FillMatrix(int** matrix, int sizeMatrix)
{
for (int i = 0; i < sizeMatrix; i++)
{
for (int j = 0; j < sizeMatrix; j++)
{
matrix[i][j] = 0;
}
}
}
int main()
{
// переменная, корректирующая переход строк, в случае выхода за размер массива
int rowCorrection = 0;
uint SIZE;
cout << "Size: ";
cin >> SIZE;
// выделяем память массиву двумерному
int** matrix = new int*[SIZE];
// выделяем память каждому одномерному массиву двумерного массива
for (int i = 0; i < SIZE; i++)
{
matrix[i] = new int[SIZE];
}
// сразу заполним матрицу нулями и покажем ее исходное состояние
FillMatrix(matrix, SIZE);
ShowMatrix(matrix, SIZE);
for (int i = 0; i < SIZE; i++)
{
for(int j = 0; j < SIZE; j++)
{
// ввод чисел по диагонали
// если индекс >= SIZE, то строка вновь становится 0 и каждую
// итерацию увеличивается на 1
// а столбцы независимо продолжают увеличиваться
cin >> matrix[ControlIndex(j+i, SIZE) + rowCorrection][j];
if (j + i >= SIZE)
{
// за счет этого, у нас индекс строки продолжает увеличиваться
// даже после ее обнуления после выхода за размер массива
rowCorrection++;
}
// выводим матрицу каждый раз после ввода числа
ShowMatrix(matrix, SIZE);
cout << endl;
}
// после ввода диагонали, обнуляем коррекцию
rowCorrection = 0;
}
ShowMatrix(matrix, SIZE);
getchar();
return 0;
}