二月的日期判断错在哪里了啊
键盘上按照年月日的格式输入年份、月和日期,运行程序以后,判断这一天是这一年的第几天。输入描述
标准输入,输入三个整数,即年、月、日(都是正数),以空格间隔,不保证输入的年份和日期是正确的。
输出描述
标准输出,输出这一天是这一年的第几天,如果日期不合法,输出“data error!”。#include<stdio.h>
int main()
{
int year,mon,day,days=0;
scanf("%d%d%d",&year,&mon,&day);
if(year>9999||year<1000) printf("data error!");
else
{if(((year%400==0)||(year%4==0&&year%100!=0))&&mon>2)
days++;
switch(mon)
{
case 1:
{
if(day>31) printf("data error!");
else
{days=day;printf("%d",days);}
break;
}
case 2:
{
if(((year%400==0||(year%4==0&&year%100!=0))&&day>29)||
((year%400!=0||(year%4!=0&&year%100==0))&&day>28))
printf("data error!");
else
{days=day+31;printf("%d",days);}
break;
}
case 3:
{
if(day>31) printf("data error!");
else
{days=day+59;printf("%d",days);}
break;
}
case 4:
{
if(day>30) printf("data error!");
else
{days=day+90;printf("%d",days);}
break;
}
case 5:
{
if(day>31) printf("data error!");
else
{days=day+120;printf("%d",days);}
break;
}
case 6:
{
if(day>30) printf("data error!");
else
{days=day+151;printf("%d",days);}
break;
}
case 7:
{
if(day>31) printf("data error!");
else
{days=day+181;printf("%d",days);}
break;
}
case 8:
{
if(day>31) printf("data error!");
else
{days=day+212;printf("%d",days);}
break;
}
case 9:
{
if(day>30) printf("data error!");
else
{days=day+243;printf("%d",days);}
break;
}
case 10:
{
if(day>31) printf("data error!");
else
{days=day+273;printf("%d",days);}
break;
}
case 11:
{
if(day>30) printf("data error!");
else
{days=day+304;printf("%d",days);}
break;
}
case 12:
{
if(day>31) printf("data error!");
else
{days=day+334;printf("%d",days);}
break;
}
default:printf("data error!");
}
}
} 问题出在日期判断的逻辑上。在输入的年份和月份都合法的情况下,程序会根据月份的不同进行不同的处理。但是在每个月份的判断逻辑中,都只判断了日期的大小,而没有考虑到闰年的情况。
闰年是指能被4整除但不能被100整除的年份,或者能被400整除的年份。在闰年的2月份,日期的范围是1-29;在平年的2月份,日期的范围是1-28。
因此,需要在2月份的判断逻辑中加入对闰年的判断,以确定日期的合法性。具体修改如下:
case 2:
{
if(((year%400==0||(year%4==0&&year%100!=0))&&day>29)||
((year%400!=0||(year%4!=0&&year%100==0))&&day>28))
printf("data error!");
else
{
days=day+31;
printf("%d",days);
}
break;
}
这样,程序就能正确判断日期的合法性,并输出对应的结果。 这段代码有几个错误:
1. 没有加入break语句:在每个case后面,需要添加break语句以结束switch语句块,否则会继续执行后面的case。
2. 闰年判断条件错误:在判断是否为闰年的条件中,存在括号不匹配的问题。正确的条件应该是((year%400==0)||(year%4==0&&year%100!=0))。
3. 二月份的天数判断错误:在判断二月份的天数时,应该先判断是否为闰年,然后再根据闰年与非闰年分别判断天数。
下面是修改后的代码:
++
#include <stdio.h>
int main() {
int year, mon, day, days = 0;
scanf("%d%d%d", &year, &mon, &day);
if (year > 9999 || year < 1000) {
printf("data error!");
}
else {
if (((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) && mon > 2) {
days++;
}
switch (mon) {
case 1:
if (day > 31) {
printf("data error!");
}
else {
days = day;
printf("%d", days);
}
break;
case 2:
if (((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && day > 29)
|| ((year % 400 != 0 || (year % 4 != 0 && year % 100 == 0)) && day > 28)) {
printf("data error!");
}
else {
days = day + 31;
printf("%d", days);
}
break;
case 3:
if (day > 31) {
printf("data error!");
}
else {
days = day + 59;
printf("%d", days);
}
break;
case 4:
if (day > 30) {
printf("data error!");
}
else {
days = day + 90;
printf("%d", days);
}
break;
case 5:
if (day > 31) {
printf("data error!");
}
else {
days = day + 120;
printf("%d", days);
}
break;
case 6:
if (day > 30) {
printf("data error!");
}
else {
days = day + 151;
printf("%d", days);
}
break;
case 7:
if (day > 31) {
printf("data error!");
}
else {
days = day + 181;
printf("%d", days);
}
break;
case 8:
if (day > 31) {
printf("data error!");
}
else {
days = day + 212;
printf("%d", days);
}
break;
case 9:
if (day > 30) {
printf("data error!");
}
else {
days = day + 243;
printf("%d", days);
}
break;
case 10:
if (day > 31) {
printf("data error!");
}
else {
days = day + 273;
printf("%d", days);
}
break;
case 11:
if (day > 30) {
printf("data error!");
}
else {
days = day + 304;
printf("%d", days);
}
break;
case 12:
if (day > 31) {
printf("data error!");
}
else {
days = day + 334;
printf("%d", days);
}
break;
default:
printf("data error!");
}
}
return 0;
}
希望以上回答对你有帮助!如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:} 本帖最后由 六翻了 于 2023-10-7 20:20 编辑
之前写的,你看下判断2月到底有几天的部分
找一个确定的闰年作为一个点,再用fabs求绝对值
struct Date
{
int day;
int month;
int year;
};
int days(int, int, int, int);
int days(int a, int b, int c, int i)
{
while(b--)
{
switch(b)
{ case 1: c += 31; break;
case 3: c += 31; break;
case 5: c += 31; break;
case 7: c += 31; break;
case 8: c += 31; break;
case 10: c += 31; break;
case 12: c += 31; break;
case 4: c += 30; break;
case 6: c += 30; break;
case 9: c += 30; break;
case 11: c += 30; break;
case 2: break;
}
}
if((b) > 2)
{
if(i == 0)
{
c += 29;
}
else
{
c += 28;
}
}
return c;
}
int main(void)
{
struct Date head;
int i, sum;
do
{
printf("请输入年月日:");
scanf("%d-%d-%d", &head.year, &head.month, &head.day);
i = fabs((head.year) - 2000);
i = i % 4;
if(i != 0 && head.day >= 29 && head.month == 2)//非闰年 >= 29天
{
printf("错误!该年2月只有28天!!\n");
}
else if(i == 0 && head.day > 29 && head.month == 2)//润年 > 29天
{
printf("错误!该年2月只有29天!!\n");
}
if (head.month == 1 || (head.month>1 && head.month <= 7 && (head.month % 2) == 1) ||
(head.month>=8 && head.month <= 12 && head.month % 2 == 0) && head.day > 31)
{
printf("date error!\n");
}
else if((head.month>1 && head.month < 7 && (head.month % 2) == 0) ||
(head.month>=8 && head.month <= 12 && head.month % 2 == 1) && head.day > 30)
{
printf("date error!\n");
}
else
break;
} while (1);
sum = days(head.year, head.month, head.day, i);
printf("该日是本年的第 %d 天\n", sum);
return 0;
}
本帖最后由 六翻了 于 2023-10-7 20:19 编辑
六翻了 发表于 2023-10-7 19:50
之前写的,你看下判断2月到底有几天的部分
这是不使用函数的,有点儿小问题int main(void)
{
struct Date
{
int day;
int month;
int year;
};
struct Date head;
int i;
do
{
printf("请输入年月日:");
scanf("%d-%d-%d", &head.year, &head.month, &head.day);
i = fabs((head.year) - 2000);
i = i % 4;
if(i != 0 && head.day >= 29 && head.month == 2)
{
printf("错误!该年2月只有28天!!\n");
}
if (head.month == 1 || (head.month>1 && head.month <= 7 && (head.month % 2) == 1) ||
(head.month>=8 && head.month <= 12 && head.month % 2 == 0) && head.day > 31)
{
printf("date error!\n");
}
else if((head.month>1 && head.month < 7 && (head.month % 2) == 0) ||
(head.month>=8 && head.month <= 12 && head.month % 2 == 1) && head.day > 30)
{
printf("date error!\n");
}
else
break;
} while (1);
int sum = 0;
int n = head.month;
while(n--)
{
switch(n)
{ case 1: sum += 31; break;
case 3: sum += 31; break;
case 5: sum += 31; break;
case 7: sum += 31; break;
case 8: sum += 31; break;
case 10: sum += 31; break;
case 12: sum += 31; break;
case 4: sum += 30; break;
case 6: sum += 30; break;
case 9: sum += 30; break;
case 11: sum += 30; break;
case 2: break;
}
}
if((head.month) > 2)
{
if(i == 0)
{
sum += 29;
}
else
{
sum += 28;
}
}
sum += head.day;
printf("该日是本年的第 %d 天\n", sum);
return 0;
}
页:
[1]