用于检查输入日期是否有效的C程序

时间:2013-02-19 04:45:33

标签: c date logic

我被要求纠正一个程序,该程序检查用户输入的日期是否合法在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,则输出是合法的。感谢您的帮助!

5 个答案:

答案 0 :(得分:6)

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

//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!");
}

答案 1 :(得分:2)

你不能像这样链接条件:

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

相反,您必须特别测试每个场景:

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

您的版本只是将第一个测试(m == 1)的结果与3的值进行或运算,其中C为非零,因此总是布尔值为真。

答案 2 :(得分:1)

这个测试当然是错误的:

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

这一定是

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

执行逻辑或非零表达式将始终评估为true。因此,您的整个测试将永远是真实的。

答案 3 :(得分:0)

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

#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;
}

答案 4 :(得分:0)

//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;
}