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