C语言程序代码,制作一个基于C语言的台历,要求输入年,能输出这一年的台历,输入年月能输出这个月的台历,输入年月日,输出这天是这年的第几周和第几天,是否是中国农历传统的节日,如果是,是什么节日。
时间: 2024-01-16 08:03:24 浏览: 186
求某一天是周几,打印周历、月历和求某年的节假日函数集合。C语言代码,下载即可用!
这是一个比较复杂的问题,需要借助一些库和算法才能完成。以下是大致的思路:
1. 首先需要获取用户输入的年、月、日信息。可以使用scanf函数来实现。
2. 接着需要判断输入的年份是否为闰年。闰年的判断方法为:能被4整除但不能被100整除,或者能被400整除。
3. 计算该年的1月1日是星期几。可以使用Zeller公式来实现。
4. 根据输入的年月,计算出该月的天数。
5. 输出台历。可以使用printf函数来逐行输出日历。
6. 判断某一天是第几周和第几天。可以根据该天与该年1月1日的差值来计算。
7. 判断某一天是否是中国农历传统的节日。这个需要借助一些算法来实现。可以参考一些现成的库,如lunar-calendar-c。
下面是一个简单的代码示例,仅供参考:
```c
#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include "lunar-calendar-c/lunar_calendar.h"
// 判断闰年
bool isLeapYear(int year) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return true;
}
return false;
}
// 计算某年1月1日是星期几
int calcWeekday(int year) {
int q, m, k, j;
q = 1;
m = 13;
if (m <= 2) {
year--;
m += 12;
}
k = year % 100;
j = year / 100;
int h = (q + 26 * (m + 1) / 10 + k + k / 4 + j / 4 + 5 * j) % 7;
return (h + 6) % 7; // 星期天为0,所以要加6再对7取余
}
// 计算某年某月的天数
int calcDaysOfMonth(int year, int month) {
if (month == 2) {
return isLeapYear(year) ? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else {
return 31;
}
}
// 输出某年某月的台历
void printCalendar(int year, int month) {
// 计算该月的天数
int days = calcDaysOfMonth(year, month);
// 输出表头
printf("%d年%d月\n", year, month);
printf("日 一 二 三 四 五 六\n");
// 计算该月1号是星期几
int weekday = calcWeekday(year);
for (int i = 0; i < weekday; i++) {
printf(" ");
}
// 输出日期
for (int i = 1; i <= days; i++) {
printf("%2d ", i);
if ((i + weekday) % 7 == 0) {
printf("\n");
}
}
printf("\n");
}
// 计算某一天是第几周和第几天
void calcWeekdayOfMonth(int year, int month, int day) {
time_t t = time(NULL);
struct tm tm = *localtime(&t);
tm.tm_year = year - 1900;
tm.tm_mon = month - 1;
tm.tm_mday = day;
mktime(&tm);
int weekday = tm.tm_wday; // 星期几
int week = (day + 6 - weekday) / 7 + 1; // 第几周
int dayOfWeek = (weekday == 0 ? 7 : weekday); // 第几天
printf("%d年%d月%d日是第%d周,星期%d\n", year, month, day, week, dayOfWeek);
}
// 判断某一天是否是农历节日
void checkLunarFestival(int year, int month, int day) {
LunarCalendar lc = solar_to_lunar(year, month, day);
if (lc.lunar_month == 12 && lc.lunar_day == 30) {
printf("%d年%d月%d日是除夕\n", year, month, day);
} else if (lc.lunar_month == 1 && lc.lunar_day == 1) {
printf("%d年%d月%d日是春节\n", year, month, day);
} else if (lc.lunar_month == 1 && lc.lunar_day == 15) {
printf("%d年%d月%d日是元宵节\n", year, month, day);
} else if (lc.lunar_month == 5 && lc.lunar_day == 5) {
printf("%d年%d月%d日是端午节\n", year, month, day);
} else if (lc.lunar_month == 8 && lc.lunar_day == 15) {
printf("%d年%d月%d日是中秋节\n", year, month, day);
} else if (lc.lunar_month == 9 && lc.lunar_day == 9) {
printf("%d年%d月%d日是重阳节\n", year, month, day);
}
}
int main() {
int year, month, day;
printf("请输入年: ");
scanf("%d", &year);
printf("请输入月: ");
scanf("%d", &month);
printf("请输入日: ");
scanf("%d", &day);
// 输出台历
printCalendar(year, month);
// 计算某一天是第几周和第几天
calcWeekdayOfMonth(year, month, day);
// 判断某一天是否是农历节日
checkLunarFestival(year, month, day);
return 0;
}
```
阅读全文