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

Populacja swiata - wyrzuca wartosc całkowitą

0 głosów
197 wizyt
pytanie zadane 15 marca 2018 w C i C++ przez Utau Użytkownik (890 p.)
edycja 15 marca 2018 przez Utau
#include <iostream>

using namespace std;

double getProcent(long long int _pPopulation, long long int _wPopulation)
{
    return (_pPopulation*100)/_wPopulation;
}

int main()
{
    long long int polandPopulation,worldPopulation;
    double result;

    cout << "Podaj liczbe ludnosci w Polsce: ";
    cin >> polandPopulation;
    cout << "Podaj liczbe ludnosci swiata: ";
    cin >> worldPopulation;

    result = getProcent(polandPopulation,worldPopulation);

    cout <<"Populacja Polski stanowi "<<result<<" % populacji swiata."<<endl;


    return 0;
}

Zadanie polega na tym, aby obliczyc % populacji jaki stanowi Polska względem populacji świata. Zadanie mówi, aby zmienne populacji deklarować jako long long int.

Niestety nie wiem czemy funkcja mimo jasno określonego typu zawsze wywala wartość całkowitą. Próbowałam rzutowania zarówno w ciele funkcji jak i w main() oraz stosowania double,long double,float, long float i ZAWSZE wyrzuca ze stanowi 0%. Zawsze wyrzuca liczbę 0 a w odpowiedziach jest 0,55782%. Nie wiem już co mam robić :/

 

EDIT: Rozwiązany przez ustawienie tego samego typu zwracanej wartości i typu argumentów. Rozumiem, że typ zwracany musi byc identyczny jak typy argumentów ?

komentarz 15 marca 2018 przez Utau Użytkownik (890 p.)

rozumiem, ze typ zwracanej funkcji musi być ten sam co typ argumentów funkcji ? Bo problem rozwiązał się następująco:

#include <iostream>

using namespace std;

long double getProcent(long double _pPopulation, long double _wPopulation)
{
    return (_pPopulation*100)/_wPopulation;
}

int main()
{
    long long int polandPopulation,worldPopulation;
    long double result;

    cout << "Podaj liczbe ludnosci w Polsce: ";
    cin >> polandPopulation;
    cout << "Podaj liczbe ludnosci swiata: ";
    cin >> worldPopulation;

    static_cast<long double>(polandPopulation);
    static_cast<long double>(worldPopulation);

    result = getProcent(polandPopulation,worldPopulation);

    cout <<"Populacja Polski stanowi "<<result<<" % populacji swiata."<<endl;


    return 0;
}

Więc funkcja automatycznie nie zmieni typu argumentów na typ zwracany ?

4 odpowiedzi

+2 głosów
odpowiedź 15 marca 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
wybrane 15 marca 2018 przez Utau
 
Najlepsza
return (_pPopulation*100)/_wPopulation;

W tej linijce najpierw obliczana jest wartość wyrażenia, które jest całkowito-liczbowe. Dopiero potem wynik (w tym przypadku 0) jest rzutowany na double. Musisz rzutować chociaż jedną ze zmiennych na double, np:

return (double)_pPopulation * 100 / _wPopulation;
komentarz 15 marca 2018 przez Utau Użytkownik (890 p.)
Dzięki! Oto mi chodziło :)
komentarz 25 października 2020 przez obl Maniak (51,120 p.)

@Qwerty96,

return _pPopulation * 100. / _wPopulation;

 

0 głosów
odpowiedź 15 marca 2018 przez Anysiu68 Użytkownik (820 p.)

Witaj.

W Twojej funkcji przynajmniej jedna zmienna musi być typu innego niż int. Jeżeli obie zmienne są typu int ich iloraz jest automatycznie rzutowany na liczbę całkowitą.

Potrzebujesz czegoś takiego:

double getProcent(double _pPopulation, double _wPopulation)

Lub przynajmniej:

double getProcent(long long int _pPopulation, double _wPopulation)

Oczywiście czy typ ma być float czy double itd. musisz zdecydować sam.

Podzrawiam.

0 głosów
odpowiedź 4 października 2020 przez AizoOz Początkujący (490 p.)

