关于日期的结构定义如下: struct DateG{ int yy,mm,dd;}; 编写两个函数,一个计算自公元1年1月1日到指定的日期共经历了多少天。另一个是前一个函数的逆函数:由自公元1年1月1日历经指定的天数后的日期(返回年月日构成的日期)。 struct DateG{ int yy,mm,dd; }; char leapYear(int year);//闰年否 struct DateG _DateG(char *st);{//"1919-9-9"-->{1919,9,9} struct DateG Add(struct DateG x,int y);//{1919,9,9}+50-->{1919,10,29} char* Date2string(struct DateG x);//{1919,9,9}-->"1919-09-09" //以上为测试程序提供的测试用函数,略去不表, //以下两函数是必须自己完成的函数 struct DateG days2Date(int x);{//from:{1,1,1} + 100-->{1,4,11} int Days(struct DateG x);// {2,,4,11} return 465 from{1,1,1} int main(){ char st[12];scanf("%s",st); struct DateG d1=_DateG(st), d2=Add(d1,60*365); printf("%s\n",Date2string(d2)); d2=Add(d2,-1000); printf("%s\n",Date2string(d2)); d2=_DateG("2020-1-23"); printf("%.2f\n",(Days(d2)-Days(d1))/365.0); return 0; } 用c语言补充程序
时间: 2024-02-28 16:57:47 浏览: 61
typed_struct:一个Elixir库,用于在不编写样板代码的情况下使用类型定义结构
可以参考以下的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct DateG{
int yy, mm, dd;
};
char leapYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
struct DateG _DateG(char *st)
{
struct DateG d;
sscanf(st, "%d-%d-%d", &d.yy, &d.mm, &d.dd);
return d;
}
struct DateG Add(struct DateG x, int y)
{
int monthDays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
struct DateG d = x;
while (y > 0) {
int daysInYear = leapYear(d.yy) ? 366 : 365;
if (y >= daysInYear) {
y -= daysInYear;
d.yy++;
} else {
int daysInMonth = monthDays[d.mm];
if (d.mm == 2 && leapYear(d.yy)) {
daysInMonth++;
}
if (y >= daysInMonth - d.dd + 1) {
y -= daysInMonth - d.dd + 1;
d.dd = 1;
d.mm++;
if (d.mm > 12) {
d.mm = 1;
d.yy++;
}
} else {
d.dd += y;
y = 0;
}
}
}
return d;
}
char* Date2string(struct DateG x)
{
static char str[12];
sprintf(str, "%04d-%02d-%02d", x.yy, x.mm, x.dd);
return str;
}
int Days(struct DateG x)
{
struct DateG d = {1, 1, 1};
int days = 0;
while (d.yy < x.yy || d.mm < x.mm || d.dd < x.dd) {
days++;
d = Add(d, 1);
}
return days + 1;
}
struct DateG days2Date(int x)
{
struct DateG d = {1, 1, 1};
while (x > 0) {
int daysInYear = leapYear(d.yy) ? 366 : 365;
if (x >= daysInYear) {
x -= daysInYear;
d.yy++;
} else {
int daysInMonth = 0;
for (int i = 1; i < d.mm; i++) {
daysInMonth += monthDays[i];
}
if (d.mm == 2 && leapYear(d.yy)) {
daysInMonth++;
}
if (x >= daysInMonth - d.dd + 1) {
x -= daysInMonth - d.dd + 1;
d.dd = 1;
d.mm++;
if (d.mm > 12) {
d.mm = 1;
d.yy++;
}
} else {
d.dd += x;
x = 0;
}
}
}
return d;
}
int main()
{
char st[12];
scanf("%s", st);
struct DateG d1 = _DateG(st), d2 = Add(d1, 60 * 365);
printf("%s\n", Date2string(d2));
d2 = Add(d2, -1000);
printf("%s\n", Date2string(d2));
d2 = _DateG("2020-1-23");
printf("%.2lf\n", (Days(d2) - Days(d1)) / 365.0);
return 0;
}
```
其中,`leapYear`函数用于判断一个年份是否为闰年;`_DateG`函数将字符串类型的日期转换为`DateG`类型;`Add`函数用于计算一个日期加上若干天之后的日期;`Date2string`函数将`DateG`类型的日期转换为字符串类型;`Days`函数计算自公元1年1月1日到指定日期共经历了多少天;`days2Date`函数是`Days`函数的逆函数,用于由自公元1年1月1日历经指定的天数后的日期(返回年月日构成的日期)。
在`main`函数中,我们首先读入一个日期,然后用`Add`函数计算出这个日期加上60年之后的日期,并输出。接着用`Add`函数计算出上一个日期往前推1000天的日期,并输出。最后,我们用`Days`函数计算出两个日期之间相差的天数,除以365得到年数,输出。
阅读全文