#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>//输入输出函数
#include <stdlib.h>//标准库函数
#define MAX_COURSES 100//设置最大课程数量
#define MAX_STUDENTS 100//设置最大学生数量
// 课程结构体
typedef struct {
int id;
char name[50];
char nature[20];
int total_hours;
int teaching_hours;
int experiment_hours;
int credits;
int semester;//仅支持输入数字,例如“1”代表“第一学期”
int selected_count;//选择该课程人数
} Course;
// 学生结构体
typedef struct {
int id;
char name[50];
int selected_courses[MAX_COURSES];// 已选课程的编号列表,可存储一百个课程编号
int course_count;// 已选课程数量
int total_credits;// 已选课程总学分
} Student;
//计数器存储所有课程与学生数据
Course courses[MAX_COURSES];//存储所有课程的数组
int course_count = 0;//初始化课程数
Student students[MAX_STUDENTS];// 存储所有学生的数组
int student_count = 0;//初始化学生总数
// 菜单显示
void menu() {
printf("\n学生选修课程系统\n");
printf("1. 录入课程信息\n");
printf("2. 录入学生信息\n");
printf("3. 浏览课程信息\n");
printf("4. 按课程性质查询课程\n");
printf("5. 按学分查询课程\n");
printf("6. 按课程编号查询课程\n");
printf("7. 查看某门课程学生选修情况\n");
printf("8. 退出\n");
printf("请输入你的选择: ");
}
// 录入课程信息
void input_course_info() {
if (course_count >= MAX_COURSES) {
printf("课程数量已达到上限!\n");
return;
}
Course new_course;
char temp[9];
int valid;
do {
printf("请输入8位课程编号: ");
scanf("%8s", temp); // 限制输入8字符
// 验证数字格式
valid = 1;
for (int i = 0; i < 8; i++) {
if (!isdigit(temp[i])) {
printf("输入编号不足8位或包含非数字字符!\n");
valid = 0;
break;
}
}
if (valid) new_course.id = atoi(temp);
} while (!valid);
int id = new_course.id;
printf("你输入的有效的课程编号是: %d\n", id);
scanf("%*[^\n]");// 读取除换行符之外的所有字符
printf("请输入课程名称: ");
scanf("%s", new_course.name);
printf("请输入课程性质(必修课、选修课): ");
scanf("%s", new_course.nature);
do {
printf("请输入总学时: ");
scanf("%d", &new_course.total_hours);
printf("请输入授课学时: ");
scanf("%d", &new_course.teaching_hours);
printf("请输入上机学时: ");
scanf("%d", &new_course.experiment_hours);
if (new_course.teaching_hours + new_course.experiment_hours != new_course.total_hours) {
printf("授课学时与上机学时之和不等于总学时,请重新输入!\n");
}
} while (new_course.teaching_hours + new_course.experiment_hours != new_course.total_hours);
printf("请输入学分: ");
scanf("%d", &new_course.credits);
printf("请输入开课学期: ");
scanf("%d", &new_course.semester);//仅支持输入数字,例如“1”代表“第一学期”
new_course.selected_count = 0;
courses[course_count++] = new_course;//存入数组后,更新自增
printf("课程信息录入成功!\n");
}
// 录入学生信息
void input_student_info() {
if (student_count >= MAX_STUDENTS) {
printf("学生数量已达到上限!\n");
return;
}
Student new_student;
printf("请输入学生编号: ");
scanf("%d", &new_student.id);
printf("请输入学生姓名: ");
scanf("%s", new_student.name);
new_student.course_count = 0;
new_student.total_credits = 0;
int choice;
do {
printf("请选择课程编号(输入 0 结束选课): ");
scanf("%d", &choice);
if (choice == 0) break;
int found = 0;
for (int i = 0; i < course_count; i++) {
if (courses[i].id == choice) {
found = 1;
// 检查是否重复选课
int is_duplicate = 0;
for (int j = 0; j < new_student.course_count; j++) {
if (new_student.selected_courses[j] == choice) {
is_duplicate = 1;
printf("该课程已选,请重新选择!\n");
break;
}
}
if (!is_duplicate) {
new_student.selected_courses[new_student.course_count++] = choice;
new_student.total_credits += courses[i].credits;
courses[i].selected_count++;
}
break;
}
}
if (found==0) {
printf("未找到该课程编号,请重新输入!\n");
}
} while (1);//保持真,无限循环
if (new_student.total_credits < 30) {
printf("选课总学分少于 30,请继续选课!\n");
return;
}
students[student_count++] = new_student;
printf("学生信息录入成功!\n");
}
// 浏览课程信息
void browse_course_info() {
printf("\n课程信息如下:\n");
printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n",
"编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数");
for (int i = 0; i < course_count; i++) {
printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n",
courses[i].id, courses[i].name, courses[i].nature,
courses[i].total_hours, courses[i].teaching_hours,
courses[i].experiment_hours, courses[i].credits,
courses[i].semester, courses[i].selected_count);
}
}
// 按课程性质查询课程
void query_by_nature() {
char nature[20];
printf("请输入课程性质(必修课、选修课): ");
scanf("%s", nature);
printf("\n符合条件的课程信息如下:\n");
printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n",
"编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数");
for (int i = 0; i < course_count; i++) {
if (strcmp(courses[i].nature, nature) == 0) {//判断性质是否一致
printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n",
courses[i].id, courses[i].name, courses[i].nature,
courses[i].total_hours, courses[i].teaching_hours,
courses[i].experiment_hours, courses[i].credits,
courses[i].semester, courses[i].selected_count);
}
}
}
// 按学分查询课程
void query_by_credits() {
int credits;
printf("请输入学分: ");
scanf("%d", &credits);
printf("\n符合条件的课程信息如下:\n");
printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n",
"编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数");
for (int i = 0; i < course_count; i++) {
if (courses[i].credits == credits) {//判断学分是否一致
printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n",
courses[i].id, courses[i].name, courses[i].nature,
courses[i].total_hours, courses[i].teaching_hours,
courses[i].experiment_hours, courses[i].credits,
courses[i].semester, courses[i].selected_count);
}
}
}
// 按课程编号查询课程
void query_by_id() {
int id;
printf("请输入课程编号: ");
scanf("%d", &id);
for (int i = 0; i < course_count; i++) {
if (courses[i].id == id) {
printf("\n符合条件的课程信息如下:\n");
printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n",
"编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数");
printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n",
courses[i].id, courses[i].name, courses[i].nature,
courses[i].total_hours, courses[i].teaching_hours,
courses[i].experiment_hours, courses[i].credits,
courses[i].semester, courses[i].selected_count);
return;
}
}
printf("未找到该课程编号!\n");
}
// 查看某门课程学生选修情况
void view_course_selection() {
int id;
printf("请输入课程编号: ");
scanf("%d", &id);
int found = 0;
for (int i = 0; i < course_count; i++) {
if (courses[i].id == id) {
found = 1;
printf("课程 %s 的选修学生信息如下:\n", courses[i].name);
printf("%-12s %-15s\n", "学生编号", "学生姓名");
for (int j = 0; j < student_count; j++) {//遍历学生数组
for (int k = 0; k < students[j].course_count; k++) {//遍历该学生选课数组
if (students[j].selected_courses[k] == id) {
printf("%-12d %-15s\n", students[j].id, students[j].name);
break;
}
}
}
break;
}
}
if (found==0) {
printf("未找到该课程编号!\n");
}
}
//主函数main
int main() {
int choice;
do {
menu();//显示菜单
scanf("%d", &choice);
switch (choice) {//根据选择执行对应函数
case 1:
input_course_info();
break;
case 2:
input_student_info();
break;
case 3:
browse_course_info();
break;
case 4:
query_by_nature();
break;
case 5:
query_by_credits();
break;
case 6:
query_by_id();
break;
case 7:
view_course_selection();
break;
case 8:
printf("退出系统!\n");
break;
default:
printf("无效的选择,请重新输入!\n");
}
} while (choice != 8);
return 0;
}学生第一次选课
最新发布