I'm currently working on writing a date checker function in C and wondering how it can be improved upon.
Q: Write a function that is passed a month, day, and year and will determine if that date is valid. You can assume each parameter is passed in as an integer. Remember to check for leap year.
I currently have this and want to see if there are any beginner mistakes, if pointers could improve efficiency or redundancies in my code.
#include <stdio.h>
#include <stdbool.h>
bool is_valid_date(int month,int day ,int year) {
//Validate year
int days_on_month[]={31,28,31,30,31,30,31,31,30,31,30};
if(year<0||year>2017) {
//year not valid , stop validation , date is invalid
return false;
}
bool isLeapYear;
//Check for leap year , every 4 years there is a leap year
if(year%4==0) {
//if year is evenly divisble by 100 it must also be by 400
if(year%100==0) {
if(year%400==0) {
isLeapYear=true;
}else{
isLeapYear=false;
}
}else{
isLeapYear=true;
}
}
//Validate months;
if(month<1||month>12) {
// not valid , stop validation , date is invalid
return false;
}
//validate day
if(month!=2) {
//Valid Date
if(day>=1&&day<=days_on_month[month-1]){return true;}
}
//February (changes no of days on leap year)
else
{
if(isLeapYear) {
if(day>=1&&day<=29){return true;}
}else{
if(day>=1&&day<=28){return false;}
}
}
return false;
}
// test if function works
int main(void) {
int day = 28;
int month = 12;
int year = 2012;
printf("Is it true? Yes = 1 No = 0! = %d\n", is_valid_date(day, month, year));
return 0;
}