0

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!

Shail
  • 881
  • 9
  • 20
  • 37

5 Answers5

6

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!");
}
Johan Bezem
  • 2,582
  • 1
  • 20
  • 47
Riskhan
  • 4,434
  • 12
  • 50
  • 76
2

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.

chrisaycock
  • 36,470
  • 14
  • 88
  • 125
1

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.

sstn
  • 3,050
  • 19
  • 32
0

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;
}
Eddy_Em
  • 864
  • 6
  • 14
  • It's based on standard time conversion. `mktime()` makes a `time_t` from `struct tm*`. If `time_t` have incorrect data, then `localtime()` will return `struct tm*` which fields will differ from original `struct tm*` (`time_`). – Eddy_Em Feb 19 '13 at 06:35
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;
}
Rithik Singh
  • 115
  • 2
  • 4