Übung zu Zählschleifen: For-Schleife



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



  • @SeppJ: Leider darf ich nur eine if-Anweisung verwenden.

    @SG1: Der kleine Fehler liegt darin, dass x am Ende des Schleifendurchlaufs auf eins mehr gesetzt wird (x++), dadurch verschiebt sich der komplette Bereich, den ich bei der if-Anweisung vordefinieren muss, da bei 10 das x nochmal erhöht wird.



  • Dann schreib halt y < 10 statt y <= 10. Bei 10 willst Du ja nichtmehr erhöhen. (Analog vermutlich bei den anderen beiden Grenzen.)



  • Danke, das war hilfreich. Jetzt stimmt auf jeden Fall schonmal:

    12345678910987654321
    

    Geht dann jedoch leider weiter mit:

    0123456787654321-1
    

Anmelden zum Antworten