
怎么弄都不能输出周日程,目的是实现日程表的功能,输入第几周,显示这周的日程表,并选择修改课程,节假日没有课程,但无论怎么改都不能显示,ai修改也做不到输出想要的结果
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#define MAX_COURSES 50#define MAX_HOLIDAYS 50#define MAX_NAME_LENGTH 50#define FILENAME_SCHEDULE "E:/schedule.txt"#define FILENAME_HOLIDAY "E:/holiday.txt"typedef struct { char name[MAX_NAME_LENGTH]; // 课程名称 char location[MAX_NAME_LENGTH]; // 上课地点 char day[10]; // 上课星期几(如 "周一") int period; // 第几节课} Course;typedef struct { Course courses[MAX_COURSES]; int course_count; // 课程数量} Schedule;typedef struct { char holidays[MAX_HOLIDAYS][11]; // 假期日期 (YYYY-MM-DD) int holiday_count; // 假期数量} Holiday;// 函数声明void load_schedule(Schedule *schedule);void load_holidays(Holiday *holiday);void list_schedule(Schedule *schedule, Holiday *holiday, int week_to_display);void list_current_time_schedule(Schedule *schedule, Holiday *holiday);void modify_schedule(Schedule *schedule);void save_schedule(Schedule *schedule);int is_holiday(const char* date, Holiday* holiday);int main() { Schedule schedule; Holiday holiday; // 加载课程安排 load_schedule(&schedule); // 加载假期安排 load_holidays(&holiday); int week_to_display; printf("请输入要查看的周数 (1-%d):", 18); // 假定总共18周 scanf("%d", &week_to_display); if (week_to_display < 1 || week_to_display > 18) { printf("无效的周数!请确保输入在范围内 (1-18).\n"); return 1; } // 列出指定周的课程安排 list_schedule(&schedule, &holiday, week_to_display); // 列出当前时间的日程 list_current_time_schedule(&schedule, &holiday); // 修改日程 modify_schedule(&schedule); // 保存日程 save_schedule(&schedule); return 0;}void load_schedule(Schedule *schedule) { FILE *file = fopen(FILENAME_SCHEDULE, "r"); if (!file) { printf("无法打开课程文件: %s\n", FILENAME_SCHEDULE); return; } schedule->course_count = 0; while (fscanf(file, "%s %s %s %d", schedule->courses[schedule->course_count].name, schedule->courses[schedule->course_count].location, schedule->courses[schedule->course_count].day, &schedule->courses[schedule->course_count].period) != EOF) { printf("加载课程: %s, 地点: %s, 星期: %s, 节次: %d\n", schedule->courses[schedule->course_count].name, schedule->courses[schedule->course_count].location, schedule->courses[schedule->course_count].day, schedule->courses[schedule->course_count].period); schedule->course_count++; if (schedule->course_count >= MAX_COURSES) { break; } } printf("总共加载课程数: %d\n", schedule->course_count); fclose(file);}void load_holidays(Holiday *holiday) { FILE *file = fopen(FILENAME_HOLIDAY, "r"); if (!file) { printf("无法打开假期文件: %s\n", FILENAME_HOLIDAY); return; } holiday->holiday_count = 0; while (fscanf(file, "%s", holiday->holidays[holiday->holiday_count]) != EOF) { printf("加载假期: %s\n", holiday->holidays[holiday->holiday_count]); holiday->holiday_count++; if (holiday->holiday_count >= MAX_HOLIDAYS) { break; } } printf("总共加载假期数: %d\n", holiday->holiday_count); fclose(file);}void list_schedule(Schedule *schedule, Holiday *holiday, int week_to_display) { printf("\n第 %d 周 课程安排:\n", week_to_display); // 假定学期从2024年9月2日周一开始 struct tm start_time = {0}; start_time.tm_year = 2024 - 1900; // 年份 start_time.tm_mon = 8; // 月份(9月是8,因为0开始) start_time.tm_mday = 2; // 日 // 遍历周内的课程 for (int day_of_week = 0; day_of_week < 5; day_of_week++) { // 从0到4表示:周一到周五 char day_name[10]; sprintf(day_name, "周%d", day_of_week + 1); for (int i = 0; i < schedule->course_count; i++) { if (strcmp(schedule->courses[i].day, day_name) == 0) { // 计算该课程的日期 struct tm target_time = start_time; target_time.tm_mday += (week_to_display - 1) * 7 + (day_of_week + 1); // 根据周和日计算 // 将时间标准化,并转换为字符串 mktime(&target_time); // 标准化时间结构体 char course_date[11]; sprintf(course_date, "%04d-%02d-%02d", target_time.tm_year + 1900, target_time.tm_mon + 1, target_time.tm_mday); // 检查假期并输出 if (!is_holiday(course_date, holiday)) { printf(" 日期: %s, 课程: %s, 地点: %s, 节次: %d\n", course_date, schedule->courses[i].name, schedule->courses[i].location, schedule->courses[i].period); } else { printf(" 日期: %s 是假期,未安排课程。\n", course_date); } } } }}int is_holiday(const char* date, Holiday* holiday) { for (int i = 0; i < holiday->holiday_count; i++) { if (strcmp(date, holiday->holidays[i]) == 0) { return 1; // 是假期 } } return 0; // 不是假期}void list_current_time_schedule(Schedule *schedule, Holiday *holiday) { time_t now = time(NULL); struct tm *tm_now = localtime(&now); char current_date[11]; // YYYY-MM-DD char current_day[10]; sprintf(current_date, "%04d-%02d-%02d", tm_now->tm_year + 1900, tm_now->tm_mon + 1, tm_now->tm_mday); // 获取星期几(tm_wday 返回值 0=周日, 1=周一) sprintf(current_day, "周%d", (tm_now->tm_wday + 6) % 7 + 1); // 转换为周一到周五 printf("\n当前时间的课程安排:\n"); for (int i = 0; i < schedule->course_count; i++) { if (strcmp(schedule->courses[i].day, current_day) == 0 && !is_holiday(current_date, holiday)) { printf("课程: %s, 地点: %s, 星期: %s, 节次: %d\n", schedule->courses[i].name, schedule->courses[i].location, schedule->courses[i].day, schedule->courses[i].period); } }}void modify_schedule(Schedule *schedule) { char course_name[MAX_NAME_LENGTH]; printf("请输入修改的课程名称: "); scanf("%s", course_name); for (int i = 0; i < schedule->course_count; i++) { if (strcmp(schedule->courses[i].name, course_name) == 0) { printf("当前详情: 地点: %s, 星期: %s, 节次: %d\n", schedule->courses[i].location, schedule->courses[i].day, schedule->courses[i].period); printf("请输入新地点: "); scanf("%s", schedule->courses[i].location); printf("请输入新星期: "); scanf("%s", schedule->courses[i].day); printf("请输入新节次: "); scanf("%d", &schedule->courses[i].period); return; } } printf("未找到该课程。\n");}void save_schedule(Schedule *schedule) { FILE *file = fopen(FILENAME_SCHEDULE, "w"); if (!file) { printf("无法打开课程文件以写入: %s\n", FILENAME_SCHEDULE); return; } for (int i = 0; i < schedule->course_count; i++) { fprintf(file, "%s %s %s %d\n", schedule->courses[i].name, schedule->courses[i].location, schedule->courses[i].day, schedule->courses[i].period); } fclose(file);}