共计 3901 个字符,预计需要花费 10 分钟才能阅读完成。
咱们常常须要应用日历,所以须要一个能生成日历的程序。
先要求你写一个程序,只须要输出年份,就能生成正确的日历。
输出
输出蕴含多组测试数据。每组输出一个整数 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;
}
正文完