当前位置: 代码迷 >> C语言 >> 紧急请教!
  详细解决方案

紧急请教!

热度:186   发布时间:2006-08-11 19:38:31.0
紧急请教!

我对C语言算是刚刚起步,最近想做一道关于计算生日的程序,可现在也没有搞明白,或者说是随便输入两个日期,能知道它们之间的天数,有这样的程序也可以指点一下,先谢谢拉!


----------------解决方案--------------------------------------------------------


#include<stdio.h>
int IsLeap(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
return(1);
return(0);
}
int main()
{
int year1,month1,day1,year2,month2,day2;
long n=0;
printf("输入起始年份:");
scanf("%d%d%d",&year1,&month1,&day1);
printf("输入结束年份:");
scanf("%d%d%d",&year2,&month2,&day2);

while(year1<year2)
{
if(IsLeap(year1)==1)
{
n=n+366;
}
else
{
n=n+365;
}
year1++;
}
while(month1<month2)
{
switch(month1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:n=n+31;break;
case 4:
case 6:
case 9:
case 11:n=n+30;break;
case 2:
{
if(IsLeap(year1)==1)
{
n=n+29;
}
else
{
n=n+28;
}
break;
}
}
month1++;
}
n=n+day2-day1;
printf("%ld\n",n);
return(0);
}


----------------解决方案--------------------------------------------------------
可以先在前面判断年份的大小,并且规定起始为小,结束为大.
用结构体来做比较方面,成员为,年,月,日.楼主试试吧
----------------解决方案--------------------------------------------------------
对了,首先谢谢你拉!不过我还想问一下:如果你输的日期都合法那是没什么说的,我想是不是还需要再加一些比如说判断输入日期是否有效,如果是无效输出说明,并且提示继续输入有效的日期什么的呢.能否再帮忙该一下,看看是不是有什么好的方法!再次感谢拉!
----------------解决方案--------------------------------------------------------


#include<stdio.h>
int IsLeap(unsigned int year)
{
if(year%4==0&&year%100!=0||year%400==0)
return(1);
return(0);
}
int main(void)
{
unsigned int year1,month1,day1,year2,month2,day2;
unsigned long n=0;
while (1)
{
printf("输入起始日期:");
if((3==scanf ("%u%u%u",&year1,&month1,&day1))&&(month1<=12)&&(day1<=31))
break;
else
fflush (stdin);
printf ("你输入的日期有错,请重新输入!\n");
continue;
}
while (1)
{
printf("输入结束日期:");
if ((3==scanf("%u%u%u",&year2,&month2,&day2))&&(year2>=year1)&&(month2<=12)&&(day2<=31))
break;
else
fflush (stdin);
printf ("你输入的日期有错,请重新输入!\n");
continue;
}
while (year1<year2)
{
if(IsLeap(year1)==1)
n=n+366;
else
n=n+365;
year1++;
}
while(month1<month2)
{
switch(month1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:n=n+31;break;
case 4:
case 6:
case 9:
case 11:n=n+30;break;
case 2:
{
if(IsLeap(year1)==1)
{
n=n+29;
}
else
{
n=n+28;
}
break;
}
}
month1++;
}
n=n+day2-day1;
printf("%lu\n",n);
return(0);

}


----------------解决方案--------------------------------------------------------

typedef struct{
int year;
int month;
int date;
}time;

void Input(time &a)
{
int flag;
do{
scanf("%d%d%d",&a.year,&a.month,&a.date);
if(a.month>=1&&a.month<=12)
{
switch(a.month)
{
case 4:
case 6:
case 9:
case 11:flag=1;
case 2:
{
if(IsLeap(a.year)==1)
{
flag=0;
}
else
{
flag=-1;
}
break;
}
}
if(a.date>=1&&a.date<=31)
{
if(flag==1&&a.data<31||flag==0&&a.date<30||flag==-1&&a.date<29)
{
break;
}
}
}
printf ("你输入的日期有错,请重新输入!\n");
}while(1);
}
/*主函数分别调用两次,给起始日期,和结束日期赋值*/


----------------解决方案--------------------------------------------------------
为了判断日期要写个这么多,谁不知道日期要这样规定的
不过还是严谨的好,楼主谢了
我没有编译和调试,楼主你自己弄一下
----------------解决方案--------------------------------------------------------
if((3==scanf ("%u%u%u",&year1,&month1,&day1))&&(month1<=12)&&(day1<=31))
在这个代码里那个3是什么啊,为什么不用1呢??
fflush (stdin);这个代码是什么作用?
先在这里说声谢谢了
----------------解决方案--------------------------------------------------------
不过我还要说一些动西的,在上面两个程序中都存在一些问题的,比如说同一年的不能计算,而且还有第一个日期的月份要是大于第二个的话也不行的.我想这个程序还需要改.确实一个很简单的问题需要注意的的确不少的啊!编程需要很严谨的算法啊!大家多努力吧!
----------------解决方案--------------------------------------------------------
TO zxd198778
fflush()函数冲洗流中的信息
在上面是为了清除多余字符的方法
----------------解决方案--------------------------------------------------------
  相关解决方案