//打印日历
//方法一:先求每一年的第一天周几,再求所求月份周几
//方法二:直接求出这月之前总天数 然后求这个月第一天周几
//两个方法思路一样 都是对7求余剩几天 加上基数
#include <stdio.h>
#include <stdlib.h>
int months[2][13] = {
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, //非闰年的12个月
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } //闰年的12个月
};
int isLeap(int year);
int first_day_of_month1(int year, int month);
int first_day_of_month2(int year, int month);
void show(int year, int month, int first);
int main()
{
int year, month;
printf("year/month: ");
scanf("%d/%d", &year, &month);
int first_month = first_day_of_month2(year, month);
show(year, month, first_month);
return 0;
}
int isLeap(int year) //判断是否为闰年
{
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
//用户输入的年份----1
int first_day_of_month1(int year, int month)
{
int base_year = 1900;
int base_first_day = 1;
int year_total = 0, month_total = 0;
int first_years;
for (int i = base_year; i < year; i++)
year_total += isLeap(i);
//这一年的第一天 (基数星期几+前一年剩下多少天)%7过了整数周剩的天数就是周几
year_total = year_total % 7; //用于我的理解 ----前一年剩下几天
first_years = (year_total + base_first_day) % 7;
for (int i = 1; i < month; i++)
month_total += months[isLeap(year)][i];
month_total = month_total % 7;
return (month_total + first_years) % 7;
}
//用户输入的年份----2
int first_day_of_month2(int year, int month)
{
int base_year = 1900;
int base_first_day = 1;
int total = 0;
int first_years;
for (int i = base_year; i < year; i++)
{
if(isLeap(i))
total += 366;
else
total += 365;
}
for (int i = 1; i < month; i++)
total += months[isLeap(year)][i];
total = total % 7;
return (total + base_first_day) % 7;
}
void show(int year, int month, int first)
{
printf("Sun Mon Tue Wed The Fri Sat\n");
printf("---------------------------\n");
for (int i = 0; i < first; i++)
printf(" ");
for (int i = 1; i <= months[isLeap(year)][month]; i++)
{
printf("%3d ", i);
if ((i + first) % 7 == 0)
printf("\n");
}
}
打印日历-C语言
最新推荐文章于 2024-03-04 14:36:01 发布