Funktion verbessern



  • Moin,

    meine Aufgabe lautet, ich soll eine 3 x 3 Matrix dahingehend überprüfen ob die Zahlen 1 bis 9 genau einmal vorkommen. Ich habe folgende Funktion geschrieben die auch funktioniert. Aber es gibt bestimmt bessere Wege als meiner. Wie könnte ich das noch testen, ohne dass ich 9 Variablen brauche?

    nt pruefen(int arr[3][3]){
    
         int a1=1;
         int a2=2;          //9 Variablen für jede Position in der
         int a3=3;          // 3x3 Matrix
         int a4=4;
         int a5=5;
         int a6=6;
         int a7=7;
         int a8=8;
         int a9=9;
    
         int i,j;
    
         for(i=0; i<3; i++){                    //In diesen Schleifen laufe ich über jedes Element in der Matrix
            for(j=0; j<3; j++){                 //und weise jeder Variable(a1 bis a9) einen neuen Wert zu, falls der alte Wert
                if(arr[i][j]==a1){              //in der Matrix gefunden wurde
                    a1=11;
                }
                else if(arr[i][j]==a2){
                    a2=12;
                }
                else if(arr[i][j]==a3){
                    a3=13;
                }
                else if(arr[i][j]==a4){
                    a4=14;
                }
                else if(arr[i][j]==a5){
                    a5=15;
                }
                else if(arr[i][j]==a6){
                    a6=16;
                }
                else if(arr[i][j]==a7){
                    a7=17;
                }
                else if(arr[i][j]==a8){
                    a8=18;
                }
                else if(arr[i][j]==a9){
                    a9=19;
                }
            }
         }
    
        //Hier überprüfe ich ob jede Variable einmal vorgekommen ist. Wenn die Variablen
        //a1 bis a9, nicht genau diese Werte haben, ist min. eine davon nicht vorgekommen
    
         if(a1!=11 ||a2!=12 ||a3!=13 ||a4!=14 ||a5!=15 ||a6!=16 ||a7!=17 ||a8!=18 ||a9!=19){
            return -1;
         }
    
         return 1;
    
    }
    

    Danke



  • Ähm, das ist schon sehr seltsam mit diesen magic numbers 😃

    Nimm ein std::set und pack da die Werte rein, und wenn der schon drin ist, dann hast du ein Duplikat.



  • Nimm ein std::set

    Wir sind im C-Forum...



  • zehforum schrieb:

    Wir sind im C-Forum...

    Sorry, hab ich nicht gesehen. Wenn du das tatsächlich in C machen willst, dann könntest du vielleicht auch eine Bibliothek nehmen, die entsprechende Datenstrukturen anbietet, z.B. apr. Oder du machst es per Bruteforce und gehst für jeden Eintrag die komplette Matrix durch und schaust, ob die da schon vorkommt. Da deine Matrix so klein ist, dürfte das noch gehen.



  • Wenn du Variablen wie a1, a2, a3 ... hast, dann bietet sich ein Array an.

    int a[9] = {0};
    

    In der Schleife kannst du dann zählen.

    a[arr[i][j]-1]++; // vorher solltest du prüfen, ob arr[i][j] im richtigen bereich ist.
    

    Und für die Überprüfung nimmst du auch eine Schleife

    for (i=0;i<9;i++)
      if(a[i] .....) return ??  // bitte selber vervollständigen
    


  • Nehme einen Array mit 9 Werten zum Zählen. Die Werte 1-9 entsprenden den Indizes 0-8. Funktion wird ein "Dreizeiler".



  • Danke, ich wusste nicht, dass folgender Ausdruck erlaubt ist

    DirkB schrieb:

    In der Schleife kannst du dann zählen.

    a[arr[i][j]-1]++;
    

    aber warum das -1?



  • Danke, ich wusste nicht, dass folgender Ausdruck erlaubt ist

    Warum sollte das nicht erlaubt sein?

    aber warum das -1?

    Du hast Zahlen von 1-9, das Array (bzw. der Index(?)) geht aber von 0 bis 8.



  • DirkB schrieb:

    vorher solltest du prüfen, ob arr[i][j] im richtigen bereich ist.

    Damit ist 1 bis 9 gemeint.
    Sonst sprichst du den falschen Index im Array an.
    Und das kommt nicht gut.


  • Mod

    wizZarD schrieb:

    aber warum das -1?

    Damit 1-9 auf 0-8 abgebildet werden.



  • int p(int arr[3][3])
    {
    	int i, j, x = 0;
    	for(i = 0; i < 3; i++)
    		for(j = 0; j < 3; j++)
    			x |= 1 << arr[i][j];
    
    	return (x == 0x03FE ? 1 : -1);
    }
    
    int main()
    {
    	int arr[3][3] = { {1, 6, 4}, {2, 3, 8}, {9, 5, 7} };
    
    	printf("%i\n", p(arr));
    	arr[0][0] = 9;
    	printf("%i\n", p(arr));
    }
    


  • Schreib doch erstmal was du genau verbessern willst, wie die Aufgabenstellung lautet.
    Was soll hier jetzt hier jemand sagen, wenn du einfach nur den Code hinklatschst



  • vayacontoz schrieb:

    Schreib doch erstmal was du genau verbessern willst, wie die Aufgabenstellung lautet.
    Was soll hier jetzt hier jemand sagen, wenn du einfach nur den Code hinklatschst

    Siehe Seite 1 😉

    Wunderte mich aber auch erst drüber.



  • vayacontoz schrieb:

    Schreib doch erstmal wie die Aufgabenstellung lautet.

    Auch wenn er es nicht explizit sagt möchte er wohl ein Sudoku Feld überprüfen.



  • sry. mein Fehler, hab nur die zweite Seite gesehen 😃


Log in to reply