Матрица с N столбцами и N строками, столбцы должны иметь значение N-1, N-2 и т. Д. - PullRequest
0 голосов
/ 02 ноября 2018

У меня проблемы с матрицей. Требования:

Создайте матрицу из N столбцов и N строк, первый столбец должен иметь значение N, второй столбец должен иметь N-1, третий N-2 и т. Д., Пока последний столбец не должен иметь значение 1.

Например: N[7][7] должно быть:

7 6 5 4 3 2 1
7 6 5 4 3 2 1
7 6 5 4 3 2 1
7 6 5 4 3 2 1
7 6 5 4 3 2 1
7 6 5 4 3 2 1
7 6 5 4 3 2 1

Мой код получает только: 7 6 6 6 6 6 6 для каждой строки и столбца. Как я могу решить это?

#include <iostream>
using namespace std;

int main()
{

    int m[24][24], i, j, k = 0;
    int linia, coloana, piesa, lac=0;
    int mutari = 0;
    int ceva;
    cout << "Cate linii si cate coloane ? :";
    cin >> lac;
    ceva = lac;

    if (lac>1 && lac<25) {
        for (i = 0; i < lac; i++)
        {
            for (j = 0; j < lac; j++)
            {

                m[i][0] = lac;
                m[i][1] = ceva-1;
                ceva = ceva;

                m[i][j] = ceva - 1;
                ceva = ceva;

                if (i == j) {
                    m[i][j] = 2;
                    m[1][1] = 2;
                }
            };              
        };

        for (i = 0; i < lac; i++)
        {
            for (j = 0; j < lac; j++)
            {
                cout << m[i][j] << " ";
            }
            cout << endl;
        }
    }

    else cout << "Numarul de linii si coloane trebuie sa fie >=2 si <= 24" << endl;
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

После того, как Тим Рэндалл показал вам, как исправить ваш код, это C ++ способ делать вещи:

#include <cstddef>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    std::cout << "Rows: ";
    std::size_t rows;
    std::cin >> rows;
    std::cout << "Columns: ";
    std::size_t cols;
    std::cin >> cols;

    std::size_t elements{ rows * cols };
    std::vector<int> m(elements);
    std::generate(m.begin(), m.end(), [&]() { return --elements % cols + 1; });

    for (std::size_t y{}; y < rows; ++y, std::cout.put('\n'))
        std::copy(m.begin() + y * cols, m.begin() + (y + 1) * cols,
                  std::ostream_iterator<int>(std::cout, " "));

    // access m[y][x] with m[y * cols + x]
}
0 голосов
/ 03 ноября 2018

Облегчите себе задачу и используйте возможности стандартной библиотеки.

constexpr auto N = 7;
std::array<int, N> row{};
std::array<std::array<int, N>, N> matrix{};

std::iota(std::rbegin(row), std::rend(row), 1);
std::fill(std::begin(matrix), std::end(matrix), row);

std::array - это очень тонкая оболочка для массивов в стиле c, с ней немного приятнее работать, и она имеет приятные функции, такие как запоминание ее размера.
std::iota заполняет диапазон последовательно увеличивающимися значениями (в данном случае начиная с 1). Используя std::rbegin, мы говорим ему заполнить row в обратном порядке.
Наконец, мы используем std::fill для установки каждой строки нашего matrix на row.

Код будет работать даже на c ++ 11, заменив std::rbegin на .rbegin().

0 голосов
/ 03 ноября 2018

Следующий код должен аккуратно инициализировать матрицу.

if (lac>1 && lac<25) {
    for (i = 0; i < lac; i++)
    {
        ceva = lac;
        for (j = 0; j < lac; j++)
        {
            m[i][j] = ceva;
            ceva = ceva-1;
        }
    } // no need for ';' here

    for (i = 0; i < lac; i++)
    {
        for (j = 0; j < lac; j++)
        {
            cout << m[i][j] << " ";
        }
        cout << endl;
    }
}

В начале каждой строки мы используем ceva = lac; для сброса значения, которое попадет в матрицу. Сразу после установки значения мы уменьшаем ceva на единицу. Я удалил много кода, цель которого я не понимал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...