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