Kleines C-Programm schreiben - Hilfe
-
Oder i < max+1
-
Wenn die Leerzeile am Anfang stört:
#include <stdio.h> int main(int argc, char *argv[]) { int x, i, j; if(argc < 2) return -1; x = atoi(argv[1]); for(i = 0; i <= x; ++i) { for(j = 0; j <= i; ++j) { printf("%d", j == 0 ? i : j); } /* Hier eigentlich eher putchar('\n'); */ printf("\n"); } return 0; }
-
bin jetzt gerade mal dabei den Aufgabenteil b) zu lösen und zwar soll dort die innere Schleife durch eine kopfgesteuerte Schleife ersetzt werden...
mein bisheriger Versuch sieht so aus:
while (i>0 && i<=max) { printf("%d", i++); }
Allerdings klappt das noch nicht richtig. Wie es theoretisch aussehen müsste ist mir bewusst. Mir fällt aber kein passender Ausdruck ein, wie ich das überprüfe, sodass er in Zeile 1 z.B. nach Ausgabe der 11 in die nächste Zeile geht und so weiter...Das i<=max ist irgendwie falsch an der Stelle dort?!
Jmd eine Idee?
-
Die innere Schleife war doch die for(j)-Schleife - sowas kann man recht meschanisch ineinander übersetzen.
Die for-Schleife
for(j=0;j<=i;++j) { mach was }
ist (fast) äquivalent zur while-Schleife
j=0; while(j<=i) { mach was ++j; }
-
Ist die Frage eigentlich C-spezifisch, oder eher so, wie man das ganze überhaupt in ein Programm hineinbekommt, also in diesem Falle eher selberdenkspezifisch?
-
danke dir! gut zu wissen, dass man den "Ausdruck", also j<=i, quasi übernehmen kann...
while(j<=i) { printf("%d",j); j++; }
jetzt fehlt mir quasi "nur" noch der innere Teil...Bei mir gibt er bisher immer nur folgendes aus:
0
11
22
33
44
55
66Was bedeuten würde, dass irgendetwas mit j beim hochzählen nicht wirklich stimmt...
-
nurkurz schrieb:
Ist die Frage eigentlich C-spezifisch, oder eher so, wie man das ganze überhaupt in ein Programm hineinbekommt, also in diesem Falle eher selberdenkspezifisch?
ich würde sagen c-spezifisch...denn ich soll es ja explizit in c schreiben und nicht z.B. in Java, was mir persönlich trotzdem lieber wär
-
Kaula schrieb:
Was bedeuten würde, dass irgendetwas mit j beim hochzählen nicht wirklich stimmt...
Das Hochzählen verläuft völlig richtig, du hast nur die Initialisierung der Schleife wegrationalisiert (beim for() der erste Ausdruck im Schleifenkopf, bei der äquivalenten while()-Schleife mußt du das vorher erledigen).
-
taadaaaaaaaaaa ich danke dir vielmals!
int main (){ int max=6; int i; for (i=0;i<=max;i++){ printf("\n%d", i); int j=1; while(j<=i) { printf("%d",j); j++; } } return 0; }
Ich hatte j bereits initialisiert mit 1. Allerdings habe ich dies ganz oben bei den anderen Variablen dazu geschrieben und dies führte zu der oben genannten Ausgabe
Heftig, dass nur durch die falsche Platzierung die komplette Ausgabe falsch wird
-
Kaula schrieb:
Ich hatte j bereits initialisiert mit 1. Allerdings habe ich dies ganz oben bei den anderen Variablen dazu geschrieben und dies führte zu der oben genannten Ausgabe
Heftig, dass nur durch die falsche Platzierung die komplette Ausgabe falsch wirdDu brauchst die Variable nicht neu definieren. Eine einfache Zuweisung hätte es auch getan.
So wie es CStoll in seiner Erklärung for -> while (kurz nach Mitternacht) schon gemacht hat.
Hätteste mal die Antwort in Ruhe durchgelesen.Es ist immer wieder erstaunlich, kaum macht man es richtig, funktioniert es.
-
Kaula schrieb:
bin jetzt gerade mal dabei den Aufgabenteil b) zu lösen und zwar soll dort die innere Schleife durch eine kopfgesteuerte Schleife ersetzt werden...
[...]
Jmd eine Idee?Die innere Schleife ist doch bereits, ebenso wie die äußere, kopfgesteuert
-
Belli schrieb:
Kaula schrieb:
bin jetzt gerade mal dabei den Aufgabenteil b) zu lösen und zwar soll dort die innere Schleife durch eine kopfgesteuerte Schleife ersetzt werden...
[...]
Jmd eine Idee?Die innere Schleife ist doch bereits, ebenso wie die äußere, kopfgesteuert
nee waren zwei zählergesteuerte Schleifen...
ja da hast du recht...ich nehm einfach mal die Uhrzeit als Entschuldigung für mein ungenaues lesen
-
Kaula schrieb:
nee waren zwei zählergesteuerte Schleifen...
So was gibt es in C nicht.
Kann man aber "nachbauen".
-
DirkB schrieb:
Kaula schrieb:
nee waren zwei zählergesteuerte Schleifen...
So was gibt es in C nicht.
Kann man aber "nachbauen".Und die For-Schleife ist nicht zählergesteuert oder was?
-
ok ok, bin ja schon ruhig
Steht bei uns halt so im Skript (bzw. Buch vom Prof), dass es die drei Schleifenarten (zähler-,kopf-, und fußgesteuert) gibt. Aber naja das Skript/Buch ist nicht wirklich der Burner, was man auch bei den Rezessionen auf Amazon feststellt^^
-
m,.m,. schrieb:
Und die For-Schleife ist nicht zählergesteuert oder was?
Kann man machen, muss man aber nicht.
Kaula schrieb:
Steht bei uns halt so im Skript (bzw. Buch vom Prof), dass es die drei Schleifenarten (zähler-,kopf-, und fußgesteuert) gibt.
Da wird dann aber auch behauptet, dass die For-Schleife Zählergesteuert ist.
Nur ist das in C ein wenig anders als z.B. in Pascal oder Basic, wo du mit FOR nur zählen kannst.
-
So, habe mich jetzt noch einmal dran versucht, die innere for() Schleife durch eine fußgesteuerte Schleife zu ersetzen.
Ist mir soweit auch gelungen - also die Bildschirmausgabe stimmt soweitJetzt allerdings meine Frage, gibt es für die "if-else-Methode" eine elegantere Variante? Denn ohne if-else würde die 1.Zeile "01" lauten und nicht "0" wie es sein sollte...
Hier mein Code:
#include <stdio.h> int main(){ int max=6; int i,j; for (i=0;i<=max;i++){ printf("\n%d",i); j=1; do { if(j==1 && i==0){ j++; } else printf("%d",j); j++; } while (j<=i); } return 0; }
LG
-
Du kannst die if-Bedingung negieren und da das printf dann ausführen.
Das spart zumindest den else-Zweig.Das der Schleifenkörper mindestens einmal durchlaufen wird ist nun mal eine Eigenschaft einer "fußgesteuerten Schleife".
-
Ok, dann werde ich die if-Bedingung noch negieren, um die Code-Zeilen etwas zu kürzen...unser Prof will nämlich immer so wenig Code wie möglich
Danke dir!
-
Kaula schrieb:
Ok, dann werde ich die if-Bedingung noch negieren, um die Code-Zeilen etwas zu kürzen...unser Prof will nämlich immer so wenig Code wie möglich
Wenn es dir nur um kurzen Code geht, lässt sich der Code sicher noch um einiges zusammenkürzen Die Frage ist, ob du das Endergebnis dann noch wiedererkennst