一个模拟的小型教务管理系统
实验报告
班别:信息技术类创新实验 111 班
学号:1107300504
姓名:黄新发
学校:广西大学
一、 实验目的
通过小型教务管理系统的设计,培养学生综合利用 C 语言进行程序设计的能力,加强函
数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳
总结的能力,培养学生利用系统提供的标准函数及典型算法进行设计。
二、 实验要求
该系统用于管理学生的基本信息、课程成绩及毕业资格审查。要求实现以下功能:
①通过此模块来管理课程信息,包括查询,添加,修改,删除等功能。在进行课程信息
添加时,系统会自动监测所添加的信息是否已经存在,如果存在,会提示已经存在。在进行
课程信息删除时,同样要求再次确定。
②实现对学生信息、课程成绩及毕业资格审查的文件存取(分别存储在 StudentInfo.txt、
StudentScore.txt 和 GraduateCheck..txt 文件中),实现对学生信息、课程成绩的记录增加、删
除及修改;
③实现输入学生学号或姓名查询并显示学生的课程成绩;
④实现输入学生学号或姓名,根据该学生的课程成绩,显示毕业资格审查结果。
学生的基本信息记录,如:
学号
姓名
20050999
张三
……
学生的课程成绩记录,如:
……
性别
男
……
学号
20050999
20050999
20050999
20050999
……
课程名称
课程性质
毛泽东思想概论
高级语言程序设计
WEB 程序设计
IT 企业管理
……
公共必修
专业必修
专业选修
素质课
……
毕业资格审查结果,显示信息如下:
出生日期
1980 年 6 月 1 日
专业
软件工程
……
学分
4
3
2
1
……
……
成绩
60
70
80
90
……
课程性质
应修学分数
已获学分数
是否通过
公共必修
专业必修
专业选修
素质课
10
30
25
15
10
29
28
16
是
否
是
是
学号
20050999
20050999
20050999
20050999
提示及说明
(1) 学生记录、生日请用结构体完成存储,课程性质及专业请用枚举类型存储。
(2) 学生信息、课程成绩、毕业资格审查的管理可用结构体数组或链表实现。
(3) 请注意分配好时间,完成系统设计与实现,同时认真填写大作业报告!按时提交
大作业报告、可运行的程序及代码,逾期不交,期末成绩以 0 分记。
三、 程序设计
1、 设计思想
我严格的按照实验的要求来写,学生的基本信息用链表来实现,其结构成员为
学号、姓名、性别、出生日期的结构体(其成员为年、月、日)、专业;课程成绩也
用链表实现,其结构成员为学号、课程名称、课程性质、学分、成绩;毕业资格审
查用链表实现,其结构成员为学号、4 个结构体的结构数组(结构数组包含课程性
质、应修学分、已修学分、审查结果)。其中学生基本信息和课程成绩的数据靠从键
盘的输入,毕业资格审查的数据是从课程成绩的数据自动的计算赋值的,无需手动
输入。将赋了值的链表依次的读入相应的 txt 文件中。
在 main 函数中先定义了不同结构类型的 head_1,head_2,head_3 三个表头,开始
就运行 read_1,read_2,read_3 三个函数从相应的 txt 文件中读出数据,建成链表,返
回值分别赋给 head_1,head_2,head_3 三个表头。主菜单中有 1、学生的基本信息,2、
学生的课程成绩,3、毕业资格审查 ,4、退出。而学生的基本信息和学生的课程成
绩又有二级菜单 1、全显,2、查找,3、添加,4、修改,5、删除,6、保存,7、
返回,8、退出。序号 1~6 都建立了函数。毕业资格审查又有 1、全显,2、查找,3、
更新,4、保存,5、返回,6、退出。序号 1~4 建立了函数。而“更新”这个函数属
于建立链表,数据是根据学生的课程成绩这一链表的数据逐一赋值的。
2、 程序框图
1、全显
2、查找
3、添加
4、修改
5、删除
6、保存
7、返回
8、退出
1、全显
2、查找
3、添加
4、修改
5、删除
6、保存
7、返回
8、退出
1、全显
2、查找
3、更新
4、保存
5、返回
6、退出
1 、
学
生
的
基
本
信
息
2、
学
生
的
课
程
成
3 、
毕
业
资
格
审
查
4 、
退
出
教
务
管
理
系
统
3、 关键技术实现
1) 运行界面的视觉效果
建立了带有int返回值的主菜单和二级菜单函数,在函数中写上system("cls")运行
前清屏,在打印。另外灵活的运用了换码符”\t”的水平制表以及字符的输出长度,使
数据的输出像表格一样整齐。我是用menu_main()函数表示主菜单,menu_minor_1()、
menu_minor_2()、menu_minor_3()函数表示二级菜单的。
2) 数据在相应的 txt 文件中的读入读出
开始的文字(如fputs("学¡ì号?\t\t姓?名?\t性?别Àe\t出?生¦¨²日¨?期¨²\t专Á¡§°¦Ì\n",fp);)
运用了fgets(),fputs(),读入读出,然后通过fscanf(),fprintf()读入读出链表中每一个结构体的
成员。文件读出是以txt文件中的数据赋值给结构体建立成链表,然后返回表头。我是用
read_1()、read_2()、read_3()和save-1(head)、save_2(head)、save_3(head)函数分别读出和
读入的。
3) 毕业资格审查链表的建立
毕业资格审查的数据不能手动的从键盘输入、添加、修改、删除,而是从课程成绩
的链表数据中根据学号、课程性质、学分、成绩的不同,经过计算在一一的赋值给毕业
资格审查的结构体成员并建成链表。我是用一个“更新”的函数来完成的。
四、 总结
在此次的大作业中,我选择了一个难度较大,具有挑战性和综合性的题目——设计实现
一个模拟的小型教务管理系统。在这个大作业中我写了一千行语句左右的代码,不仅实现了
各种功能、实现智能化,还优化的运行界面,挺高了视觉效果,使屏幕上的数据更直观了。
为了完成此次大作业,我实行了三步走战略。首先,我多次审题、思考,寻找思路,在
脑海里形成了一个程序框架,在对可能用到的技术或要实现的效果进行了多次试验;其次,
我开始写大作业的代码程序,用函数来实现所需要实现的效果(之前已试验成功);最后,
我再修改程序,简化代码。
通过做这个大作业,我看程序的视野更加开阔了,全局观念更加强烈了。
五、 附录、程序代码
#include
#include
#include
struct birthday
体
{
int year;
//定义生日的结构
int month;
int day;
};
struct stu_check1
审查结果的部分的结构体
{
//定义毕业资格
char course_nature[9];
int credit1;
int credit2;
char result[3];
};
struct stu_infor
信息记录的结构体
{
char num[11];
char name[9];
char sex[3];·
struct birthday birth;
char major[21];
struct stu_infor *next;
};
struct stu_score
程成绩记录的结构体
{
char num[11];
char course[21];
char course_nature[9];
int credit;
int grate;
struct stu_score *next;
};
struct stu_check
资格审查结果的结构体
{
//定义学生毕业
char num[11];
struct stu_check1 check[4];
struct stu_check *next;
};
int menu_main()
{
char ch;
do{
//主菜单选择
printf("\t\t 请\t1:学生的基本
信息\n");
printf("\t\t\t2:学生的课程成
//定义学生的基本
绩记录\n");
//定义学生的课
printf("\t\t\t 请输入您的选择
printf("\t\t 选\t3:毕业资格审
查结果\n");
printf("\t\t\t4:学生个人信息
\n");
printf("\t\t 择\t0:退出\n");
printf("\t———————————
——————————————————
———\t");
(0~4):");
ch=getchar();
//读入选择
}while(ch<'0'||ch>'4');
return (ch-'0');
//返回选择
}
int menu_minor_1()
{
char ch;
do{
system("cls");
printf("\n\t\t\t 欢迎使用教务
管理系统\n\t\t\t\t\t\t\t 作者:黄新发、
何双燕\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t 请\t1:学生的基本
信息\n");
printf("\t\t\t2:学生的课程成
system("cls");
//运行前 清
绩记录\n");
屏
printf("\t\t 选\t3:毕业资格审
printf("\n\t\t\t 欢迎使用教务
查结果\n");
管理系统\n\t\t\t\t\t\t\t 作者:黄新发、
何双燕\n");
\n");
printf("\t\t\t4:学生个人信息
printf("\t———————————
——————————————————
———\t");
printf("\t———————————
——————————————————
printf("\t\t\t0:退出\n");
———\t");
printf("\t\t\t 请输入您的选择
(0~4):1\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t\t 学生的基本信息
\n\n");
printf("\t1: 全 显 \t\t2: 查 找
\t\t3:添加\t\t4:修改\n\t5:删除\t\t6:
保存\t\t7:返回\t\t0:退出\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t\t 请输入您的选择:
");
}
ch=getchar();
}while(ch<'0'||ch>'7');
return (ch-'0');
int menu_minor_2()
{
char ch;
do{
system("cls");
printf("\n\t\t\t 欢迎使用教务
管理系统\n\t\t\t\t\t\t\t 作者:黄新发、
何双燕\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t 请\t1:学生的基本
信息\n");
printf("\t\t\t2:学生的课程成
绩记录\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t\t 请输入您的选择
(0~4):2\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t\t 学生的课程成绩
记录\n\n");
printf("\t1: 全 显 \t\t2: 查 找
\t\t3:添加\t\t4:修改\n\t5:删除\t\t6:
保存\t\t7:返回\t\t0:退出\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t\t 请输入您的选择:
");
}
ch=getchar();
}while(ch<'0'||ch>'7');
return (ch-'0');
int menu_minor_3()
{
char ch;
do{
system("cls");//运行前清屏
printf("\n\t\t\t 欢迎使用教务
管理系统\n\t\t\t\t\t\t\t 作者:黄新发、
何双燕\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t 请\t1:学生的基本
printf("\t\t 选\t3:毕业资格审
信息\n");
查结果\n");
printf("\t\t\t2:学生的课程成
printf("\t\t\t4:学生个人信息
绩记录\n");
\n");
printf("\t\t 选\t3:毕业资格审
printf("\t\t\t0:退出\n");
查结果\n");
printf("\t\t\t4:学生个人信息
if((fp=fopen("StudentInfo.txt","r
\n");
"))==NULL){
printf("\t\t\t0:退出\n");
printf("\t———————————
——————————————————
———\t");
printf("File open error!\n");
exit(0);
}
p1=p2=(struct
stu_infor
*)malloc(sizeof(struct stu_infor));
printf("\t\t\t 请输入您的选择
fgets(str,sizeof("学号\t\t 姓名\t
(0~4):3\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t\t 学生毕业资格审
查\n\n");
printf("\t\t1: 全 显 \t\t2: 查 找
\t\t3:更新\n\t\t4:保存\t\t5:返回\t\t0:
退出\n");
printf("\t———————————
——————————————————
———\t");
printf("\t\t\t 请输入您的选择:
");
}
ch=getchar();
}while(ch<'0'||ch>'5');
return (ch-'0');
struct stu_infor *read_1()
文件中读取学生的基本信息
{
//从磁盘
FILE *fp;
int n=0;
struct stu_infor *head,*p1,*p2;
char str[]="学号\t\t 姓名\t 性别\t
}
性别\t 出生日期\t 专业\n"),fp);
fscanf(fp,"%s",p1->num);
fscanf(fp,"%s",p1->name);
fscanf(fp,"%s",p1->sex);
fscanf(fp,"%d-%d-%d",&p1->birth.y
ear,&p1->birth.month,&p1->birth.day);
fscanf(fp,"%s",p1->major);
head=NULL;
while(!feof(fp))
{
n=n+1;
if(n==1) { head=p1;}
else p2->next=p1;
p2=p1;
p1=(struct
stu_infor
*)malloc(sizeof(struct stu_infor));
fscanf(fp,"%s",p1->num);
fscanf(fp,"%s",p1->name);
fscanf(fp,"%s",p1->sex);
fscanf(fp,"%d-%d-%d",&p1->birth.year,
&p1->birth.month,&p1->birth.day);
fscanf(fp,"%s",p1->major);
}
p2->next=NULL;fclose(fp);
return (head);
出生日期\t 专业\n";
if((fp=fopen("StudentInfo.txt","a
//一追加的方式打开文
"))==NULL){
件,是为了建立文件(如果没有该文件)
struct stu_score *read_2()
//从磁
盘文件中读取学生的课程成绩和学生的毕
业资格审查结果
{
printf("File open error!\n");
exit(0);
}
fclose(fp);
FILE *fp;
int n=0;
struct stu_score *head,*p1,*p2;
char str[]="学号\t\t 课程名称\t\t
课程性质\t 学分\t 成绩\n";
if((fp=fopen("StudentScore.txt","
//一追加的方式打
a"))==NULL){
开文件,是为了建立文件(如果没有该文件)
//从磁
struct stu_check *read_3()
盘文件中读取学生的课程成绩和学生的毕
业资格审查结果
{
printf("File open error!\n");
exit(0);
}
fclose(fp);
if((fp=fopen("StudentScore.txt","
r"))==NULL){
printf("File open error!\n");
exit(0);
}
p1=p2=(struct
stu_score
*)malloc(sizeof(struct stu_score));
fgets(str,sizeof("学号\t\t 课程名
称\t\t 课程性质\t 学分\t 成绩\n"),fp);
fscanf(fp,"%s",p1->num);
fscanf(fp,"%s",p1->course);
fscanf(fp,"%s",p1->course_nature)
;
fscanf(fp,"%d%d",&p1->credit,&p1-
>grate);
head=NULL;
while(!feof(fp))
{
n=n+1;
if(n==1) { head=p1;}
else p2->next=p1;
p2=p1;
p1=(struct
stu_score
FILE *fp;
int n=0;
int i;
struct stu_check *head,*p1,*p2;
char str[]="学号\t\t 课程性质\t 应
修学分数\t 已获学分数\t 是否通过\n";
if((fp=fopen("GraduateCheck.txt",
"a"))==NULL){
//一追加的方式
打开文件,是为了建立文件(如果没有该文
件)
printf("File open error!\n");
exit(0);
}
fclose(fp);
if((fp=fopen("GraduateCheck.txt",
"r"))==NULL){
printf("File open error!\n");
exit(0);
}
p1=p2=(struct
stu_check
*)malloc(sizeof(struct stu_check));
fgets(str,sizeof("学号\t\t 课程性
质\t 应修学分数\t 已获学分数\t 是否通过
\n"),fp);
for(i=0;i<4;i++){
fscanf(fp,"%s",p1->num);
fscanf(fp,"%s",p1->check[i].cours
*)malloc(sizeof(struct stu_score));
e_nature);
fscanf(fp,"%s",p1->num);
fscanf(fp,"%s",p1->course);
fscanf(fp,"%d%d",&p1->check[i].cr
edit1,&p1->check[i].credit2);
fscanf(fp,"%s",p1->check[i].resul
fscanf(fp,"%s",p1->course_nature);
t);}
fscanf(fp,"%d%d",&p1->credit,&p1->gra
te);
}
p2->next=NULL;fclose(fp);
return (head);
}
head=NULL;
while(!feof(fp))
{
n=n+1;
if(n==1) { head=p1;}
else p2->next=p1;
p2=p1;
p1=(struct
stu_check