Frage zur For-Schleife



  • Nein, die Klammerung bewirkt nicht, dass zwei for-schleifen parallel ihren Wert ändern - dies ist nie der Fall. Das ist nur so erreichtbar, wie es Janjan gezeigt hat.
    Jede Schleife läuft ihren Bereich ab. In Deinem Beispiel wird spalte auf 0 gesetzt, die Bedingung den Folgeblock zu behandeln ist erfüllt, also geht es in diesem Block los - und dort ist die zweite Schleife. Gleiches nun hier, und auch für die dritte Schleife. spalte, m und n stehen also auf 0 wenn die += - Zuweisung das erste Mal behandelt wird. Soweit ist es Dir ja auch klar.

    Danach geht es in die n-loop zurück, und n wird erhöht. Da dieser Block aber noch nicht beendet wird, interessiert das die m-Schleife gar nicht. Hierhin wird erst zurückgesprungen, wenn n den Wert 3 erreicht hat, und aus diesem Grund die n-Schleife beendet wird. Damit ist dieser Block beendet und m wird inkrementiert.
    Es ist noch kleiner als 3, also wird der innere Block wieder ausgeführt, und n startet wieder mit 0.

    Die Reihenfolge ist folglich:

    spalte=0 m=0 n=0 Formel
                 n=1 Formel
                 n=2 Formel
                 n=3 Abbruch, keine Formel!
             m=1 n=0 Formel
                 n=1 Formel
                 n=2 Formel
                 n=3 Abbruch, keine Formel!
             m=2 n=0 Formel
                 n=1 Formel
                 n=2 Formel
                 n=3 Abbruch, keine Formel!
             m=3 Abbruch
    spalte=1 m=0 n=0 Formel
     ...
    spalte=2 m=2 n=3 Abbruch, keine Formel!
             m=3 Abbruch
    spalte=3 Abbruch
    es geht weiter nach diesem Bereich
    


  • Ok, danke, soweit ist mir das nun klar. Vielleicht stell ich mich ja auch nur sehr blöd an, aber dann bräuchte ich doch eigentlich nur 2 for-schleifen, oder?

    Und zwar so:

    for(spalte=0;spalte<3;spalte++)
       {
       for(m=0;m<3;m++)
         {
    	 MatD[0][spalte] += (MatB[0][m]*MatA[m][0]);  
         }
       }
    

    Für die 1. Spalte funktioniert das ganze auch, aber die 2. und 4. Spalte bringen Werte nahe der unendlichkeit, und für die 3. Spalte bekomme ich den selben wert wie für die 1. Spalte 😞
    Stell ich mich wirklich so dumm an, oder ist das für ein totalen anfänger wirklich keine so einfache sache? Das ist ein Grundkurs für C und wir sind jetzt in der 5. Woche, ich frage mich, wie ich jemals die Prüfung schaffen soll, wenn ich schon jetzt solche Probleme habe 😞

    gruß kenti



  • ok, ich sollte erst denken dann schreiben, eigentlich müsste ich für alle 4 spalten den selben wert rausbekommen mit der formel, oder? 🙂



  • for(spalte=0;spalte<3;spalte++)
       {
       for(m=0;m<3;m++)
         {
         MatD[0][spalte] += (MatB[0][m]*MatA[m][0]);  
         }
       }
    

    So soll das natürlich wenn schon denn schon aussehen, aber selbes Problem, die zweite und vierte spalte spinnen 😞
    Die erste und dritte spalte stimmen aber zumindest 🙂



  • und ich glaub ich geh besser wieder ins bett, jetzt bin ich sogar noch zu dumm um einfach copy&paste anzuwenden 😞 😞 😞 sorry vielmals für den spam

    for(spalte=0;spalte<3;spalte++)
    {
    for(m=0;m<3;m++)
    {
    MatD[0][spalte] += (MatB[0][m]*MatA[m][spalte]);
    }
    }



  • kenti schrieb:

    Ok, danke, soweit ist mir das nun klar. Vielleicht stell ich mich ja auch nur sehr blöd an, aber dann bräuchte ich doch eigentlich nur 2 for-schleifen, oder?

    Wie willst du dann die Zeilen der Ergebinsmatrix voll bekommen?

    Matrix A[4][3] = {0}, B[3][4] = {0}, C[4][4] = {0};
    	int i, j, k;
    	for ( i = 0; i < 4; i++ )
    		for ( j = 0; j < 3; j++ )
    			for ( k = 0; k < 4; k++ )
    				C[i][k] += A[i][j] * B[j][k];
    


  • Ja aber wie gesagt gings mir jetzt ja erstmal nur um eine einzelne Zeile, denn wenn ich schon die einzelne Zeile nicht hinbekomme, wie soll es dann mit der kompletten matrize funktionieren? 😉

    ok ich glaube mein cygwin ist defekt, funzt nun eigentlich alles so wie es soll, außer dass er bei ein paar einträgen werte nahe der unendlichkeit herholt, en kollege hats bei sich compiliert und es ging ganz normal, also muss da bei mir wohl iwas futsch sein 😞



  • kenti schrieb:

    und ich glaub ich geh besser wieder ins bett, jetzt bin ich sogar noch zu dumm um einfach copy&paste anzuwenden 😞 😞 😞 sorry vielmals für den spam

    for(spalte=0;spalte<3;spalte++)
    {
    for(m=0;m<3;m++)
    {
    MatD[0][spalte] += (MatB[0][m]*MatA[m][spalte]);
    }
    }

    Hier sind die Grenzen der Indizes falsch. Bei einer 3x4 bzw. 4x3 Matrix muss ein Index von 0 bis 2, der andere von 0 bis 3 laufen.

    kenti schrieb:

    ok ich glaube mein cygwin ist defekt,

    Das glaube ich nicht. :p



  • wiegeht das nu mit matrix 😕



  • ehm da bin ich mir aber sehr wohl sicher das mein cygwin nicht mehr geht, denn wieso sollte es beim kollegen das programm kompilieren und richtige werte ausspucken und bei mir kommen spanische werte?



  • kenti- schrieb:

    ehm da bin ich mir aber sehr wohl sicher das mein cygwin nicht mehr geht, denn wieso sollte es beim kollegen das programm kompilieren und richtige werte ausspucken und bei mir kommen spanische werte?

    Hat Spanien nicht auch das Dezimalsystem? 😕
    Und ok, wenn du sicher bist, das es an cygwin liegt, dann benutze etwas anderes.
    Ansonsten würde ich vorschlagen:
    Da i.d.R. eine Matrixmultiplikation nicht allzu viele Codezeilen beinhaltet, würde man vermutlich relativ schnell herausfinden, ob ein logischer oder ein anderer Fehler infrage kommt, wenn du die vollständige Multiplikation posten würdest.



  • wiegeht schrieb:

    wiegeht das nu mit matrix 😕

    So kanns gehen, Bruder, guckst du Code ganz unten:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-261615-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html
    Habe ich übrigens mit der Suchfunktion gefunden 😉



  • Hallo Community,
    ich stelle mir gerade die Frage, ob man Bedingung einer Schleife auch variabel halten kann oder muss ich dafür "else if" bzw. eine "case" Anweisung nehmen?
    Hab mir das ungefähr so gedacht: Es wird in einer If-schleife überprüft, ob etwas eintritt.

    Wenn ja, dann wird bedingung="x<y"; ausgegeben.
    Wenn nein, dann wird bedingung="x>y"; ausgegeben.
    Wobei bedingung z.B.

    char bedingung[4];
    

    Somit könnte man eine andere Schleife ansteuern:

    if (bedingung){...}
    

    Ist so etwas möglich?

    Gruß Dragon


Anmelden zum Antworten