毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 课程设计 >> 正文

vc学生成绩管理系统-数据结构课程设计

更新时间:2008-12-16:  来源:毕业论文

vc学生成绩管理系统-数据结构课程设计
一、需求分析
本演示程序用TC编写,主要用到的数据结构是线性表的链式存储结构。因为学生成绩管理系统需要经常更新,修改数据。根据这个特点我们采用了链式存储结构。它是一种动态存储结构。根据数据的特点,每一条记录包含多个属性,我们定义了一个结构体Student。开发目的如下:能对成绩进行录入和修改;能计算每个学生的平均成绩以及各门功课的平均成绩;能根据学号来查相应的学生成绩;能根据学生成绩的高低进行排名。
1、 输入的形式和输入值的范围:学生的学号和姓名都为字符型,长度分别为6和5。输入的学号最多只能有5位,输入的姓名最多只能有4位。否则会出现乱码。学生的成绩在0-100之内。
2、  输出的形式:以二进制的形式存储在你指定的硬盘里。
3、 程序所能达到的功能:
每一条记录包括一个学生的学号、姓名、3门成绩、平均成绩。
输入功能:可以一次完成无数条记录的输入。
显示功能:完成全部学生记录的显示。
查找功能:完成按姓名查找学生记录,并显示。
排序功能:按学生平均成绩进行排序。
插入功能:按平均成绩高低插入一条学生记录。
保存功能:将学生记录保存在任何自定义的文件中,如保存在:c:\score。
读取功能:将保存在文件中的学生记录读取出来。
有一个清晰美观界面来调用各个功能
        
4、 测试数据:
num name Score1 Score2 Score3
10001 xing 88 98 86
10002 wang 99 69 87
10003 gong 78 99 89

 

 

二、概要设计
为了实现上述程序功能,需要定义结构体的抽象数据类型和全局变量:
ADT Student {
 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}
 数据关系:R1={<ai-1,ai>|ai-1, ai∈D,i=2,…,n}
 基本操作:
    IntiList(&L)
      操作结果:构造一个空的线性表L
    GetElem(L,i,&e)
      初始条件:线性表L已存在,1≤i≤ListLength(L)。
      操作结果:用e返回L中第i个数据元素的值。
    ListInsert(&L,I,e)
      初始条件:线性表L已存在,1≤i≤ListLength(L)+1。
      操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。
    ListDelete(&L,I,e)
     初始条件:线性表L已存在且非空,1≤i≤ListLength(L)。
     操作结果:删除L中第i个数据元素,并用e返回其值,L的长度减1。
}ADT Student
下面是我们定义的结构体数组。整个链式存储结构中,所有在存储的记录(一个学生的信息)在物理位置上是不相邻的,是通过指针把各个结点联系在一起。每一个结点包含一条记录,包括学生的学号、姓名、三科的成绩、平均成绩、总分等等,存储下面所定义的结构体数组里面。这个结构体数组贯穿整个系统,可以说是整个系统的核心。
typedef struct stu       /*定义结构体数组用于缓存数据*/
{char num[6];
char name[5];
int score[3];
int sum;
float average;
int order;
struct stu *next;
}STUDENT;


三、详细设计
整个系统除了主函数外,另外还有10个函数,实现八大功能:输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。各个函数的详细设计说明分别如下:
1、 主函数 main()
利用无限次循环for(;;)和switch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
2、 初始化函数 STUDENT         *init()
这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为NULL。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
3、 菜单选择函数 int menu_select();
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间。等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!
4、 输入记录函数 STUDENT *create()
这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停止输入,函数结束后,带回一个指向链表头的指针head。
算法:先声明一个首节点head,并将head->next设为NULL。每输入一个数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的尾端。
5、 显示记录函数 void print(STUDENT *head)
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。
算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。
6、 查找记录函数 void search(STUDENT *head)
这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。
算法:采用线性查找法往下一个节点查找。输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。
Status GetElem _L(LinkList L,int i,ElemType&e) {
// L为带头结点的单链表的头指针
// 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
P=L->next;j=1;  //初始化,p指向第一个结点,j为计数器
While(p&&j<i) {  //顺指针向后查找,直到p指向第i个元素或p为空
 P=L->next;++j;
}
If(!p||j>i)return ERROR;  //第i个元素不存在
e=p->data; //取第i个元素
return OK;
}

