2.2 按照下述格式打印2016年1月日历:
Calendar 2016-01
--------------------------
Su Mo Tu We Th Fr Sa
--------------------------
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
--------------------------
- 这种对空格严格要求对齐的,一定要使用
setw(n)
这个函数。这个函数功能很强大的。会自动帮你占n
个 位。这里的n
,就是该函数的参数。也就是说,你输入几,就给你占几个位。然后,字符串默认右对齐。多余的空格在前面显示出来。
std::cout << std::setw(4) << "abc"<< std::setw(2)<<"x"<<std::endl;
输出:
>>> abc x
从输出效果可知,在abc
和x
的前面,都又一个空格位。
通过这一验证,打印出一个月的日历效果就不会难了。
void printCalendar() {
enum WeekDay {
Su = 0, Mo, Tu, We, Th, Fr, Sa
};
WeekDay init = Fr;
// print head
std::cout << "Calendar 2016-01" << std::endl;
std::cout << "--------------------------" << std::endl;
std::cout << "Su Mo Tu We Th Fr Sa" << std::endl;
std::cout << "--------------------------" << std::endl;
for (int i = 0; i < 31; ++i) {
WeekDay wd = (WeekDay) ((i + (int) init) % 7);
// std::cout << "wd = " << wd << " , " << "Fr = " << Fr << std::endl;
int t = 0;
if(i==0){
t = 22;
} else{
t = 4;
}
switch (wd) {
case Su:
std::cout << std::setw(2) << (i + 1);
break;
case Mo:
std::cout << std::setw(4) << (i + 1);
break;
case Tu:
std::cout << std::setw(4) << (i + 1);
break;
case We:
std::cout << std::setw(4) << (i + 1);
break;
case Th:
std::cout << std::setw(4) << (i + 1);
break;
case Fr:
std::cout << std::setw(t) << (i + 1);
break;
case Sa:
std::cout << std::setw(4) << (i + 1)<<std::endl;
break;
default:
break;
}
}
std::cout << std::endl << "--------------------------" << std::endl;
}
输出效果于前面展示的别无二致。~