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()。。。你怎么知道的?你甚至都没检查我