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

Dlaczego ten program nie działa dla liczb większych niż 19?

+1 głos
332 wizyt
pytanie zadane 11 czerwca 2017 w C i C++ przez minemoney Nowicjusz (240 p.)
edycja 11 czerwca 2017 przez minemoney

Czy jest w c++ coś większego niż long double?

Program się sypie już przy 20 ;/


#include <iostream>
#include <windows.h>
#include <iomanip>
using namespace std;
long double x;
int silnia(int x)
{
    if(x<2) return x;
    return x*silnia(x-1);


}
int z;

int main()
{

    do{
    cout << "Podaj cyfre silni" << endl;
    cin>>x;
    cout<<setprecision(99999)<<silnia(x);
    cout<<"\nCzy chcesz kontynuowac?\n";

    cout<<"1.Kontynuuj\nInna liczba: zakoncz";
    cin>> z;
    if(z!=1)
    {
        return 0;
    }
    system("cls");
    }while(z=1);
}

2 odpowiedzi

+2 głosów
odpowiedź 11 czerwca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
prawdopodobnie przekroczyles long doubla, uzyj intmax_t

http://en.cppreference.com/w/cpp/types/integer
komentarz 11 czerwca 2017 przez minemoney Nowicjusz (240 p.)
dalej nie moge wpisac nic większego niż 19 ;o
+2 głosów
odpowiedź 11 czerwca 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

Nie musisz używać zmiennych globalnych, żeby wywołać funkcję.

Wczytujesz dane do zmiennej globalnej x (Twój program to przykład, dlaczego powinno unikać się zmiennych globalnych), która jest typu long double. Następnie wywołujesz funkcję silnia i podajesz argument (typu int) przez wartość (tracisz dane; 8 bajtów -> 4 bajty). W tej funkcji zwracasz również inta, więc najzwyczajniej w świecie korzystasz z inta przy wyliczaniu silnii, a nie z long double'a, jak myślałeś (czy kompilator nie pokazał ostrzeżeń?). Deklaruj zmienne, żeby były o najmniejszym możliwym zasięgu (jeżeli używasz zmiennej tylko w funkcji - deklaruj w funkcji; jeżeli w pętli - to na przykład w nagłówku pętli for, itd.). Zasięg lokalny jest nie jako ważniejszy; "przykrywa" nazwy z większego zasięgu. w Twoim wypadku zmienna automatyczna int x jest ważniejsza od long double x

Miejscem, gdzie w programie jest największy problem to typ zwracany i typ przyjmowany przez funkcję silnia. Funkcja przyjmuje liczbę typu long double jako zwykłego inta, a także zwraca zwykłego inta.

How to fix that?

#include <iostream>
#include <windows.h>
#include <iomanip>
using namespace std;
long double silnia(long double x)
{
    if(x<2) return x;
    return x*silnia(x-1);
}

int main()
{
    // nie ma sensu, zeby te zmienne byly globalne
    long double x;
    int z

    do{
    cout << "Podaj cyfre silni" << endl;
    cin>>x;
    cout<<setprecision(99999)<<silnia(x);
    cout<<"\nCzy chcesz kontynuowac?\n";

    cout<<"1.Kontynuuj\nInna liczba: zakoncz\n";
    cin>> z;
    if(z!=1)
    {
        return 0;
    }
    system("cls");
    }while(z=1);
}

Wystarczy (z dobrym nawykiem) zmienić miejsce deklaracji zmiennych x i z, a także zmienić typ zwracany przez funkcję silnia, jak i typ przyjmowany jako argument. Teraz ze zmiennej long double x, która jest zadeklarowana w funkcji main używasz tylko do wczytania danych, a następnie do przekazania do funkcji silnia argumentu przez wartość. Funkcja ta przyjmuje daną jako long double (teraz nic nie tracimy), wykonuje stosowne obliczenia i zwraca dane typu long double (yaay, znowy nic nie tracimy).

1
komentarz 11 czerwca 2017 przez minemoney Nowicjusz (240 p.)
Taki głupi błąd zrobić...

Dziękuję za pomoc ;>

Podobne pytania

0 głosów
1 odpowiedź 626 wizyt
pytanie zadane 27 marca 2017 w C i C++ przez Kamil Duljas Użytkownik (990 p.)
+1 głos
2 odpowiedzi 330 wizyt
pytanie zadane 20 czerwca 2017 w C i C++ przez maksbu23 Użytkownik (730 p.)
0 głosów
1 odpowiedź 586 wizyt
pytanie zadane 12 lutego 2019 w C i C++ przez seba0456 Nowicjusz (160 p.)

93,631 zapytań

142,555 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...