2401_87316163 2024-12-24 00:10 采纳率: 0%
浏览 6

为什么这个程序运行不会输出对应周日程?ai修改了也不行

img


怎么弄都不能输出周日程,目的是实现日程表的功能,输入第几周,显示这周的日程表,并选择修改课程,节假日没有课程,但无论怎么改都不能显示,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);}

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-12-24 08:36
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述中提到无法输出周日程,可能是因为在list_schedule函数中没有对应的代码来输出该周的日程表。另外,也需要确认是否在schedule.txt中包含了周日程的内容。 在list_schedule函数中,需要添加代码来输出指定周数的日程表。可以通过遍历Schedule结构体中的courses数组,并根据输入的week_to_display和课程的day来筛选出符合条件的课程进行输出。 以下是在list_schedule函数中添加的代码示例:
    void list_schedule(Schedule *schedule, Holiday *holiday, int week_to_display) {
        for (int i = 0; i < schedule->course_count; i++) {
            Course course = schedule->courses[i];
            
            // 检查当前课程是否在该周上课
            if (strcmp(course.day, "周日") == 0) {
                // 如果这门课在周日上课,则输出
                printf("第%d周 周日 上课: %s, 地点: %s, 节次: %d\n", week_to_display, course.name, course.location, course.period);
            }
        }
    }
    

    在修改以上代码后,再次运行程序,输入想要查看的周数,即可输出显示周日程的日程表。

    评论

报告相同问题?

问题事件

  • 修改了问题 12月24日
  • 创建了问题 12月24日