微原课设 冒泡排序.docx
《微原课设 冒泡排序.docx》由会员分享,可在线阅读,更多相关《微原课设 冒泡排序.docx(12页珍藏版)》请在冰豆网上搜索。
微原课设冒泡排序
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
题目:
冒泡排序
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
键盘输入一组十进制数,用冒泡排序由小到大排序后输出显示
时间安排:
1.9课设题目,设计内容;
1.9—1.10查资料,算法、方案设计。
1.1—1.13(硬)软件设计
1.14—1.15调试程序
1.16—1.17写课设报告
1.18答辩
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
1课程设计题目及要求
题目:
冒泡排序
题目要求:
键盘输入一组十进制数,用冒泡排序由小到大排序后输出显示
程序设计要求:
1)遵循模块化、结构化的程序设计方法。
2)要求程序必须正确。
3)程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。
4)要求程序结构合理,语句使用得当。
5)适当追求编程技巧和程序运行效率。
2课题分析及设计思路
冒泡排序:
依次比较相邻的两个数,将小数放在前面,大数放在后面。
即在第一趟:
首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
至此第一趟结束,将最大的数放到了最后。
在第二趟:
仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
此次课程设计中,冒泡排序是从大到小进行排序.通过主程序对子程序的调用来完成输入输出,排序,循环,转化等功能。
3程序主要流程图
4程序主要代码与分析
datasegment
numdw50dup(?
)
countdw10
flag1db0;符号标志
flag2db0;首位0标志
mess1 DB'INPUT10NUMBERS',0AH,0DH,'$'
mess2 DB'ERRORS',0AH,0DH,'$'
mess3 DB'SOURCE:
',0AH,0DH,'$'
mess4DB'RESULT:
',0AH,0DH,'$'
dataends
prognamsegment
mainprocfar
assumecs:
prognam,ds:
data
start:
pushds;把原数据存放到段寄存器
subax,ax
pushax
movax,data
movds,ax
redo:
callinput;输入原始数据
cmpax,-1d ;判断是否出错
jeredo;出错,退出
leadx,mess3
movah,09;9号调用,显示字符串,请求输出数据
int21h
calloutput;输出原始数据
callbubblesort ;对原始数据进行冒泡排序
leadx,mess4
movah,09;9号调用,显示字符串,请求输出数据
int21h
calloutput;输出排序后的数据
movah,7
int21h
movah,4ch
int21h
mainendp
inputproc;输入原始数据
leadx,mess1
movah,09
int21h;9号调用,显示字符串,请求输入数据
callcrlf;回车,换行
movsi,0
movcx,count
enter1:
calldecibin
deccx
cmpdl,',';进行分隔符判断,以逗号为分隔符
jestore
cmpdl,13;进行换行判断
jeexit2
jneerror
store:
movnum[si],bx;将BX中的二进制数存储到num中
addsi,2
jmpenter1
error:
callcrlf;输出报错信息
leadx,mess2
movah,09;9号调用,显示字符串,输入数据
int21h
callcrlf
movax,-1d ;以AX中的值作为出错标志
jmpexit3
exit2:
movnum[si],bx;将BX中内容存入以num为首的存储单元中
callcrlf;回车换行
exit3:
ret
inputendp
bubblesortproc;将num[]中存储的数进行冒泡排序
movcx,count;初始化计数器CX
deccx
lg1:
movdi,cx;保存CX的值
movsi,0
lg2:
movax,num[si];相邻的两数进行比较大小
cmpax,num[si+2]
jlelg3
xchgax,num[si+2];进行数据交换
movnum[si],ax
lg3:
addsi,2
looplg2;判断CX==0,循环
movcx,di;还原CX的值
looplg1;判断CX==0,循环
ret
bubblesortendp
outputproc;将num[]里的数据以十进制输出在屏幕上
callcrlf;回车,换行
movsi,0
movdi,count
next1:
movbx,num[si]
testbx,8000h;判断正负
jznext4
movdl,'-'
movah,2;2号调用,显示单字符负号'-'
int21h
negbx;求补
next4:
callbinidec;将BX中的二进制数用十进制在屏幕上输出
movdl,','
movah,02;2号调用,输出分隔符','
int21h
addsi,2
decdi
jnznext1
callcrlf
ret
outputendp
decibinproc;从键盘中取得十进制数转化为二进制,并存入BX中
movbx,0
movflag1,0;符号位标志flag1,0为正数,1为负数
newchar:
movah,1;1号调用,单字符输入,送入al
int21h
movdl,al
cmpal,2dh;与符号减号'-'的ASCII码作比较
jnznext2
movflag1,1
jmpnewchar
next2:
subal,30h
jlnext3
cmpal,9d
jgnext3
cbw
xchgax,bx
movcx,10d
mulcx
xchgax,bx
addbx,ax
jmpnewchar
next3:
cmpflag1,1
jneexit1
negbx;对bx中的内容进行求补
exit1:
ret
decibinendp
binidecproc;将BX中的二进制数以十进制形式输出在屏幕上
pushbx
pushcx
pushsi
pushdi
movcx,10000d
calldec_div
movcx,1000d
calldec_div
movcx,100d
calldec_div
movcx,10d
calldec_div
movcx,1d
calldec_div
adddl,flag2
cmpdl,30h;判断这个数是否是0,以免没有输出0
jnelg6
movah,02h
int21h
lg6:
popdi
popsi
popcx
popbx
movflag2,0;还原0标志
ret
binidecendp
dec_divproc;将BX中的需转换的十进制数,输出在屏幕上
movax,bx
movdx,0
divcx
movbx,dx
movdl,al
adddl,30h;转换成ASCII码
cmpflag2,0
jnelg4
cmpdl,30h;判断十进制数是否为0,以判断是否输出
jelg5
movflag2,1
lg4:
movah,02h;2号调用,输出十进制数
int21h
lg5:
ret
dec_divendp
crlfproc;向终端发出回车、换行符,完成一次回车换行操作
movdl,0ah
movah,02h;显示功能
int21h
movdl,0dh;回车
movah,02h;显示功能
int21h
ret
crlfendp
prognamends
endstart
5正向排序程序截图
5.1正常输入一组十进制数(10个)的输出情况
5.2当输入不合法时,程序自动跳转到初始位置,并提示输入错误、要求重新输入
5.3当输入一组数不足10个时,会自动补零并排序
6小结及体会
通过本次课程设计,我收获颇多。
第一,通过上机编程调试,我更深刻地认识到了汇编语言和高级语言的不同点。
首先是寻址方式的不同:
汇编语言是低级语言,在编写程序的时候会把根据不同的情况指定使用不同的寻址方式,能够对内存和CPU里的通用寄存器直接操纵;而C语言是高级语言,可以实现跨平台。
编写程序无需指定CPU的指令执行情况,一段程序可以在不同体系结构的计算机上使用;其次,在本次冒泡法排序中可以明显看到,汇编语言实现循环控制是给计数器CX赋值来控制循环次数,每完成一次循环计数器CX自动减1;而用C语言实现循环时不仅要通过变量赋初值来控制循环次数,还要自行设定变量运算方式和跳出循环的条件。
第二,就设计结构而言,本次课设还是采用功能分解、逐步求精的思想,一步步的实现要求的功能,并在一些已有的程序上作进一步的改进,来达到要求实现的的功能。
比如,先写好主程序,完成整体的结构流程;再分写子程序,把输入数据、十进制转换为二进制、冒泡排序、二进制转换为十进制、输出数据、换行操作等问题分块处理,这样一来复杂问题就逐渐分解了,程序执行的效率大大提高,同时也更易修改。
第三,由于汇编语言运用的不太熟练,对程序反复进行修改,发现汇编语言由于语句在程序中放置的位置不同也会是不同的效果,对汇编语言有了进一步的认识。
通过上网查阅资料,我也了解到了更多的语法功能,学习到了更多的解题思路。
总而言之,通过这次课程设计,我更加深刻地懂得了理论与实际结合的重要性。
只有课本上的知识是远远不够的,我们只有把书本上学到的知识和实际结合起来,才能真正的解决问题,从而提高自己的实际动手能力和独立思考能力。
参考文献
【1】彭虎等编著.微机原理与接口技术(第二版).北京:
电子工业出版社,2008
【2】全国计算机等级考试三级教程——PC技术.北京:
高等教育出版社,2011
【3】沈美明,温东禅.IBM-PC汇编语句程序设计(第2版).北京:
清华大学出版社,2001
【4】任向明,卢惠林.汇编语言程序设计实用教程.北京:
清华大学出版社,2009
【5】马力妮.80x86汇编语言程序设计.北京:
机械工业出版社,2004