c++: 格式化打印日历一个月的所有日期

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

从输出效果可知,在abcx的前面,都又一个空格位。

通过这一验证,打印出一个月的日历效果就不会难了。


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;
}

输出效果于前面展示的别无二致。~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值