日期对应天数问题。代码输出的结果不对
有三个函数:判断日期合法性 判断闰年,求天数
#include "stdio.h"
int flag1,flag2,day1;
int isdate(int year,int month,int day);
int isdate(int year,int month,int day)//判断日期合法性
{
int flag2=0;
scanf("%d%d%d",&year,&month,&day);
if(day>=1&&day<=31&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12))
flag2=1;
else if(day>=1&&day<=30&&(month==4||month==6||month==9||month==11))
flag2=1;
else if(isleap(year)&&day<=29&&day>=1&&month==2)
flag2=1;
else if(isleap(year)&&day<=28&&day>=1&&month==2)
flag2=1;
return flag2;
}
int isleap(int year);
int isleap(int year)//判断闰年
{
int flag1=0;
if((year%4==0&&year%100!=0)||year%400==0)
flag1=1;
return flag1;
}
int days(int month,int day);
int days(int month,int day)//求天数
{
int day1;
switch(month)
{
case 1:day1=0;break;
case 2:day1=31;break;
case 3:day1=59;break;
case 4:day1=90;break;
case 5:day1=120;break;
case 6:day1=151;break;
case 7:day1=181;break;
case 8:day1=212;break;
case 9:day1=243;break;
case 10:day1=273;break;
case 11:day1=304;break;
case 12:day1=334;break;
}
return day1;
}
int main()
{
int year,month,day,a=0,b=0,c=0;
scanf("%d-%d-%d",&year,&month,&day);
a=isdate(year,month,day);
if(a=1)
{
b=isleap(year);
if(b=1)
{
c=days(month,day)+day+1;
printf("NO:%d",c);
}else{
c=days(month,day)+day;
printf("NO:%d",c);
}
}else{
printf("DateError");
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define YEAR_ERROR -1
#define MONTH_ERROR -2
#define DAY_ERROR -3
/** 项目:
* 判断是否为闰年 Is_Leap
* 计算一年中月份的天数 Get_YM_day
* 输出日期 计算天数 Get_YMD_Total
*/
/** 判断是否为闰年 */
bool Is_Leap(int year)
{
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
/** 计算一年中月份的天数 Get_YM_day */
int Get_YM_Day(int year, int month)
{
// 静态常性数组 static 只初始化一次 const 且只可读不可写
static const int days[13] = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 0 1 2 3 4 5 6 7 8 9 10 11 12
if (month == 2 && Is_Leap(year))
{
month = 0;
}
return days[month];
}
/** 输出日期 计算天数 Get_YMD_Total */
int Get_YMD_Total(int year, int month, int day)
{
// 循环叠加用户输入月份的前几个月的天数 + 当月的天数 如:用户输入 6 月 8 日 计算前 5 个月的天数 + 8 天
int sum = 0;
if (year < 1) return YEAR_ERROR; // 输入的年份出错
if (month < 1 || month > 12) return MONTH_ERROR; // 输入的月份出错
if (day < 1 || day > Get_YM_Day(year, month)) return DAY_ERROR; // 输入的天数出错
for (int i = 1; i < month; ++i)
{
sum += Get_YM_Day(year, i);
}
sum += day;
return sum;
}
/** 主函数 */
int main()
{
int year, month, day, day1;
char ch = '\0';
do {
printf("Input (year month day): \n");
scanf_s("%d %d %d", &year, &month, &day);
// 计算一年中月份的天数
day1 = Get_YM_Day(year, month);
// 输出日期 计算天数
int total = Get_YMD_Total(year, month, day);
switch (total)
{
case YEAR_ERROR:
printf("year input error! \n");
break;
case MONTH_ERROR:
printf("month input error! \n");
break;
case DAY_ERROR:
printf("day input error! \n");
break;
default:
if (Is_Leap(year)) {
printf("%d年是闰年!\n", year);
}
else
{
printf("%d年不是闰年!\n", year);
}
printf("%d年的%d月==>%d天\n", year, month, day1);
printf("%d年%d月%d日==>%d天\n", year, month, day, total);
break;
}
printf("是否继续(y/n)... \n");
// 清除缓冲区 // fflush(stdin); 在 vs 2015 年之后就失效了
// 清除缓冲区的作用:键盘录入时会有 ‘\n’ 为了避免 ‘\n’的干扰需清除缓冲区
rewind(stdin);
ch = getchar();
} while (ch == 'Y' || ch == 'y');
return 0;
}