有序表查询.docx

上传人:b****5 文档编号:3420353 上传时间:2022-11-22 格式:DOCX 页数:16 大小:875.38KB
下载 相关 举报
有序表查询.docx_第1页
第1页 / 共16页
有序表查询.docx_第2页
第2页 / 共16页
有序表查询.docx_第3页
第3页 / 共16页
有序表查询.docx_第4页
第4页 / 共16页
有序表查询.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

有序表查询.docx

《有序表查询.docx》由会员分享,可在线阅读,更多相关《有序表查询.docx(16页珍藏版)》请在冰豆网上搜索。

有序表查询.docx

有序表查询

 

华北科技学院

 

课程设计说明书

 

专业:

网络工程

课程名称:

汇编语言班级:

网络B093班

姓名:

沈亚强学号:

200907024313

设计题目:

有序表插入、删除、查询程序

设计时间:

2011.12.5至2011.12.16

评语:

评阅成绩:

评阅教师:

李冬艳

 

一、课程设计目的

进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。

二、课程设计要求

1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。

2.遵循模块化、结构化的程序设计方法,要求程序必须正确。

3.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。

4.要求程序结构合理,语句使用得当。

5.适当追求编程技巧和程序运行效率。

三、课程设计题目

有序表的插入、删除,查询程序。

四、问题陈述及需求分析

问题陈述

有序表插入、查询、删除程序是对从键盘输入的数字进行转换、排序、显示、数字的插入、查询以及删除有序表中的数字等功能,其中包括以下几个模块:

(1)从键盘输入数字个数(两位数),根据提示依次输入若干个数字形成一列数;

(2)根据所输入的数字大小用冒泡法进行降序排序。

(3)从键盘输入所要查找的数字,若找到则输出该数字找到信息及其在有序表中的位置,否则输出查找不到的提示信息。

(4)向有序表中插入数字,并重新排序得出新的排序结果和有序表中数字个数。

(5)删除有序表中的数字,同时显示删除数字所在有序表中的位置及删除后的排序结果。

(6)退出程序,若想退出程序则按“Y”,若想继续则按“N”。

功能需求分析

有序表插入、删除、查询程序提供以下功能:

1、DOS界面下以菜单方式工作

2、输入所要插入到有序表中的数字个数,并依次输入若干个数字形成一列数

3、根据所输入的数字大小进行排序并显示排序结果

4、查找有序表中某个数字及其在有序表中的位置

5、向有序表中插入新的数字,并重新排序

6、删除有序表中的数字,同时显示该数字的位置和删除后的排序结果

7、是否要退出操作界面

五、总体设计

功能结构图设计

依据程序的功能需求,描述该程序功能的结构图如下:

有序表插入、删除、查询

1

输入有序表中数字个数

2显示排序结果

3

输入要查找数字

7退出操作界面

6

删除有序表中数字

5

向有序表中插入数字

4查找数字结果及其位置

 

模块简介

依据程序的功能模块的划分,各模块定义如下:

(1)从键盘输入数字个数并依次输入一列数字

模块名:

Inputthenumber(输入数字)

模块描述:

通过此模块可以在BUF存储单元中输入一列两位数的数字。

在此过程中要完成数字的ASCII码转换及输入数字显示。

(2)根据输入数字的大小按降序排序使BUF中数字有序排列。

模块名:

Arrangeanddisplaythenumber(排序并显示排序结果)

模块描述:

根据输入数字的大小利用冒泡法将一列数字有序排列。

在此过程中数字要进行比较、交换直到循环结束,然后显示排序结果。

(3)从键盘输入要查找数字

模块名:

Pleaseinputthenumberyouwanttofind(输入要查找的数字)

模块描述:

输入要查找的两位数数字然后显示出来。

(4)查找从键盘输入的数字在有序表中的位置

模块名:

TOsearchthenumberanddisplaythesequence(查找数字并显示其位置)

