• 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ą

VPS Starter Arubacloud
0 głosów
271 wizyt
pytanie zadane 15 marca 2018 w C i C++ przez Utau Użytkownik (900 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 (900 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 (900 p.)
Dzięki! Oto mi chodziło :)
komentarz 25 października 2020 przez obl Maniak (51,280 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 Nałogowiec (29,290 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ź 2,000 wizyt
0 głosów
0 odpowiedzi 146 wizyt
pytanie zadane 27 grudnia 2020 w C# przez Hubert Hetman Nowicjusz (120 p.)
0 głosów
1 odpowiedź 218 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...