C语言求任意两个日期间的天数,有代码但报错

思路是年月日分开求,代码如下,编译报错在图片里,win732下的VS#include<stdio.h>intleap(intyear){if(year%4==0||yea... 思路是年月日分开求,代码如下,编译报错在图片里,win7 32下的VS#include<stdio.h>int leap(int year){ if (year% 4 == 0 || year% 400 == 0 && year% 100 != 0) return 1; else return 0;}int s, i, j, y, t1 = 0, t2 = 0, n = 0, n2 = 365, n1 = 366;/*s为总天数,i为两者间的年数,n为年的总天数*/int a[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };/*闰年月份天数*/int b[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };main(){ int y1, m1, d1; int y2, m2, d2; printf("请输入第一个年月日:\n"); scanf("%d%d%d", &y1, &m1, &d1); printf("请输入第二个年月日:\n"); scanf("%d%d%d", &y2, &m2, &d2); if (m1 > 12 || d1 > 31 || m2 > 12 || d2 > 31) pritnf("输入有误,请重输!"); if (y1 < y2) y = y1;y1 = y2; if (y1>y2) y = y2;y1 = y1; for (i = y;i < y1 - 1;i++) { if (leap(i) == 1) n = n + n1; else n = n + n2; } if (y1 < y2) { for (i = 0;i < m1 - 1; i++) { if (leap(y1) == 1) t1 = n1 - (t1 + a[i] + d1); else t1 = n2 - (t1 + b[i] + d1); } for (j = 0;j < m2 - 1; j++) { if (leap(y2) == 1) t2 = t2 + a[j] + d2; else t2 = t1 + b[j] + d2; } } if (y1 > y2) { for (i = 0;i < m2 - 1; i++) { if (leap(y2) == 1) t1 = n1 - (t1 + a[i] + d2); else t1 = n2 - (t1 + b[i] + d2); } for (j = 0;j < m1 - 1;j++) { if (leap(y1) == 1) t2 = t2 + a[j] + d1; else t2 = t1 + b[j] + d1; } s = n + t1 + t2; printf("%d年%d月%d日与%d年%d月%d日共有%d天\n", y1, m1, d1, y2, m2, d2, s); return 0; }} 展开
 我来答
百度网友8b58de0
2019-03-31 · TA获得超过945个赞
知道小有建树答主
回答量:1079
采纳率:83%
帮助的人:308万
展开全部
//代码错误是:printf写成了pritnf
//代码考虑的不周全,如果输入的是同一年,那代码怎么计算,还有不同年计算也有大问题
//你的代码思路看的我头大,干脆没看,在你的代码基础上直接给改了,供参考
//这个代码中注释的应该很清楚,有疑问可以追问

#include <stdio.h>
int leap(int year)
{
if (year% 4 == 0 || year% 400 == 0 && year% 100 != 0)
return 1;
else
return 0;
}

int a[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };/*闰年月份天数*/
int b[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
void main()
{
int t, s, i, t1 = 0, n = 0, n2 = 365, n1 = 366;/*s为总天数,n为年中间天数*/
int y1, m1, d1;
int y2, m2, d2;
printf("请输入第一个年月日:\n");
scanf("%d%d%d", &y1, &m1, &d1);
printf("请输入第二个年月日:\n");
scanf("%d%d%d", &y2, &m2, &d2);
if (m1 > 12 || d1 > 31 || m2 > 12 || d2 > 31)
{
printf("输入有误,请重输!");
return; //加个错误退出
}

//先输入的是较后的年月日,就交换过来
if(y1*10000+m1*100+d1>y2*10000+m2*100+d2)
{
t=y1; y1=y2; y2=t;
t=m1; m1=m2; m2=t;
t=d1; d1=d2; d2=t;
}

//这里计算中间年份的天数,比如2000.2.2-2003.2.3,这里计算2001和2002的天数,后面再计算2000.2.2到2001.1.1的天数和2003.1.1到2003.2.3的天数
for (i = y1 + 1; i < y2; i++)
{
if (leap(i) == 1)
n = n + n1;
else
n = n + n2;
}

if (y1 < y2)//如果不同年
{
//计算y1年m1月之后月份的天数,比如2000.2.2,就计算2000年3月到12月的天数
for (i = m1 + 1;i <= 12; i++)
{
if (leap(y1) == 1)
t1 = t1 + a[i-1];
else
t1 = t1 + b[i-1];
}

//计算y1年m1月d1日当月剩余的天数
if (leap(y1) == 1)
t1=t1+a[m1-1]-d1;
else
t1=t1+b[m1-1]-d1;

//计算y2年1月1日到y2年m2月d2日的天数
for (i = 1;i < m2; i++)
{
if (leap(y2) == 1)
t1 = t1 + a[i-1];
else
t1 = t1 + b[i-1];
}
t1=t1+d2;
}
else //同一年
{
if(m1==m2) //同一年又同一月
{
t1=d2-d1;
}
else
{
//同一年不同月,先计算中间月份的天数
for (i = m1 + 1;i < m2; i++)
{
if (leap(y1) == 1)
t1 = t1 + a[i-1];
else
t1 = t1 + b[i-1];
}

//计算m1月d1日当月剩余天数加上m2月d2日的天数
if (leap(y1) == 1)
t1=t1+a[m1-1]-d1+d2;
else
t1=t1+b[m1-1]-d1+d2;
}
}

s = n + t1;
printf("%d年%d月%d日与%d年%d月%d日共有%d天\n", y1, m1, d1, y2, m2, d2, s);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式