While Schleife



  • Zunächst einmal empfehle ich dir bessere Variablennamen. Anstatt N eventuell sowas wie maxRows oder anstatt j vielleicht cntRows.

    Weiterhin fällt mir auf, dass du j in deiner äußeren Schleife um 1 erhöhst und in der ersten inneren wieder heruntersetzt. j wird also IMMER kleiner N sein > Endlosschleife. Verwende hier lieber eine extra Variable.

    Auch in deiner 2. inneren while-Schleife veränderst du deinen Zeilenzähler.

    Die Berechnung, wieviel Sternchen gezeichnet werden, solltest du erledigen, bevor du in die 2. while-Schleife springst.

    Außerdem solltest du mal einen Schreibtischtest durchführen 🙂 und für jeden Durchlauf mal auf dem Blatt Papier die Variablen durch ihre Inhalte ersetzen,


  • Mod

    BasicMan01 schrieb:

    Zunächst einmal empfehle ich dir bessere Variablennamen. Anstatt N eventuell sowas wie maxRows oder anstatt j vielleicht cntRows.

    Darf ich Vokale kaufen? :p



  • übrigens kannst du

    j=j++;
    

    ganz einfach mit

    j++;
    

    abkürzen.

    Das solltest du dir auch angewöhnen und die Unterschiede zwischen

    j++;
    

    und

    ++j;
    

    verstehen.

    Solltest du wirklich mal einer anderen Variablen den Wert einer inkrementierten Variable zuweisen wollen gibt es nämlich einen Stolperstein.

    Beispiel:

    int eineZahl = 5;
    int nochEineZahl = 7;
    
    eineZahl = nochEineZahl++;
    
    printf("%i", eineZahl);
    

    Die Ausgabe dieses Schnipsels wäre 7!
    eineZahl bekommt nochEineZahl zugewiesen und danach erst wird nochEineZahl erhöht.

    Nun das andere Beispiel:

    int eineZahl = 5;
    int nochEineZahl = 7;
    
    eineZahl = ++nochEineZahl;
    
    printf("%i", eineZahl);
    

    Hier ist die Ausgabe 8. Weil das ++ nun vor nochEineZahl steht, wird diese Variable erhöht bevor sie eineZahl zugewiesen wird.

    Hoffe, ich hab mich verständlich ausgedrückt.

    das würde also nun bedeuten:

    j=j++;
    

    müsste bei dir eigentlich

    j=++j;
    

    heißen, und da ists wirklich besser gleich

    j++;
    

    zu schreiben.

    edit: ja ich weiß, viele cpp tags



  • SeppJ schrieb:

    BasicMan01 schrieb:

    Zunächst einmal empfehle ich dir bessere Variablennamen. Anstatt N eventuell sowas wie maxRows oder anstatt j vielleicht cntRows.

    Darf ich Vokale kaufen? :p

    😃 Wr brcht schn Vkl ... lls brbwrtt.



  • TheQ schrieb:

    int eineZahl = 5;
    int nochEineZahl = 7;
    eineZahl = nochEineZahl++;
    printf("%i", eineZahl);
    

    Die Ausgabe dieses Schnipsels wäre 12!

    ???
    Die Ausgabe wäre doch eher 7, mit eineZahl += nochEineZahl++; käme man auf die Ausgabe von 12.



  • #include<stdio.h>
    int main()
    {
    
    int N, i, j, x, y;
    
    N=3;
    i=N;
    j=0;
    
    while(j<=N){
           j++;
    
           while(x>0) {
                    printf(" ");
                    x=i-1;
                    }
    
                    while(y>0){
                             printf("*");
                             y=(2*(N-i)+1);
                             }
                             printf("\n");
                             i--;
                             }
    
    return 0;
    }
    

    ist das so nun besser?
    irgendwie funktioniert das Programm immernoch nicht.



  • TheQ hat da wohl ein "+" vergessen 🤡

    eineZahl += nochEineZahl++;
    // und
    eineZahl += ++nochEineZahl;
    


  • Du hast Recht. Denkkompillierung ist immer fehleranfällig. habs verbessert, danke

    @Aleph1:

    Ja, j++ ist nun richtig an der Stelle.



  • wenn ich das programm ausführe, werden nur leerzeichen angezeigt und das bis ins unendliche... ich weis aber nicht warum



  • @Aleph1 ... wieviele meiner Tipps konntest du erfolgreich umsetzen? 😃

    - x ist uninitialisiert (besitzt also keinen definierten Wert zu Beginn) >> vor die while-Schleife "x=i"
    - "x=i-1;" liefert immer das gleiche Ergebnis in deinem Fall >> "x--"
    - "y=(2*(N-i)+1);" solltest du eigentlich über die while-Schleife bringen
    - in die zweite gehört noch ein y--

    😃 ich habs genau gesehen, du hast keinen Schreibtischtest gemacht



  • Ich kann dir nur empfehlen, deine Wünsche in eine Funktion mit min. Parameteranzahl zu kapseln, z.B. brauchst du hier eigentlich nur die Höhe:

    void maleTurm(int h)
    {
      int i,j;
      for( i=0; puts(""),i<h ;++i)
        for( j=0; j<2*h && putchar(j>=h-i&&j<=h+i?'*':' ') ;++j);
    }
    

    Das wird übersichtlicher falls dein Programm mal mehr machen soll als genau eine Aufgabe.



  • Danke BasicMan01,

    nun habe ich folgenden code:

    #include<stdio.h>
    int main()
    {
    
    int N, i, j, x, y;
    
    N=3;
    i=N;
    j=0;
    
    while(j<=N){
           j++;
           x=i;
    
           while(x>=0) {
    
                    printf(" ");
                    x=--i;
                    }
                    y=i;
    
                    while(y<=0){
                             printf("*");
                             y=(2*(N-i)+1);
                             y--;
                             }
                             printf("\n");
                             i--;
                             }
    
    return 0;
    }
    

    Leider gibt er nur jeweils einen Stern pro Zeile aus und die Leerzeichen, die den Turm formen, fehlen, bis auf die an der Spitze des Turms.

    Woran könnte das liegen?

    @Wutz ich muss mich leider an dieses Konstrukt halten (vorgegeben) aber trotzdem danke.



  • Ich vermute an einer Leseschwäche, was die Tipps der anderen angehen 🤡 *scherz*

    ich selbst schrieb:

    - "x=i-1;" liefert immer das gleiche Ergebnis in deinem Fall >> "x--"
    - "y=(2*(N-i)+1);" solltest du eigentlich über die while-Schleife bringen

    Die 2 Sachen hast du aber nicht beherzigt.

    und wo kommt das y=i her 😃 ... und Schreibtischtest hast bestimmt auch noch keinen gemacht. Spätestens bei der nächsten Klassenarbeit wärst du dankbar 😉



  • #include<stdio.h>
    int main()
    {
    
    int N, i, j, x, y;
    
    N=3;
    i=N;
    j=0;
    
    while(j<=N){
           j++;
           x=i;
    
           while(x>=0) {
    
                    printf("%d",x);
                    x=--i;
                    }
    
                   y=(2*(N-i)+1);
    
                    while(y<=0){
                             printf("*");
    
                             y--;
                             }
                             printf("\n");
                             i--;
                             }
    
    return 0;
    }
    

    ist das so besser? wenn ich x=--i schreibe, sind die Ergebnisse ja 3,2,1,0.
    ist es so richtiger?



  • Mach doch aus "x=--i" einfach "x--" ... sonst würdest du ja i verändern.



  • vielen dank für die hilfe soweit:

    #include<stdio.h>
    int main()
    {
    
    int N, i, j, x, y;
    
    N=3;
    i=N;
    j=0;
    
    while(j<=N){
           j++;
           x=i;
    
           while(x>0) {
    
                    printf(" ");
                    x--;
                    }
    
                   y=(2*(N-i)+1);
    
                    while(y>0){
                             printf("*");
                            y--;
                             }
                             printf("\n");
                    i--;
                             }
    
    return 0;
    }
    

    soweit bin ich nun!
    ich habe jedoch ein problem! das programm gibt N+1 Zeilen für die Turmhöhe aus und nicht genau N also 3 zeilen.

    Woran liegt das?

    EDIT: Ist es ok, wenn ich aus while(y>0) -> while(y>N-1) mache?
    oder gibt es eine elegantere Lösung?



  • while(j<=N){
    
    0<=3 //1. Druchlauf
    1<=3 //2. Druchlauf
    2<=3 //3. Druchlauf
    3<=3 //4. Druchlauf
    

    Entferne einfach das = aus dem Schleifenkopf



  • Ahhh vielen, vielen Dank!

    Ich schulde dir nen Bier 😃


Anmelden zum Antworten