Übung zu Zählschleifen: For-Schleife



  • Grüß Gott alle mit'anand.

    Ich sitze jetzt schon 4 geschlagene Stunden an folgender Aufgabe:

    "Schreiben Sie ein Programm welches mit 1 beginnend zu 10 hoch zählt, dann wieder zu 1 herunter zählt und erneut zu 10 hoch zählt, um anschließend wieder zu 1 herunter zu zählen. Die Ausgabe sieht dann so aus: 12345678910987654321
    2345678910987654321. Es darf nur eine for-Schleife und eine if-Anweisung verwendet werden."

    Leider bekomme ich es noch nichtmal hin von 1 auf 10 und wieder zurück auf 1 zählen zu lassen.

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int x,y;
        for(x=1,y=9;x<=10,y>=1;x++,y--)
        {
            printf("%4d\n", x);
            printf("%4d", y);
        }
        printf("\n");
        system("pause>0");
        return 0;
    }
    

    Dass es so nicht funktioniert ist mir bewusst, aber nach stundenlangem Rumprobieren ist das alles, was ich zu stande gebracht habe.

    Ich hoffe auf eure Hilfe. Danke.

    MfG,

    fright



  • Schon mal 4 Schleifen probiert?



  • es heisst ja es solle nur eine forschleife verwendet werden...

    wie sieht es mit rekursion aus? hilfsvariabeln darfst du wohl verwenden oder?



  • Dämliche Aufgabenstellungen erledigt man mit dämlichen Lösungen.

    #include <stdio.h>
    
    int main(void) {
        int i;
        int nums = {1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1};
        for (i=0; i<37; i++) {
            printf("%4d\n", nums[i]);
        }
        return 0;
    }
    

    Fordere einen Extrapunkt ein, weil du das if gespart hast.

    Ehrlich, wer kommt auf solche Aufgaben 🙄



  • Tim schrieb:

    Ehrlich, wer kommt auf solche Aufgaben 🙄

    Die Frage ist berechtigt xD

    ach ja noch was zur rekursion, so als tipp:

    i-=-1 == i++;
    i-=1 == i--;

    also würd ich halt mal sagen =b



  • Vielen Dank für eure Antworten und die tolle Lösung.

    Dummerweise hatten wir das hier noch nicht:

    int nums = {1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1};
    

    Und ehrlich gesagt weiß ich weder was das ist, noch wie man sowas verwendet.

    Dazu kommt, wenn ich versuche den Quellcode so, wie du ihn geschrieben hast in der Dev-C++ IDE zu compililieren, bringt der mir haufenweise Fehler:

    [Warning] excess elements in scalar initializer  
    [Warning] (near initialization for `nums') 
    subscripted value is neither array nor pointer
    

    Die oberen zwei wiederholen sich scheinbar 37 Mal.

    Weiß jemand woran das liegt?



  • so, habs jetzt mal ausprobiert (hab gepostet bevor ich mir überhaupt die mühe
    gemacht habe darüber nachzudenken, obs überhaupt funktioniert xD)...

    #include <stdio.h>
    #include <conio.h>
    
    void zaehle(int var, int lv, int anz);
    
    int main(){
    
    	zaehle(-1, 1, 0);
    	printf("1");
    	getch();
    
    	return 0;
    }
    
    void zaehle(int var, int lv, int anz){
    
    	int i=lv;
    	int j;
    
    	for(j=0; j<9; j++){
    		printf("%d ", i);
    		i-=var;
    	}
    
    	if(++anz < 4)
    		zaehle(var*(-1),i,anz);
    }
    

    ich habs ein paar mal durchgerechnet, aber irgendwie will das nich wirklich,
    konnte es drehen wie ich es wollte, musste aber immer am schluss ne 1 ansetzen im main... naja... is zwar nich ganz richtig, aber immerhin ein ansatz =b



  • fright schrieb:

    Vielen Dank für eure Antworten und die tolle Lösung.

    Dummerweise hatten wir das hier noch nicht:

    int nums = {1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1};
    

    Und ehrlich gesagt weiß ich weder was das ist, noch wie man sowas verwendet.

    Dazu kommt, wenn ich versuche den Quellcode so, wie du ihn geschrieben hast in der Dev-C++ IDE zu compililieren, bringt der mir haufenweise Fehler:

    [Warning] excess elements in scalar initializer  
    [Warning] (near initialization for `nums') 
    subscripted value is neither array nor pointer
    

    Die oberen zwei wiederholen sich scheinbar 37 Mal.

    Weiß jemand woran das liegt?

    so:

    int nums[] = {1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1};
    


  • Mach mal eine Schleife, die von 1 bis 37 hochzählt. Dann musst Du "nur noch" aus dem Wert der Schleifenvariable den richtigen Ausgabewert berechnen. Kennt ihr schon den Modulo-Operator % ?



  • hmmm... an den hab ich ja gar nich gedacht xD
    müsste auch gehen, aber das kann er sich jetzt selber berechnen lassen xD



  • Vielen Dank, dass du dir so viel Mühe gegeben hast itedvo.

    Leider ist das viel zu kompliziert und ich verstehe bis auf die Präprozessorbefehle, den Variablen, der if-Anweisung und der for-Schleife garnichts.

    Ich kann ausschließlich mit folgendem Grundgerüst arbeiten:

    #include <stdlib.h>
    #include <stdio.h>
    
    int main() 
    {
        //Variablen
        //for-Schleife
        //if-Anweisung
        system("pause");   
        return 0;
    }
    

    Unsere Lehrerin hat leider Mathe und Physik studiert und daher immer solche, ihrer Ansicht nach, witzigen Aufgaben, die sie uns stellt.

    PS: Modulo kenne ich bereits, aber hätte keinen blassen Schimmer, wie ich den hier einsetzten sollte.



  • sag doch gleich das deine professorin hauptsächlich mathe und physik unterrichtet xD

    naja, die zahlenreihe 12345678910987654321 ist also etwas mathematisches...
    von der physik her sagt mir diese reihe gar nichts... was mathe betrifft, da
    hab ich erst vor einem jahr mal was in der richtung gehört.

    es hat irgendwas damit zu tun, dass man aus der hälfte der dritten geraden zahl
    + 1 die zahl danach finden kann...

    hmmm, das wär dann 6, die hälfte 3... 3 + 1 = 4, davon die hälfte + 3 + 1 = 6

    falsch, endlosschleife... ich such mal in google =b

    [edit]: google spuckt wie immer einen haufen quatsch aus, nur ein beitrag aus
    einem englischen mathematik pdf dokument hat mich auf was gebracht: frequencen

    aber noch was:

    000010000
    000212000
    003212300
    043212340

    usw.

    auf was kommste wennst das siehst?



  • Dann schreib doch erstmal hin, was ich dir vorhin gesagt hab. edit: Vielleicht besser eine Schleife, die von 0 bis 36 zählt.

    Dann überleg Dir folgendes. Du hast 4 Bereiche. Hochzählen, Runterzählen, wieder hochzählen, wieder runterzählen. Wie prüfst Du, in welchem Bereich Du bist?



  • @itedvo: viel zu kompliziert.



  • @SG1: ich würds ja gerne anders machen, mit ner verschachtelten schleife wärs
    einfach =b



  • Ihr seid echt großartig, danke eurer hilfe habe ich es _fast_ geschafft:

    #include <stdlib.h>
    #include <stdio.h>
    
    int main() 
    {
        int x = 1, y;
        for(y=1;y<=37;y++)
        {
            if(y<=10 || y>=19 && y<=28)
            {
                printf("%d",x);
                x++;
            }
            else
            {
                printf("%d",x);    
                x--;
            }
        }
        system("pause");   
        return 0;
    }
    

    Jetzt muss ich nur noch einen kleinen Fehler ausmerzen, von dem ich leider noch nicht die leisteste Ahnung habe, woher er kommt.

    Aber trotzdem schonmal vielen herzlichen Dank. 😉



  • hmm, auch ne nice idee =b



  • Das sieht doch schonmal gut aus. Was ist denn der kleine Fehler?


  • Mod

    Anstatt einer komplizierten Funktion schlage ich ein paar gut gewählte if s vor:

    #include <stdlib.h>
    #include <stdio.h>
    
    int main()
    {
      int i;
      for(i=1; i<=37; ++i)
        {
          int zahl;
          if(i<10) zahl=i;
          else if(i<20) zahl = 20-i;
          else if(i<29) zahl = i - 18;
          else zahl=38-i;
          printf("%d",zahl);
        }
      putchar('\n');
      return 0;
    }
    

    Manchmal geht Entwicklungszeit eben vor Eleganz. Wobei eine geschlossene Funktion vermutlich auch nicht mehr elegant aussehen würde.

    edit: Da war meine Entwicklungszeit wohl höher als die des Threaderstellers 😃



  • SeppJ schrieb:

    Anstatt einer komplizierten Funktion schlage ich ein paar gut gewählte if s vor:

    Erfüllt aber nicht die Aufgabenstellung. Ist idiotisch... aber Schule.


Anmelden zum Antworten