基于链表学生成绩管理系统实验报告.docx
《基于链表学生成绩管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《基于链表学生成绩管理系统实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
基于链表学生成绩管理系统实验报告
“基于链表学生成绩管理系统”实验报告
1.需求分析
1.1.开发背景
学生成绩管理是一个学校不可缺少的部分,它的内容对于学校的管理者和学生来说都至关重要,所以一个良好的学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段。
学生成绩管理系统对学校加强学生成绩管理有着极其重要的作用.学生的数量日益庞大,对于如何管理如此庞大的学生成绩数据显得更为复杂,传统的手工成绩管理不仅工作量大而且容易出现问题。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对学生成绩信息进行管理,具有手工管理所无法比拟的优点。
这些优点能够极大地提高管理者管理的效率,也是学校走向科学化、正规化管理,与世界接轨的重要条件。
因此,开发设计这样一套学生成绩管理软件成为很有必要的事情。
1.2.数据需求
该学生管理系统所需要的数据有学生学号,姓名,性别,出生日期,数学,语文,英语和平均分等数据。
1.3.功能需求
该学生成绩管理系统必须基于delphi编译环境采用pascal语言开发研制,针对学生成绩及其数据特点,可以全面实现对学生成绩的插入、查询、修改、排序、删除和输出等功能。
此系统可以大大减轻了工作量,减少人为的工作失误,全面提高学生成绩管理的效率,从而使学校对于学生成绩的管理水平和技术术水平跃上一个新的台阶。
2.概要分析
2.1.功能概要
2.1.1.主菜单
主菜单包括学生管理系统的基本功能,主要功能如图2-1-1-1所示。
图2-1-1-1主菜单模块图
2.1.2.二级菜单
修改的子菜单包括姓名,出生日期,数学,英语,语文,退出等选项,具体如图2-1-2-1所示。
图2-1-2-1子菜单模块图
2.2.子程序
1.procedureInputstuinfo(varhead:
pointer);
2.procedureOutputstuinfo(varhead:
pointer);
3.procedureSortinfo(varhead:
pointer);
4.procedureSortinfotwo(varhead:
pointer);
5.procedureAgesexsearch(varhead:
pointer);
6.procedureAgesexsearch(varhead:
pointer);
7.procedureModifyinfo(varhead:
pointer);
8.procedureChangefig;
9.procedureDeleteinfo(varhead:
pointer);
10.procedureIncreaseinfo(varhead:
pointer);
11.procedureSavetofile(varstuFile:
text;varhead:
pointer);
12.procedureOutfromfile(varstuFile:
text;varhead:
pointer);
2.3.主界面和子菜单截图
主菜单如图2-3-1所示。
图2-3-1主菜单截图
子菜单如图2-3-2所示。
图2-3-2子菜单截图
3.详细设计
3.1.数据结构设计
本系统存储学生信息采用是记录类型,具体数据结构如下:
Type
pointer=^student;
Date=Record
day:
1..31;
month:
1..12;
year:
1970..2014;
End;
student=Record
num:
string[5];
name:
string[15];
sex:
string[6];
bir:
Date;
mathe:
integer;
chinese:
integer;
english:
integer;
average:
real;
fig:
real;
next:
pointer;
End;
text=fileofstudent;
3.2.查找成绩最高的学生
查找成绩最高的学生,首先运行程序进入主界面,选择对应选项进入子菜单,选择要查找成绩最高的科目,查找时先创建了一个替换成绩的分程序changefig,此分程序是将选择查找的成绩替换为中间变量既可以使用一个分程序对语文,数学,英语,平均分四门成绩进行查找。
在查找过程中遍历链表,使用中间变量记录最高分,因为最高分可能不只有一个,所以最后再遍历一次链表,将该门成绩与最高分相等的学生信息输出。
3.3.按成绩排序输出学生信息
按成绩排序输出学生信息时,采用的插入法排序,因为建立的是不带头结点的单链表,所以插入排序就要考虑具体插入的位置,将原链表依次拆开,建立新的有序链表,遍历原链表如果新链表头结点地址域为空则将结点直接插入其后并将其地址赋值为空,接下来,将新的结点与已经插入链表的数值比较如果有比它值小的则将其插入该结点之前,如果没有则将其插入到链表尾部,并将其地址赋值为空。
4.测试运行
测试运行1:
主菜单界面运行如图4-1所示.
图4-1主菜单截图
测试运行2:
英语成绩由高到低排序运行如图4-2所示。
图4-2英语排序输出截图
测试运行3:
按年龄性别查找运行如图4-3所示。
图4-3按年龄性别查找截图
测试运行4:
查找数学最高分运行如图4-4所示。
图4-4数学最高分截图
测试运行5:
修改学生姓名运行如图4-5所示。
图4-5修改学生信息截图
测试运行6:
增加学生信息运行如图4-6所示。
图4-6增加学生信息截图
测试运行7:
删除学生信息运行如图4-7所示。
图4-7删除学生信息截图
5.总结与展望
5.1.总结
这是我第一次编写比较大且复杂的系统,所以遇到了很多问题,这也体现了我自己知识的不全面性,也提醒我必须将理论知识付诸于实践中去。
这是光靠理论所无法接触到的,我认为如果没有实践理论只能是一纸空文,经过这次实验,我熟练的掌握了链表的基本创建,多种排序方法,并且将它与前面的数组比较,总结了它们各自的利弊,学会了多种编程的方法,也让我深刻的知道了程序模块化,系统化的重要性。
此外,实验中我还积极与同学讨论,发现错误的共同点,并尽自己最大的力量解决问题,这也是我自身学习能力的一种进步。
5.2.展望
这只是一个十分简单的管理系统,以后我还应该更多的学习知识来开发系统的更多功能,比如学生与老师的分开管理,增加用户名与密码登陆功能等等,增加考试题目的展示,对于错题的整理等等,只有不断地进步系统才能更加完善,才能让用户有更好的体验。
同样,对于我自身,我也需要不断的进步,不断地完善自己的各项技能,不断地学习新的知识才能让自己不掉队,只有提升自己才能达到更高巅峰。
计算机人论坛www.jsjer,com
6.参考文献
[1]赵致琢,刘坤起,张继红.高级语言程序设计[M].北京:
国防工业出版社,2010,7.
[2]赵占芳,刘坤起.高级语言程序设计实验教程[M].北京:
电子工业出版社,2014,9.
7.源代码清单
{***************************************************}
{*程序名:
StudentManage*}
{*版本:
V3.0(链表)*}
{*功能:
针对学生成绩开发的管理系统,可以实现学*}
{*生信息的增、删、改、排序、等功能*}
{*开发者:
周绍威*}
{*日期:
2014-12-11*}
{***************************************************}
programStudentManage(input,output);
type
pointer=^student;
Date=Record//定义日期记录类型
day:
1..31;//day表示天,为子界类型
month:
1..12;//month表示月,为子界类型
year:
1970..2014;//year表示年,为子界类型
End;
student=Record//定义学生为记录类型
num:
string[5];//num为学号
name:
string[15];//name为姓名
sex:
string[6];//学生性别为字符型
bir:
Date;//出生日期为date记录类型
mathe:
integer;//数学成绩为整型
chinese:
integer;//语文成绩为整型
english:
integer;//英语成绩为整型
average:
real;//平均分为实型
fig:
real;//中间变量
next:
pointer;
End;
text=fileofstudent;//声明文件类型
var
choice:
array[1..6]ofinteger;//定义一个数组,方便菜单选择
head,p:
pointer;
stuFile:
text;
{*****************************************}
{function:
输入学生信息}
{parameter:
head指针变量}
{*****************************************}
procedureInputstuinfo(varhead:
pointer);//尾插法建立链表
var
tail:
pointer;
num:
string;
begin
head:
=nil;//头结点赋值为空
tail:
=nil;
writeln;
write('学号:
');
readln(num);
whilenum<>'0'do//循环输入学生信息
begin
new(p);//新建结点
P^.num:
=num;
write('姓名:
');readln(p^.name);
write('性别(male/female):
');readln(p^.sex);
write('出生日期:
day:
');readln(p^.bir.day);
write('month:
');readln(p^.bir.month);
write('year:
');readln(p^.bir.year);
write('数学:
');readln(p^.mathe);
write('语文:
');readln(p^.chinese);
write('英语:
');readln(p^.english);
p^.average:
=(p^.mathe+p^.chinese+p^.english)/3;//计算平均分
ifhead=nilthen
head:
=p
else
tail^.next:
=p;
tail:
=p;
writeln;
write('学号:
');readln(num);
end;
tail^.next:
=nil;
writeln('首次录入结束!
');
end;
{*****************************************}
{function:
输出学生信息}
{parameter:
head指针变量}
{*****************************************}
procedureOutputstuinfo(varhead:
pointer);
begin
p:
=head;
writeln;
whilep<>nildo
begin
writeln('--------------------------');
writeln('学号:
',p^.num);
writeln('姓名:
',p^.name);
writeln('性别(male/female):
',p^.sex);
writeln('出生日期:
',p^.bir.year,'年',p^.bir.month,'月',p^.bir.day,'日');
writeln('数学:
',p^.mathe,'分');
writeln('语文:
',p^.chinese,'分');
writeln('英语:
',p^.english,'分');
writeln('平均分:
',p^.average:
6:
2,'分');
writeln('--------------------------');
p:
=p^.next;
end;
end;
{*****************************************}
{function:
按成绩从大到小进行排序}
{parameter:
head指针变量}
{*****************************************}
procedureSortinfo(varhead:
pointer);//插入法排序
var
q,t,v,x:
pointer;
begin
x:
=head^.next;
q:
=head^.next;
new(p);//新建另外一个链表,并将原来链表的信息全部给新的p,p作为新链表的头节点
p^.num:
=head^.num;
p^.name:
=head^.name;
p^.sex:
=head^.sex;
p^.bir:
=head^.bir;
p^.mathe:
=head^.mathe;
p^.chinese:
=head^.chinese;
p^.english:
=head^.english;
p^.average:
=head^.average;
p^.fig:
=head^.fig;
p^.next:
=nil;
t:
=p;
whilex<>nildo//每次取原链表的一个结点,插入到新链表中
begin
x:
=x^.next;
while(q^.fig<=t^.fig)and(t^.next<>nil)do//遍历新链表
begin
v:
=t;
t:
=t^.next;
end;
if(q^.fig>p^.fig)then//如果要插入的结点域大于头节点,则插入到头节点之前,并将其赋给头节点
begin
q^.next:
=p;
p:
=q;
end
elseif(q^.fig<=t^.fig)and(t^.next=nil)then//若在尾部,则插入到最后
begin
t^.next:
=q;
q^.next:
=nil;
end
else//否则插入到中间
begin
v^.next:
=q;
q^.next:
=t;
end;
q:
=x;
end;
head:
=p;
end;
{*****************************************}
{function:
按姓名从小到大进行排序}
{parameter:
head指针变量}
{*****************************************}
procedureSortinfotwo(varhead:
pointer);//插入法排序
var
q,t,v,x:
pointer;
begin
x:
=head^.next;
q:
=head^.next;
new(p);
p^.num:
=head^.num;
p^.name:
=head^.name;
p^.sex:
=head^.sex;
p^.bir:
=head^.bir;
p^.mathe:
=head^.mathe;
p^.chinese:
=head^.chinese;
p^.english:
=head^.english;
p^.average:
=head^.average;
p^.fig:
=head^.fig;
p^.next:
=nil;
t:
=p;
whilex<>nildo
begin
x:
=x^.next;
while(q^.name>t^.name)and(t^.next<>nil)do
begin
v:
=t;
t:
=t^.next;
end;
if(q^.name
begin
q^.next:
=p;
p:
=q;
end
elseif(q^.name>t^.name)and(t^.next=nil)then
begin
t^.next:
=q;
q^.next:
=nil;
end
else
begin
v^.next:
=q;
q^.next:
=t;
end;
q:
=x;
end;
head:
=p;
end;
{*****************************************}
{function:
按学号从小到大进行排序}
{parameter:
head指针变量}
{*****************************************}
procedureSortinfothree(varhead:
pointer);//插入法排序
var
q,t,v,x:
pointer;
begin
x:
=head^.next;
q:
=head^.next;
new(p);
p^.num:
=head^.num;
p^.name:
=head^.name;
p^.sex:
=head^.sex;
p^.bir:
=head^.bir;
p^.mathe:
=head^.mathe;
p^.chinese:
=head^.chinese;
p^.english:
=head^.english;
p^.average:
=head^.average;
p^.fig:
=head^.fig;
p^.next:
=nil;
t:
=p;
whilex<>nildo
begin
x:
=x^.next;
while(q^.num>t^.num)and(t^.next<>nil)do
begin
v:
=t;
t:
=t^.next;
end;
if(q^.num
begin
q^.next:
=p;
p:
=q;
end
elseif(q^.num>t^.num)and(t^.next=nil)then
begin
t^.next:
=q;
q^.next:
=nil;
end
else
begin
v^.next:
=q;
q^.next:
=t;
end;
q:
=x;
end;
head:
=p;
end;
{*****************************************}
{function:
按年龄和性别查找学生}
{parameter:
head指针变量}
{*****************************************}
procedureAgesexsearch(varhead:
pointer);
var
age,n:
integer;
x:
string;
begin
writeln;
writeln('请输入您要查找的年龄和性别');
write('*年龄:
');readln(age);
write('*性别(male/female):
');readln(x);
p:
=head;
writeln;
n:
=0;//记录满足条件的人数
whilep<>nildo
begin
if(age=2014-p^.bir.year)and(p^.sex=x)then//判断是否符合要求
begin
writeln('--------------------------');
writeln('学号:
',p^.num);
writeln('姓名:
',p^.name);
writeln('性别(male/female):
',p^.sex);
writeln('出生日期:
',p^.bir.year,'年',p^.bir.month,'月',p^.bir.day,'日');
writeln('数学:
',p^.mathe,'分');
writeln('语文:
',p^.chinese,'分');
writeln('英语:
',p^.english,'分');
writeln('平均分:
',p^.average:
6:
2,'分');
writeln('--------------------------');
n:
=n+1;
end;
p:
=p^.next;
end;
ifn=0then
begin
writeln;
writeln('对不起,不存在满足您搜索条件的学生!
');//搜索不存在,给出提示信息
end;
end;
{*****************************************}
{function:
子菜单中的成绩替换}
{parameter:
无}
{*****************************************}
procedureChangefig;
begin//fig作为中间参数,需要对哪一个成绩进行操作,就将其值赋值给fig
casechoice[4]of
1:
begin
p:
=head;
whilep<>nildo
begin
p^.fig:
=p^.mathe;
p:
=p^.next;
end;
end;
2:
begin
p:
=head;
whilep<>nildo
begin
p^.fig:
=p^.chinese;
p:
=p^.next;
end;
end;
3:
begin
p:
=head;
whilep<>nildo
begin
p^.fig:
=p^.english;
p:
=p^.next;
end;
end;
4:
begin
p:
=head;
whilep<>nildo
begin
p^.fig:
=p^.average;
p:
=p^.next;
end;
end;
end;
end;
{*****************************************}
{function:
查找某门课成绩最高的学生}
{parameter:
head指针变量}
{******************************