教学编制问题代码c语言,实现了根据每学期所修学分上限,要求课程尽可能集中在前 几个学期上完的编排策略
时间: 2024-03-05 18:50:40 浏览: 61
教学计划编制问题.zip
5星 · 资源好评率100%
以下是一个可能的C语言实现,实现了根据每学期所修学分上限,要求课程尽可能集中在前几个学期上完的编排策略:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_COURSES 100 // 最大课程数
#define MAX_SEMESTERS 10 // 最大学期数
// 定义课程信息结构体
typedef struct {
char id[4]; // 课程号
char name[50]; // 课程名
char type[10]; // 课程类型(通识课、专业课)
int credit; // 学分
char pre_id[4]; // 先修课程号
} Course;
// 定义学期信息结构体
typedef struct {
int id; // 学期编号
int credit_limit; // 学分上限
int credit_taken; // 已修学分
int num_courses; // 可选课程数
Course* courses[MAX_COURSES]; // 可选课程列表
} Semester;
// 读取文件中课程信息
void load_courses(char* filename, Course* courses, int* num_courses) {
FILE* fp;
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Cannot open file %s.\n", filename);
exit(1);
}
*num_courses = 0;
while (fscanf(fp, "%s%s%s%d%s", courses[*num_courses].id, courses[*num_courses].name,
courses[*num_courses].type, &courses[*num_courses].credit, courses[*num_courses].pre_id) != EOF) {
(*num_courses)++;
}
fclose(fp);
}
// 根据学分从大到小排序课程
void sort_courses(Course* courses, int num_courses) {
int i, j;
Course temp;
for (i = 0; i < num_courses - 1; i++) {
for (j = i + 1; j < num_courses; j++) {
if (courses[i].credit < courses[j].credit) {
temp = courses[i];
courses[i] = courses[j];
courses[j] = temp;
}
}
}
}
// 分配学期信息
void assign_semesters(int num_semesters, int credit_limit, Semester* semesters) {
int i;
for (i = 0; i < num_semesters; i++) {
semesters[i].id = i + 1;
semesters[i].credit_limit = credit_limit;
semesters[i].credit_taken = 0;
semesters[i].num_courses = 0;
}
}
// 根据每学期所修学分上限,集中排课
void pack_courses(int num_courses, Course* courses, int num_semesters, Semester* semesters) {
int i, j;
for (i = 0; i < num_courses; i++) {
for (j = 0; j < num_semesters; j++) {
if (semesters[j].credit_taken + courses[i].credit <= semesters[j].credit_limit) {
semesters[j].courses[semesters[j].num_courses] = &courses[i];
semesters[j].num_courses++;
semesters[j].credit_taken += courses[i].credit;
break;
}
}
}
}
// 输出学期课程安排
void print_schedule(int num_semesters, Semester* semesters) {
int i, j;
printf("Semester\tCourses\n");
for (i = 0; i < num_semesters; i++) {
printf("%d\t\t", semesters[i].id);
for (j = 0; j < semesters[i].num_courses; j++) {
printf("%s ", semesters[i].courses[j]->id);
}
printf("\n");
}
}
int main() {
Course courses[MAX_COURSES];
int num_courses;
load_courses("courses.txt", courses, &num_courses);
sort_courses(courses, num_courses);
int num_semesters = 8;
int credit_limit = 16;
Semester semesters[MAX_SEMESTERS];
assign_semesters(num_semesters, credit_limit, semesters);
pack_courses(num_courses, courses, num_semesters, semesters);
print_schedule(num_semesters, semesters);
return 0;
}
```
上述代码中,load_courses函数用于从文件中读取课程信息,并将其存储在Course结构体数组中;sort_courses函数用于根据学分从大到小排序课程;assign_semesters函数用于分配学期信息,并初始化学期信息结构体;pack_courses函数根据每学期所修学分上限,将课程集中排在前几个学期上完;print_schedule函数用于输出学期课程安排。主函数中,先调用load_courses函数和sort_courses函数,然后根据编排策略调用assign_semesters函数和pack_courses函数,最后调用print_schedule函数输出学期课程安排。
阅读全文