k=(7-(day-n+6)%7)%7; //此月第一天是星期几 else if(day==1)
k=n; 流程图:
day>1 Y k=7-(day-n+6)%7 N k=n
4.打印输出本月当前月历:
printf(\for(o=0;o printf(\ \for(o=k;o {printf(\ if(o%7==6) printf(\} 流程图 printf(\sun mon tue wen thu fri sat\\n\N Y o printf(\ \o=o+1 printf(\,o-k+1) Y o%7==6 printf(\o=o+1 4 调试分析 1,在当天的系统时间(06年7月21号)运行后; 2,为了验证是否是日期跳到下个月是自动跳换的,我改了系统时间,设定为07年7月21号,运行结果如下: 3,由于上面两次试运行都成功了,所以我把系统时间设定为过去的06年6月,考察看是否还能正常运行: 可以看到,几次试运行都是成立的,而且根据设计,这个万年历可以显示的月历可以到公元元年! 当然调试过程中也遇到了一些问题,如: 发现这是k被赋予了7的结果,所以我就在k=7-(day-n+6)%7;的基础上做了修改:k=(7-(day-n+6)%7)%7; 所以遇到的问题就解决了! 还有一个想法就是定义了days是整型,理论上可能导致超出整型的范围,所以应该可以考虑使用long型,不过必要性不是很大所以忽略. 5 总 结 基本完成了设计的要求内容(模仿显示生活中的挂历,当前页以系统当前日期的月份为准显示当前月的没一天(显示出日期对应的星期几),当系统日期变到下一月时,系统自动翻页到下一月),不过显示页面有待改进,可以更加人性化一些。还有的问题就是现在的是获取系统时间自动换页显示日历,不过没有实现人工换页的功能,如果实现的话,应该要定义变量year,month,day;为可以直接赋值的,那样的话便可以随意查询任意一个月的日历了! 在本次课程设计中,我体会到了很多C语言学习中的心得,我深深体会到查找资料的重要性,因为本次设计需要比较全面的C语言知识,需要从书本查找大量的帮助资料,所以很考大家自我学习提高的能力。 在此设计前,我都不敢想象自己可以用学到的C语言做出这样的程序出来,总觉得自信不够,但通过这次设计,经过了几夜鏖战最后把程序运行出来时,内心的喜悦是难以言表的。这次的成功不仅给了我学号C语言用好C语言的动力,也给了我更加深入的学习C语言的动力,C语言确实是一门很实际的计算机语言! 通过这次设计也使自己对C语言的掌握提高到了一个新的水平,能够利用C语言编写出一个实用的程序,很大程度提高了程序综合设计能力、分析能力和编程能力,以及自我动手能力等等。这对以后学习和工作中遇到问题也是很有帮助的,毕竟我曾经战胜过它! 7.附录 #include {int year,month,day; int days=0,i,j,n,m,k,o; int m1[]={31,28,31,30,31,30,31,31,30,31,30,31}; int m2[]={31,29,31,30,31,30,31,31,30,31,30,31}; time_t today; struct tm *p; time(&today); p=localtime(&today); //转换成本地时间的日期 year=p->tm_year+1900; month=p->tm_mon+1; day=p->tm_mday; printf(\ M-d\\n\ //打印出年月 if(year>=0) //由于已知公元元年1月1日为星期一,所以以改日为基准计算 for(i=0;i { if((i%4==0 && i0!=0)||i@0==0) //判断是否为闰年 days=days+366; else days=days+365; } if((year%4==0 && year0!=0)||year@0==0) //判断是否为闰年 for(j=0;j {days=days+m2[j]; m=m2[month]; //算出当月天数 }