设计题目:学生成绩管理系统班级:计0902姓名:付乐颖学号:20091221067完成日期:2010.10.151. 课程设计目的和要求随着科学的发展和社会的进步,许多过去有人工处理的繁杂事务开始交付计算机来完成。
学生成绩管理系统可以说是一个得力助手,它利用计算机对学生成绩进行统一管理,实现学生成绩信息管理工作流程的系统化、规范化和自动化,提高了广大教师的工作效率。
本程序旨在训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件等的各种基本操作,使学生能对C语言的文件操作有一个更深的理解。
为进一步开发出高质量的信息管理系统打下坚实的基础。
2. 课程设计任务内容学生包含以下信息项:学号、姓名、学院、班级、高数成绩、英语成绩、C语言成绩、总分、平均分。
系统的主要功能包括:1. 创建学生成绩信息文件,根据提示输入学生的各项信息,计算出总分和平均分,然后按学号对学生信息进行排序,并将排序后的学生成绩信息存储到一个二进制文件中。
2. 增加学生信息,在原有学生信息文件的基础上增加新的学生成绩信息,要求:增加后的学生信息仍按学号排序,并继续保存至原文件。
3. 删除学生信息,提示用户输入要进行删除操作的学号,如果在文件中有该信息存在,则将该学号所对应的学生信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。
4. 修改学生信息,提示用户输入要进行修改操作的学号,如果在文件中有该息存在,则将提示用户输入该学号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作。
5. 按不同条件对学生信息进行查询操作,输出满足条件的学生信息。
(1) 按学号查询,输入一个学号,输出对应的学生信息。
(2) 按姓名查询,包括精确查询(输入全名),模糊查询(输入姓)。
(3) 按学院查询,输入学院名称,输出该学院的全部学生的信息。
(4) 按班级查询,输入班级名称,输出该班级的全部学生的信息。
6. 按不同条件对学生成绩进行统计工作。
(1) 按总分对学生信息进行排序(由高到低),输出排序后的信息,并将排序后的学生信息存放到一个新的二进制文件中。
(2) 按平均分统计各个分数段的学生人数(不及格,60-69,70-79,80-89,90-100)。
(3) 分别找出3门课程成绩最高的学生,并输出他们的信息。
(4) 分别统计出3门课程的不及格率,并输出。
3. 详细设计说明3.1 功能模块图3.2 数据结构设计1.学生成绩信息结构体struct student{char num[10]; /*学号*/char name[15]; /*姓名*/char xueyuan[15]; /*学院*/char banji[15]; /*班级*/int cgrade; /*C语言成绩*/int mgrade; /*数学成绩*/int egrade; /*英语成绩*/int total; /*总分*/float ave; /*平均分*/};2.单链表node结构体typedef struct node{struct student data; /*数据域*/struct node *next; /*指针域*/}Node,*Link;3.3 功能模块设计1.主函数main()执行流程本成绩管理系统可以先以可读写的方式打开数据文件,若该文件不存在,则提醒用户新建此文件。
当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的单链表中,然后执行显示主菜单和进入主循环操作,进行按键判断。
在判断键值时,有效的输入为0至9之间的任意数值,其他输入都被视为错误按键。
若输入为0(即变量select=0),它会继续判断是否在对记录进行了更新操作以后进行了存盘操作,若未存盘,则全局变量saveflag=1,系统会提示用户是否进行数据存盘操作,用户输入Y或y,系统会进行存盘操作。
最后,系统执行退出成绩管理系统的操作。
若选择1,则调用Create()函数,执行创建学生信息操作;若选择2,则调用Insert()函数,执行插入学生信息操作;若选择3,则调用Del()函数,执行删除学生信息操作;若选择4,则调用Modify()函数,执行修改学生信息操作;若选择5,则调用Sortnum()函数,执行按学号排序操作;若选择6,则调用Find()函数,执行查找学生信息操作;若选择7,则调用Sortscore()函数,执行按总分排序操作;若选择8,则调用Tongji()函数,执行学生信息整理操作;若选择9,则调用Save()函数,执行保存学生信息操作;若输入0—9之外的值,则调用Wrong()函数,给出按键错误的提示。
2.输入学生信息模块输入学生信息模块主要实现将数据存入单链表中。
这部分的操作较为简单。
当从数据文件中读出信息时,它调用了fread(p,sizeof(Node),1,fp)文件读取函数,执行一次从文件中读取一条学生成绩信息存入指针变量p所指的节点中的操作,并且这个操作在main()中执行,即当成绩管理系统进入显示菜单界面时,该操作已经执行了。
若该文件中没有数据,系统会提示单链表为空,没有任何学生信息可操作,此时,用户应选择1,调用Create()函数,进行学生信息的输入,即完成在单链表l中添加节点的操作。
其中,字符串和数值的输入我分别采用了函数来实现,在函数中完成输入数据的任务,并对数据进行条件判断,直到满足条件为止,这样大大减少了代码的重复与冗余,符合模块化设计的特点。
3.查询学生信息模块查询学生信息模块在单链表中按学号或姓名或学院或班级查找满足条件的学生信息。
在查询函数Find()中,l为指向保存了学生成绩信息的单链表的首地址的指针变量。
对于在单链表中进行的指针定位操作,我设计成了两个单独的函数Node* Locate(Link l,char findmess[],char nameornum[])和int Locate2(Link l,char findmess[],char nameornum[]),参数findmess[]保存要查找的具体内容,nameornum[]保存要查找的字段,若找到该记录,则返回指向该节点的指针;否则,返回一个空指针。
4.更新学生信息模块此模块主要实现了对学生信息的修改、删除、插入和排序操作。
因为学生信息是以单链表的结构形式存储的,所以这些操作都在单链表中完成。
1)修改学生信息修改学生信息需要对单链表中目标节点的数据域中的只进行修改,它分两步完成。
第一步,输入要修改的学号,输入后调用Locate()或Locate2()在单链表中逐个对节点数据域中学号字段的值进行比较,直到找到该学号的学生信息;第二部,若未找到该学生信息,修改除学号之外的各字段的值,并将存盘标记变量saveflag置1,表示已经对信息进行了修改,但还未执行存盘操作。
2)删除学生信息删除学生信息操作完成删除指定学号或姓名,它也分两步完成。
第一步,输入要删除的学号或姓名,输入后调用定位函数Locate()在单链表中逐个对节点数据域中学号或姓名字段的值进行比较,直到找到该学号或姓名的学生信息,返回指向该学生信息的节点指针;第二步,若找到该学生信息,将该学生信息所在节点的前驱节点的指针域指向目标节点的后继结点。
3)插入学生信息插入学生信息操作完成在指定学号的随后位置插入新的学生信息。
首先,它要求用户输入某个学生的学号,新的学生信息将插入在该学生信息之后;然后,提示用户输入一条新的学生信息,这些信息保存在新节点的数据域中;最后,将该节点插入在指定位置学号之后。
4)学生信息排序针对单链表结构的特点,我采用了插入排序算法实现按总分降序、按学号升序进行排序。
5.学生信息整理模块该模块的实现比较简单,它主要通过循环读取指针变量p所指的当前节点的数据域中各字段的值,并对各个成绩字段进行逐个判断的形式,完成单科最高分、总分最高分学生的查找和各科不及格人数的统计。
6.输出信息模块当把信息输出至文件时,调用fwrite(p,sizeof(Node),1,fp)函数,将p指针所指节点中的各字段值写入文件指针fp所指的文件。
当把信息输出至屏幕时,调用Disp(Link l)函数,将单链表l中存储的学生信息以表格的形式在屏幕上打印出来。
3.4 相关函数说明1)printheader()用于在以表格形式显示学生记录时,打印输出表头信息。
2)printdata(Node *pp)用于在以表格形式显示学生记录时,打印输出单链表pp中的学生信息。
3)stringinput(char *t,int lens,char *notice)用于输入字符串,并进行字符串长度验证(长度<lens)。
T用于保存输入的字符串,因为是以指针形式传递的,所以t相当于该函数的返回值。
notice 用于保存printf()中输入的提示信息。
4)numberinput(char *notice)用于输入数值型数据,notice用于保存printf()中输出的提示信息,该函数返回用户输入的整型数据。
5)Disp(Link l)用于显示单链表l中存储的学生记录,内容为student结构中定义的内容。
6)Locate(Link l,char findmess[],char nameornum[])用于定位链表中符合要求的节点,并返回指向该节点的指针。
7)Create(Link l)用于在单链表中创建学生信息节点。
8)Find(Link l)用于在单链表l中按学号、姓名、学院、班级查找满足条件的学生信息,并显示出来。
9)Del(Link l)用于先在单链表l中找到满足条件的学生信息的节点,然后删除该节点。
10)Modify(Link l)用于在单链表中修改学生信息。
11)Insert(Link l)用于在单链表中插入学生信息。
12)Tongji(Link l)用于在单链表l中完成学生信息的整理工作,统计出该班的总分第一名、单科第一名、各分数段人数、不及格率。
13)Sortscore(Link l)用于在单链表l中完成利用插入排序法实现单链表的按总分降序排序。
14)Sortnum(Link l)用于在单链表l中完成利用插入排序法实现单链表的按学号降序排序。
15)Save(Link l,char file[20])用于将单链表l中的数据写入磁盘中的数据文件。
16)main()整个学生成绩管理系统的控制部分。
4. 课程设计心得与体会这次课程设计之前,我感觉学的东西很少,很零散,不知该怎么融合到一起,就要课程设计,是不是太难为我们了。
刚看到题目时,我一脸茫然,完全不知道如何下手、从哪里下手,没有一点思绪。
但是我明白,这是一个很好的锻炼机会。
第一周基本上都是在看书,把基本知识再熟悉一边。