功能要求:
1、输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。
2、输入年月,输出该月的日历。
3、输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
没看出和单链表有什么关系。
万年历C源代码在百度上一搜一大堆。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义节点结构体
typedef struct Node {
int year;
int month;
int day;
struct Node* next;
} Node;
// 定义函数声明
int getWeekday(int year, int month, int day);
bool isLeapYear(int year);
int getMonthDays(int year, int month);
int getTotalDays(int year, int month, int day);
void printMonth(int year, int month);
void printYear(int year);
void printCountdown(int year, int month, int day);
// 主函数
int main() {
int choice, year, month, day;
printf("欢迎使用万年历系统!\n");
while (true) {
printf("\n请选择要执行的操作:\n");
printf("1. 输入年份,输出该年的日历。\n");
printf("2. 输入年月,输出该月的日历。\n");
printf("3. 输入年月日,输出距今天还有多少天,星期几,是否是公历节日。\n");
printf("4. 退出系统。\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("\n请输入要查询的年份(1940-2040年之间):\n");
scanf("%d", &year);
printYear(year);
break;
case 2:
printf("\n请输入要查询的年月(格式:年 月):\n");
scanf("%d %d", &year, &month);
printMonth(year, month);
break;
case 3:
printf("\n请输入要查询的年月日(格式:年 月 日):\n");
scanf("%d %d %d", &year, &month, &day);
printCountdown(year, month, day);
break;
case 4:
printf("\n感谢使用万年历系统!\n");
exit(0);
default:
printf("\n输入有误,请重新输入。\n");
}
}
}
// 获取星期几,0代表星期日,1代表星期一,以此类推
int getWeekday(int year, int month, int day) {
if (month == 1 || month == 2) {
month += 12;
year--;
}
int c = year / 100, y = year % 100;
int weekday = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
if (weekday < 0) {
weekday = (weekday % 7 + 7) % 7;
} else {
weekday %= 7;
}
return weekday;
}
// 判断是否是闰年
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 获取某年某月的天数
int getMonthDays(int year, int month) {
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
#include <stdio.h>
#include <stdlib.h>
struct Node {
int day; // 当月第一天是星期几,0表示星期天,1表示星期一,以此类推
int days; // 当月的天数
struct Node *next; // 指向下一个月的指针
};
// 判断是否是闰年
int isLeapYear(int year) {
return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}
// 初始化月份的天数
int initDays(int month, int year) {
int days;
if (month == 2) {
days = isLeapYear(year) ? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
days = 30;
} else {
days = 31;
}
return days;
}
// 创建链表
struct Node *createList() {
struct Node *head, *p, *q;
head = p = (struct Node*)malloc(sizeof(struct Node));
head->day = 0; // 第一个节点为1900年1月,第一天是星期天
head->days = 31;
for (int i = 2; i <= 12; i++) {
q = (struct Node*)malloc(sizeof(struct Node));
q->day = (p->day + p->days) % 7; // 计算下个月的第一天是星期几
q->days = initDays(i, 1900); // 计算下个月的天数
p->next = q;
p = q;
}
p->next = head; // 形成循环链表
return head;
}
// 输出某个月份的日历
void printMonth(int month, int year, struct Node *head) {
int days = initDays(month, year); // 当月的天数
int day = 0; // 当月第一天是星期几
struct Node *p = head;
for (int i = 1; i < month; i++) {
p = p->next;
}
day = p->day;
printf("Sun Mon Tue Wed Thu Fri Sat\n");
for (int i = 0; i < day; i++) {
printf(" ");
}
for (int i = 1; i <= days; i++) {
printf("%-4d ", i);
day++;
if (day % 7 == 0) {
printf("\n");
}
}
printf("\n");
}
int main() {
struct Node *head = createList();
int year, month;
printf("请输入年份和月份,格式为yyyy mm:\n");
scanf("%d %d", &year, &month);
printf("%d年%d月的日历如下:\n", year, month);
printMonth(month, year, head);
return 0;
}