如何使用C中的结构正确地递增日期并输出以下日期

如何使用C中的结构正确地递增日期并输出以下日期,c,C,我在练习C语言,在网上找到了一些练习,所以我必须编写一个代码,可以: (1) 判断一年是否是闰年 (2) 也许,日期本身必须在代码中定义 (3) 最后,基于给定的日期和函数,程序应正确输出第二天的日期(如果需要,更改年/月):输入:2020-12-31输出:2021-01-01(非2020-12-32) 我被第三点卡住了,我的代码不改变年/月,这里我的代码是: #include <stdio.h> #include <math.h> struct Date {

我在练习C语言,在网上找到了一些练习,所以我必须编写一个代码,可以:

(1) 判断一年是否是闰年

(2) 也许,日期本身必须在代码中定义

(3) 最后,基于给定的日期和函数,程序应正确输出第二天的日期(如果需要,更改年/月):输入:2020-12-31输出:2021-01-01(2020-12-32)

我被第三点卡住了,我的代码不改变年/月,这里我的代码是:

#include <stdio.h>
#include <math.h>

struct Date
{
    int year;
    int month;
    int day;
};

typedef struct Date Date;

const int days[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31}//common year
                        ,{31,29,31,30,31,30,31,31,30,31,30,31}};//leap year


int isLeapYear(int year)//year is leap or common
{
    if(year%4==0&&year %100!=0 || year %400==0)
        return 1;
    else
        return 0;
}

void increment(Date * p)
{
    p->day++;
    int leap=isLeapYear(p->year);

}

int main()
{
    //p->year = 2021,p->month = 2,p->day = 28
    Date today = {2021,12,31}; //2020 % 4 == 0 &&  2020 % 100 != 0
    printf("%d-%02d-%02d\n", today.year, today.month, today.day);

    increment(&today);//2021-03-01 NOT 2021-02-29
    printf("%d-%02d-%02d\n", today.year, today.month, today.day);
    return 0;
}
#包括
#包括
结构日期
{
国际年;
整月;
国际日;
};
typedef结构日期;
const int days[2][12]={31,28,31,30,31,30,31,30,31}//普通年份
,{31,29,31,30,31,30,31,31,30,31,30,31}};//闰年
int isLeapYear(int year)//年份是闰年或普通年
{
如果(第%4年==0和第%100年!=0 | |第%400年==0)
返回1;
其他的
返回0;
}
无效增量(日期*p)
{
p->day++;
int leap=isLeapYear(p->year);
}
int main()
{
//年=2021年,月=2,日=28
今天的日期={2021,12,31};//2020%4==0&&2020%100!=0
printf(“%d-%02d-%02d\n”,今天.year,今天.month,今天.day);
增量(&今天);//2021-03-01而不是2021-02-29
printf(“%d-%02d-%02d\n”,今天.year,今天.month,今天.day);
返回0;
}

您必须检查是否需要更新年/月。 我建议用这个方法来检查

void increment(Date * p) {
    p->day++;
    int leap=isLeapYear(p->year);
    if (days[leap][p->month - 1] < p->day) {
        p->day = 1;
        p->month++;
    }
    if (p->month > 12) {
        p->month = 1;
        p->year++;
    }
}
无效增量(日期*p){
p->day++;
int leap=isLeapYear(p->year);
如果(天[闰][p->月-1]天){
p->day=1;
p->month++;
}
如果(p->month>12){
p->month=1;
p->year++;
}
}

您拥有所有基本元素,只需根据“天数”数组检查天数的滚动。展期也需要检查几个月

void incrementMonth(Date * p){
    p->month++;
    if (p->month > 12){
        p->month = 1;
        p->year++;
    }
}

void incrementDay(Date * p){
    int leap=isLeapYear(p->year);
    p->day++;
    if (p->day > days[leap][p->month-1]){
        p->day = 1;
        incrementMonth(p);
    }
}

不能通过简单地增加日期来增加日期。在进行操作之前转换为朱利安日期,然后再转换回年/月/日(公历日期)。看,你甚至还没有开始锻炼,那问题是什么?开始工作!因此,这不是一个家庭作业写作服务,尽管我们通常愿意在人们遇到实际问题时提供帮助,但只有在证明了他们的努力之后才会提供帮助。@UlrichEckhardt,我给了你我的草稿,我对一个功能有问题。毕竟,你怎么能判断我甚至没有开始呢?你没有考虑到2月28/29天(取决于哪一年是高还是低)你是对的。它应该是
p->month-1
,然后每个实际的月数都是
days
数组的正确索引。我编辑了答案,现在应该可以了