我们经常需要使用日历,所以需要一个能生成日历的程序。
先要求你写一个程序,只需要输入年份,就能生成正确的日历。
输入
输入包含多组测试数据。每组输入一个整数Y(1800<=Y<=2100),表示公元年份。
输出
对于每组输入,输出对应的日立本。选中下面的输出样例查看具体的输出格式,注意空格的输出。
样例输入 Copy
2010
样例输出 Copy
整年的日历格式
https://blog.csdn.net/mustuo/...

代码示例(我没彻底搞懂,这是大佬的代码)

////详见:https://blog.csdn.net/mustuo/article/details/103981084 
//#include<stdio.h> 
// 
//int days[13]={-1,31,-1,31,30,31,30,31,31,30,31,30,31};//每月的天数 
// 
//void print_block_title(int i){
//    switch(i){
//        case 1:printf("      January               February               March        \n");break;
//        case 2:printf("       April                  May                   June        \n");break;
//        case 3:printf("        July                 August              September      \n");break;
//        case 4:printf("      October               November              December      \n");break;        
//    }
//}
//void print_week_name(){
//    printf("Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa\n");
//}
//void print_title(int y){
//    printf("                              %d                              \n\n",y);
//}
///**
//判断是否闰年 
//**/ 
//int is_leap_year(int y){
//    if(y%4==0 && y%100!=0 || y%400==0){
//        return 1;
//    }else{
//        return 0;
//    }
//}
// 
//int max_r(int a, int b,int c){
//    if(a>=b && a>=c){
//        return a;
//    }
//    if(b>=a && b>=c){
//        return b;
//    }
//    if(c>=a && c>=b){
//        return a;
//    }
//}
// 
///**
//计算某个月的第一天是星期几
//return:星期(0:星期一,以此类推) 
//note:使用蔡勒公式。1,2月要当成上一年的13,14月计算。 
//**/
//int day_of_first(int y,int m){
//    if(m==1 || m==2){
//        y--;
//        m += 12;
//    }
//    int c = y/100;
//    y %=100;
//    int w = y+y/4+c/4-2*c+(26*(m+1)/10);
//    if(w<0){
//        w = (w%7+7)%7;
//    }else{
//        w %= 7;
//    }
//    return w;
//}
//int main(){
//    int Y;
//    while(scanf("%d",&Y)!=EOF){        
//        
//        //title
//        print_title(Y);
//        
//        //block
//        int line_i,j;
//        int w[3];    //每个月的第一天是星期几(0:星期日)
//        int d[3];    //累计日期 
//        int m[3];    //月份 
//        for(line_i=1;line_i<=4;line_i++){    //循环打印每一行             
//            //初始化2月天数
//            if(is_leap_year(Y)) {
//                days[2] = 29;
//            }else{
//                days[2] = 28;
//            }
//            
//            //初始化w、d、m数组
//            int i;
//            for(i=0;i<3;i++) {
//                d[i] = 1;
//                m[i] = (line_i-1)*3+i+1;
//                w[i] = (day_of_first(Y,m[i]))%7;
//            }
//            
//            //计算行数:不用算了,都是6行 
////            int r1 =  ((7-(w[0]+days[m[0]])%7)+w[0]+days[m[0]])/7;
////            int r2 =  ((7-(w[1]+days[m[1]])%7)+w[1]+days[m[1]])/7;
////            int r3 =  ((7-(w[2]+days[m[2]])%7)+w[2]+days[m[2]])/7;
////            int rows = max_r(r1,r2,r3);                
//            
//            print_block_title(line_i);
//            print_week_name();            
//            
//            int block_i,row_i;
//            for(row_i=0;row_i<6;row_i++){
//                for(block_i=0;block_i<3;block_i++){
//                    if(block_i>0){
//                        printf("  ");
//                    }
//                    
//                    for(j=0;j<7;j++){
//                        if(j>0){
//                            printf(" ");
//                        }
//                        if(row_i==0 && j<w[block_i]){//填充空格 :只有第一行才需要填充空格 
//                            printf("  ");
//                        }else if(row_i>0 || row_i==0 && j>=w[block_i]){
//                            if(d[block_i]<=days[m[block_i]]){
//                                printf("%2d",d[block_i]);
//                                d[block_i]++;
//                            }else{
//                                printf("  ");
//                            }
//                        }
//                    }
//                }
//                
//                printf("\n") ;
//            }
//        }
//    }
//    
//    return 0;
//}

另一种写法,大差不差,来自hhky某学长

//参考https://blog.csdn.net/mustuo/article/details/103981084 
#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
using namespace std;

void print_title(int y)
{
    printf("                              %d                              \n\n", y);
}

void print_block_title(int i)
{
    switch (i) {
    case 1:
        printf("      January               February               March        \n");
        break;
    case 2:
        printf("       April                  May                   June        \n");
        break;
    case 3:
        printf("        July                 August              September      \n");
        break;
    case 4:
        printf("      October               November              December      \n");
        break;
    }
}

void print_week_name()
{
    printf("Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa\n");
}

int days[13] = { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //每月的天数

int is_leap_year(int y)
{
    if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
        return 1;
    } else {
        return 0;
    }
}

int day_of_first(int y, int m)
{
    int w, d = 1;
    if (m == 1 || m == 2) {
        y--;
        m += 12; // m = m + 12;    //一、二月换算成上一年的13,14月
    }
    int c = y / 100; // 2049取前两个数字20
    y %= 100; //2049 取后两个数字 49

    w = (((y + y / 4 + c / 4 - 2 * c + (26 * (m + 1)) / 10 + d - 1) % 7) + 7) % 7;

    return w;
}

int main()
{
    // freopen("ca.out", "w", stdout);
    int Y;
    while (scanf("%d", &Y) != EOF) {
        //title
        print_title(Y);
        days[2] = is_leap_year(Y) ?  29 : 28;

        int w[3]; //每个月的第一天是星期几block
        int d[3]; //累计日期,1,2,3,4,5,6,7,8,9,10,11
        int m[3]; //月份

        //block
        for (int line_i = 1; line_i <= 4; line_i++) {
            print_block_title(line_i);
            print_week_name();

            //初始化
            for (int i = 0; i < 3; i++) {
                d[i] = 1;
                m[i] = (line_i - 1) * 3 + i + 1; //找规律,大line和月份进行对应
                w[i] = day_of_first(Y, m[i]);
            }

            for (int row_i = 0; row_i < 6; row_i++) {
                for (int block_i = 0; block_i < 3; block_i++) {
                    if (block_i > 0) {
                        printf("  ");
                    }

                    for (int j = 0; j < 7; j++) {
                        if (j > 0) {
                            printf(" ");
                        }

                        if (row_i == 0 && j < w[block_i]) {
                            printf("  ");
                        } else if (row_i > 0 || ((row_i == 0) && j >= w[block_i])) {
                            if (d[block_i] <= days[m[block_i]]) {
                                printf("%2d", d[block_i]);
                                d[block_i]++;
                            } else {
                                printf("  ");
                            }
                        }
                    }
                }
                printf("\n");
            }
        }
    }
    return 0;
}


沐小轲
9 声望0 粉丝

C++初学者


引用和评论

0 条评论