Конвертируйте секунды в дни, минуты и секунды
Вопрос
Всем привет.Я продолжаю изучать C++, и мне поставили «задачу» преобразовать секунды в формат дней, минут и секунд.
Например:31600000 = 365 дней, 46 минут, 40 секунд.
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;
Он работает и дает правильный ответ, но после его завершения я посмотрел, как другие люди справились с этим, и у них все было по-другому.Мне интересно, если я что-то упустил.
Спасибо, Дэн.
Решение
Одна из особенностей программирования заключается в том, что никогда не бывает единственного способа сделать что-то.На самом деле, если бы я задумался над этим, я мог бы придумать дюжину совершенно разных способов добиться этого.Вы ничего не упускаете, если ваш код соответствует требованиям.
Для вашего развлечения вот способ форматирования часов:минут:секунд под Windows (elapsed
является двойным и представляет количество секунд, прошедших с...что-нибудь)
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));
Другие советы
мне кажется, это самый простой способ преобразовать секунды в ДД/чч/мм/сс:
#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;
Я надеюсь, что это помогает!
С уважением,
Стойчо
Я думаю, это вызов из книги Стивена Праты.Я сделал это следующим образом:
#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;
}
Например:31600000 = 365 дней, 46 минут, 40 секунд.
Действительно?
$ bc
365*24*60*60 + 46*60 + 40
31538800
365*24*60*60 + 1066*60 + 40
31600000
Вы имели в виду «преобразовать ввод в дни, часы, минуты и секунды, а затем отбросить часы» или «преобразовать ввод в дни, общее количество минут в течение дня (т. е.может быть больше 60) и секунд"?
Во втором случае думаю стоит заменить инструкцию минут на
long minutes = input_seconds / secs_to_min % (mins_in_hour * hours_in_day);