【问题标题】:A C program to check if the entered date is valid or not一个 C 程序来检查输入的日期是否有效
【发布时间】:2013-02-19 04:45:33
【问题描述】:

我被要求纠正一个程序,该程序检查用户输入的日期在 C 语言中是否合法。我尝试编写它,但我猜逻辑不正确。

//Legitimate date
#include <stdio.h>
void main()
{
    int d,m,y,leap;
    int legit = 0;
    printf("Enter the date\n");
    scanf("%i.%i.%i",&d,&m,&y);
    if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))
        {leap=1;}
    if (m<13)
    {
        if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 )))))))
            {if (d <=31)
                {legit=1;}}
        else if (m == 4 || ( 6 || ( 9 || ( 11 ) ) ) )
            {if (d <= 30)
                {legit = 1;}}
        else
            {
                        if (leap == 1)
                              {if (d <= 29)
                                    {legit = 1;}}
                        if (leap == 0)
                              {{if (d <= 28)
                                    legit = 1;}}
             }
    }
    if (legit==1)
        printf("It is a legitimate date!\n");
    else
        printf("It's not a legitimate date!");

}

如果该月有 31 天,我将获得正确的输出,但对于其余月份,如果该天少于 32 天,则输出是合法的。感谢您的帮助!

【问题讨论】:

  • leap 未初始化。启用警告!

标签: c date logic


【解决方案1】:

我将你的程序重写得简单易行,我认为这可能会有所帮助

//Legitimate date
#include <stdio.h>

void main()
{
   int d,m,y;
   int daysinmonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   int legit = 0;

   printf("Enter the date\n");
   scanf("%i.%i.%i",&d,&m,&y);

   // leap year checking, if ok add 29 days to february
   if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))
      daysinmonth[1]=29;
   
   // days in month checking
   if (m<13)
   {
      if( d <= daysinmonth[m-1] )
         legit=1;
   }

   if (legit==1)
      printf("It is a legitimate date!\n");
   else
      printf("It's not a legitimate date!");
}

【讨论】:

  • 如果您想检查所有错误,请记住您可以在输入中获得零值和负值!
【解决方案2】:

你不能像这样链接条件:

if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 )))))))

相反,您必须专门测试每个场景:

if (m == 1 || m == 3 || m == 5 || ...)

您的版本只是简单地将第一个测试 (m == 1) 的结果与 3 的值相或,在 C 中它是一个非零值,因此总是一个布尔值 true。

【讨论】:

    【解决方案3】:

    这个测试肯定是错的:

    if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 )))))))
    

    这一定是

    if ((m == 1) || (m == 3) || (m == 5) || ... )
    

    执行逻辑表达式或使用非零表达式将始终计算为真。因此,您的整个测试将始终为真。

    【讨论】:

      【解决方案4】:

      您可以更简单地检查日期合法性:

      #define _XOPEN_SOURCE 600
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <time.h>
      
      time_t get_date(char *line){
      #define WRONG() do{printf("Wrong date!\n"); return -1;}while(0)
          time_t date;
          struct tm time_, time_now, *gmt;
          time_.tm_sec = 0;
          time_.tm_hour = 0;
          time_.tm_min = 0;
          if(strchr(line, '.') && sscanf(line, "%d.%d.%d", &time_.tm_mday, &time_.tm_mon, &time_.tm_year) == 3){
              time_.tm_mon--; time_.tm_year += (time_.tm_year < 100) ? 100 : -1900;
          }else
              WRONG();
          memcpy(&time_now, &time_, sizeof(struct tm));
          date = mktime(&time_now);
          gmt = localtime(&date);
          if(time_.tm_mday != gmt->tm_mday) WRONG();
          if(time_.tm_mon != gmt->tm_mon) WRONG();
          if(time_.tm_year != gmt->tm_year) WRONG();
          date = mktime(&time_);
          return date;
      #undef WRONG
      }
      
      int main(int argc, char** argv){
          struct tm *tmp;
          if(argc != 2) return 1;
          time_t GD = get_date(argv[1]);
          if(GD == -1) return -1;
          printf("Int date = %d\n", GD);
          printf("your date: %s\n", ctime(&GD));
          return 0;
      }
      

      【讨论】:

      • 基于标准时间转换。 mktime()struct tm* 生成 time_t。如果time_t 有不正确的数据,那么localtime() 将返回struct tm* 哪些字段将不同于原始struct tm* (time_)。
      【解决方案5】:
      //reading date and checking if valid or not
      //firstly we will check the yeear then the month and then the date
      //
      //
      //
      //
      #include<stdio.h>
      int main()
      {
          int d,m,y;
          printf("ENTER THE DATE IN DD/MM/YYYY FORMAT:");
          scanf("%d%d%d",&d,&m,&y);
          //check year 
          if(y>0 && y<9999)
          {
              // check month
              if(m>=1 && m<=12)
              {
                  if((d>=1 && d<=31) && (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12))
                      printf("the date is valid in a month with 31 days:");
                  else if ((d>=1 && d<=30) && (m==4 || m==6 || m==9 || m==11 ))
                      printf("the date is valid in a feb with 30 days:");
                  else if ((d>=1 && d<=29) && (m==2) &&  ((y%400==0) || (y%4==0) && (y%100!=0)))
                      printf("the date is valid in feb of a leap year:");
                  else if ((d>=1 && d<=28) && (m==2) && (y%4==0) && (y%100==0))
                      printf("the date is valid in feb of a leap year:");
                  else if ((d>=1 && d<=28) && (m==2) && (y%4!=0) )
                      printf("the date is valid in feb of a non leap year:"); 
                  else
                      printf("the date is invalid:");     
              }
              else
              {
                  printf("the month is not valid:");
              }
          }
          else 
          {
              printf("the date is not valid:");
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        • 2021-02-13
        • 2013-08-05
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多