Podłączam się pod temat.

Gdy ustawię zmienne polska i świat na long long to otrzymuje wynik 0%.

Dopiero gdy ustawię polska na long double to pokazuje mi prawidłowy wynik.

W zadaniu mam napisane że zmienne wejściowe mają być na long long i nie mam pojęcia jak miałbym przy takich zmiennych otrzymać wynik różny od 0 :(

 

No i drugie pytanie : czy powinienem robić te początkowe zadania jako funkcje ? ( jeszcze słabo ogarniam C++ i stąd moje pójście na łątwiznę i nie robienie funkcji ) 

 

#include <iostream>

long long  swiat = 6898758899;
long long  polska = 38482919;
long double populacja;


int main() {
    using namespace std;
    
    
    /*cout << "Podaj liczbe populacji swiata : ";
   
    cin >> swiat;
    cout << "Podaj liczbe populacji polski : ";
    cin >> polska;
    */
    populacja = ( polska / swiat ) * 100 ;
    
    cout << " Populacja Polski stanowi " << populacja << "% populacji swiata. \n";
    
    return 0;
}

 

komentarz 4 października 2020 przez Oscar Pasjonat (22,170 p.)
To już w ogóle fatalnie, masz dzielenie dwóch liczba całkowitych, z których jedna jest z definicji mniejsza od drugiej, więc zawsze wyjdzie 0. W poprzednim przykładzie przynajmniej ta mniejsza była wstępnie mnożona przez 100, wychodziła całkowita liczba procentów. A najprościej było w poprzednich przykładach stałą 100 zamienić na 100.0 i już będzie dzielenie zmiennoprzecinkowe.
komentarz 4 października 2020 przez NewEraOfPeace Gaduła (4,790 p.)

Musisz rzutować jedną z wartości w tym dzieleniu. Najlepiej

static_cast<double>(polska)/swiat

, ale można też

(double)polska/swiat

(choć to trochę mało poprawne jak na C++, choć w sumie bardziej czytelne). Poza tym - nie potrzebujesz long double, double wystarczy :) globali i polskich nazw też nie potrzebujesz

0 głosów
odpowiedź 25 października 2020 przez AizoOz Początkujący (490 p.)

Bez funkcji udało mi się napisać, ale z funkcjami wyskakuje mi problem przy popul() "C-style cast from 'long (*)()' to 'double' is not allowed" :/

#include <iostream>

using namespace std;

double popul();
void klep();
long polska();
long swiat();
long dane;


int main() {
    polska();
    swiat();
    popul();
    klep();
    return 0;
}

long polska()
{
    cout << "Podaj liczbe ludnosci polski : ";
    long polska;
    cin >> polska;
    return (double)polska;
}

long swiat()
{
    cout << "Podaj liczbe ludnosci swiata : ";
    long swiat;
    cin >> swiat;
    return (double)swiat;
}

double popul()
{
    return (double)polska / (double)swiat *100;
}

void klep()
{
    cout << " Populacja Polski stanowi " << dane << "% populacji swiata. \n";
}

 

komentarz 25 października 2020 przez NewEraOfPeace Gaduła (4,790 p.)

Ponieważ próbujesz castować pointery na funkcje. Nie musisz wiedzieć co to jest. Najprostszym fixem będzie zmiana nazw zmiennych/funkcji tak, żeby nie były takie same. Kolejna rzecz, która bym zrobił, to powywalał te rzeczy z global scopea i jeśli już musisz to tak rozdzielać na funkcje, to przesyłał przez argumenty.

 

Edit.

Nie zauważyłem co tam się dzieje. Ty próbujesz castować pointery na funkcje, a nie wyniki tych funkcji. Żeby wywołać funkcje musisz użyć operatora (), a więc (double)polska() ....

Podobne pytania

–1 głos
1 odpowiedź 1,085 wizyt
0 głosów
0 odpowiedzi 57 wizyt
pytanie zadane 27 grudnia 2020 w C# przez Hubert Hetman Nowicjusz (120 p.)
0 głosów
1 odpowiedź 141 wizyt

86,512 zapytań

135,267 odpowiedzi

300,567 komentarzy

57,262 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...