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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,213 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,060 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 (155,180 p.)
komentarz 6 września 2019 przez tkz Nałogowiec (42,060 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,060 p.)
Zauważ, że mowa tam o makrach, a nie definiowaniu stałych.
komentarz 6 września 2019 przez tangarr Mędrzec (155,180 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,060 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,060 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,060 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 (155,180 p.)
Linia 23: cout << seknaminut;

Podobne pytania

0 głosów
2 odpowiedzi 384 wizyt
0 głosów
2 odpowiedzi 517 wizyt

93,436 zapytań

142,431 odpowiedzi

322,667 komentarzy

62,801 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

...