我是C新手,我正在尝试制作一个矩阵5x4只有0到9之间的数字,其中每个数字需要在那里2次(我正在尝试制作记忆游戏)。我得到了这个代码,但我认为这是一个混乱,它不起作用,所以我的问题是,我如何改进我的代码或如何以不同的方式制作这个矩阵?
{{1}}
答案 0 :(得分:1)
这可以让您的计划更短一些。
我已将n0,n1,....放入由r。
索引的数组中#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MaxC 4
#define MaxL 5
int main()
{
int na[10] = {0};
int n[MaxL][MaxC], i=0;
srand((unsigned)time(NULL));
while(i<MaxL)
{
int j=0;
while(j<MaxC)
{
int r = rand() % 10;
if(na[r]<2)
{
++na[r];
n[i][j] = r;
printf(" %3d ",n[i][j]);
++j;
}
}
++i;
printf("\n");
}
return 0;
}
示例输出:
2 6 1 8
4 7 0 2
5 3 7 8
9 1 0 3
5 6 4 9
您的代码会继续尝试随机数,直到您将每个数字都设置为两次。这不是最好的方法。
相反,您可以在固定位置使用20个数字初始化矩阵,然后对矩阵进行随机混洗。
答案 1 :(得分:1)
首先,您已在每个j++
语句中放置if
。如果你只是在循环结束时离开j++
,它会看起来更干净。 print
语句也是如此。
其次,如果您可以发布该程序正在打印的内容或描述 它无法正常工作,那么这将有助于您获得问题的答案。如果不自己尝试,我就不会看到你的代码有什么功能问题。
编辑:有关进一步简化代码的方法,请参阅4386427的答案。
答案 2 :(得分:1)
我可以帮你吗?如果在阵列上替换十个nX变量,则可以简化代码。看看这个:
int main(){
int c[10] = {0};
int i=0,j=0,r;
int n[MaxL][MaxC];
srand(time(NULL));
for(i = 0; i < 5; i++) {
for(j = 0; j < 4; j++) {
do {
r=(rand()%10);
} while( c[r] > 2);
++c[r];
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
printf("\n");
}
return 0;
}