c-Programm Hilfe



  • Hallo, hab ein Programm geschrieben, was Quadrate bis zu 9x9 einlesen und dann ausgeben soll ob dieses Quadratisch magisch ist oder nicht. Magische heißt: jede Zeile muss die gleiche Summe haben, jede Spalte und jede Diagonale.

    Hab das Programm eigentlich auch schon fertig, bis auf einen Fehler:

    #include <stdio.h>
    
    int main (void)
    {
    
      // Zeilen, Spalten- und Diagonalsumme des Magischen Quadrates
      int ergebnis;
      // Größe des Magischen Quadrates
      int dim;
    
      printf("Geben sie die Größe des Quadrates ein: ");
      scanf("%d", &dim);
    
      // Magische Quadrat
      int quadrat [dim][dim];
      // Zeilensumme des Magischen Quadrates
      int zeilensumme [dim];
      // Spaltensumme des Magischen Quadrates
      int spaltensumme [dim];
      // Diagonalsumme des Magischen Quadrates
      int diagonalsumme [2];
      // Indexe für das zweidimensionale Array
      int j;
      int i;
    
      printf("Geben sie das Ergebnis des Quadrates ein: ");
      scanf("%d", &ergebnis);
    
      printf("Eingabe der 0. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[0][0], &quadrat[0][1], &quadrat[0][2], &quadrat[0][3], &quadrat[0][4], &quadrat[0][5], &quadrat[0][6], &quadrat[0][7], &quadrat[0][8]);
    
      printf("Eingabe der 1. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[1][0], &quadrat[1][1], &quadrat[1][2], &quadrat[1][3], &quadrat[1][4], &quadrat[1][5], &quadrat[1][6], &quadrat[1][7], &quadrat[1][8]);
    
      printf("Eingabe der 2. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[2][0], &quadrat[2][1], &quadrat[2][2], &quadrat[2][3], &quadrat[2][4], &quadrat[2][5], &quadrat[2][6], &quadrat[2][7], &quadrat[2][8]);
    
      printf("Eingabe der 3. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[3][0], &quadrat[3][1], &quadrat[3][2], &quadrat[3][3], &quadrat[3][4], &quadrat[3][5], &quadrat[3][6], &quadrat[3][7], &quadrat[3][8]); 
    
      printf("Eingabe der 4. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[4][0], &quadrat[4][1], &quadrat[4][2], &quadrat[4][3], &quadrat[4][4], &quadrat[4][5], &quadrat[4][6], &quadrat[4][7], &quadrat[4][8]); 
    
      printf("Eingabe der 5. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[5][0], &quadrat[5][1], &quadrat[5][2], &quadrat[5][3], &quadrat[5][4], &quadrat[5][5], &quadrat[5][6], &quadrat[5][7], &quadrat[5][8]); 
    
      printf("Eingabe der 6. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[6][0], &quadrat[6][1], &quadrat[6][2], &quadrat[6][3], &quadrat[6][4], &quadrat[6][5], &quadrat[6][6], &quadrat[6][7], &quadrat[6][8]); 
    
      printf("Eingabe der 7. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[7][0], &quadrat[7][1], &quadrat[7][2], &quadrat[7][3], &quadrat[7][4], &quadrat[7][5], &quadrat[7][6], &quadrat[7][7], &quadrat[7][8]); 
    
      printf("Eingabe der 8. Zeile: ");
      scanf("%d%d%d%d%d%d%d%d%d", &quadrat[8][0], &quadrat[8][1], &quadrat[8][2], &quadrat[8][3], &quadrat[8][4], &quadrat[8][5], &quadrat[8][6], &quadrat[8][7], &quadrat[8][8]); 
    
      // Summen über die Zeilen rechnen
      // i-te Zeile
      for (i=0; i<dim; i++)
      {
        int summe = 0;
        int j = 0;
        // j-te Spalte
        for (j = 0; j<dim; j++)
          summe = summe + quadrat [i][j];
        zeilensumme [i] = summe;
      }
      // Summe über die Spalten rechnen
      // j-te Spalte
      for (j = 0; j<dim; j++)
      {
        int summe = 0;
        int i = 0;
       // i-te Zeile
        for (i = 0; i<dim; i++)
          summe = summe + quadrat [i][j];
        spaltensumme [j] = summe;
      }
      // Summe über die Hauptdiagonale
      int summe = 0;
      for (i = 0; i<dim; i++)
        summe = summe + quadrat [i][i];
      diagonalsumme [0] = summe;
      summe = 0;
      // Summe über die Nebendiagonale
      for ( i = 0; i<dim; i++)
        summe = summe + quadrat [i][dim-1-i];
      diagonalsumme [1] = summe;
      // Testvariable wird bei Fehler auf 1 gesetzt
      int korrekt = 0;
    
      // Zeilenfehler ausgeben
      for (i = 0; i<dim; i++)
        if(zeilensumme[i]!=ergebnis)
        {
          printf("Zeile %i ist falsch!\n", i);
          korrekt = 1;
        }
      // Spaltenfehler ausgeben
      for (i = 0; i<dim; i++)
        if(spaltensumme[i]!=ergebnis)
        {
          printf("Spalte %i ist falsch!\n", i);
          korrekt = 1;
        }
      // Diagonalefehler ausgeben
      if(diagonalsumme[0]!=ergebnis)
      {
        printf("Hauptdiagonale ist falsch!\n");
        korrekt = 1;
      }
      // Nebendiagonale Fehler ausgeben
      if(diagonalsumme[1]!=ergebnis)
      {
        printf("Nebendiagonale ist falsch!\n");
        korrekt = 1;
      }
    
      // Falls in den oberen Abfragen "korrekt" nie verändert worden ist
      // hat es keine Fehler gegeben
      if(korrekt==0)
         printf("Das Magische Quadrat ist korrekt!\n");
    
      getchar();
    }
    

    Das Problem liegt bei der Eingabe der Zeilen und Spalten. Denn wenn man am Anfang bei der Größe des Quadrates "3" eingibt funktioniert es nicht, denn die Eingabe der Zeilen für 9 Ziffern bestimmt ist. Gibt es eine Möglichkeit die Anzahl der einzugebenden Zeilen auch individuell einzutippen?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum Linux/Unix in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Versuch erstmal das Ganze lesbar zu formatieren und in code tags zu packen. Dann gehen dir evtl. ein, zwei Lichter auf.
    Es gibt sogar auch noch einen Vorschau-Button.

    Nicht nur die Formatierung sieht katastrophal aus. Das ganze Programm tut es.



  • Max Mustermannnn schrieb:

    Gibt es eine Möglichkeit die Anzahl der einzugebenden Zeilen auch individuell einzutippen?

    Schleifen.
    Schon für die Zeilen hättest du eine Schleife nehmen müssen.
    Dann kannst du dadrin auch noch eine Schleife für die einzelnen Werte machen.



  • EOP-... schrieb:

    Versuch erstmal das Ganze lesbar zu formatieren und in code tags zu packen. Dann gehen dir evtl. ein, zwei Lichter auf.
    Es gibt sogar auch noch einen Vorschau-Button.

    Nicht nur die Formatierung sieht katastrophal aus. Das ganze Programm tut es.

    Wie lauten die code Tags?



  • [quote="Max Mustermannnn"]

    EOP-... schrieb:

    Versuch erstmal das Ganze lesbar zu formatieren und in code tags zu packen. Dann gehen dir evtl. ein, zwei Lichter auf.
    Es gibt sogar auch noch einen Vorschau-Button.

    Nicht nur die Formatierung sieht katastrophal aus. Das ganze Programm tut es.

    Mein Professor meinte die Formatierung passe so.

    Was ist jetzt an diesem Programm so katastrophal? 😃



  • Dann wende dich doch an deinen Lehrer, wenn du Fragen hast.



  • Max Mustermannnn schrieb:

    Was ist jetzt an diesem Programm so katastrophal? 😃

    Die Zeilen 1 bis 5 sind nicht katastrophal.

    Ab dann frühzeitige Variablen, keine Problemzerlegung Funktionen, ausgerollte Schleifen die zudem lügen, unnötige Zwischenergebnisse, unsinnige Kommentare weil immewr noch keine Problemzerlegung Funktionen, und getchar() am Ende.



  • volkard schrieb:

    Max Mustermannnn schrieb:

    Was ist jetzt an diesem Programm so katastrophal? 😃

    Die Zeilen 1 bis 5 sind nicht katastrophal.

    Ab dann frühzeitige Variablen, keine Problemzerlegung Funktionen, ausgerollte Schleifen die zudem lügen, unnötige Zwischenergebnisse, unsinnige Kommentare weil immewr noch keine Problemzerlegung Funktionen, und getchar() am Ende.

    Was meinst du mit den Schleifen die "lügen"?

    Bin noch Anfänger in C bzw. allgemein Programmieren...



  • Kopierter Code ist scheiß Code.
    VLA benutzen nur Deppen.



  • Wutz schrieb:

    Kopierter Code ist scheiß Code.
    VLA benutzen nur Deppen.

    Was kopierter Code?


  • Mod

    Max Mustermannnn schrieb:

    Wutz schrieb:

    Kopierter Code ist scheiß Code.
    VLA benutzen nur Deppen.

    Was kopierter Code?

    Zwei Aspekte am Codekopieren sind "scheiße":
    1. Code von anderen Leuten zu kopieren ohne ihn zu verstehen. Hast du hier vermutlich nicht gemacht, aber komm lieber auch nicht auf die Idee, das später irgendwo zu machen.
    2. In einer Idealvorstellung kommen in einem Programm keine zwei Zeilen vor, die sich auch nur ähnlich sehen. Wenn jemand sein Programm per Copy&Paste zusammensetzt - was du hier offensichtlich getan hast - dann ist das das komplette Gegenteil. Das zeigt, dass du nicht die nötigen Abstraktionen durchgeführt hast, die für gute Programmierung nötig wären¹.

    ¹: Ja, du bist Anfänger, das entschuldigt deine mangelnde Fähigkeit dazu. Das ändert aber nichts am Fakt, dass das so ist.



  • Hab jetzt nicht die Möglichkeiten, das nachzuvollziehen, aber was passiert wohl, wenn ich '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" oder 'D' oder sowas eingebe?



  • SeppJ schrieb:

    Max Mustermannnn schrieb:

    Wutz schrieb:

    Kopierter Code ist scheiß Code.
    VLA benutzen nur Deppen.

    Was kopierter Code?

    Zwei Aspekte am Codekopieren sind "scheiße":
    1. Code von anderen Leuten zu kopieren ohne ihn zu verstehen. Hast du hier vermutlich nicht gemacht, aber komm lieber auch nicht auf die Idee, das später irgendwo zu machen.
    2. In einer Idealvorstellung kommen in einem Programm keine zwei Zeilen vor, die sich auch nur ähnlich sehen. Wenn jemand sein Programm per Copy&Paste zusammensetzt - was du hier offensichtlich getan hast - dann ist das das komplette Gegenteil. Das zeigt, dass du nicht die nötigen Abstraktionen durchgeführt hast, die für gute Programmierung nötig wären¹.

    ¹: Ja, du bist Anfänger, das entschuldigt deine mangelnde Fähigkeit dazu. Das ändert aber nichts am Fakt, dass das so ist.

    Kopiert hab ich hier gar nichts^^.

    Hab den bis zu den Schleifen auch alles selbst geschrieben, aber ab da hat mir dann der Lehrer sehr geholfen.

    Bei der Eingabe häng ich jetzt eben rum, da ich nicht wirklich weiß, wie ich da mit Schleifen arbeiten kann..



  • EOP-... schrieb:

    Hab jetzt nicht die Möglichkeiten, das nachzuvollziehen, aber was passiert wohl, wenn ich '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" oder 'D' oder sowas eingebe?

    Meinst du in einer Zeile die ganzen 1en eingeben?

    Das würde nicht funktionieren, da man pro Zeile nur 9 Ziffern eingeben kann.



  • Max Mustermannnn schrieb:

    Das würde nicht funktionieren, da man pro Zeile nur 9 Ziffern eingeben kann.

    Nein.
    scanf liest bei %d Dezimalzahlen ein.
    Die können durchaus aus mehreren Ziffern bestehen.

    Aber eine fehlerhafte Eingabe sollte erstmal nicht dein Problem sein.



  • DirkB schrieb:

    Max Mustermannnn schrieb:

    Das würde nicht funktionieren, da man pro Zeile nur 9 Ziffern eingeben kann.

    Nein.
    scanf liest bei %d Dezimalzahlen ein.
    Die können durchaus aus mehreren Ziffern bestehen.

    Aber eine fehlerhafte Eingabe sollte erstmal nicht dein Problem sein.

    Mein Problem ist ja nur, dass ich das Programm immer ein wenig umschreiben muss, bevor ich z.B von einem 3x3 Quadrat auf ein 9x9 Quadrat wechsle.



  • DirkB schrieb:

    Schleifen.
    Schon für die Zeilen hättest du eine Schleife nehmen müssen.
    Dann kannst du dadrin auch noch eine Schleife für die einzelnen Werte machen.



  • Wie DirkB schon geschrieben hat. Du hast den Code für deine Eingabe praktisch vor der Nase:

    for (j = 0; j<dim; j++) 
      { 
        int summe = 0; 
        int i = 0; 
       // i-te Zeile 
        for (i = 0; i<dim; i++) 
          summe = summe + quadrat [i][j]; 
        spaltensumme [j] = summe; 
      }
    

    ^^^^ Das hast du im Code selbst. Das heißt, du musst ja wissen, dass du durch alle indices durchgehst. Warum nicht so deine Eingaben abfragen?



  • Bierkorken schrieb:

    Wie DirkB schon geschrieben hat. Du hast den Code für deine Eingabe praktisch vor der Nase:

    for (j = 0; j<dim; j++) 
      { 
        int summe = 0; 
        int i = 0; 
       // i-te Zeile 
        for (i = 0; i<dim; i++) 
          summe = summe + quadrat [i][j]; 
        spaltensumme [j] = summe; 
      }
    

    ^^^^ Das hast du im Code selbst. Das heißt, du musst ja wissen, dass du durch alle indices durchgehst. Warum nicht so deine Eingaben abfragen?

    Was muss ich dann mit den ganzen Eingabefenster machen?

    Weiß nicht wirklich, wie ich da anfangen soll...


Anmelden zum Antworten