• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja z tablicą - nie zwraca poprawnej liczby

Object Storage Arubacloud
0 głosów
456 wizyt
pytanie zadane 22 stycznia 2020 w C i C++ przez Bezk Nowicjusz (140 p.)
edycja 22 stycznia 2020 przez Bezk

Witam!

Robię program którego jedną z funkcji będzie podawanie n-tej liczby Ciągu Fibonacciego. Chciałbym napisać ten program tak, aby ustalanie liczby z Ciągu działo się w osobnej funkcji z użyciem wskaźników. Program podaje jednak zły wynik i napis nan po wypisaniu w funkcji wartości z tablicy.

#include <iostream>

using namespace std;

int wynik, p, lf;

int p_iteracja(int lf)
{
    long double *p;
    p = new long double [lf];
    p[0]=1;
    p[1]=1;
    for(int i=0; i<lf; i++)
    {
        p[i] = p[i-1] + p[i-2];
    }
    for(int i=0; i<lf; i++)
    {
        cout << p[i] << endl;
    }
    return p[lf-1];
    delete [] p;
}

int main()
{
    cout << "Ktory wyraz ciagu chcesz wyznaczyc?" << endl;
    cin >> lf;
    cout << "Iteracja: " << p_iteracja(lf);

    /*long double p[lf];
    p[0]=1;
    p[1]=1;
    for (int i=2; i<lf; i++)
    {
        p[i] = p[i-1] + p[i-2];
    }
    cout<<"Iteracja: " << p[lf-1];*/
    return 0;
}

Chciałbym, aby program:

1. Podawał prawidłową liczbę z Ciągu Fibonacciego

2. I działał z użyciem wskaźników (w komentarzach)

i chcę dowiedzieć się dlaczego wypisuję nany a nie kolejne liczby z Ciągu?

1
komentarz 22 stycznia 2020 przez tkz Nałogowiec (42,000 p.)

    return p[lf-1];
    delete [] p;

To nie ma sensu, wychodzisz z funkcji bez zwalniania pamięci. 

komentarz 22 stycznia 2020 przez Bezk Nowicjusz (140 p.)
po

1. bez tego też nie działa

2. to jak mam ją zwolnic

1 odpowiedź

0 głosów
odpowiedź 22 stycznia 2020 przez tangarr Mędrzec (154,860 p.)

1. Dlaczego używasz liczb zmiennoprzecinkowych?
2. Podczas tworzenia ciągu używasz pamięci znajdującej się przed zadeklarowaną tablicą. Zacznij iterację od indeksu 2.
3. Masz wyciek pamięci. Tablica nie zostanie usunięta. Żadna instrukcja umieszczona po returnie nie zostanie wykonana.
4. Przykładowe utworzenie tablicy z ciągiem Fibonacciego i jego użycie:
 

#include <iostream>

unsigned long long *utworzCiagFibonacciego(unsigned int dlugosc) {
    auto tablica = new unsigned long long[dlugosc];
    tablica[0]=1;
    tablica[1]=1;
    for (int i=2; i<dlugosc; i++) {
        tablica[i] = tablica[i-1]+tablica[i-2];
    }
    return tablica;
}

int main()
{
    auto ciagFibonacciego = utworzCiagFibonacciego(100);
    for (int i=0; i<100; i++) {
        std::cout << ciagFibonacciego[i] << " ";
    }
    std::cout << std::endl;
    delete [] ciagFibonacciego;
    return 0;
}

 

komentarz 22 stycznia 2020 przez Bezk Nowicjusz (140 p.)
1. Gdzie używam liczb zmiennoprzecinkowych?

2. Faktycznie zaczynając iteracje od 2 działa. Przedtem schodziło na -1 a int nie może bez signed być ujemny. Tylko dlaczego aż tyle tych nan przy trzeciej iteracji program nie napotkał by liczby ujemnej. Przy okazji dlaczego gdy wpisze w programie (bez użycia wskaźników i nie poprawionym) 400 to już wyskoczą same 0, a gdy wpisze 380 to będą strasznie małe liczby?

3. Jak mam usunąć tablicę?

4. Twój kod nie działa
komentarz 22 stycznia 2020 przez tangarr Mędrzec (154,860 p.)
1. long double jest liczbą zmiennoprzecinkową.
2a. czytałeś liczby long double na indeksach -2 i -1. Pamięć w tych miejscach nie zawiera prawidłowych liczb i stąd się wzięły NaNy. Potem już użyłeś tych NaNów do obliczenia wszystkich wyrazów.
2b. ciąg Fibonacciego rośnie bardzo szybko. dlatego od pewnego momentu wyniki nie mieszczą się wewnątrz zmiennej. musiałbyś użyć typu w stylu BigInt
3. zapisać wynik do zmiennej, usunąć tablicę, zwrócić wynik ze zmiennej.
4. Jak to nie działa? https://onlinegdb.com/SkDIPVIbL naciśnij RUN i zobaczysz wynik
komentarz 22 stycznia 2020 przez Bezk Nowicjusz (140 p.)
1. No w kursie C++ Mirosława Zelenta została użyta ta zmienna dlatego jej użyłem

2. Ok, ale w long double powinny się mieścić do 23601 wyrazu Ciągu

3. Dzięki

4. W CodeBlocks nie działa
komentarz 22 stycznia 2020 przez tangarr Mędrzec (154,860 p.)
1. Prawdopodobnie chcieli w ten sposób rozwiązać problem z przepełnieniem zmiennej. Wraz z rosnącą wartością liczby double maleje jej precyzja

4. Nie masz włączonej zgodności ze standardem c++11. Żeby mój kod zadziałał w starym standardzie trzeba zamienić typ auto prawidłowym typem.

Podobne pytania

0 głosów
1 odpowiedź 191 wizyt
pytanie zadane 26 stycznia 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
+1 głos
3 odpowiedzi 223 wizyt
pytanie zadane 7 lutego 2021 w C i C++ przez Kacperek_code Obywatel (1,690 p.)
0 głosów
0 odpowiedzi 553 wizyt
pytanie zadane 20 maja 2020 w C i C++ przez fortuna Początkujący (310 p.)

92,579 zapytań

141,430 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...