模块描述:

根据输入数字与有序表中的数字逐一相比较,如果在有序表中查找到与输入数字相等的数字则显示查找到,并显示所要查找数字在有序表中的位置。

此过程涉及到数字循环比较、计数过程,若找到则显示所要查找数字在有序表中的位置,否则给出相关提示。

(5)从键盘输入要插入到有序表的数字

模块名:

Toinsertthenumberanddisplaythesequence(插入数字并显示新排序)

模块描述:

从键盘输入的数字与有序表中的数字相比较,之后得出新的排序结果。

若输入的数大于有序表中的原始最大值则直接插入,若小于则逐一比较,移位,然后插入到有序表中。

(6)从键盘输入要删除的数字

模块名:

Todeletethenumber(删除数字)

模块描述:

从键盘输入要删除的数字,然后与有序表中的数字相比较,若在有序表中找到与之相等的数字,则从有序表中删除该数字并显示输入数字在有序表中的位置,同时显示删除后的排序结果。

此过程涉及到数字比较、删除、数字移位、所删除数字的位置显示以及数列长度减1。

(7)退出操作界面

模块名:

EXIT!

(退出)

模块描述:

操作完毕后,若想退出操作界面则按“Y”,若想继续操作则按“N”。

六、详细设计

算法说明

1、主过程的算法设计:

清屏、显示菜单及运用选择操作,调用各个子程序过程,最后退出程序。

主要代码:

MAINPROCNEAR;主程序开始

START:

MOVAX,DATAS;加载数据段

MOVDS,AX

MOVES,AX

ZHS:

CLEAR_SCREEN;调用清屏宏

XSSTR0;调用显示宏(菜单显示开始)

HUICHE;调用回车换行宏

XSSTR11

HUICHE

XSSTR1

HUICHE

XSSTR2

HUICHE

XSSTR3

HUICHE

XSSTR4

HUICHE

XSSTR5

HUICHE

XSSTR6

HUICHE

XSSTR7

HUICHE

XSSTR13

HUICHE

XSSTR11;(菜单显示结束)

MOVAH,7;键入一个字符不回显

INT21H

SUBAL,30H

CALLCHECK;调用差错检验子程序

BIJ1H,SHUZI;调用比较宏

BIJ2H,PAIXU

BIJ3H,SHURU

BIJ4H,CHAZHAO

BIJ5H,CHARU

BIJ6H,SHANCHU

BIJ7H,TUICHU

SHUZI:

CLEAR_SCREEN;清屏

CALLINPUT;调用输入数字子程序

JMPZHS;无条件转回到ZHS处

PAIXU:

CLEAR_SCREEN;清屏

CALLARRANGE;调用排序显示子程序

JMPZHS;无条件转回到ZHS处

SHURU:

CLEAR_SCREEN;清屏

PUSHDX;DX入栈保护

XSSTR17

HUICHE;调用回车换行宏

CALLZIFUSHURU;调用从键盘输入字符子程序

HUICHE

MOVSI,0

MOVNUM[SI],BX;保存被操作的数字

XSSTR18

MOVAH,1

INT21H

CMPAL,20H;显示空格

JEZHS

XSSTR12

HUICHE

POPDX;恢复DX

JMPZHS;无条件转回到ZHS处

CHAZHAO:

CLEAR_SCREEN

CALLSEARCH;调用查找子程序

JMPZHS

CHARU:

CLEAR_SCREEN

CALLINSERT;调用插入子程序

JMPZHS

SHANCHU:

CLEAR_SCREEN

CALLDELETE;调用删除子程序

JMPZHS

TUICHU:

CLEAR_SCREEN;清屏

XSSTR21

HUICHE

XSSTR22

HUICHE

MOVAH,1;从键盘输入字符

INT21H

CMPAL,'Y';若为Y,退出

JEDONE

CMPAL,'N';若为N返回菜单

JEZHS

DONE:

