Funktionales C++



  • Mein Compiler ist Visual C++. Der scheint ziemlich gutmütig zu sein^^

    Also mein Programm soll einfach folgendes können:

    - 2 Zahlen sollen vom Benutzer eingegeben und diese dann als Parameter an potenz() übergeben werden. In der Funktion potenz() soll dann die Potenz zurückgegeben werden. Allerdings soll vorher geprüft werden, ob die Eingaben von x und n korrekt waren. x und n sollen größer gleich 1 sein. Ich darf halt keine Zuweisungen und if-Anweisungen verwenden. Und da liegt mein Problem. Als if-Alternative darf ich also nur den Auswahloperator nehmen, muss also mit

    return (irgendwas) ? dies : jenes

    arbeiten. Gleichzeitig soll ich aber auch auf dem Bildschirm die Rechnung ausgeben. Ich kann ja nicht cout in nem Return-statement benutzen. Hab ehrlich gesagt keine Ahnung, wie ich das machen soll, dass der mir die Eingaben prüft und dann noch die Rechnung ausgibt (und dann noch die Konsole offen hält).



  • Wieso lässt der Compiler das überhaupt durch? Die Ergebnisse der beiden Zweige des ?: müssten dachte ich den gleichen Typ haben?!

    Und wegen der Rückgabe, ich glaube der Standard schreibt nicht vor dass das Betriebssystem als Returnwert den kompletten Wertebereich eines int auswerten muss. Irgendwie fehlt da jegliche Ausgabe.



  • Lass return weg und schick das Ergebnis der Berechnung nach cout. Dann hast Du immernoch keine ifs.

    Und wrong sollte vielleicht 0 oder sowas zurückgeben, da sonst eben gesagtes gilt.



  • LordJaxom schrieb:

    Lass return weg und schick das Ergebnis der Berechnung nach cout. Dann hast Du immernoch keine ifs.

    Und wrong sollte vielleicht 0 oder sowas zurückgeben, da sonst eben gesagtes gilt.

    Ich darf return leider nicht wegmachen, weil in der Aufgabe steht, dass ich eine Funktion "int potenz(int x, int n)" erstellen soll. 😞 Wenn die mich doch nur das normale C++ benutzen lassen würden. Aber wir sollen ja dummerweise dieses abgespeckte C++ nehmen



  • Wir sprechen von dem return in main. Dass die Funktion etwas zurückgeben muss, ist logisch.



  • LordJaxom schrieb:

    Wieso lässt der Compiler das überhaupt durch? Die Ergebnisse der beiden Zweige des ?: müssten dachte ich den gleichen Typ haben?!

    Jopp - der MSVC compiliert es auch nicht...

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int potenz(int x, int n)
    {
        return (n == 0)
    		? 1
    		: (n % 2 == 0)
    			? potenz(x * x, n / 2)
    			: x * potenz(x * x, (n - 1) / 2);
    }
    
    void wait()
    {
    	cin.clear();
    	cin.ignore( cin.rdbuf()->in_avail() );
        cin.get();
    }
    
    const char* wrong = "Falsche Eingabe! Bitte nochmal versuchen.";
    
    int main()
    {
        int a,b;
        cout << "Geben Sie eine natuerliche Zahl x>=1 ein: "; 
        cin >> a;
        cout << "Geben Sie eine natuerliche Zahl n>=1 ein: ";
        cin >> b;
    	cout << ((a<1 || b<0) ? wrong : "potenz(a, b)") << endl;
    
    	wait();
    }
    

    geht wunderbar

    wenn man nun allerdings nicht "potenz(a, b)" sondern potenz(a, b) ausgeben möchte, geht das mit dem ternären operator wirklich nicht^^

    bb

    edit:
    so geht es aber

    int main()
    {
        int a,b;
    	cout << "Geben Sie eine natuerliche Zahl x>=1 ein: "; 
    	cin >> a;
    	cout << "Geben Sie eine natuerliche Zahl n>=1 ein: ";
    	cin >> b;
    	a<1 || b<0 ? cout << wrong : cout << potenz(a, b);
    	cout << endl;
    
    	wait();
    }
    

    allerdings würd ich noch paar klammern reinmachen, weil sonst ja gar niemand mehr durchsieht 😉



  • Ok, danke! So gehts wirklich. Meine Güte....ist aber umständlich. 🙄



  • Euler schrieb:

    Ok, danke! So gehts wirklich. Meine Güte....ist aber umständlich. 🙄

    ist jede sprache, wenn man sie ganz anders verwendet als es deren paradigmen eigtl vorschreiben - wenn es überhaupt geht...



  • unskilled schrieb:

    Euler schrieb:

    Ok, danke! So gehts wirklich. Meine Güte....ist aber umständlich. 🙄

    ist jede sprache, wenn man sie ganz anders verwendet als es deren paradigmen eigtl vorschreiben - wenn es überhaupt geht...

    Ich verstehs ja auch nicht, warum wir das machen müssen. Gott sei Dank wird das in ein paar Wochen aufhören. Es bringt ja nichts wenn wir C++ lernen sollen und es dann einfach nicht voll ausnutzen dürfen. Schon gar nicht, wenn man schon die einfachsten Anweisungen ignorieren soll.

    Ein Programm ohne Zuweisungen 🙄



  • naja, das es nichts bringt, würde ich nicht sagen

    ist imho ein schönes bsp., wie funktionale sprachen funktionieren
    und man muss als lehrer/dozent seine zeit nicht mit 2mal syntax lehren verschwenden
    soll nicht heißen, dass es die tollste methode ist, aber als grundverkehrt würd ich sie auch nicht gleich einschätzen...

    bb



  • Vermutung: Sie wollten eigentlich Scheme oder sowas lehren (tolle Sprache, SICP sollte man IMHO einmal in seinem Leben gelesen haben), aber irgendwer weiter oben oder extern ("die Industrie") will lieber Leute, die Mainstream-Programmiersprachen können. Also macht man einen faulen Kompromiss. Natürlich kann man in C++ ohne weiteres pseudo-funktional programmieren, für in funktionalen Sprachen selbstverständliche Dinge wie Closures muss man aber schon ziemliche Geschütze auffahren, und irgendwann ist dann auch einfach mal Ende der Fahnenstange.

    (Der einzige Schwachpunkt dieser Theorie ist, dass in solchen Fällen normalerweise Java genommen wird.)



  • Bashar schrieb:

    (Der einzige Schwachpunkt dieser Theorie ist, dass in solchen Fällen normalerweise Java genommen wird.)

    Groovy? Scala?



  • Haskell 🙂



  • Die Haskell Syntax ist aber doof! 😉



  • Erlang!



  • unskilled schrieb:

    Die Haskell Syntax ist aber doof! 😉

    Nicht doof. Eher zu komplex. Die Sprache hat mindestens so viel Syntax wie C++. Eher noch mehr :(. Und Ganz unkomplex sind die einzelnen Features auch nicht.



  • Die Haskell-Syntax ist halt gewöhnungsbedürftig, besonders wenn man von C-ähnlichen Sprachen kommt. Ich finde sie inzwischen recht intuitiv, besonders Listen oder Fallunterscheidungen. Vor allem kann man mit ihr sehr kompakte und dennoch verständliche Ausdrücke formulieren. Nur ein paar einfache Beispiele:

    [b]-- Fakultät[/b]
    fac :: Int -> Int
    fac n = product [1..n]
    
    [b]-- Nimm alle geraden Elemente aus Liste[/b]
    filter even [1,2,3,5,6,8]
    
    [b]-- Prüfe, ob Zahl prim ist[/b]
    isPrime :: Int -> Bool
    isPrime n | n < 2     = False
              | otherwise = and [mod n m == 0 | m <- [1..n]]
    

    Ich habe mich allerdings noch nicht allzu stark mit weiterführenden Techniken beschäftigt (etwas mehr als obere Beispiele kann ich allerdings schon ;)), von daher kann ich die Komplexität der Syntax in fortgeschrittenen Haskell-Programmen schlecht einschätzen.



  • Nexus schrieb:

    von daher kann ich die Komplexität der Syntax in fortgeschrittenen Haskell-Programmen schlecht einschätzen.

    Es gibt ganz viel Syntax für Spezialfälle. Unter anderem mehrere Syntaktische Möglichkeiten, Funktionen und Argumente zu binden, etc. Ich kenn Haskell nicht perfekt, aber neben so Sachen wie funktion1.funktion2 meine ich auch sowas wie Funktion1<.>Funktion2 gesehen zu haben. Leider hatte ich nie die Chance, mich näher damit zu beschäftigen, weil Prolog dazwischen kam.



  • Hier kann man sehr viele Sprachen vergleichen:

    http://99-bottles-of-beer.net/

    EDIT:
    Ich weiss direkt nichts mit dem Thema zu tun, aber man kann auch sehr schön sehen, welche Sprachen für gewisse Probleme überhaupt nicht gedacht sind, respektive zu komplex dafür sind. Und im übrigen nette Seite zum stöberen. :p



  • Nexus schrieb:

    Die Haskell-Syntax ist halt gewöhnungsbedürftig, besonders wenn man von C-ähnlichen Sprachen kommt

    Jopp - nichts anderes wollte ich sagen^^
    Ich muss für die Uni jz bissl Haskell lernen und hab bisher ehrlich gesagt noch nicht so die Ahnung davon - aber die operatoren find ich teils unlogisch und noch viel schlimmer ist halt, dass man so viel mit der sprache machen kann und es deshalb auch so viel gibt, was man nicht weiß ;o)

    bb


Anmelden zum Antworten