以下是整个代码,每次运行程序时,我仍然会收到无效的输入。
#include<stdio.h>
int dpm[13]={31,28,31,30,31,30,31,31,30,31,30,31};
struct Sdate {
int month;
int day;
int year;
} begin, end;
int isleapyear(int a)
{
if((a%4==0&&a%100!=0)||a%400==0)
return 1;
else
return 0;
}
struct Sdate EnterDate(void){
int d,m,y;
struct Sdate A;
printf("Enter the date(mm/dd/yyyy): ");
scanf("%i/%i/%i", &m, &d, &y);
printf("\n");
A.month=m;
A.day=d;
A.year=y;
return(A);
}
int validate(void){
if(begin.year > end.year)
return 1;
if((begin.year == end.year) && (begin.month > end.month))
return 1;
if((begin.year == end.year) && (begin.month == end.month) && (begin.day > end.day))
return 1;
else
return 0;
}
int count_days(void){
int i;
int days=0;
int days_per_year = 365;
if(isleapyear(begin.year)){ // first year
if(begin.month == 1)
days = dpm[begin.month] - begin.day + 1;
else
days = dpm[begin.month] - begin.day;
}
else
days = dpm[begin.month] - begin.day;
for(i = (begin.month + 1); i < 13; ++i)
days +=dpm [i];
for(i = (begin.year + 1); i < end.year; ++i) //in between years
days += (days_per_year + isleapyear(i));
if(isleapyear(end.year))//end year
for(i = 0; i < end.month; ++i){
days += dpm[i] + 1;
days += dpm[end.month] - end.day;
}
else
for(i = 0; i < end.month; ++i)
days += dpm[i];
days += dpm[end.month] - end.day;
return days;
}
int main(int n){
printf("Please enter the first date then the second one\n");
begin=EnterDate();
end=EnterDate();
validate();
if(n == 1)
printf("Invalid Input!!!");
else
printf("Total days between these two dates is %i\n", count_days());
return 0;
}
代码仍然说验证总是如此,使输出成为“无效输入”,我只能检查程序计数天数,但是当我这样做的时候,一年或200左右都很远天。
答案 0 :(得分:4)
让我们分开那个可笑的长条件,并添加一些间距来看看我们会发生什么?
if( (begin.year>end.year) ||
( (begin.year==end.year) && (begin.month>end.month) ) ||
begin.year==end.year) && (begin.month==end.month) && (begin.day>end.day)))
显然,第三行至少有一个缺失的括号。即使在之后添加它,你也会错过另一对括号。让我们解决这两个问题,不管吗?
if( (begin.year>end.year) ||
( (begin.year==end.year) && (begin.month>end.month) ) ||
( (begin.year==end.year) && (begin.month==end.month) && (begin.day>end.day)))
尽管如此,这很难快速阅读并理解。让我们把它分开并添加一些理智的间距,不管吗?
int validate(void)
{
if(begin.year > end.year)
return 1; /* time travelling is not allowed. Yet! */
if((begin.year == end.year) && (begin.month > end.month))
return 1; /* you can't begin after you end! */
if((begin.year == end.year) && (begin.month == end.month) && (begin.day > end.day))
return 1; /* finishing before you start isn't allowed by the union */
return 0;
}
如果不了解更多关于这些阵列的信息,例如dpm
以及您调用的那些功能,就无法回答关于“关闭200天”的问题。
更新:您发布了一些额外的代码;仍然不够,但现在我的蜘蛛感觉刺痛。有些东西告诉我问题在你的EnterDate
中,它接受日期为“从1开始”(即2012年1月3日输入为2012年1月3日),但你的数组是从0开始的。
Update2 :嗯......让我们看一下:
int main(int n){
printf("Please enter the first date then the second one\n");
begin=EnterDate();
end=EnterDate();
validate();
if(n == 1)
printf("Invalid Input!!!");
我没有比这更进一步。首先,int main(int n)
不是main
的有效语法。其次,我声称你声称你的validate()
函数失败了,你声称一直在努力找到错误,我感到很震惊...你怎么知道?你甚至没有检查它的结果!!!
这个怎么样:
int main(int argc, char **argv) {
printf("Please enter the first date then the second one\n");
begin = EnterDate();
end = EnterDate();
if(validate()) {
printf("Invalid Input!!!\n");
return 1;
}
...
更新4 :如果您想在printf
函数中添加count_days
语句以查看执行情况,则错误会立即 < / em>对你来说很明显。试试这个:
int count_days(void){
int i;
int days=0;
int days_per_year = 365;
if(isleapyear(begin.year)){ // first year
printf("%d is a leap year!\n", begin.year);
if(begin.month == 1)
days = dpm[begin.month] - begin.day + 1;
else
days = dpm[begin.month] - begin.day;
}
else
days = dpm[begin.month] - begin.day;
printf("At first checkpoint: %d days\n", days);
for(i = (begin.month + 1); i < 13; ++i)
days +=dpm [i];
printf("At second checkpoint: %d days\n", days);
for(i = (begin.year + 1); i < end.year; ++i) //in between years
days += (days_per_year + isleapyear(i));
printf("At third checkpoint: %d days\n", days);
if(isleapyear(end.year))//end year
printf("%d is a leap year!\n", end.year);
for(i = 0; i < end.month; ++i){
days += dpm[i] + 1;
days += dpm[end.month] - end.day;
}
else
for(i = 0; i < end.month; ++i)
days += dpm[i];
days += dpm[end.month] - end.day;
return days;
}