课程 设 计 报 告
题目:成绩管理系统的设计与实现
姓名:徐清勇
王传浩
一、课程设计题目
成绩管理系统的设计与实现
二、课程设计目的
用汇编语言完成一个多功能的程序题,从而达到熟练运用汇编语言编程实现有比较完整功能的系统的目的。
三、课程设计内容
设计并实现一个学生成绩管理系统。学生的信息包括学号、姓名,成绩包括语文、数学、英语和计算机,并能根据这四门成绩计算得到平均分(不记小数)。系统中记录数不超过100条,学号不超过3位,姓名不超过16个字符,每门课成绩不超过100分。
基本功能:
①显示主菜单,提供添加记录和成绩显示两个选项;
②进入添加记录后,有提示信息,根据提示信息分别输入学号、姓名和每门课的成绩,计算平均分,将信息存储到记录表后,按ESC键返回主菜单;③进入成绩显示,将所有学生的信息和成绩显示出来,格式如下:
| ||||||||||||||||||||||||
附加功能:
①在基本功能基础上,在主菜单中增加删除记录、查询/修改记录和平均分排序三个选项;
②进入删除记录后,输入学号,如果该学号有记录,则将该记录删除,否则提示,按ESC键返回主菜单,该记录在以后的查询或成绩显示中不再显示;③进入查询/修改记录后,输入学号,如果该学号有记录,则按格式显示该条记录,并提示是否修改,按“Y”键进行修改,与添加记录的提示信息相同,只是不能再输入学号和姓名,只能修改四门课的成绩,并计算平均分,将信息存储到记录表,按ESC键返回主菜单;
④进入平均分排序后,根据表中记录,将平均分按从大到小顺序显示所有记录,按ESC键返回主菜单。
四、课程设计说明
4.1基本原理
本程序使用了DOS系统功能调用(INT21H),程序中用到的系统功能调用如下:
AH | 功能 | 出口 | 注释 |
01H | 从键盘输入一个字符并回显 | AL=输入字符 | 本功能自动在屏幕上显示所键入的字符 |
02H | 写字符到标准输出设备 | DL=要显示的ASCII 字符 | |
09H | 显示字符串 | DS:DX=字符串起始地址 | 字符串必须以‘$’符结束 |
0AH | 从键盘输入一串字符到缓冲区 | DS:DX=自定义的缓冲区首地址 | 缓冲区的第一个字节包含缓冲区的长度,第二个字节为实际输入的字符个数(不含最后一个回车符),由系统回填,从第三个字节开始到缓冲区的末尾包括输入的字符串以及回车符(必须以回车符结束) |
4.2数据存储格式
在数据段里定义记录表,用来保存每一个学员的信息记录,这里给每一个学
员分配36个字节空间来存储他的信息,每条记录具体情况如下所示:
| 学号 | 姓名 | 语文 | 数学 | 英语 | 计算机 | 平均分 | 换行 | |||||||||||||||
| 0 | 1 | 2 | 3 | … | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F | 20 | 21 | 22 | 23 |
0 | 0 0 1 | John | 8 0 | 8 0 | 8 0 | 8 0 | 8 0 | 0a | 0d | ||||||||||||||
1 | 0 0 2 | Anne | 7 0 | 7 0 | 7 0 | 7 0 | 7 0 | 0a | 0d | ||||||||||||||
4.3程序的流程图
程序实现的是6个功能,即分别是添加学员记录功能、学员成绩显示功能、
删除学员记录功能、查找和修改学员记录功能、按平均分对学员成绩进行排序功
能和退出功能。下面是主程序执行操作的流程图以及各功能模块执行操作流程图:
主流程图:
开始
主功能菜单
选择操作
1 | 2 | 3 | 4 | 5 | 6 |
查 | 按 |
添 | 学 | 删 | 找 | 平 | 退 |
和 | 均 | ||||
加 | 员 | 除 | 修 | 分 | |
学 | 成 | 学 | 改 | 对 | |
员 | 绩 | 员 | 学 | 成 | 出 |
记 | 显 | 记 | 员 | 绩 | |
录 | 示 | 录 | 记 | 排 | |
录 | 序 |
选1继续
是否继续
选2退出
退出
各功能模块流程图:
1)添加学员记录功能模块:
添加学员记录开始
输入学号
判断学号长度是 | Y | 提示学号输入错 |
否超过3个字节 误,请重新输入
N
调用子程序查找 | Y | 提示学号不存在, |
该学号是否存在 | 请重新输入 |
N
输入姓名
判断姓名长度是 | Y | 提示姓名输入错 |
否超过16个字节 误,请重新输入
N
输入语文成绩
调用成绩计算子程序 | Y | 提示语文成绩输入 |
判断是否超过100 错误,请重新输入
N
输入数学成绩
调用成绩计算子程序 | Y | 提示数学成绩输入 |
错误,请重新输入 | ||
判断是否超过100 |
N
输入英语成绩
调用成绩计算子程序 | Y | 提示英语成绩输入 |
判断是否超过100错误,请重新输入
N
输入计算机成绩
调用成绩计算子程序 | Y | 提示计算机成绩输 |
判断是否超过100入错误,请重新输入
N
调用平均值计算子程序并显示添加成功
添加学员记录结束
2)学员成绩显示功能模块:
学员成绩显示开始
调用显示记录子程序并显示记录结果
(具体思想见功能模块的详细说明)
学员成绩显示结束
3)删除学员记录功能模块:
删除学员记录开始
输入要删除的学员学号
调用查找学号子程序 | N | 提示学员学号不存 |
判断该学号是否存在
Y
调用删除记录子程
序并提示删除成功
在,删除操作失败
删除学员记录结束
4) 查找和修改学员记录功能模块:
查找和修改学员记录开始
输入要修改的学员的学号
调用查找学号子程序
判断该学号是否存在
N | 提示学员学号不存 |
在,删除操作失败
Y
输入语文成绩
调用成绩计算子程序 | Y | 提示语文成绩输入 |
判断是否超过100 | 错误,请重新输入 |
N
输入数学成绩
调用成绩计算子程序 | Y | 提示数学成绩输入 |
判断是否超过100 错误,请重新输入
N
输入英语成绩
调用成绩计算子程序 | Y | 提示英语成绩输入 |
判断是否超过100错误,请重新输入
N
输入计算机成绩
调用成绩计算子程序 | Y | 提示英语成绩输入 |
判断是否超过100错误,请重新输入
N
调用平均值计算子程序并显示修改成功
查找和修改学员记录结束
5)按平均分对学员成绩排序功能模块:
按平均分对成绩排序开始
调用平均值排序子程序
(具体见功能模块详细
说明)
按平均分对成绩排序结束
4.4功能模块说明
该程序一共分为五大功能模块:分别是添加学员记录、学员成绩显示、删除
学员记录、查找和修改学员记录以及按平均分对学员成绩进行排序。各功能模块
分别介绍如下:
4.4.1添加学员记录
添加学员记录包括学员的学号、姓名、语文成绩、数学成绩、英语成绩、
计算机成绩。当学员的信息输入之后,程序会自动计算出该学员的各门学科的平
均成绩,并将平均分数据放到该学员记录的相应位置。
⑴学号的输入
首先利用0AH号系统调用将字符串输入到定义在数据段里的内存缓冲区,
然后从内存缓冲区里将输入的字符串取出并放在相应的学员记录的学号位置里,
由于学号只有3位,所以当输入超过3位时程序就会提示学号输入错误,请重新
输入学号,截图如下:
具体的实现原理就是根据缓冲区的第二个字节,即实际输入的字符个数,拿这个与3
进行比较,若大于3则显示错误提示信息,否则正确继续输入。
⑵姓名的输入
姓名的输入方式和学号的输入方式一样,还是利用0AH号系统调用将字符串输入到定义在数据段里的内存缓冲区,然后从内存缓冲区里将输入的字符串取出并放在相应的学员记录的姓名位置里,由于姓名给了16个字节来存储,所以当输入超过16个字节时程序就会提示姓名输入错误,请重新输入姓名,截图如下:
具体的实现原理就是根据缓冲区的第二个字节,即实际输入的字符个数,拿这个与16进行比较,若大于16则显示错误提示信息,否则正确继续输入。
⑶语文成绩的输入
首先利用0AH号系统调用将字符串输入到定义在数据段里的内存缓冲区,由于输入的是成绩,故成绩不可能大于100,所以调用一个子程序来计算输入的成绩是否超过100,当超过100时则提示输入错误,否则将缓冲区里的字符放到学员记录语文成绩位置里,并继续进行下面成绩的输入,在输入其他的成绩之前将子程序计算出的成绩结果暂时存放在一个寄存器里,本课程设计用的是ax寄存器,然后将其存放于栈里,便于后面计算成绩的平均分。
调用的子程序来计算的思想是将输入的字符形式转换为数值表示,即先判断输入的字符个数从而确定是几位数,对于三位数,则将第一个字符的ASCII码减去30h,再乘以100,得到百位值并存放于ax寄存器,对于第二个字符,还是将其的ASCII码减去30h,再乘以10,得到十位值并将其与ax寄存器里的值相加存放于ax里,对于第三个字符,则是直接将其ASCII码减去30h,即得到了个位数,将其与ax寄存器里的值相加从而得到输入的三位数的数值表示,接着就是拿这个数值与100进行比较,大于100则跳到提示错误处执行,不然就返
回主程序执行。
当输入的语文成绩超过100时出错的截图如下:
⑷数学成绩的输入
数学成绩的输入与语文成绩的输入一样,还是调用之前的子程序来判断是否超过100,要注意的是计算的成绩还是暂时存放于ax寄存器里,然后将栈里存放语文成绩的值弹出到dx寄存器,再令ax寄存器里的值与dx寄存器里的值相加存于ax寄存器里,再入栈。接着将缓冲区里的字符放到学员记录数学成绩位置里,并继续进行下面成绩的输入。
当数学成绩的输入超过100时出错的截图如下:
⑸英语成绩的输入
英语成绩的输入与前面成绩的输入一样,还是调用之前的子程序来判断是否超过100,要注意的是计算的成绩还是暂时存放于ax寄存器里,然后将栈里存放语文、数学成绩之和的值弹出到dx寄存器,再令ax寄存器里的值与dx寄存器里的值相加存于ax寄存器里,再入栈。接着将缓冲区里的字符放到学员记录英语成绩位置里,并继续进行下面成绩的输入。
当英语成绩的输入超过100时出错的截图如下:
⑹计算机成绩的输入
计算机成绩的输入与前面成绩的输入一样,还是调用之前的子程序来判断是否超过100,要注意的是计算的成绩还是暂时存放于ax寄存器里,然后将栈里存放语文、数学和英语成绩之和的值弹出到dx寄存器,再令ax寄存器里的值 接着将缓冲区里的字符放到与dx寄存器里的值相加存于ax寄存器里,再入栈。
学员记录计算机成绩位置里,并继续进行4科成绩平均值的处理。
当计算机成绩的输入超过100时出错的截图如下:
⑺平均成绩的存储
根据上面的成绩的输入,通过程序已将前面4科成绩的和存放在了栈里,所以出栈,并将栈里的值除以4得到4科成绩的平均值。下面要处理的就是将得到的数值形式的平均值转换为字符形式存放于学员记录的平均值位置里。具体的思想就是先判断平均值是否是100,是的话则直接在学员记录的平均值位置写入相应的字符信息,即31h、30h和30h;如果值不是100,那么就是小于100的,则将值除以10,得到的商使其加上30h转换为字符存放于学员记录的平均值位置里,对于余数则加上30h再存放于学员记录的平均值位置里。
一个记录添加完且正确会提示添加成功,截图如下:
4.4.2学员成绩显示
由于将学员的信息存放于数据段里定义的一段内存空间里,且每一个学员的信息占36个字节,即为一个记录。这里利用09h号系统调用来将学员信息显
示出来,在数据段里定义一个变量count用来表示学员记录的个数,利用双重循
环来显示,将count值赋给cx寄存器作为外层循环数,而内层循环数为24h,一
个内层循环显示一行,即一个学员的记录,用loop指令实现循环操作。
学员信息记录显示截图如下:
4.4.3删除学员记录
要删除一个学员的记录,首先先输入该学员的学号,调用子程序来进行学号
的查找,判断该学号是否存在,如果不存在,则无法删除,如果存在进一步给出
提示来确定确实要删除该学员的记录。
具体思想是:
1、对于查找学号是否存在子程序的实现,即采用一一匹配,利用0Ah系统
调用输入要删除的学员学号,输入的字符存放在缓冲区里,拿缓冲区里的字符与
每个记录的学号部分进行一一比较,当都相同时则返回已找到该学员,这里是采
用给ch寄存器赋值为1表示已找到,为0表示目前的记录里没有该学号。
2、当输入的学号存在时,则进行删除操作,这里定义一个变量count1来表
示要删除的记录是位于目前所有记录里的第几个记录,而count1的值的确定是
在查找学号子程序里获得的,即先令count1值赋为0,每进行一次比较则将count1
的值加1,当查找到时则直接返回到调用该子程序的主程序里。下面就是将找到
的那条记录用后面的那条记录覆盖,而后面的那条记录再用其后面的记录覆盖,
依此下去,直到最后一条记录。
下面是进行删除操作时输入的学号存在的截图:
下面是进行删除操作时输入的学号存在时进行的提示以及删除成功的截图:
4.4.4查找和修改学员记录
要修改一个学员的信息,首先要输入该学员的学号,通过调用查找学号子
程序来判断该学号是不是存在,若存在,则进入修改,否则提示该学号不存在,
修改操作失败,直接退出到主界面。对于查找学号子程序的思想在上面已经介绍
过了,这里不再重述。
进入修改的界面,先输入要修改的语文成绩,接着输入要修改的数学成绩、
英语成绩以及计算机成绩,输入完毕之后将提示修改成功。这里没有对成绩的输
入进行其正确性的检查,即有没有超过100。
下面是修改一个学员成绩信息的几个截图:
图1输入的学号不存在的情况
图2输入的学号存在的情况
图3未修改该学号的成绩的情况
图4在修改了该学号的成绩之后的情况
4.3.5按平均分对学员成绩进行排序
按照平均分对学员的成绩进行排序,这里的排序是由小到大的的排序,采用的是冒泡排序方法对每个学员的成绩的平均值进行排序。具体实现的思路是:在数据段里定义两个100字空间,在程序里是data1和data2,对于data1存放的是未经过排序的每个学员成绩的平均值,而data2存放的是经过排序的每个学员成绩的平均值,而每个字的前一个字节存放的是相应学员的序号,即该学员是第几个学员,而后一个字节存放的是该学员的成绩的平均值。通过对data2进行排序,利用冒泡排序,从第一个与第二个进行比较开始,如果第一个小于等于第二个,则不变动,并向前移一位接着进行比较;如果第一个大于第二个,则进行交换,是整个字的交换,并向前移一位接着进行比较。当一次比较完毕,再从头开始进行新一轮的比较,直到无需再进行交换为止。排好序之后,接着就是将其输出,根据data2的每个字的前一个字节,即学员的序号来通过调用输出子程序将每个学员记录输出。
下面是按平均值排序的截图:
图1未经过排序的情况
图2经过排序的情况
五、自我评价与总结
通过汇编程序的课程设计实践活动,感觉对汇编程序的编写以及汇编的基础
知识有了较为深刻的掌握。
在此之前,大多数时候都在用高级语言编写程序,已经习惯了高级语言的方
便灵活的语法形式。一下子突然转为用汇编语言进行程序设计,总是要经过一个
很不习惯的适应过程。不过,这些是很有必要的。通过使用汇编语言,可以让我
们更好地理解程序设计的本质和原理。对以后的学习和工作都带好很多好处。而
且,这门语言也有它自己特点——高效。在特定场合,高级语言无法完成的任务,
还是得靠它。
这次在编写和调式汇编程序过程中体会最深的就是,没有好的工具,汇编程
序的调式工作太困难了!这次使用的是微软的masm编译工具,是DOS底下的
编译工具,这倒还可以,但是没有其它可视化的调式工具,只能利用DOS底下的debug命令进行调式。程序稍微长一点的时候,调试起来就不是那么方便了,主要问题是在debug中虽然可以反汇编,但是反汇编后的源程序与自己写的不太一样了(符号常量和标号都变成了数字地址),不方便辨认当前调式程序对应于 只是不源代码中的哪一行。
通过列表文件中的地址与源代码对应关系可以确认,方便。
程序中不足的地方是:成绩都是用整数表示的,没有实现浮点运算。
程序中使用了过程式编写方法。使得程序结构清晰,便于修改和分开调式。
如果把程序的功能再完善一下,比如实现浮点运算,统计汇总等功能就更好了。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务