飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3748|回复: 3

[C/C++] 万年历 (重写)

[复制链接]
  • TA的每日心情
    开心
    2024-3-7 15:25
  • 签到天数: 442 天

    [LV.9]以坛为家II

    发表于 2011-1-11 09:38:43 | 显示全部楼层 |阅读模式
    本帖最后由 sdnyzjzx 于 2011-1-11 09:40 编辑

    学习了汇编的模块化编程后,再次重写万年历代码,个人认为,思路比原来清晰了,但还有许多不足之处,敬请批评指正!
    第一次代码: https://www.chinapyg.com/viewthread.php?tid=60182
    1. /* 以2000-1-1 星期六 为计算基准 */

    2. int year,month,date,week,_first;
    3. int t,t1,t2,j,k,i,e;
    4. int m[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
    5. char key;

    6. /* 显示 年 月 日 星期几 */

    7. _show(int year,int month,int date,int _first,int *m)
    8. {
    9. int q;

    10.         leap_year(year);
    11.         j=*(m+month);
    12.         if(month==2)
    13.         {
    14.         j=j+k;
    15.         }
    16.         clrscr();
    17.         gotoxy(30,5);
    18.         printf("%4d year %d month ",year,month);
    19.         gotoxy(27,7);
    20.         printf("======================");
    21.         gotoxy(20,9);
    22.         printf("7      1      2      3      4      5      6");
    23.         if(_first==7)
    24.         {
    25.                 gotoxy(19,12);
    26.                 for(i=1;i<=j;i++)
    27.                 {
    28.                         if(i==date)
    29.                         {
    30.                         printf("%c[%2d]     %c",0x8,i,0x8);
    31.                         }
    32.                         else
    33.                         {
    34.                         printf("%2d     ",i);
    35.                         }
    36.                         if(i%7==0)
    37.                         {
    38.                         printf("\n\n");
    39.                                 for(q=1;q<19;q++)
    40.                                 {
    41.                                 printf("%c",0x20);
    42.                                 }
    43.                         }
    44.                 }
    45.         }
    46.         else
    47.         {
    48.                 gotoxy(19,12);       
    49.                 for(i=1;i<=_first+j;i++)
    50.                 {
    51.                         if(i<=_first)
    52.                         {
    53.                         printf("%2c     ",0x20);
    54.                         }
    55.                         else if(i==date+_first)
    56.                         {
    57.                         printf("%c[%2d]     %c",0x8,i-_first,0x8);
    58.                         }
    59.                         else
    60.                         {
    61.                         printf("%2d     ",i - _first);
    62.                         }
    63.                                if(i%7==0)
    64.                         {
    65.                         printf("\n\n");
    66.                                        for(q=1;q<19;q++)
    67.                                        {
    68.                                 printf("%c",0x20);
    69.                                 }
    70.                         }

    71.                 }
    72.         }
    73. gotoxy(25,24);
    74. printf("Esc: exit   Arrow : chang date");
    75. }

    76. /* 闰年判断 */

    77. int leap_year(int year)                                                                  
    78. {
    79.         if((year%4 == 0 && year%100 != 0)||(year%400==0))
    80.         k=1;
    81.         else
    82.         {
    83.         k=0;
    84.         }
    85. return k;
    86. }

    87. /* 输入日期合法性检测  */

    88. _check(int year,int month,int date)                                                
    89. {
    90.         leap_year(year);

    91.         if( year>-1 && month>0 && month<13 )
    92.         {
    93.                 while (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
    94.                 {
    95.                         if(date<0 || date>31)
    96.                         {
    97.                         _over();
    98.                         }
    99.                 break;
    100.                 }
    101.                 while (month==4 || month==6 || month==9 ||month==11)
    102.                 {
    103.                         if(date<0 || date>30)
    104.                         {
    105.                         _over();
    106.                         }
    107.                 break;
    108.                 }
    109.                 while(month==2 && k==0)
    110.                 {
    111.                         if(date<0 || date>28)
    112.                         {
    113.                         _over();
    114.                         }
    115.                 break;
    116.                 }
    117.                 while(month==2 && k==1)
    118.                 {
    119.                         if(date<0 || date>29)
    120.                         {
    121.                         _over();
    122.                         }
    123.                 break;
    124.                 }
    125.         }
    126.         else
    127.         {
    128.         _over();
    129.         }
    130. }

    131. /* 输入日期错误处理 */

    132. _over()                                                                                               
    133. {
    134.         clrscr();
    135.         gotoxy(20,13);
    136.         printf("Your input is error . Try again !");
    137.         getch();
    138.         exit(0);
    139. }

    140. /* 计算输入日期与2000年1月1日相差天数 */

    141. int _sum_day(int year,int month,int date,int *m)
    142. {
    143.         t1=t2=0;
    144.         while(year<2000)
    145.         {

    146. /* 计算当前日期是本年中第几天,计为 t1 */

    147.                         while (month>2)       
    148.                         {
    149.                                 leap_year(year);
    150.                                 for(j=1;j<month;j++)
    151.                                 {
    152.                                 t1 = t1 + *(m+j);
    153.                                 }
    154.                                 t1 = t1 + date+k ;
    155.                         break;
    156.                         }
    157.                              while (month<=2)
    158.                         {
    159.                         if(month==2)
    160.                         {
    161.                         t1=31+date;
    162.                         }
    163.                         else
    164.                         {
    165.                         t1=date;
    166.                         }
    167.                         break;
    168.                         }

    169. /* 计算输入日期到2000年1月1号天数 计为 t */
    170.                               
    171.                         for(i=year;i<2000;i++)
    172.                         {
    173.                         leap_year(i);
    174.                         t2=t2+365+k;
    175.                         }
    176.                         t=t2-t1;

    177. /* 判断输入日期是星期几 */

    178.                         week=5-t%7;
    179.                         if(week<=0)
    180.                         {
    181.                         week=week+7;
    182.                         }
    183.         break;
    184.         }
    185.         while (year>=2000)
    186.         {

    187. /* 计算当前日期是本年中第几天,计为 t1 已经过去 */

    188.                 while (month>2)
    189.                 {
    190.                         leap_year(year);
    191.                         for(j=1;j<month;j++)
    192.                         {
    193.                         t1 = t1 + *(m+j);
    194.                         }
    195.                         t1 = t1 + date + k;
    196.                         break;
    197.                 }
    198.                 while (month<=2)
    199.                 {
    200.                         if(month==2)
    201.                         {
    202.                         t1=31+date;
    203.                         }
    204.                         else
    205.                         {
    206.                         t1=date;
    207.                         }
    208.                 break;
    209.                 }
    210.                 while (year>2000)
    211.                 {
    212.                         for(i=2000;i<year;i++)
    213.                         {
    214.                         leap_year(i);
    215.                         t2=t2+365+k;
    216.                         }
    217.                 break;
    218.                 }      
    219. /* 计算与 2000-1-1 相距天数,并计算星期几 */
    220.                         t=t1+t2;
    221.                         week=5+t%7;
    222.                         if(week>7)
    223.                         {
    224.                         week=week-7;
    225.                         }

    226.         break;
    227.         }
    228. /* 计算当前月1号星期几 */
    229.                 _first=0;
    230.                 _first=week-date%7+1;
    231.                 if(_first<=0)
    232.                 {
    233.                 _first=_first+7;
    234.                 }
    235. }


    236. main()
    237. {
    238.         clrscr();
    239.         gotoxy(10,13);
    240.         printf("Please input the date (eg:2000-1-1) : ");
    241.         scanf("%d-%d-%d",&year,&month,&date);
    242.         _check(year,month,date);
    243.         _sum_day(year,month,date,m);
    244.         _show(year,month,date,_first,m);
    245.        
    246.         while (3)
    247.         {
    248.                 key=getch();

    249.                 if(key==0x48 && key != 0)   /* up */
    250.                 {
    251.                 month++;
    252.                 }
    253.                 else if(key==0x50 && key != 0)
    254.                 {
    255.                 month--;
    256.                 }
    257.                 else if(key==0x4b && key != 0)
    258.                 {
    259.                 year--;
    260.                 }
    261.                 else if(key==0x4d && key != 0)
    262.                 {
    263.                 year++;
    264.                 }
    265.                 else if(key==0x1b)
    266.                 {
    267.                 break;
    268.                 }

    269.                 if(month==0)
    270.                 {
    271.                 year--;
    272.                 month=12;
    273.                 }
    274.                 if(month==13)
    275.                 {
    276.                 year++;
    277.                 month=1;
    278.                 }
    279.                 if(year==-1)
    280.                 {               
    281.                 year=0;
    282.                 }
    283.                 _check(year,month,date);
    284.                 _sum_day(year,month,date,m);
    285.                 _show(year,month,date,_first,m);

    286.         }
    287.                 clrscr();
    288. }
    复制代码
    万年历.jpg
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2011-1-11 20:01:04 | 显示全部楼层
    楼主的认真的态度让我钦佩!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2011-2-23 08:40:12 | 显示全部楼层

                 

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












    燃文
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2011-3-10 11:35:40 | 显示全部楼层
    楼主很细心,很认真
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表