Frage zu for-Schleife



  • Folgende Aufgabe wurde gestellt:

    Schreiben Sie ein Programm, welches die Zahlen von 1-10 multipliziert und
    das Ergebnis ausgibt jedoch ohne dabei eine Form der Multiplikation (*, *=)
    zu benutzen.

    Meine Lösung:

    #include <iostream>
    
    int main ()
    {
    int a = 2, help = 0, u = 3;
    for (int i = 0;i < 8; ++i)
    {
    	for(int f = 0; f < u; ++f)
    	{
    	help += a;
    	}
    	a = help;
    	help = 0;
    	++u;
    }
    std::cout << a << std::endl;
    std::cin.get();
    return 0;
    }
    

    Der offizielle Lösungsvorschlag:

    #include <iostream>
    
    int main()
    {
    	int result = 1 ;
    	for (int i = 1; i <= 10; ++i)
    	{
    		int help = result;
    		for (int j = 1; j < i; ++j)
    		{
    			result += help;
    		}
    }
    std::cout << result << "\n";
    return 0;
    }
    

    Nun sehe ich, dass ich es umständlicher gelöst habe. Was würdet Ihr an meiner Stelle anders machen?



  • Den offiziellen Lösungsvorschlag verstehen und die Logik verinnerlichen?

    Ich verstehe deine Frage leider nicht.



  • Ich frage mich, wie man darauf kommen soll. Ich wäre nie von alleine auf diese Lösung gekommen...

    😕



  • Warum nicht einfacher (wenn es nur darum geht, keine Multiplikation zu benutzen):

    #include <iostream>
    
    int mult(int a, int b)
    {
        int tmp = 0;
        for(int i=0; i!=b; ++i)
            tmp+=a;
        return tmp;
    }
    
    int main()
    {
        int help = 1;
        for(int i=1 ; i<=10; ++i)
            help = mult(help, i);
        std::cout<<help;
    }
    


  • Da gibt es viele gute Lösungen.
    Zum Beispiel

    #include <iostream>
    
    int main()
    {
    	std::cout << 3628800 << "\n";
    }
    

    oder

    //Inspiriert durch Werner Solomon
    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <numeric>
    
    struct Thingy
    {
    	int x;
    	Thingy(int x)
    	:x(x)
    	{
    	}
    	Thingy& operator++()
    	{
    		++x;
    	}
    	friend bool operator!=(Thingy const& a,Thingy const& b)
    	{
    		return a.x!=b.x;
    	}
    	int operator*()
    	{
    		return x;
    	}
    };
    
    int main()
    {
    	std::cout << std::accumulate(Thingy(1), Thingy(10), 1, std::multiplies<int>()) << '\n';
    }
    

    oder

    #include <iostream>
    #include <cmath>
    
    int main()
    {
    	double f=0;
    	for(int i=1;i<=10;++i)
    		f+=log(i);
    	std::cout << int(exp(f)) << '\n';
    }
    

    Auf den offiziellen Lösungsweg wäre ich nicht so schnell gekommen. Aber hübsch ist er auch.



  • volkard schrieb:

    Da gibt es viele gute Lösungen.
    Zum Beispiel

    #include <iostream>
    
    int main()
    {
    	std::cout << 3628800 << "\n";
    }
    

    oder

    //Inspiriert durch Werner Solomon
    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <numeric>
    
    struct Thingy
    {
    	int x;
    	Thingy(int x)
    	:x(x)
    	{
    	}
    	Thingy& operator++()
    	{
    		++x;
    	}
    	friend bool operator!=(Thingy const& a,Thingy const& b)
    	{
    		return a.x!=b.x;
    	}
    	int operator*()
    	{
    		return x;
    	}
    };
    
    int main()
    {
    	std::cout << std::accumulate(Thingy(1), Thingy(10), 1, std::multiplies<int>()) << '\n';
    }
    

    oder

    #include <iostream>
    #include <cmath>
    
    int main()
    {
    	double f=0;
    	for(int i=1;i<=10;++i)
    		f+=log(i);
    	std::cout << int(exp(f)) << '\n';
    }
    

    Auf den offiziellen Lösungsweg wäre ich nicht so schnell gekommen. Aber hübsch ist er auch.

    Echt gemein! xD



  • Erscheint mir als saublöde Aufgabenstellung, mit der man nichts anfangen und mit der gefundenen Lösung nichts anderes lernen kann! 😡



  • berniebutt schrieb:

    Erscheint mir als saublöde Aufgabenstellung, mit der man nichts anfangen und mit der gefundenen Lösung nichts anderes lernen kann! 😡

    Das ist eine Aufgabenstellung die sehr oft verwendet wird, um for-loops zu "trainieren".

    Meiner Meinung nach ist das totaler Blödsinn, da der/die Lernende bloss verwirrt wird: "Wieso soll ich nicht einfach multiplizieren???"



  • oder der C++ Weg

    template<unsigned int A, unsigned int B> struct mult
    {
        static const unsigned int val = A+mult<A, B-1u>::val;
    };
    template<unsigned int A> struct mult<A, 0u>
    {
        static const unsigned int val = 0u;
    };
    template<unsigned int B> struct mult<0u, B>
    {
        static const unsigned int val = 0u;
    };
    template<> struct mult<0u,0u>
    {
        static const unsigned int val = 0u;
    };
    
    template<unsigned int A> struct add_multiplicated_numbers
    {
        static const unsigned int val = mult<add_multiplicated_numbers<A-1>::val, A>::val;
    };
    template<> struct add_multiplicated_numbers<0u>
    {
        static const unsigned int val = 1u;
    };
    
    #include <iostream>
    int main()
    {
        std::cout<<add_multiplicated_numbers<10>::val;
        std::cin.get();
    }
    


  • Was habt ihr gegen die Aufgabenstellung? Es ist ein einfaches Problem, zu dem ein einfacher Algorithmus gefunden werden soll. Das find ich gut, um Programmieranfängern die nötige Denkweise näherzubringen.



  • Michael E. schrieb:

    Was habt ihr gegen die Aufgabenstellung? Es ist ein einfaches Problem, zu dem ein einfacher Algorithmus gefunden werden soll. Das find ich gut, um Programmieranfängern die nötige Denkweise näherzubringen.

    Schreib mal einen englischen Text, ohne "a" oder "the" zu benutzen.
    Das ist bei weitem keine nötige Denkweise. Das können wir zur Unterhaltung machen, ist sogar noch schwieriger als Sackhüpfen. Aber was tut das dem Anfänger bringen außer Schmerz? Ich glaube auch, daß diese Sorte von Aufgaben eher spaltet, die guten werden besser, die schlechten fallen hinten runter.
    Also gute Aufgabe für die ersten Studiensemester, wo Sieben angesagt ist, aber für die Schule würde ich das hassen.



  • volkard schrieb:

    Schreib mal einen englischen Text, ohne "a" oder "the" zu benutzen.

    Diese beiden Probleme sind nicht gerade gleich schwer 😉

    Das ist bei weitem keine nötige Denkweise.

    Mit "nötige Denkweise" meine ich die Denkweise, ein Problem in der Art anzuschauen, dass man einen Algorithmus aufstellen kann, den man anschließend in einer Sprache implementiert. Diese Denkweise ist sehr wohl wichtig und wird mit dieser Aufgabe geschult.



  • Michael E. schrieb:

    volkard schrieb:

    Schreib mal einen englischen Text, ohne "a" oder "the" zu benutzen.

    Diese beiden Probleme sind nicht gerade gleich schwer 😉

    Das ist bei weitem keine nötige Denkweise.

    Mit "nötige Denkweise" meine ich die Denkweise, ein Problem in der Art anzuschauen, dass man einen Algorithmus aufstellen kann, den man anschließend in einer Sprache implementiert. Diese Denkweise ist sehr wohl wichtig und wird mit dieser Aufgabe geschult.

    Dazu gäbe es aber bessere Aufgaben, nicht so seltsam-beschneidende, daß man am Edne gar nicht mehr weiß, was man machen soll.



  • Michael E. schrieb:

    volkard schrieb:

    Schreib mal einen englischen Text, ohne "a" oder "the" zu benutzen.

    Diese beiden Probleme sind nicht gerade gleich schwer 😉

    Siehe mein erster Code. Es war nicht verlangt, daß der Text besonders lang ist.



  • Volkhard: Bleiben wir beim Sinn und Zweck von Übungsaufgaben. Diese können meiner Meinung nach nur zwei Zielrichtungen haben, nämlich zu zeigen:

    1. so macht man das --> hir nicht erfüllt
    2. So ist ein algorithmischer Weg für andere komplexere Aufgaben --> erkenne ich auch nicht

    Bitte andere Aufgaben ausdenken, die den Lernenden nicht sofort verwirren und andere - wie mich - nicht sagen lassen Das ist eine saublöde Aufgabe!
    Übungsaufgaben zur Programmierung sind wichtig zum Lernen, daran besteht kein Zweifel. Nur totaler Blödsinn sollten sie auch nicht sein!



  • berniebutt schrieb:

    Volkhard: Bleiben wir beim Sinn und Zweck von Übungsaufgaben. Diese können meiner Meinung nach nur zwei Zielrichtungen haben, nämlich zu zeigen:

    1. so macht man das --> hir nicht erfüllt
    2. So ist ein algorithmischer Weg für andere komplexere Aufgaben --> erkenne ich auch nicht

    Bitte andere Aufgaben ausdenken, die den Lernenden nicht sofort verwirren und andere - wie mich - nicht sagen lassen Das ist eine saublöde Aufgabe!
    Übungsaufgaben zur Programmierung sind wichtig zum Lernen, daran besteht kein Zweifel. Nur totaler Blödsinn sollten sie auch nicht sein!

    Manchmal zweifle ich an deinem Textverständnis. volkard findet die Aufgabe auch blöd. Ich bins, der die Aufgabe nicht schlecht findet, auch wenns sicher nicht meine Lieblingsaufgabe ist. Aber um das weiter sinnlos auszudiskutieren, fehlt mir die Lust.



  • berniebutt schrieb:

    Volkhard:

    Nenn mich doch dein Einfachheit halber Volkard.

    berniebutt schrieb:

    Bitte andere Aufgaben ausdenken, die den Lernenden nicht sofort verwirren

    Ich denke, das habe ich anno 1999 schon zu Genüge getan.



  • volkard schrieb:

    berniebutt schrieb:

    Bitte andere Aufgaben ausdenken, die den Lernenden nicht sofort verwirren

    Ich denke, das habe ich anno 1999 schon zu Genüge getan.

    Dann zeige den Zugang zu deinen Beispielen den jetzt lernenden bitte! Wie finden sie, was du 1999 bereits von dir gegeben hast? Ein Verweis darauf zum Nachlesen gehört hier dahin. Mache eine eigene Homepage, damit man das lesen kann! Vielleicht kann ich auch noch etwas lernen?



  • berniebutt schrieb:

    Volkhard: Bleiben wir beim Sinn und Zweck von Übungsaufgaben. Diese können meiner Meinung nach nur zwei Zielrichtungen haben, nämlich zu zeigen:

    1. so macht man das --> hir nicht erfüllt
    2. So ist ein algorithmischer Weg für andere komplexere Aufgaben --> erkenne ich auch nicht

    Ich denke schon, dass 2. hier zutrifft. Man nimmt ein einfach zu verstehendes Problem und beschränkt die zur Verfügung stehenden Mittel, um den Lösungsweg so vorzugeben, dass das Lehrziel erreicht wird. Man könnte natürlich auch ein schwieriges Problem hernehmen, bei dem die Mittel auf natürliche Art und Weise beschränkt sind, aber dann sitzen die Schüler "etwas länger" daran.



  • Danke an alle. Welche Übungen würdet Ihr mir denn empfehlen?

    (Ich lerne C++ nebenbei)


Anmelden zum Antworten