Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Problemfälle bei Fibonacci-Funktion behandeln
Autor
Universität/Hochschule J Problemfälle bei Fibonacci-Funktion behandeln
JamesNguyen
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 08.11.2020
Mitteilungen: 196
  Themenstart: 2021-02-26

Hallo, in der Aufgabe steht: Eine Funktion isFibonacci untersucht einen übergebenen Wert, ob er eine Fibonacci-Zahl ist und gibt einen entsprechenden logischen Wert zurück. ich habe folgendes implementiert: _Bool isFibonacci ( long long value ) { auto long long fNminus2 = 0LL , fNminus1 = 1LL , fN = fNminus1 + fNminus2 ; auto unsigned char i ; if ( ) if ( fNminus2 == value ) { return 1 ; } else if ( fNminus1 == value ) { return 1 ; } else if ( fN == value ) { return 1 ; } { for ( i = 3 ; i < 93 ; i ++ ) { fNminus2 = fNminus1 ; fNminus1 = fN ; fN = fNminus1 + fNminus2; if ( fN == value ) return 1 ; } } return 0 ; } jetzt bin ich bei der Aufgabenstellung Welche Probleme können bei unsachgemäßer Nutzung der jeweiligen Funktion auftauchen? Sehen Sie eine Kontrolle dieser Problemfälle vor, indem Sie bspw. eine entsprechende Rückgabe machen. Das muss natürlich auch dokumentiert und getestet werden. In der Vorlesung hatten wir dazu auch folgends Beispiel // funktionsdeklaration int macheLinie ( int zeichen , int laenge ) ; int main ( void ) { macheLinie ( 340 , -77 ) ; macheLinie ( '~' , 1111 ) ; return 0 ; } // funktionsdefinition: int macheLinie ( int zeichen , int laenge ) { int i = 0 ; if ( zeichen > 255 ) zeichen = zeichen % 256 ; if ( laenge < 0 ) laenge = abs ( laenge ) ; if ( laenge > 80 ) laenge = 80 ; for ( i = 0 ; i < laenge ; i ++ ) { printf ( "%c" , zeichen ) ; } printf ( "\n" ) ; return i ; } da hat er also mit if Abfragen einiges behandelt. Mir fehlt etwas das Wissen wie ich meine obige Funktion behandeln soll bzw. was unsachgemäße Benutzung darstellen würde. ich hatte meine funktion vorher auch mit unsigned long long mal geschrieben theoretisch kann ich ja in die main der funktion aufrufen isFibonacci ( < alles von ]-unendlich, +unendlich[ dass dann mit sämtlichen präfixen ull, LL usw. ich bin mehr einfach sehr unsicher was davon alles überhaupt behandelt werden kann. weil das was inder main funktion aufgerufen wird. geht mir tatsächlich u.U verloren in der is Fibonacci Funkion. Bspw. wenn ich -5 isFibonnacci (unsigned long long number) aufrufe dann bekomme 42949672911. es würde hier also wenig sinn machen inder FUnktion if ( number < 0 ) zu schreiben, weil -5 so gar nicht angekommen ist.


   Profil
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27784
Wohnort: Hessen
  Beitrag No.1, eingetragen 2021-02-27

Mal im Ernst, Sportsfreund, wer soll sich denn durch diesen unleserlichen linksbündigen Codesalat durchwühlen? \quoteon(2021-02-26 22:06 - JamesNguyen im Themenstart) […] _Bool isFibonacci ( long long value ) { auto long long fNminus2 = 0LL , fNminus1 = 1LL , fN = fNminus1 + fNminus2 ; auto unsigned char i ; if ( ) if ( fNminus2 == value ) { return 1 ; } else if ( fNminus1 == value ) { return 1 ; } else if ( fN == value ) { return 1 ; } { for ( i = 3 ; i < 93 ; i ++ ) { fNminus2 = fNminus1 ; fNminus1 = fN ; fN = fNminus1 + fNminus2; if ( fN == value ) return 1 ; } } return 0 ; } […] // funktionsdeklaration int macheLinie ( int zeichen , int laenge ) ; int main ( void ) { macheLinie ( 340 , -77 ) ; macheLinie ( '~' , 1111 ) ; return 0 ; } // funktionsdefinition: int macheLinie ( int zeichen , int laenge ) { int i = 0 ; if ( zeichen > 255 ) zeichen = zeichen % 256 ; if ( laenge < 0 ) laenge = abs ( laenge ) ; if ( laenge > 80 ) laenge = 80 ; for ( i = 0 ; i < laenge ; i ++ ) { printf ( "%c" , zeichen ) ; } printf ( "\n" ) ; return i ; } […] \quoteoff Benutze bitte in Zukunft den [Quelltext]-Bereich (findest du unter dem Eingabefenster), bei mehr als 3 oder 4 Zeilen Code auch mit Zeilennummern, also [num.], dann sieht das vernünftig so aus: \sourceonC \numberson _Bool isFibonacci ( long long value ) { auto long long fNminus2 = 0LL , fNminus1 = 1LL , fN = fNminus1 + fNminus2 ; auto unsigned char i ; if ( ) if ( fNminus2 == value ) { return 1 ; } else if ( fNminus1 == value ) { return 1 ; } else if ( fN == value ) { return 1 ; } { for ( i = 3 ; i < 93 ; i ++ ) { fNminus2 = fNminus1 ; fNminus1 = fN ; fN = fNminus1 + fNminus2; if ( fN == value ) return 1 ; } } return 0 ; } \sourceoff Dann können wir über den Code reden😉


   Profil
__blackjack__
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 23.09.2021
Mitteilungen: 81
  Beitrag No.2, eingetragen 2021-09-25

@JamesNguyen: Problematisch kann eigentlich nur eine negative Zahl sein. Die kann keine Fibonacci-Zahl sein, also ist auch klar was die Funktion dann zurückgeben muss. Bei den literalen 0 und 1 sind die LL-Suffixe nicht wirklich sinnvoll, denn da kann ja ganz offensichtlich nichts passieren. Das ist eine einfache Zuweisung und keine Rechnung wo man sicherstellen muss, dass die ausserhalb vom `int`-Wertebereich passiert. Das man ausserhalb vom Embedded-Bereich sich die Mühe macht eine Laufvariable für eine ``for``-Schleife auf 8-Bit zu beschränken, ist auch eher unüblich. In der Regel nimmt man da einfach `int` und nimmt was der Compiler einem da gibt. Warum geht die Schleife dann von 3 bis 92? Nimmst Du etwa bei `long long` eine bestimmte feste Bitanzahl an? Das ist falsch, zumindest wenn man halbwegs portabel sein will. Entweder du deklarierst das Argument und die Variablen als `int64_t`, oder Du schreibst eine Abbruchbedingung für die Schleife so, dass sie funktioniert egal wie viele Bits `long long` hat.


   Profil
JamesNguyen hat die Antworten auf ihre/seine Frage gesehen.
JamesNguyen hat selbst das Ok-Häkchen gesetzt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]