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

Stephen Prata język C++ Szkoła programowania wydanie VI Rozdział 3 Zadanie 4.

Object Storage Arubacloud
0 głosów
841 wizyt
pytanie zadane 6 września 2019 w C i C++ przez Jaca123 Nowicjusz (150 p.)

Witam mam problem z wyżej wymienionym zadaniem, jego treść to:

"Napisz program, który poprosi użytkownika o podanie liczby sekund (zmienna typu long albo long long, jeśli są dostępne) jako wartości całkowitej (użyj typu long) i pokaże odpowiednik przekazanej liczby w dniach, godzinach minutach i sekundach. Użyj stałej symbolicznej, aby zapisać liczbę godzin w dniu,minut w godzinie i sekund w minucie.Wyniki powinny wyglądać następująco:

Podaj liczbę sekund : 31600000

31600000 sekund = 365 dni, 17 godzin, 46 minut, 40 sekund."

O to do czego udało mi się do tej pory dojść.

#include <iostream>
#define WDOBIE 86400
#define WGODZINIE 3600
#define WMINUCIE 60
int main()
{
	using namespace std;
	cout << "Podaj liczbe sekund: ";
	long long sekundy;
	cin >> sekundy;
	cout << endl;
	int iloscdob;
	iloscdob = sekundy / WDOBIE;
	int seknah;
	seknah = sekundy % WDOBIE;
	seknah = seknah / WGODZINIE;
	int iloscgodzin;
	iloscgodzin = seknah;
	int seknaminut = sekundy % WDOBIE;
	seknaminut = seknaminut % WGODZINIE;
	seknaminut = seknaminut / WMINUCIE;
	cout << seknaminut;
	int iloscminut;
	iloscminut = seknaminut;
	int iloscsekund;
	iloscsekund = sekundy % WDOBIE;
	iloscsekund = iloscsekund % WGODZINIE;
	iloscsekund = iloscsekund % WMINUCIE;
	cout << sekundy << " sekund = " << iloscdob << " dni, " << iloscgodzin << " godzin, ";
	cout << iloscminut << " minut, " << iloscsekund << " sekund.";
	return 0;
}

Daje to wynik:

Podaj liczbę sekund: 31600000

4631600000 sekund = 365 dni, 17 godzin, 46 minut, 40 sekund.

Jak widać na pierwszy rzut oka coś jest nie tak z wyświetlaną liczbą sekund. Nie mam pojęcia jak rozwiązać ten problem dlatego proszę chętnych o nakierowanie mnie na rozwiązanie ewentualnie wysłanie mi poprawionego kodu jeżeli zrobiłem bardzo dużo błędów. Dziękuję serdecznie za fatygę.

4 odpowiedzi

0 głosów
odpowiedź 6 września 2019 przez multim Obywatel (1,830 p.)
wybrane 6 września 2019 przez Jaca123
 
Najlepsza

"Błąd" pojawia się w 22 lini (wypisujesz tam 46, ale nie wstawiasz znaku nowej lini).
Wystarczy dodać " << endl" na końcu wiersza:
 

cout << seknaminut << endl;

Parę uwag:
Błędów dużo nie ma, możnaby ewentualnie wykorzystywać zmienne z poprzednich obliczeń zamiast np. 3 razy liczyć "sekundy % WDOBIE"
Dlaczego korzystasz z tego #define? W każdym przypadku lepsze do definiowania stałych jest const (oczywiście w możliwie wąskim zakresie, ewentualnie z użyciem static).
Możesz poprawić czytelność nawet najprostszych i najkrótszych programów odpowiednio nazywając zmienne i formatując bloki kodu (dodanie pustych wierszy rozdzielających grupy operacji, wykorzystanie osobnych funkcji do obliczania kolejnych kroków programu). Pomoże Ci to szybko znaleźć podobne omyłki i groźniejsze błędy.

komentarz 6 września 2019 przez tkz Nałogowiec (42,000 p.)

endl; samo w sobie nie jest dobrym podejściem do tworzenia nowej linii, cpp.sh/573w5 .

Co jest złego w #define? Ma kilka plusów na rzecz const.  Główna zalety const polegają na tym, że można je przeskalować i można ich użyć w sytuacjach, w których należy przekazać wskaźnik do obiektu. Define ma ten plus, że nie potrzebuje pamięci. Pewnie temat rzeka na ten temat, takie dwie różnice, które przyszły mi do głowy.

komentarz 6 września 2019 przez tangarr Mędrzec (154,780 p.)
komentarz 6 września 2019 przez tkz Nałogowiec (42,000 p.)
Związku z czym? Bo nie jestem pewny czy odnosisz się do tego co napisałem, czy tak po prostu. Fajnie jakbyś podał jakieś odniesienie.

