Kleines C-Programm schreiben - Hilfe



  • 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.



  • wie kommt er aber dann auf j == -1 ?



  • Im Kopf der while-Schleife darüber wird j postdekrementiert. Wenn

    while(j--)
    

    mit j == 0 erreicht wird, wird die Schleife abgebrochen und j um 1 dekrementiert. Danach ist j == -1.



  • seldon schrieb:

    Im Kopf der while-Schleife darüber wird j postdekrementiert. Wenn

    while(j--)
    

    mit j == 0 erreicht wird, wird die Schleife abgebrochen und j um 1 dekrementiert. Danach ist j == -1.

    Ahh jetzt 😃 Danke dir 👍

    Ich bin davon ausgegangen, dass wenn die Schleife abgebrochen wird er auch nicht dekrementiert... 🙄


Anmelden zum Antworten