我想创建一个5行和5列的矩阵,其中包含1到9的值。当我向程序输入5
时,以下程序会显示1到25之间的数字。
#include <iostream>
using namespace std;
int a[20][20], n, x = 0;
int main()
{
cout << "n=";
cin >> n;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
a[i][j] = x+1;
x = x+1;
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
cout << a[i][j] << " ";
cout << endl;
}
}
我是初学者,所以也许这很简单,但我不知道如何让它显示从1到9的值。这是矩阵我除了:
1 2 3 4 5
6 7 8 9 1
2 3 4 5 6
7 8 9 1 2
3 4 5 6 7
答案 0 :(得分:0)
您需要使用模数运算符(%)。如果您希望矩阵中的值与计算它们一样,但只需要更改显示,则可以输出矩阵值,如下所示:
cout << (a[i][j] % 10) << " ";
如果您希望一位数值位于矩阵本身中,您可以改变&#39; x&#39;以下内容:
x = (x+1) % 10;}
答案 1 :(得分:0)
您的代码中存在一些问题。
C阵列或STL容器?
首先,a
你的矩阵可能只能容纳20x20的矩阵。如果输入大于20的n
,您的程序将无声地失败,因为您将访问内存超出范围;这会导致未定义的行为(请参阅其他常见的UB案例here)。
您可能希望使用动态大小数组 - 实现此目的的一个好方法是使用std::vector
。不幸的是,这不如使用具有两个维度的C风格数组那么舒服 - 您可以使用std::vector<std::vector<int>>
实现相同的访问语法,但这不是非常有效(如果您使用this answer感兴趣为什么)也不太舒服。
Boost C ++库提供a multidimensional array library。一旦你获得足够的经验,你就可以在其中找到用途。
<=
或<
? 0
- 索引或1
- 已编入索引?
今天许多编程语言使用0
- 数组索引。这意味着数组的第一个元素位于索引0
,而不是1
。有些语言,比如Lua,不会这样做。
这意味着您应该将i
和j
从0
重复到n
。这也意味着n
被排除在外,因此您应该使用<
,而不是<=
。
使用1到9之间的数字填充矩阵
您的代码不执行任何操作,因此您可以获得从1到9的数字 - 它只会使用从1到n * n
的数字填充矩阵。您可以使用if
子句更改此设置,以便每次超过x
时设置9
:
if (x > 9) { x = 0; } // x = 0 because it will be 1 on the next iteration
话虽如此,正如@ PMar的回答所说,更方便。 modulo operator %
也可以完成任务。
a[i][j] = (x % 9) + 1;
x = (x % 9) + 1;
这样,您就可以获得从1
到9
的所有数字。
现在,您还可以进行另一次清理:为什么要计算x
的下一个值,然后才设置它?您可以在分配之前将新的x
值分配给矩阵的单元格。这样可以使代码更清晰,复制粘贴更少,这意味着更好的可维护性。
x = (x % 9) + 1;
a[i][j] = x;
另一个代码质量考虑因素
我不能说你的原始代码源是否像你的问题一样缩进(在编辑之前),但你应该真的缩进你的代码,为将来你和其他人必须阅读你的代码。它允许更好的可读性。
代码的不同部分也是如此:添加一些空间!如果你在表达式之间做出明确的区分,它只会变得更具可读性。
答案 2 :(得分:0)
#include <iostream>
int main()
{
int a[5][5];
int x = 1;
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(x > 9)
x = 1;
a[i][j] = x;
x++;
}
}
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(a[i][j] < 10)
std::cout << " ";
std::cout << a[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
return 0;
}