Kleines C-Programm schreiben - Hilfe



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

    Was 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 wird 😮

    Du 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... 🙂

    @DirkB

    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? 😮



  • @DirkB

    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 soweit 🙂

    Jetzt 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


Anmelden zum Antworten