一、2015年的NOIP普及组初赛有一道代码补全的题目,很有意思,功能是实现一个当年任意月的月历显示。
为了让代码更有趣,我这里把它改为针对2022年的任意月的月历的显示。代码如下:
// 2022年,任一月份的月历
#include<iostream>
using namespace std;
const int dayNum[]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int m;
cin >> m;
cout << "S\tM\tT\tW\tT\tF\tS" << endl;
int offset=6;
for (int i=1; i<m; i++) {
offset= (offset+ dayNum[i])%7;
}
for (int i=0; i<offset; i++){
cout << "\t";
}
for (int i=1; i<= dayNum[m]; i++){
cout << i ;
if (i==dayNum[m] || (i+offset)%7==0) {
cout << endl;
} else {
cout << "\t";
}
}
return 0;
}
我们学习软件的一个非常好的方式就是给现有的代码增加新的功能。从这个最基础的功能开始,我们逐步增加新的功能进来。
二、首先,这里是周日起点,我们想把它改为更符合中国人习惯的周一起点,并且使用中文。
代码只须修改一点点:
#include<iostream>
using namespace std;
const int dayNum[]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int m;
cin >> m;
cout << "一\t二\t三\t四\t五\t六\t日" << endl;
int offset=6;
for (int i=1; i<m; i++) {
offset= (offset+ dayNum[i])%7;
}
offset= (offset+6)%7;
for (int i=0; i<offset; i++){
cout << "\t";
}
for (int i=1; i<= dayNum[m]; i++){
cout << i ;
if (i==dayNum[m] || (i+offset)%7==0) {
cout << endl;
} else {
cout << "\t";
}
}
return 0;
}
三、常见的月历中,周六周日用红色显示,我们可以使用windows的库实现这个功能。