潘治刚成绩管理系统详细设计文档格式.docx
《潘治刚成绩管理系统详细设计文档格式.docx》由会员分享,可在线阅读,更多相关《潘治刚成绩管理系统详细设计文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![潘治刚成绩管理系统详细设计文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/28/c20f55e1-da95-41ba-a820-7af5428c1750/c20f55e1-da95-41ba-a820-7af5428c17501.gif)
本软件才用结构体来保存一条学生的记录,然后用一个链表来保存一个学生信息表,结构体代码如下:
成绩管理表结构代码:
typedefchar*pChar;
typedefstructGradeInfo
{
intnID;
pCharSubject[15];
intGrade[15];
structGradeInfo*next;
}*pGrade;
学生基本信息结构体代码:
typedefstructStudentInfo
charname[20];
charsex[3];
intage;
charClassName[20];
structStudentInfo*next;
}*pSTUDENT;
3.2对学生基本信息数据的管理
3.2.1删除指定学号的记录
当用户选择这个功能以后,只需要按提示输入学生学号,系统自动调用下面的DeleteStudent函数删除指定学生信息。
数据流程图:
intDeleteStudent(pSTUDENTlink,intID)
pSTUDENTp=stlink,p2=NULL;
while(p->
next!
=NULL)
{
if(p->
next->
nID==ID)
{
p2=p->
next;
p->
next=p2->
//这句话就已经让值为ID的结点移出链表了
free(p2);
return0;
}
p=p->
//如果这个结点不是要删除的节点就继续往下移动
}
return-1;
}
3.2.2插入一条学生信息
当用户选择插入学生信息这项功能以后,系统就调用下面函数,要求用户输入学生信息,保存到结构体中,然后插入到链表中,等待保存到文件中。
intInsertStudent(pSTUDENTlink,intID,charname[],charsex[],intage,charclassname[])
st->
next=stlink->
stlink->
next=st;
这里采用的是头插法
3,.2.3修改一条学生基本信息
当用户需要修改学生信息的时候,系统需要用户输入该学生的所有信息然后调用ModefyStuInfo函数修改原有能容,函数定义如下:
intModifyStuInfo(pSTUDENTlink,intID,charname[],charsex[],intage,charclassname[])
Link->
nID=ID;
Strcopy(link->
name,name);
sex,sex);
classname,classname);
age=age;
3.3对学生成绩信息数据的管理
3.3.1删除一条学生成绩信息
intDeleteStudent(pGradelink,intID)
pSTUDENTp=stlink,p2=NULL;
//这句话就已经让值为ID的结点移出链表了
//如果这个结点不是要删除的节点就继续往下移动
3.3.2插入一条学生成绩信息
在这里插入成绩信息的时候需要在学生信息表查找看看学生信息表中有没有该学生的信息,如果没有就不能插入。
数据流程图:
intInsertStudent(pGradelink,intID,charsubject[],intgrade)
If(seek(student,ID)=-1)
Printf(该生并不存在,清检查后重新输入:
);
Else
Gre->
next=link->
Link->
next=gre;
3.3.3查询并修改一条学生成绩信息
intModifyStuInfo(pGradelink,intID,charsubject[],intgrade)
subject,subject);
grade=grade;
3.4对学生成绩信息数据统计
3.4.1读取学生信息
读取学生信息的时候,就相当于是建立一个链表的时候,读出来的数据放到一个结构体变量中,然后将这个结构体变量插入到链表中去。
当用feof()来判断文件中的数据是否读完
intReadFlieofStu(pSTUDENTStudent)
pGradegra;
FILE*fp=NULL;
fp=fopen("
StudentGradeInfo.txt"
"
rb"
if(fp==NULL)
printf("
目前没有学生信息!
\n"
return-1;
else
gra=newGRADE;
fread(gra,sizeof(GRADE),1,fp);
while(!
feof(fp))
gra->
next=Grade->
Grade->
next=gra;
fread(gra,sizeof(GRADE),1,fp);
fclose(fp);
}
3.4.2读取学生成绩
读取学生信息的过程和上面一个函数的原理一样,这里就不说了
intReadFileofGrade(pGradeGrade);
3.4.3总分成绩第一学生信息
这里直接用比较的方法找出链表中最高分是多少,然后根据这个分数把所有这个分数的同学的信息都显示出来:
intTotalFirst(pGradeGrade)
Intdata=0;
pGradep=Grade->
While(p!
=null)
If(p->
grade>
data)
Data=grade;
P=p->
3.4.4单科成绩第一学生信息
这个函数分别显示每一个科目分数最高的学生信息,采用的算法和intTotalFirst(pGradeGrade)函数的算法基本一致。
只是要多查找几次而已,这里也就不多说了.
intSingleFirst(pGradeGrade,charSubject[])\
{}
3.4.5不及格学生成绩信息
这里需要因为不及格的学生可能不止一个,所以需要换回一个链表,然后把链表的信息输出来,这里主要涉及的算法就是查找和添加,把分数小于及格分数线的学生信息添加到另一个链表中。
pGradeflunk(pGradeGrade);
pGradelink;
initLink(link);
pGradep=Grade->
next,p2=NULL;
Grade<
60)
P2=p;
P2->
next=p2;
P=p->
nxet;
3.4.6不及格人数
这个函数算法和上面一样,只是统计的是人数,相对还要简单很多。
intflunkNum(pGradeGrade);
3.4.7显示所有学生的成绩
这里只需要遍历整个链表,然后把所有人的成绩信息输出来就可以了。
voidprintAllGrade(pGradeGrade);
Printf("
……"
……);
3.4.8可以分组统计学生成绩并输出到屏幕
voidprintBySubject(pGradeGrade,charSubject[]);
voidprintByGrade(pGradeGrade,charClassName[15]);
voidprintByClass(pGradeGrade);
3.4.9按总分排序
只需要调用该函数就直接把排序以后的结果显示出来,但是并不改变原来表中的顺序,并把排序以后的结果临时存储起来。
pGradeSortByTotal(pGradeGrade);
这个函数采用的算法就是用快速排序法!
将链表中的结点按总分进行排序然后输出。
这里最重的就是设计到结点之间的交换,最好不需要把结点的内容拿出来互换,而是把结点互换。
两结点交换的代码如下:
next,p2=gradeNode;
P-next=p2->
P2->
P->
这段代码实现的就是把p2结点和p2的下一个结点交换位置
3.4.10安单科排序
pGradeSortBySubject(pGradeGrade,charSubject[]);
单科排序的算法和总分排序的算法一样,只是需要用户输入是按哪一科的成绩来排序,或者哪两科的成绩来排序;
3.4.11按学号排序
只需要调用该函数就直接把排序以后的结果显示出来,但是并不改变原来表中的顺序,并把排序以后的结果临时存储起来。
pGradeSortByStudentId(pGradeGrade);
这个算法也一样