我遇到矩阵问题。要求是:
制作一个具有N
列和N
行的矩阵,第一列必须具有值N
,第二列必须具有N-1
,第三列{{1 }},直到最后一列的值必须为1。
例如:N-2
必须是:
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
答案 0 :(得分:0)
以下代码应整洁地初始化矩阵。
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
减小1。
我剥离了很多我不明白目的的代码。
答案 1 :(得分:0)
Tim Randall向您展示了如何修复代码之后,这就是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]
}
答案 2 :(得分:0)
使自己更轻松,并利用标准库的功能。
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
。
通过将std::rbegin
替换为.rbegin()
,该代码甚至可以在c ++ 11上运行。