While Schleife
-
Hallo allerseits,
ich bin gerade dabei C zu lernen und habe eine Aufgabe, die mir Kopfzerbrechen bereitet. Sie lautet wie folgt:
- Schreibe ein Programm, welches einen Turm variabler Höhe, wie im Bild unten für N=3 dargestellt am Bildschirm ausgibt:
---*
--***
-*****Das "-" soll Leerzeichen simulieren.
Ich habe hier folgenden Code (teilweise gegeben) und muss Anhand diesen Codes, das Programm schreiben.
Anbei sind noch folgende Infos gegeben:
Die äußere while-Schleife soll nach einem Durchlauf genau eine Zeile des Turms produzieren. Dafür umfasst sie zwei innere while-Schleifen, von denen die erste
nach vollem Ablauf genau i-1 Leerzeichen ausgeben soll.
Die zweite while-Schleife soll jeweils 2(N-i)+1 Sternzeichen ausgeben. Es sollen N Zeilen ausgegeben werden.Nun zu dem Code bzw. meinem Ansatz (der aber leider nicht funzt):
#include<stdio.h> int main() { int N, i, j; N=3; i=N; while(j<=N){ j=j++; while(i-1>0) { printf(" ",j); j=i-1; } while(j>0){ printf("*",j); j=(2*(N-i)+1); } printf("\n"); i=i++; } return 0; }
Ich hatte mir gedacht, solange j kleiner als N, wiederhole bis j=N.
Ich würde mich sehr freuen, wenn man mich auf meine Fehler hinweisen würde, da ich es wirklich lernen möchte.
vielen dank
-
Denk mal darüber nach, welchen Wert j wohl in Zeile 10 hat.
Außerdem: Compiliere als Anfänger immer mit vollen Warnoptionen. Mein Compiler meldet dir folgende weitere potentielle Fehler (von denen ich als Mensch dir bestätigen kann, dass es echte Fehler sind):
test.c:11: warning: operation on ‘j’ may be undefined test.c:15: warning: too many arguments for format test.c:21: warning: too many arguments for format test.c:25: warning: operation on ‘i’ may be undefined
Die 11 und 25 sind falsche Vorstellungen davon, was j++ macht. Informier dich darüber mal selbstständig, dann dürfte dir klar werden, wie man eine Zahl um 1 erhöht. Bei den Zeilen 15 und 21 weiß ich nicht, was du dir überhaupt dabei gedacht hast, daher kann ich es schwerlich verbessern. Ich hätte einfach nur ein "*" oder ein " " ausgegeben, was das j und das i dort zu suchen haben versteh ich nicht.
Funktionieren wird dein Programm danach aber immer noch nicht, denn wie sollen die beiden inneren Schleifen jemals verlassen werden? du prüfst Bedingungen für i bzw. j, aber i und j ändern in der Schleife ihre Werte nicht!
-
So ich habe nun folgenden code:
#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; }
Ich weis nicht, welche Bedingung ich für die inneren Schleifen sonst nehmen könnte als diese nun? Hättest du bitte einen Tip?
Danke soweit
-
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.