7、 删除记录函数 STUDENT *delete(STUDENT *head)
这是一个有参函数,形参为“链表头的指针”,先输入要删除的学生记录的学号,找到后显示该学生信息,等确认后便可按“Y”进行删除。
算法:从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。
Status ListDelete _L(LinkList&L,int i,ElemType&e) {
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
p=L;J=0;
while(p->next&&j<i-1){//寻找第i个结点,并令P指向其前趋
p=p->next;++j;
}
if(!(p->next)||j>i-1)return ERROR; //删除位置不合理
q=p->next;p->next=q->next;  //删除并释放结点
e=q->data;free(q);
return OK;
} //ListDelete_L

8、排序函数 STUDENT *sort(STUDENT *head)
这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还可以显示名次。
8、 插入函数 STUDENT *insert(STUDENT *head,STUDENT *new)
这是一个有参函数,形参有两个,一个是“链表头的指针”,一个是“待插入指针”,按照原来成绩平均分的高低进行插入,插入后会重新进行排序,并返回。
算法:先将学生的成绩按平均分由高分到低分进行排序,再插入一个新生的结点,要求按平均分的高低顺序插入。先用指针变量p0指向待插入的结点,p1指向第一个结点。如果p0->average<p1->average,则待插入的结点不应插在p1所指的结点之前。此时将p1后移,并使p2指向刚才p1所指的结点。重复以上的步骤,直到p0->average>=p1->average为止。这时将p0指向的结点插到p1所指结点之前。但是如果p1所指的已是表尾结点,则p1就不应后移了。如果p0->average比所有结点的average都小,则应将p0所指的结点插到链表末尾。如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值赋给p2->,使p2->next指向待插入的结点,然后将p1的值赋给p0->next,使得p0->next指向p1指向的变量。如果插入位置为第一个结点之前,则将p0赋给head,将p1赋给p0->next。如果要插到表尾之后,应将p0赋给p1->next,NULL赋给p0->next。最后再调用排序的函数,将学生成绩重新排序.
Status Listinsert _L(LinkList&L,int i,ElemType&e) {
//在带头结点的单链线性表L中第i个位置之前插入元素e
p=L;j=0;
while (p&&j<i-1) {P=p->next;++j;} //寻找第i-1个结点
if(!p||j>i-1)return ERROR; //i小于1或者大于表长加1
a=(Linklist)malloc(sizeof(LNode));  //生成新结点
s->data=e;s->next=p->next;//插入L中
return OK;
}//ListInsert_L

10、保存数据到文件函数 void save(STUDENT *head)
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。
11、从文件读数据函数 STUDENT *load()
这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。

四、调试分析
(1)刚开始没有那个初始化函数,程序运行后,没有输入任何数据就试着去执行显示功能,结果显示的是一些乱码。加入初始化函数后,这种现象也随之消失。
(2)刚开始时,先把成绩按平均分排序,再插入一个学生的成绩,执行显示功能,虽然插入的学生的成绩能正常插入,但该学生的名次为0。后来,在插入成绩之后,调用排序函数,把所有成绩重新排序一次。
(3)在输入函数中设了一个无限循环,可以输入无数个学生的成绩信息,当学号为0的时候则停止输入。
(4)输入太多个学生的成绩时,屏幕显示不能控制为一页一页显示,所以为了方便起见,不要输入太多记录,十七左右为最佳。
(5)在没有输入任何信息的情况下,去执行排序功能,最后显示有一个记录,学号、姓名为空白,成绩都为0,名次为1。
(6)在输入选项时不能输入字母,否则会死循环,建议不要乱输字母。
(7)刚开始时,显示所有记录时格式比较乱,字段和记录没能很好的对齐。很不好看。后来重新调整了一下显示格式,让学号字段(num)多几个空格才能够对齐。这样修改之后就美观了很多。
(8)在输入测试数据的时候我们输入的6位的学号和5位的姓名。虽然我们定义了他们的字符串长度为6和5,但是我们没有考虑到字符串后面还有一个结束符/0。这样做的后果是出了很多莫名奇妙的错误。不能正常的删除数据,它老是提示找不到数据。

五、使用说明
程序名为学生成绩管理系统.exe,运行环境为DOS。程序执行后显示166

[1] [2] [3] [4] 下一页

vc学生成绩管理系统-数据结构课程设计下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©lwfree.cn 六维论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。