Problem z zaokrąglaniem liczb (zmienna double)

0

Witam!
Mam problem z tym, że zmienna double a nie wyświetla wartości po przecinku, a całkowite (sprawdzałem dodając cout >> a; pod koniec programu). Prosiłbym o podsunięcie mi błedu w programie gdyż głowię się nad tym przez cały dzień i nie mogę znaleźć problemu.

//
//  main.cpp
//  obzartuchy
//
//  Created by Mateusz  on 12-08-10.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#include <iostream>

/////////zmienne
int testy,obz,i,wynik3,wynik2,ciastka;
int * tab;
int * wynik1;

int obz2,obz3;
double a;
/////////////////

int main (int argc, const char * argv[])
{

    using namespace std;
    cin >> testy;
    while (testy--) 
    {
        ///////wczytywanie
        cin >> obz >> ciastka;
        tab = new int[obz];
        wynik1 = new int[obz];

        obz2 = obz;
        obz3 = obz;

        for (i=0; obz--; i++) 
        {
            cin >> tab[i];
        }

        ///////obliczanie

        for (i=0; obz2--; i++) 
        {
            wynik1[i] = 86400 / tab[i];

        }

        for (i=0; obz3--; i++) 
        {
            wynik2 = wynik2 + wynik1[i];

        }
        ///////w tym miejscu zaczyna sie problem
        a = wynik2 / ciastka;
        wynik3 = wynik2 / ciastka;

        if (wynik3 != a) 
        {
            cout << wynik3 + 1;
        }
        else
        {
            cout << wynik3;
        }

      //////////a tu sie konczy  

    }

    return 0;
}
1

Wszystkie zmienne poza a są typu int. Dzielenie dwóch liczb int daje wynik o typie int, który następnie jest przepisywany do zmiennej double, ale jest to i tak liczba całkowita. Albo wykonuj obliczenia na typie zmiennoprzecinkowym, albo w odpowiednich miejscach umieść rzutowanie, np:

a = static_cast<double>(wynik2) / ciastka;

Drugiej zmiennej nie trzeba już rzutować. Pojęcia nie mam co Ty chcesz uzyskać i co to za obliczenia, więc samo to rzutowanie może nie wystarczyć. Być może lepiej od razu rób wszystko na double.

0

Teraz po ominięciu tego problemu z zaokrąglaniem napotkałem problem z obliczaniem. Pierwszy test przykładowy mój program przechodzi dobrze natomiast test nr 2 oblicza źle. Przerobiłem trochę program i mam nadzieję,że może komuś z was uda się znależć błąd. Oto kod:

//  main.cpp
//  obzartuchy
//
//  Created by Mateusz  on 12-08-10.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#include <iostream>
# include <math.h>

/////////zmienne
int testy,obz,i,wynik2,wynik1,ciastka;
int * tab;

int obz2;
double a;
/////////////////

int main (int argc, const char * argv[])
{

    using namespace std;

    cin >> testy;
    while (testy--) 
    {
        ///////wczytywanie
        cin >> obz >> ciastka;
        tab = new int[obz];

        obz2 = obz;

        for (i=0; obz--; i++) 
        {
            cin >> tab[i];
        }

        ///////obliczanie

        for (i=0; obz2--; i++) 
        {
            wynik1 += 86400 / tab[i];

        }

        a = wynik1 / static_cast<double>(ciastka);

        cout << ceil(a);

    }

    return 0;
}

PS: To jest to zadanie ze spoja do którego link podał użytkownik wyżej.

1

Jest jeden maly blad jeszcze. Samo liczenie wynikow powinno wygladac tak.

        for(int i=0;i<czasy.size();i++)
        {
            wynik+=floor(86400.0/static_cast<double>(czasy[i]));
        }
        cout << ceil(wynik/ile) << endl;
0

Niestety program nadal źle oblicza 2 przykład a gdy dodaje for(int i=0;i<czasy.size();i++) to nie chce się skompilować.

0

Na windowsie też nie działa. Xcode wywala pi błąd obok

for (int i=0;i<tab.size();i++)

i jest tam napisane : Member reference base type 'int *' is not a structure or union. Podejżewam, że chodzi o coś z tym wskaźnikiem od tworzenia tablicy dynamicznej. Byłbym bardzo wdzięczny jeśli ktoś będzie wiedział gdzie leży problem Oto aktualny kod programu:

//
//  main.cpp
//  obzartuchy
//
//  Created by Mateusz  on 12-08-10.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#include <iostream>
# include <math.h>

/////////zmienne
int testy,obz,ciastka;
int * tab;
int obz2;
double wynik1;
/////////////////

int main (int argc, const char * argv[])
{

    using namespace std;

    cin >> testy;
    while (testy--) 
    {
        ///////wczytywanie
        cin >> obz >> ciastka;
        tab = new int[obz];

        obz2 = obz;

        for (int i=0; obz--; i++) 
        {
            cin >> tab[i];
        }

        ///////obliczanie

        for (int i=0;i<tab.size();i++) 
        {
            wynik1 += floor(86400.0/static_cast<double>(tab[i]));

        }
        cout << ceil(wynik1/ciastka) << endl;

    }

    return 0;
}
0

przecież błąd jest wyraźny
|46|error: request for member 'size' in 'tab', which is of non-class type 'int*'|
int nie ma metody size().

for (int i=0;i<obz2;i++)

czy wynik dobry, nie sprawdzałem, ale skopiowałeś kod, zamiast go zrozumieć

0

Program się teraz kompiluje, ale wynik i tak wychodzi zły. Kod skopiowałem ponieważ nigdy nie słyszałem o metodzie size i myślałem, że to pomoże.

0

Typy proste jak tablica w C++ nie mają metod... http://www.cplusplus.com/reference/stl/vector/size/

BTW. skoro już używasz <iostream>, to czemu korzystasz z <math.h> zamiast z <cmath>? Taki kosmetyczny zabieg, bo w C++ nagłówki biblioteki standardowej są bez rozszerzenia :)

0

Mam to zadanie zaliczone, i można to zrobić na samych int-ach. Właśnie sprawdziłem że nadal przechodzi, więc testów nie zmienili. Tyle że trzeba


if (ile%ciastka==0) ile=ile/ciastka;
else ile=(ile/ciastka)+1;
cout << ile << endl;

zamiast samego wyświetlania jak u ciebie. Podejrzewam że ile to u ciebie wynik, ale to już sam sprawdź. Jak dalej nie pójdzie to mogę wkleić cały "zatwierdzony" kod do porównania.

ps zadanie robiłem na początku maja i już nie pamiętam z czego ten if wynika.

edit już sobie przypomniałem, zaczęte ciastko to ciastko zjedzone nawet jak dokończone po czasie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0