While Schleife
-
Ich habe mal deinen Code anders formatiert (eingerückt)
#include<stdio.h> int main() { int N, i, j; N=3; i=N; j=0; while(j<=N){ j=j+1; while(j>0) { printf(" "); j=i-1; } while(i<N){ printf("*"); j=(2*(N-i)+1); } printf("\n"); i=i+1; } return 0; }
Vielleicht kannst du jetzt besser erkennen dass in der while(i<N) Schleife das i gar nicht geändert wird.
P.S. Das Einrücken ist allerdings Geschmackssache. Ich persönlich schreibe die schließende Klammer in die gleiche Spalte in der auch der auch der Block beginnt (also unter das w von while). So kann man leichter sehen wo die } hingehört. Ist aber wie schon gesagt meine Sache.
-
Das j wird aber geändert oder?
Sollte die while(i<N) Schleife dann while(j<N) heissen?Oder was sollte man denn sonst nehmen?
-
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,
-
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, miteineZahl += 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
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 bringenDie 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