万年历 (重写)
本帖最后由 sdnyzjzx 于 2011-1-11 09:40 编辑学习了汇编的模块化编程后,再次重写万年历代码,个人认为,思路比原来清晰了,但还有许多不足之处,敬请批评指正!
第一次代码: https://www.chinapyg.com/viewthread.php?tid=60182/* 以2000-1-1 星期六 为计算基准 */
int year,month,date,week,_first;
int t,t1,t2,j,k,i,e;
int m ={0,31,28,31,30,31,30,31,31,30,31,30,31};
char key;
/* 显示 年 月 日 星期几 */
_show(int year,int month,int date,int _first,int *m)
{
int q;
leap_year(year);
j=*(m+month);
if(month==2)
{
j=j+k;
}
clrscr();
gotoxy(30,5);
printf("%4d year %d month ",year,month);
gotoxy(27,7);
printf("======================");
gotoxy(20,9);
printf("7 1 2 3 4 5 6");
if(_first==7)
{
gotoxy(19,12);
for(i=1;i<=j;i++)
{
if(i==date)
{
printf("%c[%2d] %c",0x8,i,0x8);
}
else
{
printf("%2d ",i);
}
if(i%7==0)
{
printf("\n\n");
for(q=1;q<19;q++)
{
printf("%c",0x20);
}
}
}
}
else
{
gotoxy(19,12);
for(i=1;i<=_first+j;i++)
{
if(i<=_first)
{
printf("%2c ",0x20);
}
else if(i==date+_first)
{
printf("%c[%2d] %c",0x8,i-_first,0x8);
}
else
{
printf("%2d ",i - _first);
}
if(i%7==0)
{
printf("\n\n");
for(q=1;q<19;q++)
{
printf("%c",0x20);
}
}
}
}
gotoxy(25,24);
printf("Esc: exit Arrow : chang date");
}
/* 闰年判断 */
int leap_year(int year)
{
if((year%4 == 0 && year%100 != 0)||(year%400==0))
k=1;
else
{
k=0;
}
return k;
}
/* 输入日期合法性检测*/
_check(int year,int month,int date)
{
leap_year(year);
if( year>-1 && month>0 && month<13 )
{
while (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
{
if(date<0 || date>31)
{
_over();
}
break;
}
while (month==4 || month==6 || month==9 ||month==11)
{
if(date<0 || date>30)
{
_over();
}
break;
}
while(month==2 && k==0)
{
if(date<0 || date>28)
{
_over();
}
break;
}
while(month==2 && k==1)
{
if(date<0 || date>29)
{
_over();
}
break;
}
}
else
{
_over();
}
}
/* 输入日期错误处理 */
_over()
{
clrscr();
gotoxy(20,13);
printf("Your input is error . Try again !");
getch();
exit(0);
}
/* 计算输入日期与2000年1月1日相差天数 */
int _sum_day(int year,int month,int date,int *m)
{
t1=t2=0;
while(year<2000)
{
/* 计算当前日期是本年中第几天,计为 t1 */
while (month>2)
{
leap_year(year);
for(j=1;j<month;j++)
{
t1 = t1 + *(m+j);
}
t1 = t1 + date+k ;
break;
}
while (month<=2)
{
if(month==2)
{
t1=31+date;
}
else
{
t1=date;
}
break;
}
/* 计算输入日期到2000年1月1号天数 计为 t */
for(i=year;i<2000;i++)
{
leap_year(i);
t2=t2+365+k;
}
t=t2-t1;
/* 判断输入日期是星期几 */
week=5-t%7;
if(week<=0)
{
week=week+7;
}
break;
}
while (year>=2000)
{
/* 计算当前日期是本年中第几天,计为 t1 已经过去 */
while (month>2)
{
leap_year(year);
for(j=1;j<month;j++)
{
t1 = t1 + *(m+j);
}
t1 = t1 + date + k;
break;
}
while (month<=2)
{
if(month==2)
{
t1=31+date;
}
else
{
t1=date;
}
break;
}
while (year>2000)
{
for(i=2000;i<year;i++)
{
leap_year(i);
t2=t2+365+k;
}
break;
}
/* 计算与 2000-1-1 相距天数,并计算星期几 */
t=t1+t2;
week=5+t%7;
if(week>7)
{
week=week-7;
}
break;
}
/* 计算当前月1号星期几 */
_first=0;
_first=week-date%7+1;
if(_first<=0)
{
_first=_first+7;
}
}
main()
{
clrscr();
gotoxy(10,13);
printf("Please input the date (eg:2000-1-1) : ");
scanf("%d-%d-%d",&year,&month,&date);
_check(year,month,date);
_sum_day(year,month,date,m);
_show(year,month,date,_first,m);
while (3)
{
key=getch();
if(key==0x48 && key != 0) /* up */
{
month++;
}
else if(key==0x50 && key != 0)
{
month--;
}
else if(key==0x4b && key != 0)
{
year--;
}
else if(key==0x4d && key != 0)
{
year++;
}
else if(key==0x1b)
{
break;
}
if(month==0)
{
year--;
month=12;
}
if(month==13)
{
year++;
month=1;
}
if(year==-1)
{
year=0;
}
_check(year,month,date);
_sum_day(year,month,date,m);
_show(year,month,date,_first,m);
}
clrscr();
}
楼主的认真的态度让我钦佩!
唉,没抢到沙发沙发。。。
http://www.discuz.net/static/image/common/sigline.gif
燃文 楼主很细心,很认真
页:
[1]