- UID
- 65892
注册时间2010-3-1
阅读权限50
最后登录1970-1-1
感悟天道
TA的每日心情 | 慵懒 2024-12-4 10:07 |
---|
签到天数: 444 天 [LV.9]以坛为家II
|
本帖最后由 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[13] ={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();
- }
复制代码
|
|