一、主要内容
【数据文件】
1.课程信息数据文件。每门课程的信息包含:课程编号,课程名称,理论课时、实验课时、学分、开课学期(8个学期)、课程性质(分为必修、选修、限选等类别)、课程介绍等信息;
2.学生数据文件。该文件中包括学生的信息,每个学生信息包含:学号、姓名、年级(如2024届),密码,权限级别(区别系统管理员和普通学生)等信息;
3.设计的扩展功能对应的其他数据文件。
【系统实现功能】要求系统能够实现“管理员”和“学生”两类人员的登录以及完成对应的操作。
1.管理员
(1)实现课程信息管理:如①初始化该专业的所有课程信息,可保存到文件中;②相关信息各种查询。如支持以下几种查询方式:(a)按课程名或者课程号查询(精确查找,或模糊查找) (b)按学期进行查询,(c)按课程性质查询(d)。③课程信息添加、删除、修改等。
(2)实现学生信息管理:如①逐个或者批量创建普通用户账号(用户名为学生学号,密码可统一初始化,并将相应的信息存储到文件“userinfo.dat”中),②逐个或批量删除学生账号,③可重置单个学生密码等操作。
2.学生
(1)学生信息管理:学生登录可更改自己账号的密码。
(2)查询专业中各个课程的信息。支持的查询方式同管理员模式下的查询功能。
二、需求分析
软件工程专业课程信息管理系统主要可以分为两大部分,一是管理员操作部分,二是学生操作部分。
管理员需要实现的功能有:
- 增加课程信息
- 删除课程信息
- 查找课程信息(按名称、编号、性质、学期查找)
- 修改课程信息
- 浏览课程信息
- 增加学生信息
- 删除学生信息
- 重置学生密码
学生需要实现的功能有:
- 查询课程信息(同管理员)
- 修改密码
三、概要设计
1、系统功能层次结构图
2、数据类型的定义
- 课程数据类型的定义
需要储存的数据有:课程编号、课程名称、理论课时、实践课时、学分、学期、课程性质。
struct course
{
char name[30]; //课程名称
char num[30]; //课程编号
int period_li; //理论课时
int period_shi; //实际课时
int credit; //学分
int term; //学期
char nature[20]; //性质(必修or选修)
};
2.学生数据类型的定义
需要储存的数据有:学生的姓名、学号和密码。
struct student //学生结构体
{
char s_name[30]; //学生姓名
char s_num[30]; //学生学号
char s_key[30]; //学生密码
};
3、函数设计
为了实现上述功能,本系统设计了多个函数,函数和功能具体阐述如下:
void printList(struct Node* headNode); //打印课程信息
void insertData(struct Node* headNode,struct course data) //插入课程信息
void insertData2(struct Node2* headNode2,struct student data2) //插入学生信息
void deleteDatabyname(struct Node* headNode, const char*name) //通过名称删除课程
void deleteDatabynum(struct Node* headNode, const char*num) //通过编号删除课程
void deleteDatabys_num(struct Node2* headNode2, const char*s_num) //通过学号删除学生
struct Node* searchDatabyname(struct Node* headNode, const char*name) //通过学生查询课程
struct Node* searchDatabynum(struct Node* headNode, const char*num) //通过编号查询课程
struct Node* searchDatabynature(struct Node* headNode, const char*nature) //通过性质查询课程
struct Node* searchDatabyterm(struct Node* headNode, const int*term) //通过学期查询课程
struct Node* searchDatabys_num(struct Node2* headNode2, const char*s_num) //通过学号查询课程
void saveToFile(struct Node* headNode,const char* fileName) //保存课程文件
void saveToFile2(struct Node2* headNode2,const char* fileName) //保存学生文件
void readFromFile(struct Node* headNode,const char* fileName) //读取课程文件
void readFromFile2(struct Node2* headNode2,const char* fileName) //读取学生文件
void HandleCourse() //管理课程信息
void HandleStudent() //管理学生信息
void choice_teacher() //管理员选择
void choice_student() //学生选择
void enter() //用户登录
int main() //主函数
四、运行环境
硬件环境:PC机-内存 16GB。
软件环境:操作系统-windows11。
开发环境:CodeBlocks 20.03
编程语言:C语言。
五、详细设计
1、系统登录
身份选择功能如图5-1所示,需要用户输入自己的身份,如果输入1,那么就读取管理员信息的文件;如果输入2,那么就读取学生信息的文件。然后需要用户输入管理员或学生的账号和密码,如果和文件中的数据一致,那么则登录成功,跳转到管理端或学生端。实现这一功能需要使用fscanf函数遍历管理员信息文件或是学生信息文件中的数据,然后与用户键入的数据进行比较。
void enter()
{
int shenfen;
char enter_hao[20]={' '};
char enter_key[20]={' '};
char file_hao[20]={' '};
char file_key[20]={' '};
struct student a;
FILE* fp;
menu();
scanf ("%d",&shenfen);
switch(shenfen)
{
case 1:
fp=fopen("管理员信息.txt","r");
printf ("请输入账号:\n");
scanf ("%s",enter_hao);
printf ("请输入密码:\n");
scanf ("%s",enter_key);
while(1)
{
fscanf (fp,"%s %s",file_hao,file_key);
if (strcmp(enter_hao,file_hao)==0&&strcmp(enter_key,file_key)==0)
{ printf ("登录成功!");
choice_teacher();
break;
} //登陆成功
else if (strcmp(enter_hao,file_hao)==0&&strcmp(enter_key,file_key)!=0)
{
printf ("密码错误!\n");
break;
}
else if (strcmp(enter_hao,file_hao)!=0)
{
continue;
}
else
{
printf ("输入错误!");
break;
}
fclose(fp);
}
break;
default:
printf ("输入错误\n");
}

2、录入课程信息
录入课程信息功能如图5-2所示,需要用户输入课程编号、名称、理论学时、实践学时、学分、学期、性质,然后储存到名为“course.txt”的文件。
void insertData(struct Node* headNode,struct course data) //插入函数
{
struct Node* newNode = createNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
case 1: //主函数的录入操作
printf ("请输入:\n");
printf ("课程编号 名称 理论学时 实践学时 学分 学期 性质:\n"); scanf("%s %s %d %d %d %d %s",temp.num,temp.name,&temp.period_li,&temp.period_shi,&temp.credit,&temp.term,temp.nature);
insertData(list,temp);
printf ("录入成功!\n");
saveToFile(list,"course.txt");
break;

3、删除课程信息
删除课程信息功能如图5-3所示,可以通过按名称和按编号两种方式执行删除操作。下面仅展示通过编号删除的代码。
void deleteDatabynum(struct Node* headNode, const char*num)
{
struct Node* preNode = headNode; //前一个结点
struct Node* curNode = headNode->next; //这一个结点
while (curNode!=NULL&&strcmp(curNode->data.num,num)!=0)
{
preNode=curNode;
curNode=preNode->next;
}
if (curNode==NULL)
{printf ("删除失败!没有找到指定课程!\n");}
else
{
preNode->next = curNode->next;
free(curNode);
printf ("删除成功!");
}
}

4、修改课程信息
修改课程信息功能如图5-4所示,可以通过按编号和按名称两种方式执行修改操作。这里仅以按编号修改为例子。在键入编号后,还需输入该课程新的信息。下面仅展示通过编号修改的代码。
case 4: //修改
printf ("请选择修改方式\n");
printf ("1:按名称修改\n");
printf ("2:按编号修改\n");
scanf ("%d",&choice_xiugai);
if (choice_xiugai==1)
{
printf ("请输入要修改的学生姓名:\n");
scanf ("%s",temp.name);
result=searchDatabyname(list,temp.name);
if (result==NULL)
{
printf ("未找到该课程\n");
}
else
{
printf ("请输入该课程新的信息\n");
printf ("编号 名称 理论学时 实践学时 学分 学期 性质\n");
scanf("%s %s %d %d %d %s",
result->data.num,
result->data.name,
&result->data.period_li,
&result->data.period_shi,
&result->data.credit,
&result->data.term,
result->data.nature);
printf ("修改成功!\n");
}
}
if (choice_xiugai==2)
{
printf ("请输入要修改的课程编号:\n");
scanf ("%s",temp.num);
result=searchDatabynum(list,temp.num);
if (result==NULL)
{
printf ("未找到该课程\n");
}
else
{
printf ("请输入该课程新的信息\n");
printf ("编号 名称 理论学时 实践学时 学分 学期 性质\n");
scanf("%s %s %d %d %d %s",
result->data.num,
result->data.name,
&result->data.period_li,
&result->data.period_shi,
&result->data.credit,
&result->data.term,
result->data.nature);
printf ("修改成功!\n");
}
}
saveToFile(list,"course.txt");
break;

5、查找课程信息
查找课程信息功能如图5-5-1和5-5-2所示,可以通过名称、编号、性质、学期来进行查找。查找需要遍历整个链表,直到找到与键入信息相同的节点数据。可以通过pmove指针来实现。通过性质或学期查找,则需要再加一个循环。下面仅以按编号查找和按性质查找为例子。
struct Node* searchDatabynum(struct Node* headNode, const char*num) //按编号查找函数
{
struct Node* pmove = headNode->next;
while(pmove!=NULL&&strcmp(pmove->data.num,num))
{
pmove=pmove->next;
}
return pmove;
}
if (choice_chaxun==2) //主函数中的查找操作
{
printf ("请输入要查找的课程编号\n");
scanf("%s",temp.num);
result=searchDatabynum(list,temp.num);
if (result==NULL)
{
printf ("未找到该课程\n");
}
else
{
printf ("编号\t名称\t\t\t理论学时\t实践学时\t学分\t学期\t性质\n");
printf ("%s\t%s\t\t%d\t\t%d\t\t%d\t%d\t%s\n",
result->data.num,
result->data.name,
result->data.period_li,
result->data.period_shi,
result->data.credit,
result->data.term,
result->data.nature);
}
break;
}

6、浏览课程信息
浏览课程信息功能如图5-6所示,本系统先定义一个打印函数,通过调用打印函数,可以实现把文件中的全部课程信息打印到屏幕上。
void printList(struct Node* headNode) //打印函数
{
struct Node* pmove = headNode->next;
printf ("编号\t名称\t\t\t理论学时\t实践学时\t学分\t学期\t性质\n");
while (pmove!=NULL)
{printf ("%s\t%s\t\t%d\t\t%d\t\t%d\t%d\t%s\n",
pmove->data.num,
pmove->data.name,
pmove->data.period_li,
pmove->data.period_shi,
pmove->data.credit,
pmove->data.term,
pmove->data.nature);
pmove = pmove->next;
}
}

7、录入学生信息
录入学生信息功能如图5-7所示。本系统先定义了一个插入学生函数,使用时需要管理员键入学生的姓名、学号、密码,再调用插入学生函数,完成操作,将学生信息储存到名为“学生信息.txt”的文件。
void insertData2(struct Node2* headNode2,struct student data2) //插入学生函数
{struct Node2* newNode2 = createNode2(data2);
newNode2->next2 = headNode2->next2;
headNode2->next2 = newNode2;}
case 1: //主函数中的录入学生信息操作
printf ("请输入:\n");
printf ("姓名 学号 密码\n");
scanf(" %s %s %s",temp2.s_name,temp2.s_num,temp2.s_key);
insertData2(list2,temp2);
printf ("录入成功!\n");
saveToFile2(list2,"学生信息.txt");
break;

8、删除学生信息
删除学生信息功能如图5-8所示,需要管理员输入要删除学生的学号。通过学号找到该学生节点,然后删去。
void deleteDatabys_num(struct Node2* headNode2, const char*s_num) //删除学生函数
{
struct Node2* preNode2 = headNode2; //前一个结点
struct Node2* curNode2 = headNode2->next2; //这一个结点
while (curNode2!=NULL&&strcmp(curNode2->data2.s_num,s_num)!=0)
{preNode2=curNode2;
curNode2=preNode2->next2;}
if (curNode2==NULL)
{
printf ("删除失败!没有找到指定学生!\n");
}
else
{
preNode2->next2 = curNode2->next2;
free(curNode2);
printf ("删除成功!");}
}
case 2: //主函数中的删除学生操作
printf ("请输入你要删除学生的学号\n");
scanf ("%s",temp2.s_num);
deleteDatabys_num(list2,temp2.s_num);
saveToFile2(list2,"学生信息.txt");
break;

9、重置学生密码
重置学生密码功能如图5-9所示,需要管理员输入要重置密码学生的学号,然后输入新的密码。实现这一过程需要调用通过学号查询函数找到该学生节点,然后修改节点中的密码。
case 3:
printf ("请输入要重置密码学生的学号:\n");
scanf ("%s",temp2.s_num);
result2=searchDatabys_num(list2,temp2.s_num);
if (result2==NULL)
{printf ("未找到该学生\n");}
else
{printf ("请输入该学生新的密码\n");
scanf("%s",result2->data2.s_key);
printf ("修改成功!\n");}
saveToFile2(list2,"学生信息.txt");
break;

六、尾声
希望大家能给个赞赞支持一下![doge]