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.

0

Niestety w moim programie to nic nie zmieni ponieważ robi on błąd w obliczeniach. W teście powinno wyjść 2 a mój program oblicza 2.20225.

0

Już rozwiązałem problem, trzeba zerować tablice po każdym przejściu pętli. Serdecznie dziękuje wszystkim za pomoc!!!

0

Problem jest w tym, że prowadzisz obliczenia na liczbach zmiennoprzecinkowych. Powinieneś liczyć wyłącznie na liczbach całkowitych.

Jeśli obżartuch je ciastko w ciągu secs_per_cookie sekund to wciągu dnia może ich zjeść:

unsigned secs_per_cookie = ...
const unsigned secs_per_day = 60 * 60 * 24;
/* Użyjemy dzielenia całkowitego. Pasuje do zadania w sam raz, gdyż obżartuchy nie mogą napocząć ciastka, muszą jeść wyłącznie po całym. */
unsigned cookies_per_day = secs_per_day / x; // w wyniku dostaniemy ilość pełnych 'secs_per_cookie' jakie mieszczą się w 'secs_per_day'  

Teraz po zsumowaniu wszystkich ciastek trzeba określić ile pudełek nam potrzeba. Tu również użyj dzielenia całkowitego, ale tym razem zaokrąglając w górę a nie w dół:

unsigned cookies_required = ...
unsigned cookies_per_box = ...
unsigned boxes_required = (cookies_required + cookies_per_box - 1U) / cookies_per_box;

No i żadnych tablic nie potrzebujesz, sumuj na bieżąco podczas wczytywania danych.

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