MOVAH,4CH;结束程序

INT21H

MAINENDP;主程序结束

 

整体程序流程图:

主程序开始

初始化

清屏宏调用

菜单显示

CALLCHECK

BIJ宏调用

1234567

SHUZ

I

PA

I

XU

SHURU

TU

I

CHU

SHANCHU

CHARU

CHAZHAO

 

CALL

INPUT

CALL

ARRANGE

CALL

Z

I

FUSHURU

CALL

SEARCH

CALL

I

NSERT

CALL

DELETE

输入Y退出

输入N继续

 

结束

2、子过程的算法设计

(1)INPUT(输入数字)子程序

子程序INPUT

该过程的程序流程图如图所示:

CX<—存储单元数目

向BUF送零

DI循环加2

循环结束?

N

CALLZIFUSHURU

Y

CX<—实际数字个数

CX入栈保护

键盘输入两位数字

是否在0~9之间

N

AX值扩大10倍—>BX

Y

AX与BX相加—>BX

BUF[SI]<—BX

SI循环加2

CX出栈

RET返回

循环结束?

YN

(2)ARRANGE子程序即数字排序子程序

子程序ARRANGE

该过程的程序流程图如图所示:

CX<—数字个数K

保护外循环次数

AX<—BUF[SI]

BUF[SI]>=BUF[SI+2]?

Y

AX与BUF[SI+2]互换值

N

BUF[SI]<—AX互换后的值

SI循环加2

内循环结束?

N

恢复外循环次数

Y

外循环结束?

N

CALLSHUZIXS

Y

RET返回

 

(3)SEARCH子程序即查找子程序

子程序SEARCH

该过程的程序流程图如图所示:

CX<—数字个数K

INCCX

AX<—要查找的数字

AX与BUF[SI]逐一比较

是否相等

Y

SI循环加2

N

AX<—P值

P自加1

循环结束?

CALLDISPLAY

N

RET返回

Y

关键代码:

MOVAX,NUM[DI];要查找的数字送到AX中

SE1:

CMPAX,BUF[SI];AX与有序表中的值逐一比较

JESEA;如果相等转到SEA处

ADDSI,2;如果不等,SI加2

INCP;同时P自加1

LOOPSE1;循环继续查找

XSSTR9

JMPRT1

SEA:

XSSTR8MOVAX,P;显示计数(即位置)过程

HUICHE

XSSTR20CALLDISPLAY;调用显示数字子程序

(4)INSERT子程序即数字插入子程序

子程序INSERT

该过程的程序流程图如图所示:

AX<—要插入的数字

BUF[DI]大于AX值吗?

Y

N

直接插入到表最后

BUF中的数字后移,再进行比较

DI减2

同时表长度K加1

循环结束?

CALLSHUZIXS

N

Y

RET返回

关键代码:

MOVAX,NUM[SI];要插入的数字送给AX

CMP1:

CMPBUF[DI],AX;BUF中最后一个数字与AX比较

JAEINSQ;如果大于等于则转到INSQ处

MOVBX,BUF[DI];如果小于,则移位

MOVBUF[DI+2],BX

SUBDI,2;同时DI减2

JMPCMP1;无条件转到CMP1处继续比较

INSQ:

MOVBUF[DI+2],AX;AX值放到BUF最后面

ADDK,1;同时表长度加1

最后就是显示相关信息、排序结果以及新排序表的长度即在原来长度上加1。

 

(5)DELETE子程序即数字删除子程序

该过程的程序流程图如图所示:

子程序DELETE

查找要删除的数字

AX入栈保存

CALLDISPLAY

AX出栈

AX与K是否相等?

Y

CX<—数字个数K

表长度K减1

N

CALLSHUZIXS

SUBCX,Q

DI<—AX

比较DI与1是否相等?

DI加2

DI加2

BUF中的数字移位

BUF中的数字移位

NN

循环是否结束?

循环是否结束?

