问题描述
这是我的任务,下面是我已经编写的大多数代码:
编写一个程序,要求用户以24小时格式输入当前时间,并询问您想睡多长时间。然后,程序将计算您的唤醒时间并进行打印。该程序必须检查以正确的格式输入的值,如果输入的输入无效,则必须打印错误消息。
程序还必须检查输入的数字是否在有效范围内(0-23 / 0-59)。
示例:
输入当前时间(hh:mm):21:56
您想睡多长时间(h:mm):8:30
如果您现在上床睡觉,则必须在6:26醒来。
具体问题:
我的代码将数字添加到24小时格式之外,例如:“ 29小时”。
如何测试分钟数总和是否大于59?这样就可以增加小时数,并从分钟数中减去1小时(60分钟)
最后,如何检查小时数是否超过23?因此需要从小时数中减去1天(24小时)。
代码:
#include <stdio.h>
int ValidateTime(int hh,int mm)
{
int ret = 0;
if (hh > 24) ret = 1;
if (mm > 60) ret = 1;
return ret;
}
int main()
{
char string[100] = { 0 };
int ret = 0;
int hour1 = 0,min1 = 0;
int hour2 = 0,min2 = 0;
int hour_final = 0,min_final = 0;
int sum = 0;
printf("\nEnter the time in \"hh:mm\" format : ");
fgets(string,100,stdin);
sscanf_s(string,"%d:%d",&hour1,&min1);
ret = ValidateTime(hour1,min1);
if (ret)
{
printf("\nInvalid Time. Try Again.\n");
}
do {
printf("How long do you want to sleep in \"h:mm\" format: ");
fgets(string,stdin);
sscanf_s(string,&hour2,&min2);
sum = hour1 + hour2,min1 + min2;
ret = ValidateTime(hour2,min2);
if (ret)
{
printf("\nInvalid Time. Try Again.\n");
}
} while (hour2 < 0);
printf("If you go to bed Now you must wake up at: %d:%d",sum);
fgets(string,stdin);
sscanf_s(string,&sum);
return 0;
}
解决方法
您可以使用除法和取模:
#include <stdio.h>
int main(void)
{
int x = 29;
printf("%d days,%d hours\n",x / 24,x % 24);
return 0;
}
输出:
1 days,5 hours
相同的分钟和小时,在这种情况下使用60:
int x = 257;
printf("%d hours,%d minutes\n",x / 60,x % 60);
,
[注意:我意识到这是家庭作业,而不是实际的日期数学问题。我给日期数学答案是因为作业是关于学习的,而日期数学很棘手。]
编写一个程序,要求用户以24小时格式输入当前时间,并询问您想睡多长时间。然后程序会计算您的唤醒时间并打印出来。
由于夏令时规则,您不能简单地获取当前时间,为其添加小时和分钟并产生一个唤醒时间。如果DST改变了一整夜,您将提前一个小时(或更晚)醒来。
相反,只有标准库可用,您才可以将当前时间转换为纪元时间(格林尼治标准时间1970年1月1日以来的秒数),再加上秒数,然后再将其转换回本地时间。 / p>
首先,将当前时间转换为当天的完整本地日期和时间。使用time
可以获取绝对时间(秒),而不管时区如何。然后localtime_r
将其转换为本地日期和时间。 (注意:INSERT INTO projects(id,project_name)
VALUES(1234,'Test_Project')
ON CONFLICT (id)
DO NOTHING
可能是编译器上的localtime_r
。
localtime_s
然后使用#include <time.h>
// Get the current time since the epoch
time_t current_time = time(NULL);
// Convert it to the current local date and time.
struct tm start_local;
localtime_r(¤t_time,&start_local);
// Set the local date to your given hour and minute.
start_local.tm_hour = hour1;
start_local.tm_min = min1;
将其转换为时代。
mktime
现在我们可以安全地进行数学了。 time_t start_time = mktime(&start_local);
以秒为单位。将小时和分钟转换为秒并添加它们。
start_time
并将其转换回本地日期时间。
time_t wake_time = start_time + (hour2 * 60 * 60) + (min2 * 60);
要进行格式化,请使用strftime
(STRing格式化时间)。
struct tm wake_local;
localtime_r(&wake_time,&wake_local);
现在我们需要确定时间是今天还是明天或其他时间。
char time_part[10];
strftime(time_part,sizeof(time_part),"%H:%m",&wake_local);
请注意,即使那还不完整,如果您在除夕设置闹钟,该怎么办?您还需要检查年份。
如果要做很多看起来很简单的工作要做:欢迎使用C。实际上,日期数学是如此复杂且容易出错,您可以使用a datetime library是真实的,但是意识到这些问题是很好的。