Einfaches programmieren?



  • Ich bin wohl ein hoffnungsloser Fall 😡
    Ich habe einen Onlinekurs in cpp gemacht und verstehe nicht was genau da falsch ist 😮
    sorry falls ich das falsche Forum ausgewählt habe.

    Beispiel:
    // Es wurde 5 7 9 11 12 eingegeben
    Ausgabe:
    Zahl 5 ist eine Fibonaccizahl
    Zahl 7 ist keine Fibonaccizahl
    Zahl 9 ist keine Fibonaccizahl
    Zahl 11 ist keine Fibonaccizahl
    Zahl 12 ist keine Fibonaccizahl

    und geschrieben hab ich:
    #include <iostream>
    #include <cstdio>

    using namespace std;

    int main() {

    int wert, wert2, wert3, wert4, wert5;
    cout << "Bitte geben Sie 5 Zahlen zwischen 1 und 50 ein:";
    cin >> wert;
    cin >> wert2;
    cin >> wert3;
    cin >> wert4;
    cin >> wert5;
    switch(wert, wert2, wert3, wert4, wert5) {
    {
    case 0:
    case 1:
    case 2:
    case 3:
    case 5:
    case 8:
    case 13:
    case 21:
    case 34:
    cout << "ist eine Fibonaccizahl" << endl;
    break;
    case 4:
    case 6:
    case 7:
    case 9:
    case 10:
    case 11:
    case 12:
    case 14:
    case 15:
    case 16:
    case 17:
    case 18:
    case 19:
    case 20:
    case 22:
    case 23:
    case 24:
    case 25:
    case 26:
    case 27:
    case 28:
    case 29:
    case 30:
    case 31:
    case 32:
    case 33:
    case 35:
    case 36:
    case 37:
    case 38:
    case 39:
    case 40:
    case 41:
    case 42:
    case 43:
    case 44:
    case 45:
    case 46:
    case 47:
    case 48:
    case 49:
    case 50:
    cout << " keine Fib.Zahl" << endl;
    break;
    default:
    cout << " Wert ungueltig!" << endl;
    }

    }
    fflush(stdin);
    getchar();
    return 0;
    }
    Wieso nur ein Satz ausgegeben wird ist mir rätzenhaft, könnt ihr mir helfen?



  • topfklee2 schrieb:

    Ausgabe:
    Zahl 5 ist eine Fibonaccizahl
    Zahl 7 ist keine Fibonaccizahl
    Zahl 9 ist keine Fibonaccizahl
    Zahl 11 ist keine Fibonaccizahl
    Zahl 12 ist keine Fibonaccizahl

    Also die Ausgabe macht doch genau das, was sie soll 😉
    Die Ausgabe bei 5 ist eine andere als beim Rest.



  • topfklee2 schrieb:

    Ich bin wohl ein hoffnungsloser Fall 😡

    Unwahrscheinlich.

    topfklee2 schrieb:

    Ich habe einen Onlinekurs in cpp gemacht und verstehe nicht was genau da falsch ist 😮

    Vielleicht ist der Onlinekurs hoffnungslos.

    topfklee2 schrieb:

    sorry falls ich das falsche Forum ausgewählt habe.

    Vermutlich. Soll es C oder C++ sein?

    Vielleicht war eher sowas gemeint?

    #include <iostream>
    using namespace std;
    
    bool istFibonacciZahl(int n){
        int a=1,b=1;
        while(b>=a){
            if(b==n)
                return true;
            int c=a+b;
            a=b;
            b=c;
        }
        return false;
    }
    
    int main() {
        cout << "Bitte geben Sie 5 Zahlen zwischen 1 und 50 ein:";
        for(int i=0;i<5;++i){
            int kandidat;
            cin>>kandidat;
            cout<<kandidat<<" ist ";
            if(istFibonacciZahl(kandidat))
                cout<<'k';
            cout<<"eine Fibonacci-Zahl.\n";
        }
        return 0;
    }
    

    Aber die Aufgabenstellung halte ich für recht ungeschickt, zu viele Fallstricke, viel zu viele anscheinend offensichtliche Lösungen, die einen nicht weit tragen.

    Bitte geben Sie 5 Zahlen zwischen 1 und 50 ein:5 7 13 20 21
    5 ist keine Fibonacci-Zahl.
    7 ist eine Fibonacci-Zahl.
    13 ist keine Fibonacci-Zahl.
    20 ist eine Fibonacci-Zahl.
    21 ist keine Fibonacci-Zahl.
    
    Process returned 0 (0x0)   execution time : 4324.554 s
    Press any key to continue.
    

    Jo, klappt vermutlich. Sollte es aber noch testen mit den beiden kleinstmöglichen und den beiden größtmöglichen Fibonacci-Zahlen, die in einen in passen und deren Nachbarn, nur zur Sicherheit.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • volkard schrieb:

    Bitte geben Sie 5 Zahlen zwischen 1 und 50 ein:5 7 13 20 21
    5 ist keine Fibonacci-Zahl.
    7 ist eine Fibonacci-Zahl.
    13 ist keine Fibonacci-Zahl.
    20 ist eine Fibonacci-Zahl.
    21 ist keine Fibonacci-Zahl.
    
    Process returned 0 (0x0)   execution time : 4324.554 s
    Press any key to continue.
    

    Jo, klappt vermutlich. Sollte es aber noch testen mit den beiden kleinstmöglichen und den beiden größtmöglichen Fibonacci-Zahlen, die in einen in passen und deren Nachbarn, nur zur Sicherheit.

    die ausgabe hier ist aber falsch! 5 ist eine Fibonacci-Zahl, 7 aber nicht.
    also alles genau falsch rum 😉



  • int fibonaccis[99];
    
    fibonaccis[0] = 0;
    fibonaccis[1] = 1;
    fibonaccis[2] = 2;
    
    for (int i = 3; i <= 99; i++)
    {
        fibonaccis[i] = (fibonaccis[i - 1] + fibonaccis[i - 2]);  // dein fibonacci - array
    }
    
    bool isfib(int eingabe){                                     // testet ob zahl im array vorkommt
    
    for (int c = 0; c <= eingabe; c++)
    {
        if (fibonaccis[c] == eingabe)
        { 
            return true;             
        }
    }
    
    return false;
    }
    

    du kannst dann über:

    bool fibonacci_ja_oder_nein = isfib(7);    //statt 7 jede beliebige zahl, sollte klappen
    

    herausfinden, ob es eine fibonacci - zahl aus dem array ist.
    geht wohl noch eleganter, da du ja hier eine array begrenzung von 100 hast, aber
    da du eh nur bis 50 abfragst egal.

    Gruß
    Player894



  • Wenn es nur um ints geht, die Wertemenge also sehr begrenzt ist, dürfte die einfachste Methode ein std::set sein, etwa

    #include <algorithm>
    #include <iostream>
    #include <limits>
    #include <set>
    
    std::set<int> generate_fibonacci_numbers() {
      std::set<int> fibs;
      unsigned i = 1, j = 1;
    
      do {
        fibs.insert(static_cast<int>(j));
    
        i += j;
        std::swap(i, j);
      } while(j <= static_cast<unsigned>(std::numeric_limits<int>::max()));
    
      return fibs;
    }
    
    int main() {
      std::set<int> fibonacci_numbers = generate_fibonacci_numbers();
      int x;
    
      while(std::cin >> x) {
        bool x_ist_fib = fibonacci_numbers.find(x) != fibonacci_numbers.end();
    
        std::cout << x << " ist " << (x_ist_fib ? "" : "k") << "eine Fibonacci-Zahl.\n";
      }
    }
    

    Wenn es um größere Zahlenbereiche geht, die Wertemenge also unbegrenzt ist, ist dieser Weg allerdings nicht mehr sinnvoll. In dem Fall dürfte der Weg über den goldenen Schnitt sinnvoller sein -- da

    F(n) = floor(φn / sqrt(5) + 0.5)

    und im Umkehrschluss

    n(F) = floor(log(F * sqrt(5) + 0.5) / logφ)

    ist, ist eine Zahl x eine Fibonacci-Zahl, wenn

    F(n(x)) = x

    gilt.


Log in to reply