Kleines C-Programm schreiben - Hilfe



  • Bedingung der ersten Schleife falsch, sollte lauten: i < max.



  • cooky451 schrieb:

    CStoll schrieb:

    vor der Schleife den Zeilenwechsel und die Zeilennummern.

    Das führt aber eher zu dieser Ausgabe:

    Ach, damit werde ich auch noch fertig 😃

    printf("%s%d",i?"\n":"",i);
    

    @Kaula: Du hast die Abbruchbedingung der äußeren Schleife versaut - das ist kein Vergleich, sondern eine Zuweisung.



  • Ok, also habe das jetzt mal umgeändert auf i<max - soweit stimmt jetzt auch alles 🙂

    Aber, i<max kann doch gar nicht sein oder?! Denn max ist ja 6 und bei i<max würde er ja nur von 0 bis 5 "durchlaufen" und somit fehlt die letzte Zeile "6123456" oder täusche ich mich irgendwo?

    // ok ok ok i<=max muss es heißen 😃

    danke euch für die schnelle Hilfe! 👍



  • Oder du setzt max auf 7... .. .. .



  • Würde natürlich auch gehen. Aber da es in der Aufgabe so vorgegeben ist, dass max 6 sein muss bleibt ja nur noch i<=max übrig...



  • 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^^ 🙄


Anmelden zum Antworten