• 已知1800年1月1日是星期三,打印指定的年份和月份月历


    #ifndef CALENDAR_H_
    #define CALENDAR_H_
    
    #include <string>
    #include <iostream>
    #include <stdio.h>
    
    
    void showCalendar(int year, int month);
    void showHead(int year, int month);
    void showBody(int year, int month);
    std::string month_number_toString(int month);
    int getFirstDayOfMonth(int year, int month);
    int getMonthDays(int year, int month);
    bool isLeapYear(int year);
    
    
    void showCalendar(int year, int month)
    {
        
        showHead(year, month);
        showBody(year, month);
        std::cout << "
    -----------------------------------
    ";
    }
    
    void showHead(int year, int month)
    {
        std::cout << "           ";
        std::cout << month_number_toString(month) << " " << year << std::endl;
        std::cout << "-----------------------------------
    ";
        std::cout << " Sun  Mon  Tue  Wed  Thu  Fri  Sat
    ";
    }
    
    void showBody(int year, int month)
    {
        int firstDay = getFirstDayOfMonth(year, month);
        int i = 0;
        int monthDays = getMonthDays(year, month);
        for (i = 0; i < firstDay; i++)
        {
            std::cout << "     ";
        }
        for (i = 1; i <= monthDays; i++)
        {
            printf(" %-3d ", i);
            if((firstDay + i) % 7 == 0)
                std::cout << std::endl;
        }
    }
    
    std::string month_number_toString(int month)
    {
        std::string ret;
        switch (month)
        {
        case 1:        ret = "January";    break;
        case 2:        ret = "February";    break;
        case 3:        ret = "March";        break;
        case 4:        ret = "April";        break;
        case 5:        ret = "May";        break;
        case 6:        ret = "June";        break;
        case 7:        ret = "July";        break;
        case 8:        ret = "August";        break;
        case 9:        ret = "September";    break;
        case 10:    ret = "October";    break;
        case 11:    ret = "November";    break;
        case 12:    ret = "December";    break;
        default:    ret = "ErrorMonth";    
        }
        return ret;
    }
    
    int getFirstDayOfMonth(int year, int month)
    {
        int totalDays = 0;
        for (int i = 1800; i < year; i++)
            totalDays += isLeapYear(i) ? 366 : 365;
        for (int i = 1; i < month; i++)
            totalDays += getMonthDays(year, i);
        return (totalDays + 3) % 7;
    }
    
    int getMonthDays(int year, int month)
    {
        int monthArray[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
        return (month == 2 && isLeapYear(year)) ? 29 : monthArray[month - 1];
    }
    
    bool isLeapYear(int year)
    {
        return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
    }
    
    #endif
    
    #include "calendar.h"
    #include <iostream>
    
    
    int main()
    {
        using namespace::std;
        int year, month;
        cout << "Enter full year (e.g., 2001): ";
        cin >> year;
        while (getchar() != '
    ');
        cout << "Enter month in number between 1 and 12: ";
        cin >> month;
        showCalendar(year, month);
        return 0;
    }
    View Code
    Enter full year (e.g., 2001): 2017
    Enter month in number between 1 and 12: 6
               June 2017
    -----------------------------------
     Sun  Mon  Tue  Wed  Thu  Fri  Sat
                         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
    -----------------------------------
  • 相关阅读:
    (原创)monitor H3C switch with cacti
    (原创)monitor Dell Powerconnec 6224 with cacti
    (转载)运行主机管理在openvswitch之上
    图片鼠标滑动实现替换
    分布式缓存(一)失效策略和缓存问题击穿,雪崩,穿透
    Spring 事务源码学习
    FactoryBean和BeanFactory
    Spring AOP 源码学习
    “两地三中心”和“双活”
    安装 geopandas 步骤
  • 原文地址:https://www.cnblogs.com/endenvor/p/6985694.html
Copyright © 2020-2023  润新知