在C中计算天数

时间:2013-04-30 16:44:43

标签: 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 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左右都很远天。

1 个答案:

答案 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;
}