微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于计算您的唤醒时间并打印出来的程序

如何解决用于计算您的唤醒时间并打印出来的程序

这是我的任务,下面是我已经编写的大多数代码

编写一个程序,要求用户以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(&current_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是真实的,但是意识到这些问题是很好的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。