sdnyzjzx 发表于 2011-1-11 09:38:43

万年历 (重写)

本帖最后由 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();
}

whypro 发表于 2011-1-11 20:01:04

楼主的认真的态度让我钦佩!

doudou8308 发表于 2011-2-23 08:40:12

             

唉,没抢到沙发沙发。。。











http://www.discuz.net/static/image/common/sigline.gif
燃文

qifeng09 发表于 2011-3-10 11:35:40

楼主很细心,很认真
页: [1]
查看完整版本: 万年历 (重写)