2016-07-25 60 views
1

我是一个C新手,我试图做一个矩阵5x4只有0和9之间的数字,其中每个数字需要在那里2次(我试图制作记忆游戏)。我得到了这段代码,但我认为这是相当混乱的,它不起作用,所以我的问题是,我该如何改进我的代码,或者如何以不同的方式创建这个矩阵?C随机矩阵,数字介于0和9之间

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

#define MaxC 4 
#define MaxL 5 



int main(){ 


    int n1=0, n2=0, n3=0, n4=0, n5=0, n6=0, n7=0, n8=0, n9=0, n0=0; 
    int i=0,j=0,r; 
    int n[MaxL][MaxC]; 
    srand(time(NULL)); 

    while(i<5){ 
     j=0; 
     while(j<4){ 

      r=(rand()%10); 

      if(r==0 && n0<2){ 
       n0++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==1 && n1<2){ 
       n1++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==2 && n2<2){ 
       n2++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==3 && n3<2){ 
       n3++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==4 && n4<2){ 
       n4++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==5 && n5<2){ 
       n5++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==6 && n6<2){ 
       n6++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==7 && n7<2){ 
       n7++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==8 && n8<2){ 
       n8++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 
      if(r==9 && n9<2){ 
       n9++; 
       j++; 
       n[i][j]=r; 
       printf(" %3d ",n[i][j]); 
      } 

     } 
     i++; 
    } 
    return 0; 
} 
+3

请先从格式化代码开始。 – MikeCAT

+3

你介意解释“它不工作”吗?你期望什么,实际发生了什么?至少你应该包含'time.h'来使用'time()'函数。 – MikeCAT

+0

MikeCAT im试图打印矩阵,但它只给了我的第一行。 从来没有用过time.h acc,我在没有它的情况下做出了主要思想:s –

回答

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个数字初始化矩阵,然后对矩阵进行随机洗牌。

+0

将单行'j ++;'移过内层'printf'另外,'MaxC'和'MaxL'是有原因的。把它们用于你的控制循环 – WhozCraig

+0

@WhozCraig - ups - 我忽略了那个 - 谢谢 – 4386427

+0

thx man:D现在我看到了我的错误^^ –

1

首先,您已将j++放在每个if声明中。如果你在循环结束时只留下j++,它会看起来更干净。 print声明也是如此。

其次,如果你可以发布什么程序打印出来或描述如何它不起作用,这将帮助你得到你的问题的答案。如果没有亲自尝试,我看不出你的代码有什么功能问题。

编辑:请参阅4386427的答案为更多的方法来简化您的代码。

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; 
}