C语言中的计数天数函数
这是完整的代码,我每次运行程序都会收到一个无效的输入C语言中的计数天数函数,c,unix,data-structures,C,Unix,Data Structures,这是完整的代码,我每次运行程序都会收到一个无效的输入 #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
#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;
}
#包括
int dpm[13]={31,28,31,30,31,30,31,30,31,31};
结构Sdate{
整月;
国际日;
国际年;
}开始,结束;
国际年(国际年)
{
如果((a%4==0&&a%100!=0)| | a%400==0)
返回1;
其他的
返回0;
}
结构Sdate输入日期(无效){
int d,m,y;
结构Sdate A;
printf(“输入日期(mm/dd/yyyy):”;
scanf(“%i/%i/%i”,&m,&d,&y);
printf(“\n”);
A.月=m;
A.日=d;
A.年=y;
报税表(A);
}
int验证(无效){
如果(开始年份>结束年份)
返回1;
如果((begin.year==end.year)&&(begin.month>end.month))
返回1;
如果((begin.year==end.year)&&(begin.month==end.month)&&(begin.day>end.day))
返回1;
其他的
返回0;
}
整数计数天数(无效){
int i;
整数天=0;
每年整数天=365;
如果(isleapyear(begin.year)){//第一年
如果(begin.month==1)
天=dpm[开始.月]-开始.天+1;
其他的
天=dpm[开始.月]-开始.天;
}
其他的
天=dpm[开始.月]-开始.天;
对于(i=(begin.month+1);i<13;+i)
天数+=dpm[i];
对于(i=(begin.year+1);i
代码仍然在说验证总是正确的,使输出成为“无效输入”,我只能勉强检查程序计数天数,但当我检查时,距离一年或大约200天都很遥远。让我们将这段长得可笑的条件拆分,并加上一些间隔,看看发生了什么,好吗
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;
}
很明显,第三行至少少了一个括号。即使添加了它,也会丢失另一对括号。让我们解决这两个问题,好吗
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;
}
尽管如此,这还是很难快速阅读和理解。让我们把它分开,加上一些合理的间隔,好吗
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-based”(即2012年1月3日输入为1/3/2012),但您的数组是基于0的
更新2:嗯。。。让我们看看这里:
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!!!");
我没有走得更远。首先,intmain(intn)
不是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:如果您费心在count_days
函数中添加printf
语句以查看执行情况,则错误会立即变得明显。试试这个:
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;
}
int计数天数(无效){
int i;
整数天=0;
每年整数天=365;
如果(isleapyear(begin.year)){//第一年
printf(“%d是闰年!\n”,begin.year);
如果(begin.month==1)
天=dpm[开始.月]-开始.天+1;
其他的
天=dpm[开始.月]-开始.天;
}
其他的
天=dpm[开始.月]-开始.天;
printf(“在第一个检查点:%d天\n”,天);
对于(i=(begin.month+1);i<13;+i)
天数+=dpm[i];
printf(“在第二个检查点:%d天\n”,天);
对于(i=(begin.year+1);i
让我们把长得离谱的条件向上拆分,再加上一些空格,看看发生了什么,好吗
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;
}
很明显,第三行至少少了一个括号。即使添加了它,也会丢失另一对括号。让我们解决这两个问题,好吗
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;
}
尽管如此,这还是很难快速阅读和理解。让我们把它分开,加上一些合理的间隔,好吗
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-based”(即2012年1月3日输入为1/3/2012),但您的数组是基于0的
更新2:嗯。。。让我们看看这里:
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!!!");
我没有走得更远。首先,intmain(intn)
不是main
的有效语法。其次,我很震惊,你声称你的validate()。。。你怎么知道的?你甚至都没检查我