YY

RET返回

七、编码和测试

(1)菜单选项界面整体结构图:

(2)输入数字个数及一列数字结果图:

(3)输入数字的降序排序结果图:

(4)输入查找数字的查找结果及其在有序表中的位置结果图:

(5)输入所要插入的数字并显示新的排序结果及新的数列长度结果图:

(6)删除有序表中的数字,并显示其在有序表中的位置及新排序结果图

(7)退出操作界面结果图

以上是有序表的数字个数输入、一列数字输入、数字排序结果显示、数字查找结果及其在有序表中位置显示、数字插入、插入后新排序及新的表长度显示、操作界面退出显示结果图。

八、总结与体会

此次课程设计的内容有关有序表的插入、删除、查询程序设计,在程序设计和功能实现过程中用到汇编语言中模块程序设计思想,使整个程序划分为多个子程序,各个子程序分别实现不同功能,然后再通过主程序的调用,使整个复杂的大程序变为清晰有条理,方便程序读写、调试和修改。

经过模块划分后的程序设计涉及到汇编语言内容主要有BIOS中断相关知识的运用、子程序的编写和调用、宏的使用、冒泡排序程序设计思想、从键盘输入数字ASCII码转换和显示、分支程序设计伪指令应用(无条件转移JMP、条件转移)、循环程序设计伪指令应用、寻址方式的运用以及基本汇编伪指令的使用等知识。

其中程序设计当中大量运用到宏定义(回车换行宏定义、显示宏定义、比较宏定义、清屏宏定义等)和子程序调用(CHECKPROCNEAR检查、ZIFUSHURUPROCNEAR字符ASCII码转换、SHUZIXSPROCNEAR字符显示、INPUTPROCNEAR数字输入、ARRANGEPROCNEAR数字排序、数字插入、删除、查询等子程序的设计)。

这两方面知识的运用大大简化程序代码,使程序变得简练、清晰、有条理,程序逻辑性更加强;由于子程序设计存在一定的缺陷:

每次执行完CALL指令后就要对端点和现场进行保护,传参时要占用寄存器或存储器,编程过程中容易出错。

因此,在实现有序表的插入、删除、查询功能时,结合宏定义使用,这样能使程序不断优化,使程序达到更好的效果;宏指令运用不亚元来传参比较方便且不易出错,不过多次使用宏定义会使程序代码不断加长,因此,在使用过程中适当使用。

另外,在其他子程序设计过程中要考虑到一些容易出错的知识点。

汇编语言是一门与硬件直接相关的语言,因此很多操作功能的使用需要反复调用,为此,程序显得十分烦琐,通过子程序的调用,可将这些重复的步骤,加以简化,为内存节省空间。

通过有序表插入、删除、查询的编程和在编程过程中遇到的问题的思考,提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足,尤其是在运用BIOS中断知识设计清屏代码段时,要调用INT10H的各个功能号设置窗口属性、字体颜色等知识。

通过这次课程设计,我巩固所了之前学过的基础知识,能用汇编语言熟练地运用宏定义、子程序设计、循环伪指令、分支程序设计伪指令以及基本汇编指令,进一步掌握了各个指令的功能,特别是转向指令。

在整个程序的编写中,调试占了很大部分的时间。

要想写好汇编语言的程序,必须认真对待代码的每一个细节以及注意寄存器的保护,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。

通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平。

不过设计过程中暴露出了自己的一些问题,动手和实践能力不足,知识上还有许多漏洞,缺乏大型程序的开发经验,例如:

在编写删除数字子程序代码时,只知道根据输入的数字在有序表中查找与之相等的数字代码编写,而如何从有序表中删除这个数,当时编写代码时有一定的困难,之后通过同学讨论,网上查找相关知识,再经过多次调试,问题才得以解决。

希望以后在编程的学习上和操作、调试过程中掌握更多有关编程经验和知识,逐渐弥补这些不足。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1