Quadrat erstellen, mit Zeilensumme/Kontrolle



  • Ich würde gern ein magisches Quadrat erstellen (z.B. 4x4 Felder, Zeilensumme=Spaltensumme=Diagonale summe).

    Das Programm soll einfach alle Felder füllen und danach prüfen ob die Bedingung (magisches Quadrat) erfüllt ist, wenn ja, Ausgabe, wenn nein Wiederholung.

    Kannst du mir dabei helfen?

    Ich kann das nicht einschätzen, und würde mich über ein Beispiel freuen.

    edit: es geht mir primär um die Frage/begriff:

    a)Wie kann ich definieren das der PC sich ein nxn Feld vorstellt (n wird eingegeben)

    b) Wie lautet der Begriff/Befehl, dass diese virtuellen Felder automatisch mit Zufalls- Zahlen gefüllt werden.

    c) dieses vorgestellte Feld müsste ausgegeben werden also printf(?)

    Ich brauch nur einen Begriff oder Beispiel

    gebe Feldgröße ein (printf+scanf soviel ist mir klar)
    erstelle Feld (?)
    Fülle alle Felder mit Zufalls-Zahlen ? (evtl. Begrenzung der Zahlenhöhe)
    überprüfe Zeilensumme/Spaltensumme/Diagonale
    wenn Z=S=D, dann printf, sonst Wiederholung

    danke



  • also ein pseudocode müsste nach meiner Recherche in etwas so aussehen, nur ich kann es nicht umsetzen/zuordnen:

    {
    if (IsSquareFilled(...))
    {
    if (IsMagic(...))
    {
    // Ausgeben und abbrechen
    }
    }
    else
    {
    /* Nummern durchlaufen, die gesetzt werden können
    */ Also noch nicht verwendet sind
    for (...)
    {
    // Element in Quadrat an currentPos schreiben

    // Rekursiver Aufruf
    Create(currentPos, ...)

    // Element an currentPos aus Quadrat löschen
    }
    }
    }



  • Hast du denn schon die Anfängerprogramme
    - "Hallo Welt!" ausgaben
    - Mehrmals "Hallo Welt!" in einer Schleife ausgaben
    - Anzahl Zeichen zählen und ausgeben.
    - Würfel simulieren

    programmiert?

    Du bist auch ein bisschen spät dran, denn das Thema hatten wir hier schon.



  • cneu schrieb:

    gebe Feldgröße ein (printf+scanf soviel ist mir klar)
    erstelle Feld (?)
    Fülle alle Felder mit Zufalls-Zahlen ? (evtl. Begrenzung der Zahlenhöhe)
    überprüfe Zeilensumme/Spaltensumme/Diagonale
    wenn Z=S=D, dann printf, sonst Wiederholung
    danke

    du benötigst die funktionen malloc/(calloc), free, rand, srand.
    mit malloc erstellst du das feld, dessen zellen(felder) kannst du dann per koordinaten adressieren und somit die spalten-/zeilen-/diagonalsummen berechnen.
    die adressierung per koordinaten funktioniert so: feld[y*anzahl_spalten*x];
    0 <= x < anzahl_spalten, 0 <= y < anzahl_zeilen.

    erzeugung des feldes:

    int* feld = malloc ( anzahl_spalten*anzahl_zeilen*sizeof(int));
    


  • ich habe das bis jetzt so

    #include <stdio.h>
    //#include <windows.h>
    #include <time.h>
    //#define MAX
    
    void main()
    {	int  max;
    	scanf("%d",&max);
        int feld[max][max]={0};
        int k,i,j,a;
    
        srand(time(0)); 
    
            k=1;
            for(i=0;i<max;i++)
            {
                for(j=0;j<max;j++)
                {
                    feld[i][j]=rand() % 1000 + 0;
    
                    printf("Nr.%2i:\t%2i\n",k,feld[i][j]);
    
                    k++;
                }
            }
    }
    

    Allerdings bekomme ich die variable Größe (max) nicht eingelesen?
    Wo ist der Fehler?

    Jetzt hab ich zumindest mal die Funktion für Zufallszahlen angewendet,
    jetzt brauche ich noch die Erzeugung der Zeilen/Spaltensumme; das bekomm ich aber nicht hin.

    Wenn ihr mir da noch helfen könntet 🤡



  • Die Zeilensumme bekommst du wie bei deinem füllen.
    i für die Zeilen, j für die Spalten.
    Rechtzeitig die Zeilensumme auf 0 setzen und uin der inneren Schleife dann addieren.

    Müssen nicht die Zahlen von 1 bis max*max in dem Quadrat verteilt werden?
    Irgendwo stand auch was von Rekursion.



  • Müssen nicht die Zahlen von 1 bis max*max in dem Quadrat verteilt werden?

    stimmt, das hab ich korrigiert

    #include <stdio.h>
    #include <time.h>
    
    void main()
    {	int  max;
    	printf("Bitte geben Sie die Groesse ein:");
    	scanf("%d",&max);
        int feld[max][max];
        int k,i,j;
    
        srand(time(0));
    
            k=1;
            for(i=0;i<max;i++)
            {
                for(j=0;j<max;j++)
                {
                    feld[i][j]=rand() % max*max;
    
                    printf("Nr.%2i:\t%2i\n",k,feld[i][j]);
    
                    k++;
                }
            }
    }
    

    irgendwo stand auch was von Rekursion

    ich muss jetzt erstmal versuchen die Summe jeder Zeile zu bilden und zu vergleichen, das selbe mit der Spaltensumme. Wenn die Summe gleich ist \dann Ausgabe , sonst Wiederholen, solange bis es zutrifft. Diese Wiederholung, hab ich gedacht, nennt man Rekursion.

    Bzw. es ist doch eigentlich eine Schleife, aber ich seh da keinen Unterschied im Ergebnis.

    Rechtzeitig die Zeilensumme auf 0 setzen und uin der inneren Schleife dann addieren.

    das versteh ich noch nicht



  • Jetzt bekommst du ZAhlen zwischen 0 und maxmax-1. Davon können auch welche doppelt vorkommen und manche gar nicht.
    Füll erstmal von 1 bis max
    max du musst ja sowieso tauschen.

    Hast du das ganz schon mal mit einem Blatt Papier und einem Taschenrechner durchgespielt?
    - Du musst die Anzeige vom Rechner löschen.
    - Du gehst zum ersten Feld
    - + Du addierst du das Feld
    - + Dann gehst du ein Feld weiter (Spalte)
    - + Wiederholen bis du beim Letzten Felde bist.
    - Ergebnis-Taste drücken.

    Dann geht es weiter zur nächsten Zeile

    Rekursion ist, wenn sich eine Funktion selber aufruft.


Anmelden zum Antworten