汇编课程设计成绩管理系统+源代码.docx
- 文档编号:28073477
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:45
- 大小:250.88KB
汇编课程设计成绩管理系统+源代码.docx
《汇编课程设计成绩管理系统+源代码.docx》由会员分享,可在线阅读,更多相关《汇编课程设计成绩管理系统+源代码.docx(45页珍藏版)》请在冰豆网上搜索。
汇编课程设计成绩管理系统+源代码
XXXXX
课程设计说明书
汇编语言课程设计
班级:
网络B101姓名:
XXX
学号XXX
设计题目:
学生成绩管理
设计时间:
2012.12.09至2012.12.21
指导教师:
XXX
评语:
_______________________________
_______________________________________
_______________________________________
_______________________________________
_______________________________________
评阅成绩:
___________评阅教师:
____________
一、课程设计的目的
进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。
二、设备与环境
PC兼容机、Windows操作系统、汇编程序masmforwindows2010
三、课程设计要求
1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。
2.遵循模块化、结构化的程序设计方法。
3.要求程序必须正确。
4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。
5.要求程序结构合理,语句使用得当。
6.适当追求编程技巧和程序运行效率。
四、课程设计的课题和分析
题目:
学生成绩管理
分析:
建立学生成绩文档;输入学生各门功课成绩;(假设3门功课);修改指定学号的学生成绩;统计指定学号的学生的平均成绩、总成绩,并在屏幕上显示;统计指定学号课程的平均成绩,并在屏幕上显示;每门课程成绩分析在屏幕上显示3门课程的各个分数段的学生人数;(分数段为:
>=90;80~89;70~79;60~69;<=59)此处可以以表格的形式给出数据,或者以坐标曲线的形式给出。
对学生成绩记录进行检索(按学号、姓名),成绩排序(按总成绩降序排列),退出,最好用到文件处理。
五、流程图、总体设计、详细设计
学生成绩管理,最基本能实现的的功能是输入学号,同时显示该学生的基本的信息,我设计的成绩管理系统功能还包括了显示该生的语文,英语,数学三门学科的成绩,求出了该生的总分,以及该生的平均分,动态输入学生的成绩,而且成绩是按照三位数显示的,可以输入任意多的学生人数,每个学生都是三门课程,最后统计输入所有学生的各科各个分数段的人数,最后显示出所有学生的成绩排名情况。
为了使系统更实际一些,我设计的系统包括建立了文件,方便学生的信息一次录入之后可以保存该数据,将该数据保存在score.txt文件中,而且文件的路径与该软件默认的安装路径一致;为了使系统更方便用户使用,我设计了菜单,菜单中设计了六个功能,包括插入,删除,查询,修改,查看,退出等。
以下是对程序中常用的六个个功能进行解析:
1、数据输入功能:
这是必不缺少的功能,学号的输入,成绩的输入都离不了这个功能,在输入成绩时,特地加了一个判断功能,在输入不合理的成绩时,程序将提示出错,并要求重新输入。
在输入学生学号的时候,程序首先会判断此学生的成绩是否存在,如果存在,则程序提示需重新输入。
插入一条学生记录子模块,搜索可用单元,接收输入的记录,并写入文件。
建立成绩表子模块,控制输入界面,并多次调用插入记录子模块,完成成绩的建立。
2、修改功能:
考虑到会存在在输入成绩时,容易输入错误,或者发生个别学生的试卷被误判需修改成绩等情况,所以加了此功能,在发生以上情况时可以调用此功能,修改指定学生的成绩。
3、删除学生信息的功能。
如果输入的学生信息根本不存在,或者发生其它情况需删除一个无意义的学生信息时,可以调用此功能。
此功能将实现将指定学号学生的信息删除。
4、信息查找功能:
当需要查询某个学生的成绩或者检查输入是否有误时,可以调用此功能,此功能实现将指定学号学生的成绩显示出来。
实际上在调用此功能的同时,程序会首先求的总成绩,平均成绩,然后产生排名结果,最后将数据信息显示。
5、显示排名信息功能:
此功能会将学生成绩自动相加,得到每位学生的总成绩及平均成绩,然后进行排名,得到每个学生的名词,最后按照输入顺序将所有学生的学号,语文成绩,英语成绩,数学成绩,平均成绩,总成绩,名次依次输出。
模块中排名处理、学科平均成绩计算、均需取出某一学科的所有学生成绩,因而此操作作为公用子程序以供调用。
个人总分及平均分处理较为简单,根据索引逐条处理记录。
排名处理。
排名结果为一维数组,与学科成绩存在对应关系。
查询学生记录,先进行学号匹配,再输出一条记录;查询该生的所有信息。
6、文件写入及退出功能。
此功能实现将学生的信息保存在一个文件里。
此程序默认将文件放在C盘下,名称为:
score,属性为txt格式的文本文档。
该文档能够保存数据,以便数据不需要重复录入,是系统更能满足用户需求。
写入文件完毕后,关闭文件,并退出程序。
该程序的流程图:
文件创建和菜单显示:
在创建文件时使用命令请求创建文件,以下是菜单显示,首先显示菜单的界面,1号功能接收功能,程序先和菜单中所有的功能都进行比较,假如都不是功能菜单,则提示输入错误,重新输入,假如输入正确,则调用相对应的子程序。
文件内容显示:
在文件查找的子程序会显示该生的学号,三门的成绩,该生的总分,平均分和该生成绩的排名情况,则在显示学生信息之前先处理数据,成绩和总分是按照三位数的处理,学号和名次是按照两位数处理的,总分是字类型,其他的是字节类型,所以必须要转换基址才能找到该生相对应的总分。
文件的删除则是先找到该学生的信息,然后显示该生的成绩缓存区的地址的下一位,则显示的是空白。
总分和名次
定义子程序sumprocnear,先是从存放各科的缓存区移出数据,然后相加,采用循环,对用户输入的数据都是按照这个规则求出该生的总分;pingprocnear是求出该生的平均分,把之前存放在zc[bx]的总分数据取出来,然后除以3;
六、遇到的问题及解决办法
问题:
在编写程序时,不知道删除的程序应该如何实现,以及在创建文件时不知道如何下手,然后老师提示是采用中断,我们需要自学中断,在设置光标和屏幕显示也是采用中断,我自能自学课本的第九章内容,然后再写程序,在文件的删除那里我卡住了研究好久也不知道怎么实现,最后我问了我同学,我们一起讨论出的结果就是让屏幕不显示当前指针指向的内容,显示指针指向的一个内容即可,这样就可以实现删除功能,删除功能就是删除该学号学生的成绩数据,使这些数据全部清空则达到了删除文件的功能;
关键代码:
此段代码时是实现数据段插入功能首先提示输入学号的语句,然后调用shuru的宏定义,这个宏定义是接收键盘输入的两位数,然后处理成十进制输出,比较符合实际,然后把n学生个数给bl,将输入的学生学号保存在xh[bx]数组中,方便使用,然后判断该学号是否为第一次输入,是则跳转,假如不是第一次输入,则提示用户该学号已经存在,需要重新输入,跳转到输入成绩的子程序,在调用shuruu宏,此功能是处理三位数,使成绩是按照三位数显示的,而且必须是在合理的范围内的,假如输入的数据是不合理的则又跳转到重新输入的界面,要求用户输入有效数据,数据输入完成之后则存入相对应的缓存区。
;*********************************************
inputprocnear;输入学生学号,成绩
e6:
outputmess1
shuru
movbl,n;统计输入学生个数
movbh,0
movxh[bx],dl;输入的个数同时以地址指针形式显示
cmpbx,0;判断是不是第一次输入,如果是,则跳过比较程序
jeqq1;继续输入成绩
movcl,n;如果不是第一次输入则要将输入的学号与以前输入的比较
cbw
movsi,0
moval,xh[bx]
e7:
cmpal,xh[si]
jee5
addsi,1
loope7
jmpqq1
e5:
outputts4
jmpe6
qq1:
outputmess2;如果不是重复的学号则可以继续输入成绩和其他信息
outputmess4
movsi,0
movcx,3
qq3:
shuruu
cmpdx,78h;比较输入的成绩是否大于120,如果大于120的话,那么重新输入成绩
jbeqq2
outputts3;提示输入错误
jmpqq1
qq2:
movbuf[si],dl;把输入的学生信息保存在缓存区
outputbg
addsi,1
loopqq3
movbl,n
cbw
moval,buf[0];以下是把之前的成绩数据保存到相对应的缓存区
movchi[bx],al
moval,buf[1]
moveng[bx],al
moval,buf[2]
movmat[bx],al
ret
inputendp
;**********************************************
该关键代码是实现该学号学生的总分和名次的交换以及显示,首先是先把即将要用到的存储器全部清零,将名次mc[si]初值为1,si依次+1,因为存放名次的数组是字节类型的,然后把n学生的个数赋给cl,接下来就是处理查找总分的地址指针,因为总分数组是字型所以需要使bl*2,然后cx清零,按照学号找到相对应该生的总分,两个总分相比较此时大的则暂时为第一名,然后再继续接受总分,接受的总分又要和之前暂时的第一比较然后和暂时的第二名比较,循环找出第一名,继续循环,显示总分和名次。
;**********************************************
rankprocnear;排名
movcl,n
movch,0;将用到的存储器清零
movsi,0
rrc:
movmc[si],1;将存储名次的存储器给予的初值是1
addsi,1;
looprrc
moval,n;此处2n最后放到al中,是为了下面总分的输出
movbl,2
mulbl
movcl,n
movch,0
movsi,0
movbx,0
movdi,0
rrb:
movdx,zc[di]
rra:
cmpdx,zc[bx];总分之间的比较
jgecontinue;大于等于的那个分数则为第一名
addmc[si],1
continue:
addbx,2
looprra;余下的继续比较依次排出名次
movcl,n
cbw
addsi,1;名次是字节类型的
adddi,2;总分是字类型的
movbx,0
cmpsi,ax;ax里面是2n为了找到总分输出
jberrb
ret
rankendp
;**************************************************
七、结果显示
菜单显示界面图:
首次输入学生信息界面;修改学生信息界面;查看学生各个分数段的界面;
删除学生信息界面:
查看学生成绩排名情况界面:
八、感想、收获及体会
终于完成了一门课程设计,比起之前完成的综合实验我觉得自己又上升了一个台阶,学到的东西更多了,虽然自己付出了两周的时间,但是一个好的程序员就需要舍得花时间去创建更加完美的程序,完成更多的功能,满足用户更多的要求。
这次的课程设计和自己上课学到的东西有很多不同,需要自己去查看中断的代码,因为此次课程设计老师要求我们必须有文件的创建和文件存储和文件关闭,给课程设计增加了难度,课设正是这样,所以在完成这门课设之后,我真心觉得自己的编程水平又上升,同时也说明了好多东西是可以靠自己领悟和自学得来的;课程设计完成了,但是我设计的成绩管理系统还是存在不足:
成绩都是用整数表示的,没有实现浮点运算;平均成绩也是按照整型的,查询功能中只能通过学号查询,没有实现学号或者通过姓名查询的选择;主菜单界面设计不够人性化,不够简单明了,缺少美观,没有使用彩色的界面。
虽然我的程序中出现那么多的不完美,但是只有我有一颗追求完美的心,则我就会有一个继续学下去的心。
此次的课程设计,我还是和以前的综合实验的感触有些类似,在此之前,大多数时候都在用高级语言编写程序,已经习惯了高级语言的方便灵活的语法形式。
一下子突然转为用汇编语言进行程序设计,总是要经过一个很不习惯的适应过程。
但是我们学习编语言,可以让我们更好地理解程序设计的本质和原理。
对以后的学习和工作都带好很多好处。
这次在编写和调式汇编程序过程中体会最深的就是,没有好的工具,汇编程序的调式工作太困难了!
这次使用的是微软的masm5.0编译工具,是DOS底下的编译工具,但是没有其它可视化的调式工具,只能利用DOS底下的debug命令进行调式。
程序稍微长一点的时候,调试起来就不是那么方便了,主要问题是在debug中虽然可以反汇编,但是反汇编后的源程序与自己写的不太一样了(符号常量和标号都变成了数字地址),不方便辨认当前调式程序对应于源代码中的哪一行。
这些疑问都是我完成课设的难点,自己学的不是很透彻,在完成报告之前,我花了一天的时间和同学讨论我的程序,通过对这学生成绩管理的的设计,使我对汇编语言的基本知识的使用更加熟练,同时也增加了我对汇编语言的一些认识,在作业完成过程中通过和同学的交流,也增加了合作的技巧。
通过查阅资料也学到了一些课本上没有的东西,有幸接触到中断这个功能,同时更是让我明白了即使是低级的汇编语言也可以完成高级语言可以完成的程序,历时两周终于完成,这次课程设计中有很多源程序的子程序的源代码可以从资料中或获得,但有很多都需要我们仔细琢磨才能明白其中的原理,同时程序中需要调用大量的BIOS和DOS系统功能调用,如显示字符串的功能调用、光标设置的功能的调用、清屏的功能调用等,这些问题如不查询资料就无法理解,因为上汇编语言基础时对这些DOS和BIOS的系统功能了解很少,所以我们需要查询DOS和BIOS功能的系统调用的基本信息。
还有在一些循环结构设计上也有许多不能理解的地方,都需要加以深刻的理解才能将问题顺利的解决,多整个程序的理解也有了更进一步的了解。
有时候遇到自己查资料和不能理解的地方时,自己不能解决时,先找同学讨论一下,会有意想不到的收获,有些问题就会迎刃而解。
即使是花了两个周的时间完成一个程序,但是我可以骄傲的告诉别人我完成一个程序了,完成了一个设计,将来我更有底气的告诉别人这个是我的成品,就如老师说的,我们可以骄傲的告诉面试老师我曾经完成的作品。
目前已是大三的我们,我们完成的课程设计已经很多了,但是我对此次的课设感慨真的很多,因为这次完成真的太不容易,因为我自己本人觉得我真的一点都学不会,居然也可以完成如此浩大的程序编写,真的是我想不到的,虽然此程序我参考了资料,咨询了同学,但是那些收获是我都很惊叹的,进一步的拓宽了我的汇编知识,同时最重要的一点是要学的精通可以靠自己自学,很多知识是我们自己就可以领悟的。
虽然本程序仍然存在不少缺点和不足,但是只要我有心,只要我舍得花时间去自学,看看视频,一定能使我的编程能力提升,克服所以的不足,设计出更出色的作品。
九参考文献
[1]郑晓薇编著,《汇编语言》机械工业出版
[2]《IBM—PC汇编语言程序设计实验教程》
[3]《IBM—PC汇编语言程序设计(第2版)》
十附录。
①用户手册使用说明:
可以根据我上面粘贴的运行界面进行使用,选择自己需要的功能
②源程序清单:
huancunmacroj,t;将三位数的数据转换成为三个对应的字符,并将其存入缓冲区zs中j,t是两个哑元
pushbx;入栈是对存储器里面的值进行保护
movsi,t;对两个哑元进行说明
movax,j
movbl,100;对输出的数据进行处理,显示出百位十位个位
divbl
addal,30h
movzs[si],al;把处理好的百位进行缓存区
addsi,1
moval,ah
cbw
movbl,10;对十位的处理
divbl
addal,30h
addah,30h
movzs[si],al
addsi,1
movzs[si],ah;对个位的处理,
addsi,1;对输入的数据反复处理,指针下移
popbx;存储器出栈
endm
clearMACRO;清屏的宏定义
MOVAH,2;设置光标位置
MOVDH,0;行号
MOVDL,0;列号
INT10H;屏幕及光标控制int10h
MOVAH,6;屏幕开窗口
MOVAL,0
MOVBH,7;颜色属性是正常显示,黑底白字
MOVCH,0;左上角的行号
MOVCL,0;左上角的列号
MOVDH,24;右上角的行号
MOVDL,79;右上角的列号
INT10H;调用10号功能,设置屏幕的坐标是(0,0)(24,79)
ENDM
kongmacro;回车换行的宏定义
movah,2;2号功能输出回车换行
movdl,0ah
int21h
movah,2
movdl,0dh
int21h
endm
outputmacrop;字符串输出
movdx,offsetp
movah,9
int21h
endm
shurumacro;二位数数据输入
movah,01;1号功能的输入,输入的值放在dl中
int21h
subal,30h;对输入的数据先减掉30h
cbw;字节扩展成字类型
movbl,10;对输入的数据进行乘以10
mulbl
movdl,al;把al中的乘积取出来,放在dl中
movah,01h
int21h
subal,30h;处理完了要加上30h再用一号功能输出
adddl,al
endm
zhuanemacroe,b;将二位数转换成对应两个字符,并将其存入缓冲区zs
pushbx
movsi,b;以下是对两个哑元的说明
moval,e
cbw
movbl,10;对二位数据的处理就是先显示出十位然后显示出个位
divbl
addah,30h
addal,30h
movzs[si],al;处理好的数据存放在zs存储区
addsi,1
movzs[si],ah
addsi,1;指针再下移,继续处理下一个
popbx
endm
zhuansmacrof,s;将三位数成绩转换成为对应的三个字符,并存入缓冲区zs中
pushbx
movsi,s
moval,f
cbw;需要扩展,字节扩展成字
movbl,100
divbl
addal,30h
movzs[si],al;百位存放在存储区
addsi,1
moval,ah;把余数取出来
cbw;字节扩展成字
movbl,10
divbl
addal,30h;把ah中的余数取出来再进行除以10,最后的余数还是存放在ah中,此次的商放在存储区zs中
addah,30h
movzs[si],al
addsi,1
movzs[si],ah;最后的余数在ah中,其实就是三位数的个位
addsi,1;指针下移
popbx
endm
shuzimacror;二位数据输出,以下是对数据输出的处理
moval,r
cbw
movbl,10;对数据的输出和输入一样也需要进行处理,以十进制显示出来
divbl
movbl,ah
movdl,al
adddl,30h
movah,2;2号功能显示十位
int21h
movdl,bl
adddl,30h
movah,2;2号功能显示个位
int21h
endm
shuruumacro;三位数数据输入
shuru
moval,dl;用1号功能的输入值存放在dl中,首先把dl中的值存放在al中
movdl,10
muldl
movdx,ax;乘以10以后的值存放在ax中;需要取出放在dx中
movah,1
int21h
subal,30h
cbw;加完30h再把字节扩展成字
adddx,ax
endm
shuziimacrou;三位数数据输出
movax,u
movbl,100;对百位的处理,把100赋给bl
divbl
movbl,ah;商在al中,余数在ah中
movdl,al;把商从al中取出来
adddl,30h;在显示百位之前加30h,再放到dl中
movah,2;2号功能显示
int21h
shuzibl
endm
DATASSEGMENT
mdw0;移动文件指针时,选择绝对移动方式,则m代表指针偏移量
zsdb18dup(?
);缓冲区用来存放单个学生信息的字符
pathnamdb'C:
\score.txt',00h;建立目录项
handledw?
;文件句柄
bufdb3dup(?
);输入缓冲区
zcdw100dup(?
);存放总成绩的数组
pjdb100dup(?
);存放平均成绩数组
ndb0;存放输入的学生信息的个数
gs0db5dup(0);记录所查询科目分数段的
gs1db5dup(0)
gs2db5dup(0)
mcdb100dup
(1);存放学生的名次的数组
chidb100dup(?
);存放学生成绩的数组
engdb100dup(?
)
matdb100dup(?
)
xhdb100dup(?
);存放学生学号的数组
cour0db'chinese','$';语文
cour1db'english','$';英语
cour2db'maths','$';数学
tsdb13,10,'Youaresuccessful,pressanykeytocontinue!
',13,10,'$';以下是提示语句
ts1db13,10,'Youarewrong,Tryagain!
',13,10,'$'
ts3db13,10,'Thescoreyouinputisbiggerthan127,inputagian!
',13,10,'$'
ts4db13,10,'Theschoolnumberyouinputisexist,pleasetryagain!
',13,10,'$'
ca
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 课程设计 成绩管理系统 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)