日期输出,有问题

yaganblw 2011-03-01 01:48:14
输入一个日期,输出它的隔天的日
如 2009-11-30
输出 2009-12-2
代码有问题
一些特殊的日期有问题
#include"stdio.h"
int leamp(int y)
{int p=0;
if(y%4==0)
{
if(y%100==0)
{ if(y%400==0)
p=1;
else
p=0;

}
else
p=1;
}
else
p=0;
return p;
}
int check(int y,int m,int d)
{int leap=0;
if(m>=1&&m<=12&&m!=2)
{ if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
if(d>=1&&d<=31)
leap=1;
if(m==4||m==6||m==9||m==11)
if(d>=1&&d<=30)
leap=1;
}
if(m==2)
{if(leamp(y))
{if(d>=1&&d<=29) leap=1;}
else
{if(d>=1&&d<=28) leap=1;}
}

return leap;
}
void main()
{int y;
int m;
int d;
int tag;
printf("please input the date:\n");
scanf("%d%d%d",&y,&m,&d);
tag=leamp(y);
if(check(y,m,d)){
printf("your now date is:%d-%d-%d\n",y,m,d);
if(m==1||m==3||m==5||m==7||m==8||m==10)
{if(d==31)
{d=1; m=m+1;}
else if(d==30)
{d=2; m=m+1;}
else
d=d+2;
}
if(m==4||m==6||m==9||m==11)
{if(d==30)
{d=2; m=m+1;}
else if(d==29)
{d=1; m=m+1;}
else
d=d+2;
}
if(m==2)
{if(tag)
{if(d==29)
{d=2; m=m+1;}
if(d==28)
{d=1; m=m+1;}
else
d=d+2;
}
else
{if(d==28)
{d=2;m=m+1;}
if(d==27)
{d=1; m=m+1;}
else
d=d+2;
}
}
if(m==12)
{if(d==31)
{d=2;
y=y+1;
m=1;
}
if(d==30)
{d=1;
y=y+1;
m=1;
}
else
d=d+2;
}
printf("Two days later, it's:%d-%d-%d\n",y,m,d);
}
else
printf("data error");
getch();
}
...全文
215 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
julysee 2011-03-01
  • 打赏
  • 举报
回复
5楼正解。
yaganblw 2011-03-01
  • 打赏
  • 举报
回复
楼上说的利用check()函数,是不是要对返回值进行处理?这样我觉着确实简化了一些。
我说说我一开始的思路
对输入进行限制和判断闰年都是两个独立的模块
在main()函数中主要做月份和天数的处理
程序的错误之处我也已经找出来了,正如newfarmerchi所说那样,对月份进行判断时应该加else if
if{}
else if{}
else if{}
...
else{}
这样的错误都能犯???
贴一下正确代码和结果,也非常感谢lthyxy的二维数组思路,Bokutake的库函数方法,以及moorsf的直接在check()函数中返回所需要值的方法

#include"stdio.h"
int leamp(int y)
{int p=0;
if(y%4==0)
{
if(y%100==0)
{ if(y%400==0)
p=1;
else
p=0;

}
else
p=1;
}
else
p=0;
return p;
}
int check(int y,int m,int d)
{int leap=0;
if(m>=1&&m<=12&&m!=2)
{ if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
if(d>=1&&d<=31)
leap=1;
if(m==4||m==6||m==9||m==11)
if(d>=1&&d<=30)
leap=1;
}
if(m==2)
{if(leamp(y))
{if(d>=1&&d<=29) leap=1;}
else
{if(d>=1&&d<=28) leap=1;}
}

return leap;
}
void main()
{int y;
int m;
int d;
int tag;
printf("please input the date:\n");
scanf("%d%d%d",&y,&m,&d);
tag=leamp(y);
if(check(y,m,d)){
printf("your now date is:%d-%d-%d\n",y,m,d);
if(m==1||m==3||m==5||m==7||m==8||m==10)
{if(d==31)
{d=1; m=m+1;}
else if(d==30)
{d=2; m=m+1;}
else
d=d+2;
}
if(m==4||m==6||m==9||m==11)
{if(d==30)
{d=2; m=m+1;}
else if(d==29)
{d=1; m=m+1;}
else
d=d+2;
}
if(m==2)
{if(tag)
{if(d==29)
{d=2; m=m+1;}
else if(d==28)
{d=1; m=m+1;}
else
d=d+2;
}
else
{if(d==28)
{d=2;m=m+1;}
else if(d==27)
{d=1; m=m+1;}
else
d=d+2;
}
}
if(m==12)
{if(d==31)
{d=2;
y=y+1;
m=1;
}
else if(d==30)
{d=1;
y=y+1;
m=1;
}
else
d=d+2;
}
printf("Two days later, it's:%d-%d-%d\n",y,m,d);
}
else
printf("data error\n");
printf("\n----------------------------------------------------------\n");
getch();
}

please input the date:
2000 2 29
your now date is:2000-2-29
Two days later, it's:2000-3-2

----------------------------------------------------------
please input the date:
2008 12 31
your now date is:2008-12-31
Two days later, it's:2009-1-2

----------------------------------------------------------
please input the date:
2011 3 1
your now date is:2011-3-1
Two days later, it's:2011-3-3

----------------------------------------------------------
please input the date:
2010 3 45
data error

----------------------------------------------------------


moorsf 2011-03-01
  • 打赏
  • 举报
回复

#include"stdio.h"
int leamp(int y)
{
if(y%4==0)
{
if(y%100==0&&y%400!=0)
return 0;
else
return 1;
}
else
return 0;
}

