2016-07-25 11 views
1

Ich bin ein C Neuling und ich versuche, eine Matrix 5x4 nur mit Zahlen zwischen 0 und 9 zu machen, wo jede Zahl 2 mal da sein muss (ich versuche es Mach das Memory-Spiel). Ich habe diesen Code, aber ich denke, das ist ein ziemliches Durcheinander und es funktioniert nicht, also meine Frage ist, wie kann ich meinen Code verbessern oder wie kann ich diese Matrix auf eine andere Weise machen?C zufällige Matrix mit Zahlen zwischen 0 und 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

Beginnen Sie mit der korrekten Formatierung Ihres Codes. – MikeCAT

+3

Würde es Ihnen etwas ausmachen, "es funktioniert nicht" zu erklären? Was erwartest du und was passiert eigentlich? Zumindest sollten Sie 'time.h' verwenden, um die' time() 'Funktion zu benutzen. – MikeCAT

+0

MikeCAT ich versuche, die Matrix zu drucken, aber es gibt mir nur die erste Zeile. nutzte nie die time.h acc, ich machte Master Mind ohne es: s –

Antwort

1

Hier ist eine kleine Änderung, um Ihr Programm kürzer zu machen.

Ich habe n0, n1, .... in ein mit r indiziertes Array platziert.

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

Beispiel Ausgabe:

2 6 1 8 
    4 7 0 2 
    5 3 7 8 
    9 1 0 3 
    5 6 4 9 

Ihr Code hält versuchen Zufallszahl, bis Sie jede Zahl zweimal gehabt haben. Das ist nicht der beste Ansatz.

Stattdessen könnten Sie die Matrix mit den 20 Zahlen an festen Stellen initialisieren und dann eine zufällige Mischung der Matrix durchführen.

+0

Verschieben Sie die einzeilige 'j ++;' nach dem inneren 'printf' Auch,' MaxC' und 'MaxL' gibt es aus einem bestimmten Grund. Verwenden Sie sie für Ihre Regelkreise – WhozCraig

+0

@WhozCraig - ups - Ich habe das übersehen - danke – 4386427

+0

thx Mann: D Jetzt sehe ich meinen Fehler ^^ –

1

Zunächst einmal haben Sie j++ in jede if Anweisung gesetzt. Es sieht viel sauberer aus, wenn Sie j++ am Ende der Schleife verlassen. Gleiches gilt für die print Aussage.

Zweitens, wenn Sie posten könnten, was das Programm ausdruckt oder beschreiben wie es funktioniert nicht, das würde Ihnen helfen, eine Antwort auf Ihr Problem zu bekommen. Ich sehe nicht, welches Funktionsproblem Ihr Code hat, ohne es selbst auszuprobieren.

EDIT: Siehe 4386427 die Antwort für weitere Möglichkeiten, um Ihren Code zu vereinfachen.

1

Darf ich Ihnen helfen? Sie können Ihren Code vereinfachen, wenn Sie zehn der nX-Variablen im Array ersetzen. Schau dir das an:

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