代写C语言、C++、Java、Python、HTML、JavaScript、vue、MySQL相关编程作业,
长期接单,信誉有保证,标价10-20每份,如有需要请加文章最下方QQ。
本文资源:https://download.csdn.net/download/weixin_47040861/88971027
1.题目要求
题目描述:
假定有n门课程,每门课程有课程编号,课程名称,课程性质(必须/选修),学时,授课学时,实验或上机学时,学分等信息,学生按要求(总学分不得少于15,其中必修课不得低于10分)自由选课。试设计一个简单选修课程系统。
功能要求:
(1) 输入功能:可以完成若干条课程信息记录的输入
(2) 显示功能:完成全部记录的显示。
(3) 插入功能:插入添加一条或多条记录
(4) 查找功能:按课程编号查找并显示。
(5) 删除功能:按课程编号号进行删除。
(6) 修改功能:按课程编号进行修改。
(7) 排序功能:实现学分进行排序。
(8) 选课功能:按照要求实现选课功能并能随时查阅显示。
扩展功能:
(1) 增加统计功能。比如按照课程性质分别统计总学分等。
(2) 试题记录信息从文件读入。
(3) 将试题记录信息保存到文件中。
2.视频演示
【C语言期末/课程设计】课程管理系统(vs2022项目)
3.项目介绍
结构体和变量:
// 定义常量表示结构体数组长度
#define ARRAY_LENGTH 20
// 定义课程结构体
struct Course {
int courseNumber; // 课程编号
char courseName[50]; // 课程名称
char courseNature[10]; // 课程性质(必修/选修)
int totalHours; // 总学时
int lectureHours; // 授课学时
int labHours; // 实验或上机学时
float credits; // 学分
};
// 声明结构体数组
struct Course courses[ARRAY_LENGTH] = { 0 };
int len = 0;//声明长度
// 声明选课数组
int course_selection[ARRAY_LENGTH];
主函数:
首先调用get()函数获取目录下"Course.csv"文件中的数据,然后打印菜单,根据输入的操作编号调用对应的功能函数,每次执行完成操作后调用set()函数保存结构体数组中的数据到本地的"Course.csv"文件中。
int main() {
int choice=0;
get();
do {
// 显示菜单
displayMenu();
// 获取用户选择
printf("请选择操作(输入对应的数字): ");
scanf_s("%d", &choice);
// 根据用户选择执行相应的操作
switch (choice) {
case 1:add();break;
case 2:show();break;
case 3:insert();break;
case 4:find();break;
case 5:delCourse();break;
case 6:change();break;
case 7:sort(); break;
case 8:selection(); break;
case 0:; break;
default:
// 处理无效的选择
printf("无效的选择,请重新输入。\n");
}
system("pause");
set();
} while (choice != 0);
return 0;
}
1.添加 add()
- 提示用户输入要添加的课程数量。
- 使用
scanf_s
函数获取用户输入的数量。 - 使用
for
循环迭代添加课程信息: a. 提示用户输入第几门课程的信息。 b. 获取课程编号,并进行唯一性验证,如果输入的编号已存在,则提示用户重新输入直到输入一个唯一的编号。 c. 获取课程名称。 d. 验证课程性质是否为"必修"或"选修",如果不是则提示用户重新输入直到输入正确的性质。 e. 获取总学时、授课学时、实验或上机学时以及学分。 - 循环结束后更新课程数组的长度。
- 打印添加成功的课程数量。
2.显示 show()
- 首先检查课程数组的长度是否为零,如果为零,则打印提示信息 "没有课程信息可显示。" 并返回,不进行后续操作。
- 如果课程数组不为空,则打印表头,包括课程编号、课程名称、课程性质、总学时、授课学时、实验学时和学分。
- 打印分隔线,用于区分表头和课程信息。
- 使用循环遍历课程数组,依次打印每门课程的信息,包括课程编号、课程名称、课程性质、总学时、授课学时、实验学时和学分。
- 循环结束后再次打印分隔线,用于结尾。
3.插入 insert()
- 提示用户输入要插入的数量。
- 提示用户输入要插入的课程编号。
- 查找课程编号为输入值的课程位置。
- 如果找不到对应的课程编号,则输出提示信息并返回。
- 检查要插入的数量是否大于结构体数组剩余长度,如果是则输出提示信息并返回。
- 向后移动元素,为新数据腾出空间。
- 循环输入新数据.
- 更新课程数组的长度。
- 输出插入成功的信息。
4.查询 find()
- 提示用户输入要查询的课程编号。
- 使用
scanf_s
函数获取用户输入的课程编号。 - 遍历课程结构体数组: a. 如果找到与用户输入的课程编号匹配的课程,则打印该课程的详细信息,并返回函数。 b. 如果未找到匹配的课程编号,则打印提示信息表示未找到该课程。
5.删除 delCourse()
- 提示用户输入要删除的课程编号。
- 使用
scanf_s
函数获取用户输入的课程编号。 - 遍历课程结构体数组: a. 如果找到与用户输入的课程编号匹配的课程,则记录该课程的索引位置,并跳出循环。 b. 如果未找到匹配的课程编号,则打印提示信息表示未找到该课程,并结束函数。
- 从找到的索引位置开始,将数组中后续的元素向前移动一个位置,覆盖当前位置的元素,实现删除操作。
- 更新课程数组的长度。
- 打印删除成功的提示信息。
6.修改 change()
- 提示用户输入要修改的课程编号。
- 使用
scanf_s
函数获取用户输入的课程编号。 - 遍历课程结构体数组: a. 如果找到与用户输入的课程编号匹配的课程,则记录该课程的索引位置,并跳出循环。 b. 如果未找到匹配的课程编号,则打印提示信息表示未找到该课程,并结束函数。
- 提示用户选择要修改的内容,包括课程名称、课程性质、总学时、授课学时、实验或上机学时、学分。
- 根据用户输入的操作编号执行相应的修改操作: a. 如果是修改课程名称,则提示用户输入新的课程名称。 b. 如果是修改课程性质,则验证用户输入的性质是否为"必修"或"选修",如果不是则要求重新输入。 c. 如果是修改总学时、授课学时、实验或上机学时、学分,则分别提示用户输入新的值。
- 执行完相应的修改操作后,打印修改成功的提示信息。
7.排序 sort()
- 使用冒泡排序算法,通过比较课程的学分大小来进行排序。
- 外层循环控制排序的轮数,从第一个元素到倒数第二个元素。
- 内层循环在每一轮中比较相邻的两个课程的学分大小,如果前一个课程的学分小于后一个课程的学分,则交换它们的位置。
- 在交换位置的同时,也更新了一个名为
course_selection
的数组,以保持与课程信息数组的对应关系。 - 排序完成后,调用
show()
函数打印排序后的课程信息。 - 最后打印排序完成的提示信息。
8.选课 selection()
- 提示用户选择操作,选课或查询选课结果。
- 使用
scanf_s
函数获取用户选择的操作编号,并清除缓冲区中的换行符。 - 根据用户的选择执行相应的操作:
- 如果选择选课功能(操作编号为1):
- 清空
course_selection
数组,准备重新选择课程。 - 提示用户输入所选课程名称,以空格分隔。
- 使用
fgets
函数获取用户输入的课程名称,并将换行符替换为空字符。 - 使用
strtok_s
函数分割用户输入的课程名称,遍历课程结构体数组,查找课程名对应的编号,并将对应位置的course_selection
数组标记为1,表示选中该课程。 - 统计所选课程的总学分、必修课程的总学分和选修课程的总学分。
- 判断是否满足选课条件(总学分大于15且必修课程的总学分大于10),如果满足则打印选课成功的提示信息,否则打印选课失败的提示信息。
- 打印选课结果和统计分数。
- 清空
- 如果选择查询选课结果功能(操作编号为2):
- 打印已选课程的信息。
- 如果选择选课功能(操作编号为1):
- 如果用户输入的操作编号既不是1也不是2,则打印无效选择的提示信息。
↓如有任何问题,请加下方QQ↓