解题思路:
这个题目是传统的打印日历的题目 不是很难 但要很细心 注意仔细观察样例的输出格式 才有可能AC
参考代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; bool judge(int year)//判断是不是闰年 { if(year%4==0&&year%100!=0||year%400==0) return true; else return false; } int DaysReturn(int year,int month)//找出输入的日期的月份的一号距离2007年1月1日有多少天 { int sum=0;//统计一年内的天数 int sum1=0;//统计间隔了多少年的天数 if(judge(year)) { switch(month) { case 1: sum=0;break; case 2: sum=31;break; case 3: sum=31+29;break; case 4: sum=31+29+31;break; case 5: sum=31+29+31+30;break; case 6: sum=31+29+31+30+31;break; case 7: sum=31+29+31+30+31+30;break; case 8: sum=31+29+31+30+31+30+31;break; case 9: sum=31+29+31+30+31+30+31+31;break; case 10: sum=31+29+31+30+31+30+31+31+30;break; case 11: sum=31+29+31+30+31+30+31+31+30+31;break; case 12: sum=31+29+31+30+31+30+31+31+30+31+30;break; } } else { switch(month) { case 1: sum=0;break; case 2: sum=31;break; case 3: sum=31+28;break; case 4: sum=31+28+31;break; case 5: sum=31+28+31+30;break; case 6: sum=31+28+31+30+31;break; case 7: sum=31+28+31+30+31+30;break; case 8: sum=31+28+31+30+31+30+31;break; case 9: sum=31+28+31+30+31+30+31+31;break; case 10: sum=31+28+31+30+31+30+31+31+30;break; case 11: sum=31+28+31+30+31+30+31+31+30+31;break; case 12: sum=31+28+31+30+31+30+31+31+30+31+30;break; } } for(int i=2007;i<year;i++) { if(judge(i)) { sum1+=366; } else sum1+=365; } sum1+=sum;//总天数 return sum1; } void Print(int year,int days,int month) { int x=days%7+1;//找出这个月的1号是星期几 int monthdays;//这个月有多少天 cout<<"---------------------"<<endl; cout<<" Su Mo Tu We Th Fr Sa"<<endl; cout<<"---------------------"<<endl; if(month==2) { if(judge(year)) monthdays=29; else monthdays=28; } else if(month==4||month==9||month==6||month==11) { monthdays=30; } else monthdays=31; if(x==7) printf("%3d",1);//针对每个月一号不同的星期制定不同的输出格式 if(x==1) printf("%6d",1); if(x==2) printf("%9d",1); if(x==3) printf("%12d",1); if(x==4) printf("%15d",1); if(x==5) printf("%18d",1); if(x==6) printf("%21d",1); for(int i=2;i<=monthdays;i++) { printf("%3d",i); if((i+(x%7))%7==0&&i<monthdays) printf("\n");//注意如果一个月的最后一号是星期6则无需空行 } cout<<endl; cout<<"---------------------"<<endl; } int main() { int year,month; while(cin>>year>>month) { int days=DaysReturn(year,month); Print(year,days,month); } return 0; }
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题6.3 (Java代码)浏览:650 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:653 |
2006年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:468 |
【密码】 (C语言代码)浏览:333 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:543 |
字符串输入输出函数 (C语言代码)浏览:2480 |
模拟计算器 (C语言代码)浏览:2293 |
数组输出 (C语言代码)浏览:700 |
良心推荐——>题解1049:C语言程序设计教程(第三版)课后习题11.1 (C语言描述——简单明了,时间复杂度低)浏览:1273 |
上车人数 (C语言代码)浏览:710 |
Spperman 2018-09-21 10:36:15 |
想啦一下: 当一个月的第一天是星期六 也应该回车所以代码稍微改一下就好啦
Spperman 2018-09-21 10:59:00 |
if(x==6) printf("%21d\n",1); 这是第一天为周六时 为最后一位应该直接回车