1. 项目介绍
1.1 功能
该项目是一个简易的学生管理系统,实现了“添加学生”,“删除学生”,“查询学生基础信息”,“查询学生所选课程”,“学生选课”,“可选课程管理”等功能。
要求:
①学生信息包括 学号,姓名,班级,所选课程 四个信息; 课程包括 课程名,地点,时间 三个信息,要求学生选课只能从已有课程中选且不重复
②将学生信息持久化存储到文件中,要求对原始信息加密处理
③(进阶) 对②中存储信息的文件进行读取和解析,并在控制台打印
④(进阶) 自定义一个异常处理类,能够在 添加学生时输入信息不合法、选课重复 时抛出异常提示用户
1.2 采用的数据结构
学生列表和课程列表都采用的的顺序表结构。
1.3 项目组成
1.3.1 头文件部分
1. Secret.h -> 包含加密解密函数的声明,加密解密算法采用Base64算法,对于该部分我有一篇文章进行过详细介绍利用Base64加密算法将数据加密解密-CSDN博客
2. Stusystem.h -> 包含各种结构体,顺序表,以及函数的声明。
1.3.2 源文件部分
1. CourseControl.c -> 包含与课程管理有关函数的实现。
2. Secret.c -> 包含加密解密函数的实现。
3. Student_course.c -> 包含与学生选课退课。
4. StudentControl.c -> 包含与学生管理有关函数的实现。
1.3.3 资源文件部分
1. Course_tmp.txt -> 用于临时存放未加密的课程信息。
2. CourseInformation.txt -> 用于存放加密后的课程信息。
3. Student_tmp.txt -> 用于临时存放未加密的学生信息。
4. StudentInformation.txt -> 用于存放加密后的学生信息。
并在Secret.h中有如下定义:
#define StuTmp "Student_tmp.txt"
#define StuInfo "StudentInformation.txt"
#define CouTmp "Course_tmp.txt"
#define CouInfo "CourseInformation.txt"
2. 源码
2.1 头文件
2.1.1 Secret.h
#pragma once
#define StuTmp "Student_tmp.txt"
#define StuInfo "StudentInformation.txt"
#define CouTmp "Course_tmp.txt"
#define CouInfo "CourseInformation.txt"
//加密函数
void Into_Base64(const char dest[], const char src[]);//目标文件,源文件
//解密函数
void Out_Base64(const char dest[], const char src[]);//目标文件,源文件
2.1.2 StuSystem.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define ID_MAX 20//学号长度
#define NAME_MAX_STU 20//学生姓名长度
#define CLASS_MAX 5//班级编号长度
#define COURSE_MAX 10//学生最多可选课程数量
#define NAME_MAX_COURSE 20//课程名长度
#define ADDERSS_MAX 20//上课地址长度
#define TIME_MAX 7//某课程的上课时间段数
typedef struct Student//学生
{
char ID[ID_MAX];//学号
char name[NAME_MAX_STU];//姓名
char class[CLASS_MAX];//班级
int size;//已选课程节数
int course[COURSE_MAX];//选课序号
}Stu;
typedef struct SeqListStu//学生花名册
{
Stu* data;
int size;
int capacity;
}Roster;
typedef struct Time//课程时间
{
int week;//1, 2, 3, 4, 5, 6, 7
int begin;//
int end;//
}Time;
typedef struct Course//课程
{
int ID;
char name[NAME_MAX_COURSE];//课程名
char address[ADDERSS_MAX];//上课地址
int frequency;
Time time[TIME_MAX];//时间
}Cou;
typedef struct SeqListCou//课程列表
{
Cou* data;
int size;
int capacity;
}Curriculum;
//初始化花名册
void InitRoster(Roster* ps);
//销毁花名册
void DestroyRoster(Roster* ps);
//检查花名册是否需要扩容
void RosterCapacityCheck(Roster* ps);
//增加学生
void AddStudent(Roster* ps);
//查询学生信息
void StuInfoSearch(Roster* ps);
//删除学生
void DelStudent(Roster* ps);
//查询学生所选课程
void StuCourseSearch(Roster* ps, Curriculum* pc);
//学生选课
void StuSelectCourse(Roster* ps, Curriculum* pc);
//初始化课程列表
void InitCurriculum(Curriculum* ps);
//检查课程列表是否需要扩容
void CurricCapacityCheck(Curriculum* ps);
//销毁课程列表
void DestroyCurriculum(Curriculum* ps);
//可选课程管理
void CourseControl(Curriculum* ps);
//添加课程
void AddCourse(Curriculum* ps);
//查看已有课程
void PrintCourse(Curriculum* ps);
//删除课程
void DelCourse(Curriculum* ps);
2.2 源文件
2.2.1 CourseControl.c
#define _CRT_SECURE_NO_WARNINGS
//管理课程,负责课程的增加,查找,修改等
#include "StuSystem.h"
#include "Secret.h"
void InitCurriculum(Curriculum* ps)
{
assert(ps);
ps->data = NULL;
ps->size = 0;
ps->capacity = 0;
CurricCapacityCheck(ps);
Out_Base64(CouTmp, CouInfo);
FILE* ct = fopen(CouTmp, "r");
if (ct == NULL)
{
perror("InitCurriculum fail:");
exit(-1);
}
int i = 0;
while (fscanf(ct, "%d %s %s %d ", &(ps->data[i].ID), ps->data[i].name, ps->data[i].address, &(ps->data[i].frequency)) != EOF)
{
for (int j = 0; j < ps->data[i].frequency; j++)
{
fscanf(ct, "%d %d %d ", &(ps->data[i].time[j].week), &(ps->data[i].time[j].begin), &(ps->data[i].time[j].end));
}
ps->size++;
CurricCapacityCheck(ps);
i++;
}
fclose(ct);
}
void CurricCapacityCheck(Curriculum* ps)
{
assert(ps);
int newcapacity = ps->capacity == 0? 16 : ps->capacity + 16;
Cou* tmp = (Cou*)realloc(ps->data, sizeof(Cou) * newcapacity);
if (tmp == NULL)
{
perror("realloc fail:\n");
exit(-1);
}
ps->data = tmp;
ps->capacity = newcapacity;
}
void DestroyCurriculum(Curriculum* ps)
{
assert(ps);
FILE* pf = fopen(CouTmp, "w");
if (pf == NULL)
{
perror("DestroyCurriculum:");
exit(-1);
}
int i = 0;
for (i = 0; i < ps->size; i++)
{
fprintf(pf, "%d %s %s %d ", ps->data[i].ID, ps->data[i].name, ps->data[i].address, ps->data[i].frequency);
for (int j = 0; j < ps->data[i].frequency; j++)
{
fprintf(pf, "%d %d %d ", ps->data[i].time[j].week, ps->data[i].time[j].begin, ps->data[i].time[j].end);
}
}
fclose(pf);
Into_Base64(CouInfo, CouTmp);//加密
FILE* pe = fopen(CouTmp, "w");//清空临时文件内容
if (pe == NULL)
{
perror("DestroyCurriculum:");
exit(-1);
}
fclose(pe);
free(ps->data);
ps->size = 0;
ps->capacity = 0;
}
void CouControl_menu()
{
printf("||=============课程管理系统=============||\n");
printf("||------------- 1.添加课程 -------------||\n");
printf("||------------- 2.删除课程 -------------||\n");
printf("||----------- 3.查看已有课程 -----------||\n");
printf("||--------------- 0.返回 ---------------||\n");
}
void CourseControl(Curriculum* ps)
{
assert(ps);
fflush(stdin); system("cls");
int input = 0;
do
{
CouControl_menu();
printf("请选择:>");
fflush(stdin);
scanf("%d", &input);
switch (input)
{
case 1:
AddCourse(ps);
break;
case 2:
DelCourse(ps);
break;
case 3:
PrintCourse(ps);
system("pause"); fflush(stdin); system("cls");
break;
case 0:
printf("即将返回!");
system("pause"); fflush(stdin); system("cls");
break;
default:
printf("输入错误,请重新输入!");
system("pause"); fflush(stdin); system("cls");
break;
}
} while (input);
}
void AddCourse(Curriculum* ps)
{
assert(ps);
printf("请输入课程编号:>");
scanf("%d", &(ps->data[ps->size].ID));
printf("请输入课程名称:>");
scanf("%s", ps->data[ps->size].name);
printf("请输入上课地址:>");
scanf("%s", ps->data[ps->size].address);
printf("请输入一周中该课程的节数:>");
scanf("%d", &(ps->data[ps->size].frequency));
int i = 0;
for (i = 0; i < ps->data[ps->size].frequency; i++)
{
printf("请输入第%d节课在周几:", i + 1);
getchar();
scanf("%d", &(ps->data[ps->size].time[i].week));
printf("第几节开始(可选1到11):>");
scanf("%d", &(ps->data[ps->size].time[i].begin));
printf("第几节结束(可选1到11):>");
scanf("%d", &(ps->data[ps->size].time[i].end));
}
ps->size++;
printf("添加成功!");
system("pause"); fflush(stdin); system("cls");
}
void PrintCourse(Curriculum* ps)
{
assert(ps);
int i = 0;
printf("\n");
printf("%-10s\t%-20s\t%-20s\t%-20s\n", "课程编号", "课程名称", "上课地点", "一周节数");
for (i = 0; i < ps->size; i++)
{
printf("%-10d\t%-20s\t%-20s\t%-5d\n", ps->data[i].ID, ps->data[i].name, ps->data[i].address, ps->data[i].frequency);
for (int j = 0; j < ps->data[i].frequency; j++)
{
printf("第%d节:周%d 第%d节课到第%d节课\n", j + 1, ps->data[i].time[j].week, ps->data[i].time[j].begin, ps->data[i].time[j].end);
}
printf("\n");
}
printf("\n");
}
void DelCourse(Curriculum* ps)
{
assert(ps);
int tmp = 0;
printf("请输入课程编号:>");
scanf("%d", &tmp);
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (tmp == ps->data[i].ID)
{
int input = 0;
printf("\n已找到,课程名称为:%s,确认要删除吗?\n", ps->data[i].name);
printf("输入1即可继续删除,否则继续取消:>");
scanf("%d", &input);
if (input != 1)
{
printf("未确认,已取消!\n");
system("pause"); fflush(stdin); system("cls");
return;
}
//删除课程
for (int j = i; j < ps->size - 1; j++)
{
ps->data[j] = ps->data[j + 1];
}
break;
}
}
if (i == ps->size)
{
printf("没有这个课程!请仔细检查课程编号!\n");
}
printf("删除成功!\n");
ps->size--;
system("pause"); fflush(stdin); system("cls");
}
2.2.2 Secret.c
#define _CRT_SECURE_NO_WARNINGS
//加密解密函数
#include <stdio.h>
#include "Secret.h"
char Base64_Int(char tem)//字符转Base64编码
{
if (tem >= 'A' && tem <= 'Z')
return tem - 'A';
else if (tem >= 'a' && tem <= 'z')
return tem + 26 - 'a';
else if (tem >= '0' && tem <= '9')
return tem + 52 - '0';
else if (tem == '+')
return 62;
else if (tem == '/')
return 63;
}
char Base64_Char(int tem)//Base64编码转字符
{
if (tem >= 0 && tem <= 25)
return tem + 'A';
else if (tem >= 26 && tem <= 51)
return tem + 'a' - 26;
else if (tem >= 52 && tem <= 61)
return tem + '0' - 52;
else if (tem == 62)
return '+';
else if (tem == 63)
return '/';
}
void Into_Char(char* dest, int* src, int flag)//将二进制数转换为char类型//flag==1转换为Base64,flag==0转换为ascll
{
int tem = 0;
int n = 1;
int num = 0;
if (flag)
num = 5;
else
num = 7;
for (int i = num; i >= 0; i--)
{
tem += *(src + i) * n;
n *= 2;
}
if (flag)
*dest = Base64_Char(tem);
else
*dest = tem;
}
void Into_Binary(int* dest, char src, int flag)//将src转换为二进制存到dest中//flag==1将Base64编码转换为二进制,flag==0将ascll转换为二进制
{
int n = 2;
int num = 0;
if (flag)
{
num = 5;
src = Base64_Int(src);
}
else
{
num = 7;
}
for (int i = num; i >= 0; i--)
{
*(dest + i) = src % n;
src /= 2;
}
}
void Into_Base64(const char dest[], const char src[])//加密函数//目标文件,源文件
{
FILE* srcx = fopen(src, "r");
if (srcx == NULL)
{
perror("source:");
return;
}
FILE* destx = fopen(dest, "w");
if (destx == NULL)
{
perror("destination:");
return;
}
int flag = 1;
while (flag)
{
char secret[5] = { 0 };//存储加密后数据
int binary[25] = { 0 };//6和8的最小公倍数为24
char ch = 0;
for (int i = 0; i < 3; i++)
{
ch = getc(srcx);
if (ch == -1)
{
flag = 0;
goto interruption;
}
Into_Binary(binary + i * 8, ch, 0);
}
interruption:
for (int i = 0; i < 4; i++)
{
Into_Char(secret + i, binary + i * 6, 1);
}
fprintf(destx, "%s", secret);
}
fclose(srcx);
fclose(destx);
}
void Out_Base64(const char dest[], const char src[])//解密函数//目标文件,源文件
{
FILE* srcx = fopen(src, "r");
if (srcx == NULL)
{
perror("source:");
return;
}
FILE* destx = fopen(dest, "w");
if (destx == NULL)
{
perror("destination:");
return;
}
int flag = 1;
while (flag)
{
char secret[4] = { 0 };//存储解密后数据//
int binary[25] = { 0 };//6和8的最小公倍数为24
char ch = 0;
for (int i = 0; i < 4; i++)
{
ch = getc(srcx);
if (ch == -1)
{
flag = 0;
goto interruption;
}
Into_Binary(binary + i * 6, ch, 1);
}
interruption:
for (int i = 0; i < 3; i++)
{
Into_Char(secret + i, binary + i * 8, 0);
}
fprintf(destx, "%s", secret);
}
fclose(srcx);
fclose(destx);
}
2.2.3 Student_course.c
#define _CRT_SECURE_NO_WARNINGS
#include "Secret.h"
#include "StuSystem.h"
void StuCourseSearch(Roster* ps, Curriculum* pc)
{
assert(ps&&pc);
char tmp[ID_MAX] = { 0 };
printf("请输入学生学号:>");
scanf("%s", tmp);
int i = 0;
for (i = 0; i < ps->size; i++)//找学生
{
if (strcmp(tmp, ps->data[i].ID) == 0)
{
if (ps->data[i].size == 0)
{
printf("该学生还未选课!\n");
break;
}
printf("%-10s\t%-20s\t%-20s\t%-20s\n", "课程编号", "课程名称", "上课地点", "一周节数");
for (int j = 0; j < ps->data[i].size; j++)//遍历该学生的课
{
int k = 0;
for (k = 0; k < pc->size; k++)//找到改编号对应的课程
{
if (pc->data[k].ID == ps->data[i].course[j])
{
printf("%-10d\t%-20s\t%-20s\t%-5d\n", pc->data[k].ID, pc->data[k].name, pc->data[k].address, pc->data[k].frequency);
for (int x = 0; x < pc->data[k].frequency; x++)
{
printf("第%d节:周%d 第%d节课到第%d节课\n", x + 1, pc->data[k].time[x].week, pc->data[k].time[x].begin, pc->data[k].time[x].end);
}
printf("\n");
}
}
if (k == pc->size)//找不到该课程,将该课程删掉
{
for (int s = j; s < ps->data[i].size - 1; s++)
{
ps->data[i].course[s] = ps->data[i].course[s + 1];
}
ps->data[i].size--;
}
}
break;
}
}
if (i == ps->size)
{
printf("查无此人!请仔细检查学号!\n");
}
system("pause"); fflush(stdin); system("cls");
}
void SelectCou(Roster* ps, Curriculum* pc, int i)
{
assert(ps && pc);
int id = 0;
printf("请输入课程编号:>");
scanf("%d", &id);
int flag1 = 0;//是否存在这门课,0不存在
int flag2 = 0;//是否已选这门课,0未选
for (int j = 0; j < pc->size; j++)
{
if (pc->data[j].ID == id)
{
flag1 = 1;//存在
break;
}
}
for (int j = 0; j < ps->data[i].size; j++)
{
if (ps->data[i].course[j] == id)
{
flag2 = 1;//已选
}
}
if (flag1 == 0)
{
printf("该门课程不存在!\n");
return;
}
if (flag2 == 1)
{
printf("该学生已选这门课!\n");
return;
}
ps->data[i].course[ps->data[i].size] = id;
ps->data[i].size++;
printf("选课成功!\n");
}
void DelSelected(Roster* ps, int i)
{
assert(ps);
int id = 0;
printf("请输入课程编号:>");
scanf("%d", &id);
int flag = 0;//是否存在这门课,0不存在
for (int j = 0; j < ps->data[i].size; j++)
{
if (ps->data[i].course[j] == id)
{
flag = 1;
for (int k = j; k < ps->data[i].size - 1; k++)
{
ps->data[i].course[k] = ps->data[i].course[k + 1];
}
ps->data[i].size--;
break;
}
}
if (flag == 0)
{
printf("该学生未选该门课或该门课不存在!\n");
return;
}
printf("删除成功!\n");
}
void StuSelectCourse(Roster* ps, Curriculum* pc)
{
assert(ps && pc);
fflush(stdin); system("cls");
char tmp[ID_MAX] = { 0 };
printf("请输入学生学号:>");
scanf("%s", tmp);
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (strcmp(tmp, ps->data[i].ID) == 0)
{
int input = 0;
PrintCourse(pc);
printf("该学生已选择编号为:");
for (int j = 0; j < ps->data[i].size; j++)
{
printf("%d ", ps->data[i].course[j]);
}
printf("的课程.\n");
do
{
printf("输入1继续选课, 输入2退课, 输入0返回:>");
scanf("%d", &input);
switch (input)
{
case 1:
if (ps->data[i].size == COURSE_MAX)
{
printf("学生选课已达上限,无法继续选课!\n");
break;
}
else
{
SelectCou(ps, pc, i);
break;
}
case 2:
if (ps->data[i].size == 0)
{
printf("该学生还未选课!\n");
break;
}
else
{
DelSelected(ps, i);
break;
}
case 0:
printf("即将返回!\n");
system("pause"); fflush(stdin); system("cls");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
break;
}
}
if (i == ps->size)
{
printf("查无此人!请仔细检查学号!\n");
}
}
2.2.4 StudentControl.c
#define _CRT_SECURE_NO_WARNINGS
//学生管理系统
#include "StuSystem.h"
#include "Secret.h"
void InitRoster(Roster* ps)
{
assert(ps);
ps->data = NULL;
ps->size = 0;
ps->capacity = 0;
RosterCapacityCheck(ps);
Out_Base64(StuTmp, StuInfo);
FILE* st = fopen(StuTmp, "r");
if (st == NULL)
{
perror("InitRoster fail:");
exit(-1);
}
int i = 0;
while (fscanf(st, "%s %s %s %d ", ps->data[i].ID, ps->data[i].name, ps->data[i].class, &(ps->data[i].size)) != EOF)
{
for (int j = 0; j < ps->data[i].size; j++)
{
fscanf(st, "%d ", &(ps->data[i].course[j]));
}
ps->size++;
RosterCapacityCheck(ps);
i++;
}
fclose(st);
}
void DestroyRoster(Roster* ps)
{
assert(ps);
FILE* pf = fopen(StuTmp, "w");
if (pf == NULL)
{
perror("DestroyRoster:");
exit(-1);
}
int i = 0;
for (i = 0; i < ps->size; i++)
{
fprintf(pf, "%s %s %s %d ", ps->data[i].ID, ps->data[i].name, ps->data[i].class, ps->data[i].size);
for (int j = 0; j < ps->data[i].size; j++)
{
fprintf(pf, "%d ", ps->data[i].course[j]);
}
}
fclose(pf);
Into_Base64(StuInfo, StuTmp);//加密
FILE* pe = fopen(StuTmp, "w");//清空临时文件内容
if (pe == NULL)
{
perror("DestroyRoster:");
exit(-1);
}
fclose(pe);
free(ps->data);
ps->size = 0;
ps->capacity = 0;
}
void RosterCapacityCheck(Roster* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
int newcapacity = ps->capacity == 0? 24 : ps->capacity + 24;
Stu* tmp = (Stu*)realloc(ps->data, sizeof(Stu) * newcapacity);
if (tmp == NULL)
{
perror("realloc fail:\n");
exit(-1);
}
ps->data = tmp;
ps->capacity = newcapacity;
}
}
void AddStudent(Roster* ps)
{
assert(ps);
RosterCapacityCheck(ps);
printf("请输入学生学号:>");
scanf("%s", ps->data[ps->size].ID);
printf("请输入学生姓名:>");
scanf("%s", ps->data[ps->size].name);
printf("请输入学生班级:>");
scanf("%s", ps->data[ps->size].class);
ps->data[ps->size].size = 0;
printf("学生添加成功!\n");
ps->size++;
system("pause"); fflush(stdin); system("cls");
}
void PrintRoster(Roster* ps)
{
assert(ps);
int i = 0;
printf("%-20s\t%-20s\t%-5s\n", "学号", "姓名", "班级");
for (i = 0; i < ps->size; i++)
{
printf("%-20s\t%-20s\t%-5s\n", ps->data[i].ID, ps->data[i].name, ps->data[i].class);
}
system("pause"); fflush(stdin); system("cls");
}
void SearchDesignatedStudent(Roster* ps)
{
assert(ps);
char tmp[ID_MAX] = { 0 };
printf("请输入学生学号:>");
scanf("%s", tmp);
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (strcmp(tmp, ps->data[i].ID) == 0)
{
printf("学号:%s\n姓名:%s\n班级:%s\n", ps->data[i].ID, ps->data[i].name, ps->data[i].class);
//打印所选课程
//PrintCurriculum(ps);
break;
}
}
if (i == ps->size)
{
printf("查无此人!请仔细检查学号!\n");
}
system("pause"); fflush(stdin); system("cls");
}
void StuControl_menu()
{
printf("||=============学生查询系统=============||\n");
printf("||----------- 1.查询学生列表 -----------||\n");
printf("||----------- 2.查找单个学生 -----------||\n");
printf("||--------------- 0.返回 ---------------||\n");
}
void StuInfoSearch(Roster* ps)
{
assert(ps);
fflush(stdin); system("cls");
int input = 0;
do
{
StuControl_menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
PrintRoster(ps);
break;
case 2:
SearchDesignatedStudent(ps);
break;
case 0:
printf("即将返回!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
system("pause"); fflush(stdin); system("cls");
}
void DelStudent(Roster* ps)
{
assert(ps);
char tmp[ID_MAX] = { 0 };
printf("请输入学生学号:>");
scanf("%s", tmp);
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (strcmp(tmp, ps->data[i].ID) == 0)
{
for (int j = i; j < ps->size - 1; j++)
{
ps->data[j] = ps->data[j + 1];
}
break;
}
}
if (i == ps->size)
{
printf("查无此人!请仔细检查学号!\n");
}
printf("删除成功!\n");
ps->size--;
system("pause"); fflush(stdin); system("cls");
}
2.2.5 test.c
#define _CRT_SECURE_NO_WARNINGS
#include "StuSystem.h"
void menu()
{
printf("||=============学生管理系统=============||\n");
printf("||------------- 1.添加学生 -------------||\n");
printf("||------------- 2.删除学生 -------------||\n");
printf("||--------- 3.查询学生基础信息 ---------||\n");
printf("||--------- 4.查询学生所选课程 ---------||\n");
printf("||------------- 5.学生选课 -------------||\n");//包括查看可选课程
printf("||----------- 6.可选课程管理 -----------||\n");//包括查看可选课程
printf("||--------------- 0.退出 ---------------||\n");
}
int main()
{
int input = 0;
Roster roster;
InitRoster(&roster);
Curriculum course;
InitCurriculum(&course);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
AddStudent(&roster);
break;
case 2:
DelStudent(&roster);
break;
case 3:
StuInfoSearch(&roster);
break;
case 4:
StuCourseSearch(&roster, &course);
break;
case 5:
StuSelectCourse(&roster, &course);
break;
case 6:
CourseControl(&course);
break;
case 0:
DestroyRoster(&roster);
DestroyCurriculum(&course);
printf("已退出学生管理系统!\n");
break;
default:
printf("选择错误,请重新输入!\n");
system("pause"); fflush(stdin); system("cls");
break;
}
} while (input);
return 0;
}
3. 总结
这是迄今为止,第一个由我自己独立完成的项目,没有借鉴过相关的文章或视频。
项目中依然存在许多问题,例如缺少对学生或课程信息输入合法性的检查……
对学生和课程的查找功能本应该单独封装为函数的,但是我在写了好几个涉及该功能的函数之后才意识到这个问题,实在懒得大改了,于是将错就错,反正这个功能写起来也并不麻烦。
算上头文件总计920行代码,最有成就感的一集。