c语言实现2个日期间的天数

一.作业题目

三天打鱼两天晒网

二.作业内容

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是在“打鱼”还是“晒网”。
更新:加上文件测试

三.算法设计

1.检测输入时间的合法性
即年份需要不小于2010,月份不能大于12,日期不能大于31
2.设计函数用来判断闰年还是平年
闰年:能被4整除且不能被100整除或者能被400整除,闰年2月有29天
平年:2月28天
可以在算天数的函数中,定义一个二维数组来分开区别表示。

3.设计函数用来算2个时间之间的天数
3.1年份相同,月份相同,日期相减即可
3.2年份相同,月份不同。通过循环二维数组实现天数的累加,最后再加上本月的日期即可
3.3年份不同。
先算整年的天数进行累加,再算整月的天数进行累加,最后加上本月的日期
4.打鱼还是晒网
将天数除以5得余数
余数为1,2,3;则打鱼
余数为4,0;则晒网
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <stdio.h> 
#include <stdlib.h>
struct Date
{
int year;
int month;
int date;
};//声明结构体

int main(void)
{
struct Date maxDate;
int days,tag,a,b,c;
FILE *p,*f;
printf("请输入选择标志tag的值;tag为1是从键盘输入年月日,tag为0是从in.text中提取日期\n");
scanf("%d",&tag);
switch(tag)
{
case 0:
{
FILE *p=fopen("in.txt","r");//用只读的方式打开文件in.txt
FILE *f=fopen("out.txt","w");//用只写的方式打开文件out.txt
while(!feof(p))
{
fscanf(p,"%d %d %d",&a,&b,&c);//从文件in.txt中读取数据年月日
printf("%d年%d月%d日\n",a,b,c);
maxDate.year=a;
maxDate.month=b;
maxDate.date=c;

if (maxDate.year < 2010 || maxDate.month > 12 || maxDate.date > 31)
printf("输入数据有误,请重新输入\n");
else{
int Diff(struct Date maxDate);
days = Diff(maxDate) + maxDate.date;//将Diff函数返回的day天数再加上本月的日期,即为2个时间之间的天数
printf("天数为:%d\n", days);//将天数输出
int yu = days % 5;
switch (yu) //利用switch语句,判断打鱼or晒网
{
case 1:
case 2:
case 3:
printf("今天打鱼\n");
fprintf(f,"%d %s %d %s %d %s",a,"年",b,"月",c,"日");//将判断及结果写入out.txt中
fprintf(f,"%s","他这天在打鱼\n");//输出打鱼
break;
case 4:
case 0:
printf("今天晒网\n");//输出晒网
fprintf(f,"%d %s %d %s %d %s",a,"年",b,"月",c,"日");//将判断及结果写入out.txt中
fprintf(f,"%s","他这天在晒网\n");//输出晒网
break;
};

};

};
break;
};
case 1:{
printf("请输入年月日\n");
scanf("%d %d %d",&maxDate.year,&maxDate.month,&maxDate.date);

if (maxDate.year < 2010 || maxDate.month > 12 || maxDate.date > 31)
printf("输入数据有误,请重新输入\n");
else
{
int Diff(struct Date maxDate);
days = Diff(maxDate) + maxDate.date;//将Diff函数返回的day天数再加上本月的日期,即为2个时间之间的天数
printf("天数为:%d\n", days);//将天数输出
int n = days % 5;
switch (n) //利用switch语句,判断打鱼or晒网
{
case 1:
case 2:
case 3:
printf("今天打鱼");//输出打鱼
break;
case 4:
case 0:
printf("今天晒网");//输出晒网
break;
};
};
};
};
};






int isPrime(int year) //检查是否为闰年,闰年返回1,平年返回0
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return 0;
else
return 1;
};

int Diff(struct Date maxDate) //计算日期
{
int day = 0, i, j;
static int Month[2][13] = { {0,31,29,31,30,31,30,31,31,30,31,30,31},{0,31,28,31,30,31,30,31,31,30,31,30,31} };//设计一个二维数组来分开区别闰年和平年
if (maxDate.year == 2010)//将年份,月份都相同 和 年份相同,月份不同的两种情况进行合并
for (i = 1; i < maxDate.month; i++)//利用for循环二维数组,实现整月份天数累加
day += Month[1][i];
else //年份不同的情况相对复杂
{
for (j = 2010; j < maxDate.year; j++) //先从2010年向后到年份的前一年进行推算循环
day += isPrime(j) ? 365 : 366; //利用双目条件运算符和判断闰年还是平年的函数,进行整年份的天数累加
for (i = 1; i < maxDate.month; i++) //实现整月份的天数累加
day += Month[isPrime(maxDate.year)][i];
};
return day;
};

注意:输入in.txt文件和输出out.txt文件需要和.cpp文件放到一个工程中