2010-03-10 5 views
7

Xin chào mọi người. Tôi đã tiếp tục học C++ và tôi đã đặt 'thách thức' về chuyển đổi giây thành định dạng là Ngày, Phút và Giây.Chuyển đổi giây thành Ngày, Phút và Giây

Ví dụ: 31600000 = 365 ngày, 46 phút, 40 giây.

using namespace std; 
const int hours_in_day = 24; 
const int mins_in_hour = 60; 
const int secs_to_min = 60; 

long input_seconds; 
cin >> input_seconds; 

long seconds = input_seconds % secs_to_min; 
long minutes = input_seconds/secs_to_min % mins_in_hour; 
long days = input_seconds/secs_to_min/mins_in_hour/hours_in_day; 

cout << input_seconds << " seconds = " 
    << days << " days, " 
    << minutes << " minutes, " 
    << seconds << " seconds "; 

return 0; 

Nó hoạt động và đưa ra câu trả lời đúng nhưng sau khi hoàn thành, tôi đã xem cách người khác giải quyết nó và của họ khác nhau. Tôi đang tự hỏi nếu tôi đang thiếu một cái gì đó.

Xin cảm ơn, Dan.

+1

Điều này khác nhau như thế nào? – Mark

+0

ngày = thời gian/86400 giờ = (thời gian/3600) - (ngày * 24) phút = (thời gian/60) - (ngày * 1440) - (giờ * 60) giây = thời gian mod 60 Cảm ơn. – Dan

Trả lời

5

Một trong những điều về lập trình là không bao giờ chỉ có một cách để làm điều gì đó. Trong thực tế, nếu tôi đã đặt tâm trí của tôi với nó, tôi có thể có thể đưa ra một chục cách hoàn toàn khác nhau để thực hiện điều này. Bạn không thiếu bất cứ điều gì nếu mã của bạn đáp ứng các yêu cầu.

Đối với giải trí của bạn, đây là một cách để định dạng lên giờ: phút: giây trong môi trường Windows (elapsed là một đôi & đại diện cho số giây trôi qua kể từ ... một cái gì đó)

sprintf_s<bufSize>(buf, "%01.0f:%02.0f:%02.2f", floor(elapsed/3600.0), floor(fmod(elapsed,3600.0)/60.0), fmod(elapsed,60.0)); 
1

Ví dụ: 31600000 = 365 ngày, 46 phút, 40 giây.

Thật sao?

$ bc 
365*24*60*60 + 46*60 + 40 
31538800 

365*24*60*60 + 1066*60 + 40 
31600000 

Ý của bạn là "chuyển đổi các đầu vào ngày, giờ, phút và giây, và sau đó loại bỏ các giờ" hoặc "chuyển đổi các đầu vào ngày này, tổng số phút trong một ngày (tức là có thể có nhiều hơn 60) và giây "?

Trong trường hợp thứ hai tôi nghĩ rằng bạn nên thay thế các hướng dẫn cho vài phút với

long minutes = input_seconds/secs_to_min % (mins_in_hour * hours_in_day); 
+0

Vâng tôi có nghĩa là để loại bỏ các giờ tuy nhiên cảm ơn cho trả lời. – Dan

8

này dường như đối với tôi là cách dễ dàng nhất để chuyển đổi giây vào DD/hh/mm/ss:

#include <time.h> 
#include <iostream> 
using namespace std;  

time_t seconds(1641); // you have to convert your input_seconds into time_t 
tm *p = gmtime(&seconds); // convert to broken down time 

cout << "days = " << p->tm_yday << endl; 
cout << "hours = " << p->tm_hour << endl; 
cout << "minutes = " << p->tm_min << endl; 
cout << "seconds = " << p->tm_sec << endl; 

Tôi hy vọng điều đó sẽ hữu ích!

Kính trọng,

Stoycho

+0

bạn có chắc chắn không? Với mã của bạn tôi nhận được rằng 1641 giây là bằng ngày = 0 giờ = 1 phút = 27 giây = 21, mà dường như rất khó với tôi (một giờ quá nhiều) – Wim

+0

Vâng, bạn đúng Wim. Bạn phải sử dụng gmtime thay vì localtime khi chuyển đổi thành thời gian bị hỏng. Có thể bạn đang ở trong múi giờ UTC +01: 00 (ví dụ: CET), nơi có sự khác biệt một giờ. – stoycho

+0

ah, không nghĩ về điều đó, cảm ơn bạn rất nhiều :-) nhưng tôi hiện đang sử dụng câu trả lời của John Dibling (xem ở trên): int hours = floor (totalseconds/3600.0); int phút = sàn (fmod (tổng số giây, 3600.0) /60.0); int giây = fmod (tổng số giây, 60,0); human_readable.sprintf ("% 01du% 02dm% 02ds", giờ, phút, giây); – Wim

3

Tôi nghĩ là thách thức từ cuốn sách Stephen Prata của. Tôi đã làm như sau:

#include <iostream> 

using namespace std; 

int main() 
{ 
    long input_seconds = 31600000; 

    const int cseconds_in_day = 86400; 
    const int cseconds_in_hour = 3600; 
    const int cseconds_in_minute = 60; 
    const int cseconds = 1; 

    long long days = input_seconds/cseconds_in_day; 
    long hours = (input_seconds % cseconds_in_day)/cseconds_in_hour; 
    long minutes = ((input_seconds % cseconds_in_day) % cseconds_in_hour)/cseconds_in_minute; 
    long seconds = (((input_seconds % cseconds_in_day) % cseconds_in_hour) % cseconds_in_minute)/cseconds; 
    cout << input_seconds << " seconds is " << days << " days, " << hours << " hours, " << minutes << " minutes, and " << seconds << " seconds."; 

    cin.get(); 
    return 0; 
}