int check(int y,int m,int d)
{
int leap=0;
if(m>=1&&m<=12&&m!=2)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
if(d>=1&&d<=31)
leap=1;
if(m==4||m==6||m==9||m==11)
if(d>=1&&d<=30)
leap=1;
}
if(m==2)
{
if(leamp(y))
{
if(d>=1&&d<=29) leap=1;
}
else
{
if(d>=1&&d<=28) leap=1;
}
}

return leap;
}
void main()
{
int y;
int m;
int d;
int cnt=2;

printf("please input the date:\n");
scanf("%d%d%d",&y,&m,&d);
if(check(y,m,d))
{
printf("your now date is:%d-%d-%d\n",y,m,d);
//进入这里已经保证之前的日期正确,那么做两次日期的加法就可以
while(cnt--)
{
d++;
if(!check(y,m,d))
{
d=1;
m++;
if(m>12)
{
m=1;
y++;
}
}
}
printf("Two days later, it's:%d-%d-%d\n",y,m,d);
}
else
printf("data error\n");
getch();
}

大略帮你改了下,main函数中的判断看起来比较复杂,没必要,可以利用之前的check函数。
yaganblw 2011-03-01
  • 打赏
  • 举报
回复
其实我在之前没加check()函数时,完全符合要求
不知道c中有没有对输入进行判断的自检函数
yaganblw 2011-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 newfarmerchi 的回复:]
主要问题是由少了else 再次进入if语句判断引起的
[/Quote]
我都用大括号括起来了,怎么会再次进入if语句判断
yaganblw 2011-03-01
  • 打赏
  • 举报
回复
不熟悉time函数
fireyou 2011-03-01
  • 打赏
  • 举报
回复
C有库函数可以用吧
不用自己写吧。
辰岡墨竹 2011-03-01
  • 打赏
  • 举报
回复

time_t rawtime;
struct tm *tm_a2d;
int year, month, day;

printf ( "please input the date(YYYY MM DD):" );
scanf (" %d%d%d", &year, &month, &day );

time ( &rawtime );
tm_a2d = localtime( &rawtime ); // 原来的多了个*,抱歉~
tm_a2d->tm_year = year - 1900;
tm_a2d->tm_mon = month - 1;
tm_a2d->tm_mday = day + 2;
mktime ( tm_a2d );

printf ( "after 2 day: %04d-%02d-%02d\n",
tm_a2d->tm_year + 1900,
tm_a2d->tm_mon + 1,
tm_a2d->tm_mday );
辰岡墨竹 2011-03-01
  • 打赏
  • 举报
回复
C自带的time函数能完成那种功能,要是都得自己写,不得累死……
newfarmerchi 2011-03-01
  • 打赏
  • 举报
回复

//主要问题是由少了else 再次进入if语句判断引起的,
//我加了一些,运行了几个日期还可以。也可能不全。顺着这个
//思路,你再改。
#include"stdio.h"
int leamp(int y)
{int p=0;
if(y%4==0)
{
if(y%100==0)
{ if(y%400==0)
p=1;
else
p=0;

}
else
p=1;
}
else
p=0;
return p;
}
int check(int y,int m,int d)
{int leap=0;
if(m>=1&&m<=12&&m!=2)
{ if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
if(d>=1&&d<=31)
leap=1;
if(m==4||m==6||m==9||m==11)
if(d>=1&&d<=30)
leap=1;
}
if(m==2)
{if(leamp(y))
{if(d>=1&&d<=29) leap=1;}
else
{if(d>=1&&d<=28) leap=1;}
}

return leap;
}
void main()
{int y;
int m;
int d;
int tag;
printf("please input the date:\n");
scanf("%d%d%d",&y,&m,&d);
tag=leamp(y);
if(check(y,m,d))
{
printf("your now date is:%d-%d-%d\n",y,m,d);
if(m==1||m==3||m==5||m==7||m==8||m==10)
{
if(d==31)
{d=2; m=m+1;}//是否为2
else if(d==30)
{d=2; m=m+1;}
else
d=d+2;
}
else //加了个else 以防止进入if(m==2).如输入m=1,d=30 ,在第一个if里
//有d=2,m++;往下走 ,遇到if(m==2) 此时m==2,再次进入有d=d+2;
if(m==4||m==6||m==9||m==11)
{
if(d==30)
{d=2; m=m+1;}
else if(d==29)
{d=1; m=m+1;}
else
d=d+2;
}
else if(m==2)//else
{
if(tag)
{if(d==29)
{d=2; m=m+1;}
else//else
if(d==28)
{d=1; m=m+1;}
else
d=d+2;
}
else
{if(d==28)
{d=2;m=m+1;}
else
if(d==27)
{d=1; m=m+1;}
else
d=d+2;
}
}
else if(m==12)
{
if(d==31)
{d=2;
y=y+1;
m=1;
}
else if(d==30)//else
{d=1;
y=y+1;
m=1;
}
else
d=d+2;
}
printf("Two days later, it's:%d-%d-%d\n",y,m,d);
}
else
printf("data error");
getch();
}

liutengfeigo 2011-03-01
  • 打赏
  • 举报
回复
你那里是+2也一样的
liutengfeigo 2011-03-01
  • 打赏
  • 举报
回复
搞个2惟数组
一行是闰年的.一年是非闰年的.
先确定是不是闰年.
然后判天.找到数组中对应的位置.如果是最后一天月份+1,天数为1.还判断是不是12月.
不是的话直接+1
sxqinge 2011-03-01
  • 打赏
  • 举报
回复
楼主代码好复杂,1~12月都被你列出来了

69,387

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