华北科技学院综合性实验报告
《 汇 编 语 言》课程综合性实验报告
实验题目 显示学生名次表 一、实验目的 通过显示学生成绩名次表,进行汇编语言程序设计应用的综合性训练。综合运用汇编语言循环程序、子程序、宏指令编程方法,提高汇编语言程序设计能力的应用水平。 二、设备与环境 PC兼容机、Windows操作系统、汇编程序masm for windows 2012。 三、实验内容 1.实验内容: 编制一程序,要求接收从键盘输入的一个班的学生的学号、姓名、成绩,对学生的成绩进行排序,再按学号顺序和学生名次顺序分别把学生成绩显示出来。 2.实验要求: ①必须画程序流程图。 ②本程序要求要有多重循环和子程序及宏,其中成绩输入、计算学生名次、显示学生名次都分别用子程序,也可用宏处理。 ③要求用菜单选择,输入1时按学号顺序输出成绩(包括姓名、学号、成绩、名次),输入2时按成绩排名顺序输出成绩(包括姓名、学号、成绩、名次)。 四、实验结果及分析 1.主界面的设计与实现: (1)程序分为两个菜单: ①一级菜单:完成学生成绩的录入或从本地文件中载入学生成绩信息。(图 1-1 )用户输入对应选项1、2、3或L、C、E,分别执行相应的功能。 输入1(或 L ):表示从文件中读取学生成绩信息; 输入2(或 C):表示重新录入学生成绩信息,并保存到文件中; 输入3(或 E):表示退出程序。 ②二级菜单:完成对学生成绩信息的排序,并输出排序后结果。(图 1-2 ) 输入1:完成按学号排序(升序)并输出排序后结果; 输入2:完成按总分排序(降序)并输出排序后结果; 输入3:返回一级菜单。 图 1-1程序主界面: 第 1 页
华北科技学院综合性实验报告 图 1-2 程序二级菜单界面: 2.排序功能的实现: 图 1-2 输入学生成绩界面: 图 1-4 按总分排序输出学生成绩信息: 3.设计思路: (1)数据定义:
第 2 页
华北科技学院综合性实验报告 一个数据元素(一个学生的数据项)应该为一个结构类型,定义如下: STUDENT STRUC LINK DW 0 ID DB '000' ; 定义学生结构体 ; 单链表指针,指向下一个节点偏移地址 ; 学号 ; 姓名 ; 语文成绩 ; 数学成绩 ; 总分 NAMES DB '$$$$$$$$' CSCORE DB ? MSCORE DB ? SUM DB ? STUDENT ENDS 其中,LINK 字段为链指针,指向数据元素的后续地址,它占用一个字,其初值为 0;ID字段为3个字节,存放学号,为了输入输出方便,学号以3位十进制数字的字符存放;NAMES字段为 8 个字节,存放姓名,为了方便输出,预设8个‘$’符号;CSCORE字段、MSCORE字段和SUM字段分别为学生的语文成绩、数学成绩、总成绩,由于这3个字段的值不超过200,分别以一个字节的二进制存放即可。 每一个学生的数据信息为结构S这样一个数据元素。则 10 个学生需要分配10个这样的数据元素的存储单元。用上面的结构名 STUDENT 作为伪指令定义学生数组如下: S_ARRAY STUDENT 10 DUP(< >) ; 预设学生人数为 10 S_ARRAY 是一个结构类型的数组,它包括 10 个元素,每一个元素为一个 STUDENT类型的结构。 在建立链表的过程中,会用数组元素的首地址装填LINK字段,为了避免冲突,数组元素的首地址不能为 0 和 1 ,因此,在数据段定义中定义 S_ARRAY 数组之前,用 DW分配了一个字,使数组 S_ARRAY 的第一个元素的位移量不为 0,也不为 1。 (2)方法和步骤: 这个程序主要包括3个部分:输入数据、按学生的总成绩由高到低(降序)建立链表和按学生名次输出学生信息。 ①输入数据。 从数组的第一个元素开始,顺序填装数据元素,因此设置循环将S_ARRAY 数组第一个元素的位移量送至 BX,每一次循环,BX加上 TYPE S_ARRAY(值为 16),使BX指向S_ARRAY数组中下一个元素的起始地址。 装填每个元素的各字段值:输入学号存放到 S_ARRAY 数组元素的 ID字段;输入姓名、语文成绩、 数学成绩并分别存放到数组元素的 NAMES字段、CSCORE字段和MSCORE字段;将CSCORE字段和MSCORE 字段的值相加得到总成绩送入SUM字段。 ②按学生的总成绩由高到低进行排序建立链表。 这一部分任务是按学生总成绩由高到低进行排序。采用单链表方式,给数据元素的链指针 LINK 字段装填数据,使LINK字段指向它的后继数据元素。步骤如下: 第 3 页
华北科技学院综合性实验报告 Ⅰ. 初始时,数组元素的每个LINK字段值为 0,表示数组元素没有被选中。扫描数组元素的SUM字段,从中找到第一个最大的数,将这个数组元素设置为链表的头,保存这个数组元素的位移量,并将其LINK字段设置为 1,标记这个数组元素已被选中但尚未装填链指针。 Ⅱ. 扫描整个数组,从链指针字段为 0 的数组元素中寻找 SUM 字段最大的数组元素,将这个数组元素的位移量填至上一个最大元素的LINK字段,并将 1 送至这个数组元素的LINK字段。 Ⅲ. 重复执行步骤 Ⅱ ,最后剩下一个链指针字段值为 1 的数组元素,该元素是链表的链尾。 ③ 按名次(总成绩由高到低的顺序)输出学生信息,也就是按链表中元素的顺序访问其数据元素。步骤如下: Ⅰ. 将链表的头元素的位移量送到 BX 寄存器。 Ⅱ. 输出BX 指向的数据元素的信息,即学号、姓名、语文成绩、数学成绩和总成绩,输出回车换行。判断 [BX].LINK 字段的值是否为 1,为1则结束程序,否则将该元素LINK字段的内容送入 BX中,重复步骤 Ⅱ。 4.流程图与关键代码分析: ①按学生总成绩排序(降序)流程图,同时建立单链表:
第 4 页