Kleines C-Programm schreiben - Hilfe
-
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
-
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
Das glaube ich dir sofort.
Diese Tatsache stelle ich Woche für Woche fest, wenn der Prof seine Lösung(en) vorstellt
-
Boshaftigkeit erwünscht, was? In dem Fall kann man das auch mit einem printf erschlagen:
#include <stdio.h> int main(int argc, char *argv[]) { int i, j, x = 6; for(i = 0; i <= x; ++i) { for(j = 0; j <= i; ++j) { printf(i == j ? "%d\n" : "%d", j != 0 ? j : i); } } return 0; }
...und wenn man wirklich Amokläufe bei Kollegen provozieren will, geht es auch mit einer Schleife:
#include <stdio.h> int main(int argc, char *argv[]) { int i, j, x = 6; for(i = 0, j = 0; i <= x; i == j ? ++i, j = 0 : ++j) { printf(i == j ? "%d\n" : "%d", j != 0 ? j : i); } return 0; }
Code dieser Art ist übrigens ein wunderbares Anschauungsbeispiel dafür, dass Cleverness mitunter ein großes Laster sein kann. Es ist gut, zu verstehen, wie solcher Unfug funktioniert, aber wenn man ernsthaft anfängt, so zu programmieren, fliegt einem der eigene Code irgendwann um die Ohren - womöglich noch bevor jemand anders ihn entdeckt und einem den Kopf dafür abreißt.
Worauf ich hinaus will: In der Kürze liegt Würze, aber die relevante Definition von "Kürze" ist komplexer als "je weniger Zeilenumbrüche, desto besser". Der Trick mit der einzelnen Schleife oben ist beispielsweise logisch äquivalent zu zwei geschachtelten Schleifen; sie sind lediglich in einem Schleifenkopf verklausuliert. Ich habe den eigentlichen Algorithmus nicht verkürzt, sondern bloß eine kürzere Schreibweise gefunden - und wenn man nicht gerade der Ansicht ist, dass Romane sich am besten in Steno lesen, dürfte man darin eher einen Nachteil erkennen.
-
Moin zusammen,
könnte mal bitte jmd kurz folgendes Programm durch seinen Compiler jagen und mir sagen, was er ausgibt?
Bei mir kommt immer eine Art "externer Link-Fehler" oder so etwas ähnliches. Das Programm müsste normal stimmen, habe es aus einem Buch abgetippt...#include <stdio.h> int main ( ) { int i,j; for (i=0;i<3;i++) { j=i/2; while (j--) printf(”i=%d j=%d\n”,i,j); do printf(”i=%d j=%d\n”,i,j); while (++j<i); } printf(”i=%d j=%d\n”,i,j); return 0; }
Danke
LG
-
D:\0Neue Programme\Hilfe\main.c||In function 'main':|
D:\0Neue Programme\Hilfe\main.c|8|error: stray '#' in program|
D:\0Neue Programme\Hilfe\main.c|8|error: expected ')' before ';' token|
D:\0Neue Programme\Hilfe\main.c|8|error: stray '#' in program|
D:\0Neue Programme\Hilfe\main.c|9|error: stray '\224' in program|
D:\0Neue Programme\Hilfe\main.c|9|error: expected expression before '%' token|
D:\0Neue Programme\Hilfe\main.c|9|error: stray '\' in program|
D:\0Neue Programme\Hilfe\main.c|9|error: stray '\224' in program|
D:\0Neue Programme\Hilfe\main.c|11|error: stray '\224' in program|
D:\0Neue Programme\Hilfe\main.c|11|error: expected expression before '%' token|
D:\0Neue Programme\Hilfe\main.c|11|error: stray '\' in program|
D:\0Neue Programme\Hilfe\main.c|11|error: stray '\224' in program|
D:\0Neue Programme\Hilfe\main.c|14|error: stray '\224' in program|
D:\0Neue Programme\Hilfe\main.c|14|error: expected expression before '%' token|
D:\0Neue Programme\Hilfe\main.c|14|error: stray '\' in program|
D:\0Neue Programme\Hilfe\main.c|14|error: stray '\224' in program|
||=== Build finished: 15 errors, 0 warnings ===|Ps lade die mal http://www.codeblocks.org/ runter das ist nen kostenloser compiler
-
Wenn ich die Eingabefehler richtig gefixt habe (” und ” -> "; − -> -), kommt dabei
i=0 j=-1 i=1 j=-1 i=1 j=0 i=2 j=0 i=2 j=-1 i=2 j=0 i=2 j=1 i=3 j=2
raus.
Mal wild geraten: Hast du den Code als neue Quellcodedatei einem bestehenden Projekt hinzugefügt? In dem Fall hättest du in zwei verschiedenen Dateien des Projektes eine main definiert, und der Linker wüsste am Ende nicht, welche er benutzen soll.
-
nein neues Projekt er lässt sich einfach nicht Compilern
es ligt einfach am zeichen satz den mein compiler nicht kennt
["] ist nun mal nicht [”]
-
jepp ganz genau...habe ganz normal, wie immer, ein neues Projekt angelegt...
danke euch beiden
// sry für die Tippfehler bzw. falschen Zeichen, da waren die Hände mal wieder schneller als der Kopf
-
nochmal kurz zu dem Programm...
die ersten 3 Ausgaben sind mir klar, aber dann:
i=2, dann berechnet er j=1 (i/2)...
dann geht er in die while-schleife, da j=1 und gibt, nachdem er j dekrementiert hat i=2 und j=0 aus.
Aber warum geht er jetzt laut Ausgabe (i=2 und j=-1) nochmals in die while-Schleife?
Ich dachte, sobald der Ausdruck der while-Schleife 0 ist wird diese nicht mehr ausgeführt und j ist ja 0, also dürfte er doch gar nicht mehr in diese Schleife gehn?!
-
Tut er nicht. Er geht in die do-while-Schleife direkt darunter.