打印某一年的月份日历
题目
2008年1月1日为星期二,判断2008年是否为闰年,输入任意一个月份,打印该年该月的日历,要求按周排齐,星期一排第一列。
分析
第一:考察的就是闰年的判断。
- 1、能整除400的。 year%400==0
- 2、能整除4同时不能整除100 。year%4==0&&year%100!=0
第二: 2008年1月1日是星期二,说明整除7的时候余数是2,这时候我们算天数的时候要在2的基础上开始,才能算出正确的星期
我觉得考察点就是这两个吧。
为什么要考虑闰年,闰年2月是29天,平年是28天,所以这一块的考虑。
下面我们看一下具体的代码吧。
代码(源码点击这里)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int days(int flag, int month);
void fun6(){
int year = 2008; //这里的月份按照题设是给定了,可以定义输入
int flag = 0;
int month, week, day = 2;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
flag = 1;
printf("2008 year is yes\n");
}
printf("please input 1-12\n");
scanf("%d", &month);
while (1) { // 判断输入的月份是否正确
if (month > 12 || month < 0) {
printf("please input 1-12\n");
scanf("%d", &month); }
else {
break;
}
}
for (int i = 1; i <= month - 1; i++) {
day += days(flag, i);
}
printf("\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "Mon", "Tuse", "Wed", "Thur", "Fri", "Sat", "Sun");
int size = days(flag, month);
for (int i = day, j = 1; i <= day + size && j <= size; i++, j++) {
week = i % 7;
if (i == day && week != 1) {
if (week == 0) {
printf("\t\t\t\t\t");
}
for (int i = 0; i < week - 2; i++) {
printf("\t");
}
}
switch (week) {
case 1:
printf("%d", j);
break;
case 2:
case 3:
case 4:
case 5:
case 6:
printf("\t%d", j);
break;
case 0:
printf("\t%d\n", j);
break;
default:
break;
}
}
}
// 计算天数
int days(int flag, int month){
switch (month) {
case 1:
case 5:
case 3:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if (flag == 1) {
return 29;
}else {
return 28;
}
}
}
int main(int argc, char const *argv[]){
fun6();
return 0;
}
效果
输入2的时候,
输入5看效果
2019年研究生考试的一道题,具体的题目不记得的,大概相类似吧。当时考场上,模模糊糊,时间紧迫没有写完美,今天就在写一下吧。
如果有什么问题,欢迎留言,探讨啊,如果有更好的解决办法,也欢迎留言啊。