首先有几个特殊点,①二月,②七、八月连续的31天大月份。
对于①,另写一个函数判断是否闰年。
(year % 4 == 0 && year % 100 != 0) || year % 400 == 0
对于②,将七月作为分界线,分别判断月份的奇偶性来判断大小月。
见代码。
对于计算,可以先计算本月前所有月份日期总和,在加上本月日期,最后修正即可得到。
另写一个函数判断日期合法性,同样利用月份的奇偶性
(初学者,如有更简单的算法敬请指教)
实现如下
#include <stdio.h>
int y(int year);//判断瑞年
void p(int year,int month,int day);//判断日期
int n=0;
int main()
{
int a,i,sum=0;
int year,month,day;
printf("请输入年份/月份/日期:\n");
scanf("%d/%d/%d", &year,&month,&day);
p(year,month,day);
if (n==1) {
printf("日期错误\n");
} else {
a=y(year);
for (i=1;i<month;) {
sum=sum+31;
i++;
if (i<month) {
sum=sum+30;
i++;
}//算出之前的月份日数总和(待修正)
}
if (month>2) {
if (a) {
sum--;
} else {
sum=sum-2;
}
if (month==9 || month==11){
sum++;
}
}//修正
printf("现在是一年的第%d天",day+sum);
}
}
int y(int year)
{
int a;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
a=1;
else
a=0;
// printf("%d",a);
return a;
}
void p(int year,int month,int day)
{
if (month<=7) {
if (month%2==0) {
if (month == 2) {
if (y(year)) {
if (day>29)
n=1;
}else {
if (day >30)
n=1;
}
}else {
if (day>30)
n=1;
}
}else {
if (day>31)
n=1;
}
}else if (month>7 && month<=12) {
if (month%2==0) {
if (day>31)
n=1;
} else {
if (day>30)
n=1;
}
} else
n=1;
}