A C program to check if the entered date is valid or not

牧云@^-^@ 提交于 2019-12-01 13:53:33

问题


I was asked to right a program which checks if the date entered by the user is legitimate or not in C. I tried writing it but I guess the logic isn't right.

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

}

I am getting the correct output if the month has 31 days but for the rest of the months, the output is legitimate if the day is less than 32. Your help is appreciated!


回答1:


You can't chain conditionals like this:

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

Instead, you'll have to test each scenario specially:

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

Your version simply ORs the results of the first test (m == 1) with the value of 3, which in C is a non-zero and therefore always a boolean true.




回答2:


i rewrite you program as simple and easy, i think this may help

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



回答3:


This test is certainly wrong:

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

This must be

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

Performing a logical or with a non-zero expression will always evaluate to true. Therefore, your entire test will always be true.




回答4:


You can check date legitimacy simpler:

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



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


来源:https://stackoverflow.com/questions/14950012/a-c-program-to-check-if-the-entered-date-is-valid-or-not

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!