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
    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 😃


Anmelden zum Antworten