Kleines C-Programm schreiben - Hilfe



  • Moin zusammen,

    ich muss euch nochmal schnell "nerven" 😃

    Und zwar soll ich ein C-Programm schreiben mit folgender Bildschirmausgabe:

    0
    11
    212
    3123
    41234
    512345
    6123456
    

    Ich darf dabei allerdings nur 2 printf-Befehle verwenden ( eins für die Zahlenausgabe und eines für den Zeilenumbruch) und soll mit 2 zählergesteuerten Schleifen arbeiten. Außerdem soll das "Ende" des Programms, also die 6, variabel gehalten werden mit "int max=6;"

    Allerdings komme ich gerade bei dem Ausgeben der Zahlen nicht weiter 😞 Hier mein "Versuch" bis jetzt:

    #include <stdio.h>
    
    int main (){
        int max=6;
        int i,j;
    
        for (i=0;i<7;i++){
            for (j=0;j<=i;j++){
    
                 printf(???????);
    
                 printf("\n");
            }
        }
        return 0;
    }
    

    Hoffe mir kann da jmd weiterhelfen...Wäre klasse 👍

    MfG
    Kaula



  • Mit zwei printf() kannst du dich auch schon genug austoben - in der inneren Schleife gibst du die aufsteigenden Zahlenfolgen (am Ende "123456") aus, vor der Schleife den Zeilenwechsel und die Zeilennummern.



  • Du kannst zwischen den for ein printf("\n%d", i); machen.
    Und das i geht nicht bis 7 sondern bis max.



  • Danke euch beiden schon einmal für die Antwort 🙂

    Ach so, ja ich habe die andere 6 (also die ganz rechts unten gemeint) deswegen habe ich die Schleife bis <7 laufen lassen...ok erklärt einiges 😃



  • CStoll schrieb:

    vor der Schleife den Zeilenwechsel und die Zeilennummern.

    Das führt aber eher zu dieser Ausgabe:

    //leer
    0
    11
    212
    3123
    41234
    512345
    6123456
    

    Die einzig wahre Lösung muss also lauten:

    #include <stdio.h>
    
    int main()
    {
      printf("0\n"
             "11\n"
             "212\n"
             "3123\n"
             "41234\n"
             "512345\n"
             "6123456\n");
      return 0;
    }
    

    Sogar nur ein printf verwendet! 🙄



  • hmm, jetzt hänge ich gerade komplett^^

    jetzt gibt er die ganze Zeit in Dauerschleife 6123456 aus, was ja in der letzten Zeile auch richtig wäre 😃

    D.h. aber auch, dass irgendetwas mit meinem Schleifenabbruch nicht stimmt, denn sonst würde er ja irgendwann aufhören?! Und wieso fängt er nicht bei 0 an? sondern direkt bei 6 😕

    #include <stdio.h>
    
    int main (){
        int max=6;
        int i,j;
    
        for (i=0;i=max;i++){
    
    		printf("\n%d", i);
    
            for (j=1;j<=i;j++){
    
    			printf("%d", j);
    
            }
        }
        return 0;
    }
    

    // cooky451 auf den gedanke kam ich auch als aller erstes...allerdings hat mir die Vorgabe von 2 for-Schleifen dabei einen Strich durch die Rechnung gemacht 😃 😃



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


Log in to reply