我写过一个充当时钟的功能。它会在时间上增加一秒钟(即输入),然后将在军事时间内给出新的时间。
如果新时间过了午夜,那么它将更新日期(第二天),考虑月份,年份以及是否为闰年。
该程序完美运行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;
}
谢谢!
答案 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};
您的结构以正确的顺序打印;复合文字是错的。