ďťż

Ładny brzuch

Hi, mam problem. Mianowicie dotyczy on ciągu Fibonacciego. Mam w C++ do napisania wersję iteracyjną tego ciągu, jednak muszę wykorzystać liczbę 1.618 (wiem, że fi=0.618, ale na korzyść algorytmu potrzebna mi jest ta pierwsza liczba).

PROBLEM poprawnie wyświetla mi się tylko 1. i 2. wyraz ciągu-reszta to w ogóle nie są liczby z ciągu, do tego wyraz ciągu musi być liczbą całkowitą (a fi jest typu float). Niby ustaliłam, że wynik jest typu int, jednak kompilator (podejrzewam, że słusznie), wyświetla mi jakieś ostrzeżenia (które zamieściłam niżej).

Oto kod programu, który zrobiłam:
#include <iostream> using namespace std; const float fi=1.618; unsigned long int fibo(int n) //funkcja obliczająca element ciągu Fibonacciego { int wynik=2; if (n==1||n==2) return 1; else { for(int i=2; i<=n; i++) wynik=wynik*fi; return wynik;// } } int main() { int n; cout << "\t\tProgram oblicza metoda iteracyjna n-ty element\n"; cout << "\t\t\tCIAGU FIBONACCIEGO\n"; do { cout << "\nKtory element ciagu program ma obliczyc? "; cin >> n; } while (n<1); //uzytkownik nie ma "szans" na wpisanie liczby mniejszej od 1 cout << endl << "Wynik: " << fibo(n); cout << endl << endl; system("pause"); return 0; }

A to ostrzeżenia:
In function `long unsigned int fibo(int)': Line 9 [Warning] assignment to `int' from `float' Line 9 [Warning] argument to `int' from `float'

Mam nadzieję, że pomożecie mi w rozwiązaniu tego problemu. Zapewne wszystko tutaj "poplątałam" :)

PS. Środowisko, z którego korzystam to: Dev-C++ 4.9.9.0



Zdefiniuj zmienną wynik jako float i powinno być dobrze :-D


Zdefiniuj zmienną wynik jako float i powinno być dobrze :-D

Niestety... Zdefiniowałam i samą funkcję jako float (bo bez tego znowu pojawiają się ostrzeżenia), a także wynik jako float. Dla 3. wyrazu ciągu wychodzi 5.23585 - co zupełnie mija się z celem (bo ta wartość powinna wynieść 2), a poza tym, musi to być liczba całkowita :)

//edit. aha, nawet jak zostawię funkcję fibo jako unsigned long int, to nadal 3 wyraz ciągu to 5... :/

Z tego co pamietam to do tego ciagu zalicza sie rowniez 0. Dla n=0 powinnas zwrocic 0. (moge sie mylic)

A zeby fi byla dokladniejsza mozna wykorzystac: (√5 + 1)/2 = 1.6180339...



A wiesz dlaczego? O jedną operację w pętli za dużo. Zamień i<=n na i<n. Teraz powinno działać (przynajmniej u mnie działa :-P).


A wiesz dlaczego? O jedną operację w pętli za dużo. Zamień i<=n na i<n. Teraz powinno działać (przynajmniej u mnie działa :-P).

Nie do końca... Zniknęła gdzieś w ogóle z ciągu liczba 2 - która powinna być 3 wyrazem ciągu. Dałam na wszelki wypadek linię
if (n==3) return wynik;
Jednak i tak działa dalej źle ta funkcja. Bo dla 4 wyrazu powinna być to liczba 3. Pojawia się 5. Musiałam coś przeoczyć...

//edit. w pętli zmieniłam startową licznika na 3. Jednak pojawia się teraz problem przy 8 wyrazie ciągu. Zamiast 21, pojawia się 22 (podejrzewam, że tutaj chodzi o zaokrąglanie) - automatycznie kolejne wyrazu ciągu są złe.

W takim razie odwrotnie :-) for (int i=3; i<=n; i++)
A co do błędu statystycznego to może źle zaokrągliłaś liczbę fi? Albo za mało liczb po przecinku . . . To najbardziej prawdopodobne.
Użytkownik andrzej_aa edytował ten post 06 grudzień 2007, 21:09

W takim razie odwrotnie :-) for (int i=3; i<=n; i++)
A co do błędu statystycznego to może źle zaokrągliłaś liczbę fi? Albo za mało liczb po przecinku . . . To najbardziej prawdopodobne.


Niestety, wtedy zupełnie program źle działa :) Zapewne problem leży w zaokrągleniu liczby fi (próbowałam z różnymi zaokrągleniami), jednak po jakimś czasie i tak któryś wyraz ciągu był nieprawidłowy.
Po prostu oddam tę Pani Profesor wersję, która wyświetla poprawnie ciąg do 7 wyrazu. Ona powinna raczej docenić moje starania.

Dziękuję jednak andrzej_aa za pomoc :)

To jeszcze można było użyć zmienniej typu double. Jest pojemniejsza. I nie ma sprawy, lubię naukę ;-)

Jakby tego nie zrobil blad przy pierwszych liczbach ciagu fib... jest za duzy.
Zapamietaj w programie odpowiedzi do 5 - 6 liczby. Kolejne juz wyliczaj i powinno byc ok.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •