下面是我的源程序:
#include <stdio.h>
int main(){
int swap(int date1[],int date2[]);
long years(int year1,int year2);
int leap_year(int year);
int days(int month,int day);
int judge(int date[]);
int date1[4],date2[4],i,m;
long Days,Days1,Days2,Days3;
char ch;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
do{
printf("\n\n\n");
printf("\t\tinput the first date:");
printf("\n");
do{
printf("\t\t\tinput the year:");
scanf("%d",&date1[1]);
if(leap_year(date1[1]))months[2]=29;
else months[2]=28;
}while(date1[1]<1900||date1[1]>3000);
do{
printf("\t\t\tinput the month:");
scanf("%d",&date1[2]);
m=date1[2];
}while(date1[2]<1||date1[2]>12);
do{
printf("\t\t\tinput the day:");
scanf("%d",&date1[3]);
}while(date1[3]<1||date1[3]>months[m]);
printf("\n\n\t\tinput the second date:");
printf("\n");
do{
printf("\t\t\tinput the year:");
scanf("%d",&date2[1]);
if(leap_year(date2[1]))months[2]=29;
else months[2]=28;
}while(date2[1]<1900||date2[1]>3000);
do{
printf("\t\t\tinput the month:");
scanf("%d",&date2[2]);
}while(date2[2]<1||date2[2]>12);
do{
printf("\t\t\tinput the day:");
scanf("%d",&date2[3]);
m=date1[2];
}while(date2[3]<1||date2[3]>months[m]);
for(i=1;i<4;i++){
if(date1[i]>date2[i]){
swap(date1,date2);
break;
}
else if(date1[i]==date2[i]) continue;
else break;
}
Days1=years(date1[1],date2[1]);
Days2=days(date2[2],date2[3]);
Days3=days(date1[2],date1[3]);
Days=Days1+Days2-Days3;
//Days=years(date1[1],date2[1]);
printf("\t\tThere are %ld days",Days1);
printf("\t\tThere are %ld days",Days2);
printf("\t\tThere are %ld days",Days3);
printf("\n\t\tThere are %ld days",Days);
ch=getch();
}while(ch==' ');
return 0;
}
int swap(int date1[],int date2[]){
int i,temp;
for(i=1;i<4;i++){
temp=date1[i];
date1[i]=date2[i];
date2[i]=temp;
}
return 0;
}
int leap_year(int year){
if((year%4==0&&year%4!=0)||year%400==0)return 1;
else return 0;
}
long years(int year1,int year2){
int d=0;
long td=0;
if(year1==year2)return 0;
for(;year1<year2;year1++){
if(leap_year(year1))d=366;
else d=365;
td+=d;
}
td=td+1;
return td;
}
int days(int month,int day){
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i;
//day=day-1;
for(i=1;i<month;i++)
day+=months[i];
//total=sm+day;
return day;
}
我不明白的是输入1900 1 1到3000 12 31时误差很大,而输入其它数据时都通过
会有加分的,你们回答得越精彩,加分会越多!
你有看我的程序吗?我程序的设计就是这样子的。就是有误差而已,我找不出这误差
呵呵,答案是402000多,就差了200多天,我不知道怎么回事,这是我们的实习作业来着,大家的结果都是402000多。还有,实际上,我有几个测试数据都跟正确的结果差了1天,我想,误差应该出在这里吧
追答差了200多天的话,1101年,大概有200多个闰年,这么看来,最大的可能性是你的程序里闰年的处理应该有问题,导致每一个闰年的计算都差一天,1000多年累积差了200多天
追问我前面有说过,我有几个数据都跟正确的答案有1天的误差,误差会不会出在这里呀?
long years(int year1,int year2){
int d=0;
long td=0;
if(year1==year2)return 0;
for(;year1<year2;year1++){
if(leap_year(year1))d=366;
else d=365;
td+=d;
}
td=td+1;
return td;
}
我一直都怀疑这个函数,但一直找不出这个函数是怎么产生误差的。帮我看下,谢谢!
c语言里面没有long long这样声名的,而且,我测试过了,没有溢出哦
不是一直输入的,只是要求输入月份,我用循环是为了控制输入数据的正确性
追答用不着吧。。。
追问这是老师要求的,如果老师没有要求控制输入数据的正确性的话,我4~5行就解决输入问题了