谁能发现我的代码有什么问题? 它应该简单地比较日期并且应该记录最早的日期,但是只有我的第一个输入是。慢慢走过来也看不出我的逻辑错误在哪里。
#include <stdio.h>
int main(void)
{
int month=1, day=1, year=1;
int fmonth=0, fday=0, fyear=0;
while((month != 0) && (day != 0) && (year != 0))
{
printf("Enter the date: (0/0/0 to cancel) ");
scanf("%d/%d/%d", &month, &day, &year);
if(fyear < year)
{
fyear = year;
fmonth = month;
fday = day;
}
else if ((fyear == year) && (fmonth < month) && (fday <= day))
{
fyear=year;
fmonth=month;
fday=day;
}
}
printf("Earliest Date is: %d/%d/%d\n", fmonth,fday,fyear);
return 0;
}
最佳答案
哈,这有点有趣。您的主要问题是您的比较倒退了。 (并且您需要添加一个 (month == fmonth)
测试)您的次要问题是验证用户输入 完全失败——它每次都会困扰您。
首先,您要检查 (date < fdate)
是否为在分配之前,不是 if (fdate < date)
否则您将用较晚的日期覆盖较早的日期(如 yuchaun 最初正确指出的那样)。
始终,始终,验证用户输入。众所周知,一只猫可能正在踩键盘。至少,至少检查 scanf
的返回验证转换为 int
的次数您期望的,确实发生了(验证值落入有效月、日、年范围内的任务留给您)。
将这些部分放在一起,并替换 "0/0/0"
使用一个简单的计数器取消以确定您何时输入了两个日期,您可以执行类似的操作:
#include <stdio.h>
int main (void) {
int month = 1, day = 1, year = 1,
fmonth = 0, fday = 0, fyear = 0,
n = 0; /* simple counter - no need for 0/0/0 */
while (1) { /* just loop until you have 2 dates */
printf ("Enter the date: ");
/* validate ALL User Input */
if (scanf ("%d/%d/%d", &month, &day, &year) != 3) {
fprintf (stderr, "error: invalid date, exiting.\n");
return 1;
}
/* if no fdate or if (date < fdate) then fdate = date */
if (!n || (year < fyear) ||
((year == fyear) && ((month < fmonth) ||
((month == fmonth) && (day < fday))))) {
fyear = year;
fmonth = month;
fday = day;
}
if (++n == 2) /* increment counter and test */
break;
}
printf ("Earliest Date : %d/%d/%d\n", fmonth, fday, fyear);
return 0;
}
示例使用/输出
$ ./bin/earlierdate
Enter the date: 12/21/1991
Enter the date: 12/22/1991
Earliest Date : 12/21/1991
$ ./bin/earlierdate
Enter the date: 12/22/1991
Enter the date: 12/21/1991
Earliest Date : 12/21/1991
当你遇到这样的问题时,总是看到How to debug small programs并且不要羞于与鸭子交谈......它有效!
查看所有内容,考虑所有答案,如果您有任何其他问题,请告诉我。
关于c - 日期比较程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45396405/