edit: dobra, nie załadowało mi się to odniesieni...
komentarz 6 września 2019 przez tkz Nałogowiec (42,000 p.)
Zauważ, że mowa tam o makrach, a nie definiowaniu stałych.
komentarz 6 września 2019 przez tangarr Mędrzec (154,780 p.)
Napisałeś: Co jest złego w #define?
Dałem link do CppCoreGuildlines mówiący, dlaczego lepiej unikać makr.
komentarz 6 września 2019 przez tkz Nałogowiec (42,000 p.)

Napisałem to "Co jest złego w #define? Ma kilka plusów na rzecz const.", nie samo "Co jest złego w #define?". Same makra(funkcję zastąpione define) są złe.

komentarz 6 września 2019 przez Jaca123 Nowicjusz (150 p.)

@multim, Jak mogłem być tak ślepy, pewnie to że skończyłem pisać ten kod o 2:00 w nocy miało na to swój wpływ. Co do #define to we wcześniejszych zadaniach używałem const, tym razem właśnie chciałem sobie przetestować ten sposób. Wniosek mam taki że w mniejszych kodach takie define jest dużo czytelniejsze gdyż masz cały czas wszystko w jednym miejscu z podświetloną nazwą stałej i jej wartością. W większych programach kiedy używa się const do poszczególnych funkcji a nie całego programu faktycznie może być wygodniejsze. 

1
komentarz 6 września 2019 przez tkz Nałogowiec (42,000 p.)
Tak na marginesie lepszym wyborem jest constexpr.
komentarz 6 września 2019 przez multim Obywatel (1,830 p.)
@tkz

C/C++ ma pewne elementy które początkującemu mogą sprawić sporo problemów. Moja odpowiedź miała na celu wskazać rozwiązania, które na obecnym poziomie wiedzy mogą pomóc pytającemu. Dodatkowe możliwości jakkolwiek precyzyjne powinny być albo obiektywnie opisane (dlaczego są lepsze), albo pominięte na tym etapie.

Zaproponowałem endl, bo z podobnej konstrukcji korzystał Jaca123, zaproponowałem const int, ponieważ łatwiej jest wyłapać co poszło nie tak ze względu na zasięg i typowanie. Generalnie jeżeli się da faworyzuje się (static) const w C++ (niekoniecznie a C).
komentarz 6 września 2019 przez tkz Nałogowiec (42,000 p.)

Luzik, prostota jest ważna, ale nie ma sensu ograniczać się do tego, że ktoś jest początkujący i nie zrozumie. 

Generalnie jeżeli się da faworyzuje się (static) const w C++

Wcale nie, static w const po za nadaniem jej klasy pamięci statycznej jest po to by ograniczyć jej zakres. Różnica jest taka, że jeśli zmienne globalne zadeklarujemy z atrybutem static, to będą widoczne w danym module (jednostce translacji) i tylko w nim: nie można się do nich odwołać z innego modułu nawet poprzez użycie słowa kluczowego extern. 

0 głosów
odpowiedź 4 lutego 2020 przez Kmicitz Początkujący (300 p.)
Program dobrze oblicza,

 

skasuj tylko to : cout << seknaminut;

 

Zadbaj o porządek w kodzie to będzie bardziej czytelny.

 

Ja zaraz kleję swoje rozwiązanie, to sobie porównasz.

 

Może tu będziemy rozwiązywać kolejne ?

 

Ja zrobiłem 3 i działąją.
0 głosów
odpowiedź 4 lutego 2020 przez Kmicitz Początkujący (300 p.)
#include <iostream>

using namespace std;

int main()

{
    //cout.setf(ios_base::fixed, ios_base::floatfield); //pokazuje dokładniej liczby rzeczywiste

    cout << "Hello world!" << endl;

    int doba; int godzina;
    int minuta; long int sekunda;
    const int sek_na_min = 60; const int min_na_godz = 60; const int godz_na_dobe = 24;

cout << "Podaj sekundy: ";
    cin  >> sekunda;

            minuta = sekunda/sek_na_min;
            godzina = minuta/min_na_godz;
            doba = godzina/godz_na_dobe;

    cout << "\n\n\nPrzeliczam........\n\n\n";

cout << sekunda << " sekund to: " << doba << " dni " << godzina%godz_na_dobe << " godzin " << minuta%min_na_godz << " minut " << sekunda%sek_na_min << " sekund "<<endl <<endl <<endl <<endl;

    return 0;
}
–1 głos
odpowiedź 6 września 2019 przez tangarr Mędrzec (154,780 p.)
Linia 23: cout << seknaminut;

Podobne pytania

0 głosów
2 odpowiedzi 308 wizyt
0 głosów
2 odpowiedzi 373 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...