乐趣区

关于初学者:AH-日历本基础上机试题

咱们常常须要应用日历,所以须要一个能生成日历的程序。
先要求你写一个程序,只须要输出年份,就能生成正确的日历。
输出
输出蕴含多组测试数据。每组输出一个整数 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;
}

退出移动版