clockKeeper功能。节目'工作'但价值是按错误的顺序打印出来的?

时间:2016-07-22 12:09:36

标签: c datetime time structure

我写过一个充当时钟的功能。它会在时间上增加一秒钟(即输入),然后将在军事时间内给出新的时间。

如果新时间过了午夜,那么它将更新日期(第二天),考虑月份,年份以及是否为闰年。

该程序完美运行ALMOST。

如果更新时间是在午夜之前,那么一切正常,如下:

好的,请选择日期: 22/07/2016 现在选择你的时间: 21时53分22秒 这是新的时间:21:53:23 这是日期:2016年7月22日

但是如果它已经过了午夜,那么时间和日期会以错误的顺序打印出来,如下所示:

好的,请选择日期: 21/07/2016 现在选择你的时间: 23:59:59 这是新的时间:7:22:2016 这是日期:0/0/0

另请注意,日期和月份也是如何切换的!

这让我很困惑很长一段时间,我很感激任何建议。

这是我的代码:

#include <stdio.h>
#include <stdbool.h>

typedef struct 
{
    int hours;
    int minutes;
    int seconds;
    int day;
    int month;
    int year;
}dateAndTime;

// Function Declarations

dateAndTime timeUpdate (dateAndTime);
dateAndTime dateUpdate (dateAndTime);
dateAndTime clockKeeper (dateAndTime);
int numberOfDays (dateAndTime);
bool isLeapYear(dateAndTime);

int main (void)
{
    // Two functions of struct dateAndTime. 

    dateAndTime timeDate, newTimeDate;

    // Enter in dates and time

    printf("Okay, so choose your date:\n");
    scanf("%i/%i/%i", &timeDate.day, &timeDate.month, &timeDate.year);

    printf("Now choose your time:\n");
    scanf("%i:%i:%i", &timeDate.hours, &timeDate.minutes, &timeDate.seconds);

    // Call clockKeeper function, store new values in newTimeDate

    newTimeDate = clockKeeper(timeDate);

    //print updated time and date

    printf("This is the new time: %i:%i:%i\n", newTimeDate.hours, newTimeDate.minutes, newTimeDate.seconds);
    printf("This is the date: %i/%i/%i\n", newTimeDate.day, newTimeDate.month, newTimeDate.year);

}


// This function calls the timeUpdate function. If it's the new time is past midnight, call dateUpdate function

dateAndTime clockKeeper (dateAndTime timeDate)
{
    dateAndTime newTimeDate = timeUpdate (timeDate);

    if(newTimeDate.hours < timeDate.hours)
    {
        newTimeDate = dateUpdate(timeDate);
    }

    return newTimeDate;
}


// Update time

dateAndTime timeUpdate (dateAndTime now)
{
    now.seconds++;

    if(now.seconds == 60)
    {
        now.seconds = 0;
        now.minutes++;

        if(now.minutes == 60)
        {
            now.minutes = 0;
            now.hours++;

            if(now.hours == 24)
            {
            now.hours = 0;
            }
        }
    }
    return now;
}


// Update date

dateAndTime dateUpdate (dateAndTime date)
{
    dateAndTime newDate;

    // call function to check how many days are in the month
    int numberOfDays (dateAndTime d);

    if(date.day != numberOfDays (date))
    {
        newDate = (dateAndTime) {date.month, date.day + 1, date.year};
    }
    else if(date.month == 12)
    {
        newDate = (dateAndTime) {1, 1, date.year + 1};
    }
    else
    {
        newDate = (dateAndTime) {date.month + 1, 1, date.year};
    }

    return newDate;
}

int numberOfDays (dateAndTime d)
{
    int days;

    //call function to check if it's a leap year so amount of days in february can be upated.
    bool isLeapYear (dateAndTime d);
    const int daysPerMonth[12] =
        {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    if(isLeapYear (d) && d.month == 2)
    {
        days = 29;
    }
    else
    {
        days = daysPerMonth[d.month - 1];
    }

    return days;
}

bool isLeapYear(dateAndTime d)
{
    bool leapYearFlag;

    if ( (d.year % 4 == 0 && d.year % d.year % 100 != 0) || d.year % 400 == 0)
    {
        leapYearFlag = true;
    }
    else
    {
        leapYearFlag = false;
    }

    return leapYearFlag;
}

谢谢!

1 个答案:

答案 0 :(得分:1)

newDate = (dateAndTime) {date.month + 1, 1, date.year};

你基本上说应该将这3个整数复制到dateAndTime结构的前3个整数,而将其他3个默认初始化为0。

你应该做的是

newDate = (dateAndTime) {date.hours, date.minutes, date.seconds, date.month + 1, 1, date.year};

您的结构以正确的顺序打印;复合文字是错的。