学生成绩管理程序(汇编语言实现)作者:学号:班级学院(系):计算机学院专业:指导教师:分数:2目录1.设计内容及要求...........................................................................................................32.设计思路及方法...........................................................................................................33.程序最终效果...............................................................................................................54.数据结构及各功能模块的具体实现.........................................................................105.程序不足.....................................................................................................................176.实验遇到问题及实验心得.........................................................................................177.附录(源代码).........................................................................................................1831.设计内容及要求设计一个学生成绩管理程序,一个学生包括姓名、班级、学号、成绩。试编写程序,能实现以下功能:(1)成绩需要精确到1位小数(2)可以录入学生成绩(10进制形式)(3)可以按照要求(如学号或成绩)进行排序显示(4)可以统计平均成绩(5)可以统计各个分数段的人数(5)在以上5点的基础上可以增加删除等功能2.设计思路及方法整个程序采用主程序调用子程序,各个子程序完成相应独立的一块功能的方法实现,各个程序的方法实现方法简要描述如下:宏:宏名实现功能nextlinemacro回车换行helpmacroaddress打印提示信息,address为字符串名choicemacro系统总界面的显示,显示各个选项函数:4函数实现功能make_c初始界面的选择插入等操作的子程序clear清屏函数,使用10H中断的06功能将屏幕右下角位置18H行,4FH列(DX)移动到左上角00H,00Hcursor光标定位函数,使用10H中断的02功能将光标定位get进行提示,使用户输入学号等学生信息,并统计总的学生成绩,及对相应各个分数段进行++操作print打印出学生所有学生的信息,包括学号、姓名、班级、成绩等sort冒泡算法对学生以分数进行排序delete删除子程序,根据用户输入的学号进行相应的删除工作,并在末尾进行相应的分数段减一,学生总人数减一,总分数减去删除的学生成绩statistic_print打印出学生的统计信息,包括各个分数段的人数和平均分sta_childstatistic_print的子程序,入口为bx,对各个分数段的人数的字符打印d_b将分数转化为2进制,即10进制转化成2进制,返回参数为bx。其中2进制分数为10进制分数10倍,以存储原有数据的小数部分b_d输出显示时,以10进制显示分数,即把二进制转化成十进制,入口参数为bx,默认保留1位小数,原来是整数,现在显示将变成.0形式print_d显示一位数字的函数print_p显示小数点53.程序最终效果主界面:自己运行程序截图去吧Insert(i)插入学生信息:自己运行程序截图去吧6List(l)显示学生成绩:自己运行程序截图去吧Order(o)以分数进行从高到底排序:自己运行程序截图去吧Statistic(s)统计学生成绩分布:自己运行程序截图去吧Delete(d)删除学生信息(成功:Succesfully,失败:Failed):自己运行程序截图去吧删除后显示学生信息:自己运行程序截图去吧modify(m)通过学号来修改学生的信息:自己运行程序截图去吧7修改后显示:自己运行程序截图去吧退出系统:自己运行程序截图去吧4.数据结构及各功能模块的具体实现(1)数据结构:学生信息的结构manstrucxnumdb10,?,10dup(0);学生的学号xnamedb20,?,20dup(0);学生的名字xclassdb10,?,10dup(0);学生的班级xscoredw0;学生的成绩manends虽然很自然的想到了用结构来存储学生的信息,形成一个完整的独立的数据块,但是在实际编程中并没有怎么很好的利用节后这一数据结构,对信息的存储等仍为基本的偏移操作,这是编程过程中的一个小败笔,。isdb0;修改时用的,判定是否找到相应学号temp1db5,?,5dup(0);为了使输入的分数也能输入错误的情况下回退光标进行修改而用的temp2db10,?,10dup(0);删除时存储学号用的sum_hdw0;总分数的高位sum_ldw0;总分数的低位totaldw0;学生的人数averagedw0;平均成绩s_59dw0;小于60s_60dw0;60到70s_70dw0;70到80s_80dw0;80到90s_90dw0;90到998condb48;结构字段的大小,为常数stuman100dup();学生信息(2)make_cproc流程图:9系统显示界面清屏,进入插入界面1号系统调用接收选择字符是否为i是否为l是否为o是否为s是否为d是否为eNNNNN接收字符并判断是否为c清屏,进入显示界面清屏,进入排序界面清屏,进入统计界面清屏,进入删除界面接收字符并判断是否为c接收字符并判断是否为c接收字符并判断是否为c接收字符并判断是否为c退出系统YYYYYYYYYYYNNNNNmake_c子程序是否为m清屏,进入修改界面接收字符并判断是否为cYYNN对于modify(修改)模块,其实和delete结构差不多,故偷个懒,没有新写一个函数,实现方法为先调用delete函数删除相应学号的信息,再调用get函数输入新的成绩,因此modify完并不是原来的位置,而是数据的末尾。(3)clearproc清屏函数使用10H中断的06功能将屏幕右下角位置18H行,4FH列(DX)移动到左上角00H,00H。BIOS中断类型10H,功能号06H完成屏幕上卷。辅助调用寄存器,AL=上卷10行数,BH=上卷行属性,CH=左上Y,CL=左上X,DH=右下Y,DL=右下X,使用中AL=0,使整屏空白,普通文本模式下IBMPC屏幕被划分为80行25列(从00开始)(4)cursorproc光标定位函数使用10H中断的02功能将光标定位,BIOS中断类型10H,功能号02H,设置光标位置。辅助调用寄存器,BH=页号,DH=行DL=列(5)getproc得到学生的信息流程图:实现:学生信息数据块的末尾位置输入姓名字符串并保存输入学号字符串并保存输入班级字符串并保存Calld_b10转2进制子程序返回到bx中总分数低字加bx高字加CF位统计属于哪个分数段退出getproc模块最初的打算是单独做一个统计各个分数段,及求平均分的子程序,但是仔细一想,其实在输入学生信息的时候就可以完成各个分数段的统计工作,并求出总的成绩。把求平均成绩的任务留到打印统计那一块,因此使用了addsum_l,bxadcsum_h,0来求总分。Bx中装的是calld_b子程序返回的分数,是10进制的10倍以2进制存储11(5)printproc打印子函数打印的流程和get的差不多,循环打印出总的学生的成绩信息等,不包括统计信息(6)deleteproc删除模块流程图:movcx,totalcmpcx,0输入学号字符串比较字符串长度比较字符学号长度的变量是否为0总分减去相应分数,相应分数段减一分数置为0排序Total-1成功地址指到下一个数据块cx-1失败退出学号长度变量减一学号地址加1相等不相等NY不相等相等不为0为0Delete模块基本思路是将相应位置的分数置为0,同时相应分数段人数减一,总分数减去相应分数,之后进行排序,使其达到最后的位置,再将总人数减一,从而隐形的删除了数据块。实现时,因为跳转比较多,故调试时出现了很多错误,最终经过一步一步仔细修改,实现了相应功能。12(7)statistic_printproc模块此子函数是主要是求得平均分并打印显示,同时打印出各个分数段的人数。在求平均分时,因为我把10进制分数乘以10倍存储的,故用下面代码实现:movdx,sum_h;总分的高字movax,sum_l;总分的低字divtotalmovaverage,ax(8)sta_childproc模块是statistic_printproc模块的补充,打印人数的子函数,入口为bx,2进制,输出为打印显示2进制的相应10进制数(9)d_bproc模块10进制转化成2进制的子函数,返回参数为bx。在求原数10倍的时候,使用了移位来求,主要部分如下:addax,bx;将ax和bx相加shlax,1;(ax)×2movbx,axshlax,1;(ax)×4shlax,1;(ax)×8addbx,ax;(ax)的10倍ax中为1位数字的ASCII码减去‘0’。对于输入错误,有以下一些措施(a)默认一串数字只取前两位,如987时应存98.0×10(b)当串中有小数点时,只读取小数点后1位,如98.76时存98.7×10(c)对输入串中出现非0-9的数时,取第一次错误的前面字符,如1a.8存1.0×10(d)对输入以0开头的字符串时,默认为0分(10)b_dproc把二进制转化成十进制的函数,入口参数为bx流程图:13movax,bx;2进制数传给axcmpax,10;和10比较movbl,10divbl;除以10movcl,ah;余数放到cl中cmpax,10;和10比较显示百位和十位显示小数点打印一位小数显示0显示个位小于10小于10大于10大于10退出说明,本程序默认分数小于100,故不存在1000的数,因为存数时是乘以10倍进行存取,故以以上流程图进行。而且默认不管输入是整数还是小数最终输出保留一位小数,因此若输入98,最终显示98.0(11)print_dproc显示一位数字的函数(12)print_pproc显示小数点(13)sortproc排序子程序冒泡算法排序流程图如下:14DecaxAx和0比较Ax到bxmovsi,offsetstuaddsi,46movdi,siadddi,48pushaxmovax,[si]movdx,[di]Ax和dx比较交换数据块decbx;内层循环减一bx和0比较addsi,48adddi,48若为0Total到ax大于等于小于则交换为0则排序完毕不为0冒泡排序法流程图实现从大到小排列155程序不足在界面上不够智能,人机互动过多,重复某项功能操作需要输入c。在显示上存在不足,无法显示过多的内容,没有设计滑块。在存储方面,没有将数据存入文件,造成测试用例为易失性的。在处理错误方面,若像c语言那样考虑语法语义等错误,工程浩大且不太现实,故只处理了几种小错误,因此在错误处理反面还有待完善。sta_child子程序和b_d子程序有些相似,b_d处理分数成小数显示,sta_child处理人数,应该可以合并一下,不过考虑合并后显得更复杂,故仍将其分开。6实验遇到问题及实验心得实验中大大小小问题遇到很多,开始时编时感觉没什