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

Konwersja stopni na minuty i sekundy

Object Storage Arubacloud
+1 głos
410 wizyt
pytanie zadane 4 listopada 2015 w C i C++ przez Rutherford Nowicjusz (130 p.)
edycja 4 listopada 2015 przez Patrycjerz

Witam, mam problem z poniższym kawałkiem kodu. Mianowicie przy niektórych wartościach np. 1.2 program zwraca o 1 sekundę za mało. Podejrzewam,że chodzi tu o coś z konwersją double na inta. Byłbym wdzięczny za wyjaśnienie problemu.

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

using namespace std;

double user_data;

int stopnie(double s)
{
    return floor(s);
}

int minuty(double m)
{
    return (m - floor(m))*60;
}

int sekundy(double k)
{
    return ((k - floor(k))*60-floor(k-floor(k)))*60;
}

int main()
{
cout << "Ile stopni: ";
cin >> user_data;
cout << stopnie(user_data)<<"\370 ";
cout << minuty(user_data)%60<<"' ";
cout << sekundy(user_data)%60<<"\" ";
return 0;
}

 

3 odpowiedzi

+3 głosów
odpowiedź 4 listopada 2015 przez furas Maniak (53,800 p.)
Ale o co chodzi ? Podałeś kod i co dalej ?

Mamy go wydrukować i powiesić sobie na ścianie ?
komentarz 4 listopada 2015 przez Javowiec Pasjonat (21,560 p.)
Jak przewiniesz w prawo kod to zobaczysz treść pytania w bloku z kodem XD
0 głosów
odpowiedź 4 listopada 2015 przez Magulon Użytkownik (580 p.)
W czym problem?
komentarz 4 listopada 2015 przez Rutherford Nowicjusz (130 p.)
Po pierwsze z racji tego że to mój pierwszy post, tekst mojego pytania został uznany jako kod. Znajduje się na początku kodu tylko trzeba go przwinąć w prawo.
komentarz 4 listopada 2015 przez furas Maniak (53,800 p.)
Podaj kilka przykładów danych w stopniach oraz poprawnych wyników w minutach/sekundach aby można było na nich sprawdzać działanie kodu.
komentarz 4 listopada 2015 przez Rutherford Nowicjusz (130 p.)
Ogólnie po dodaniu ceila do return-ów to w większości przypadków tam gdzie było żle wcześniej to teraz jest dobrze i odwrotnie.(z wyjątkiem liczb całkowitych, połówek, liczb mniejszych od 1 - tam z ceilem są obliczane poprawnie a bez ceila brakuje 1 minuty zamiast 1 sekundy).
0 głosów
odpowiedź 4 listopada 2015 przez Szykem2 Nałogowiec (29,510 p.)

Błąd jest w tym, że przy zwracaniu następuje niejawna konwersja z double do int. Double to liczba ze sporą precyzją ale ograniczoną dokładnością czyli defakto nie masz tam 12 tylko 11.9999999999 a w strumieniu wyjściowym pokazuje jako 12 jako zaokrąglenie. Przy konwersji ucina to wszystko co jest po precinku czyli zostaje 11 a ma zwrócić 12. Mówię tu o przykładzie dla 1.2 stopnia. Przy zwracaniu zrób:

return ceil((m - floor(m))*60);
return ceil(((k - floor(k))*60-floor(k-floor(k)))*60);

 

komentarz 4 listopada 2015 przez Rutherford Nowicjusz (130 p.)

Teraz z kolei np. dla 1.1 wychodzi 1° 7' 1'', a dla 1.6 1° 37' 1''.

komentarz 5 listopada 2015 przez Szykem2 Nałogowiec (29,510 p.)
Racja nie przemyślałem pewnej kwestii zamień ceil() na round() i powinno już być ok.
komentarz 5 listopada 2015 przez Rutherford Nowicjusz (130 p.)
Poradziłem sobie w inny sposób. Mianowicie przed konwersją na inta do obliczonej wartości minut czy sekund dodaje 0.5 dzięki czemu później program obcina double do porządanej wartości inta.

Podobne pytania

0 głosów
4 odpowiedzi 5,824 wizyt
pytanie zadane 12 września 2016 w Egzaminy zawodowe przez Kenzy Obywatel (1,160 p.)
+1 głos
2 odpowiedzi 1,248 wizyt
pytanie zadane 26 lipca 2016 w C i C++ przez dziubi21 Początkujący (310 p.)
0 głosów
2 odpowiedzi 1,766 wizyt

92,568 zapytań

141,424 odpowiedzi

319,632 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...