我们经常需要使用日历,所以需要一个能生成日历的程序。
先要求你写一个程序,只需要输入年份,就能生成正确的日历。
输入
输入包含多组测试数据。每组输入一个整数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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。