logo资料库

教务系统C程序及实验报告.doc

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
一个模拟的小型教务管理系统 实验报告 班别:信息技术类创新实验 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
分享到:
收藏