程序篇-循环与分支程序设计_第1页
程序篇-循环与分支程序设计_第2页
程序篇-循环与分支程序设计_第3页
程序篇-循环与分支程序设计_第4页
程序篇-循环与分支程序设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章程序篇-循环与分支程序设计循环程序的结构形式程序有顺序、循环、分支和子程序四种结构,本章说明循环与分支程序结构。有二种结构形式:(见下页)

do_WHILE结构(循环次数可能为0)循环控y制条件循环体N先判条件,满足条件那么执行循环体,否那么退出。循环初始状态循环体循环控制条件NYdo-UNTIL结构先执行循环体,后判断条件,满足条件,那么循环,否那么退出。不管哪种结构形式,循环程序可由如下三局部组成:1〕设置循环的初始状态。如设置循环计算值等。2〕循环体。循环工作的主体,它由循环的工作局部及修改局部组成。3〕循环控制局部:合理地选择循环控制条件是循环程序设计的关键。循环程序设计方法编程步骤如下:1、分析题意,确定算法。(仔细分析和理解题意,找出合理的算法及适当的数据结构)2、根据算法画出程序框图。3、依框图编写程序.4、上机调试程序----检查你的设计思想是否正确以及你的程序是否符合你设计思想。0~9,A~F30~39H,41~46H例1:编制一个程序把BX存放器的二进制数用十六进制数在屏幕上显示出来。步骤:1、分析提意,选择算法。分析:二进制数〔十六进制数〕

16进制数的ASC‖码屏幕显示出正确的十六进制数算法:1〕将BX内的十六进制数分成4组,〔即4个十六进制数〕。2〕从最高位组开始进行转换,假设>9〔即3aH),那么将该组值加上37H,并将结果显示出来,然后再转换次高位组,依次循环4次。3〕最高位组移到AL中的低四位,以使计算用循环左移形成。MOVCL,4ROLBX,CLMOVAL,BL2、画框图:12〔续下页〕开始初始化MOVCH,4BX循环左移将最右边的转换成ASCII码ASCII的A-F?加7显示一个字符调用DOS的02号功能循环计算数=0结束〔续上页〕12yNNy3、写出源程序Program segment assumecs:programStart: mov bx, 468ah mov ch, 4rotate: movc1,4 rolbx,c1 mova1,b1 anda1,0fh

adda1,30h cmpa1,3ah jl print addal,7hPrint: mov dl,al movah,2 int21h decch jnzrotate mov ah,4ch int 21h Program ends endstart注意:1、该程序中,未用LOOP指令,而是用DECCH和JNZrotate来完成的。2、本例为do-until结构。例2:在ES段中有一个首地址为LIST和未经过排序的字数组,在数组的第一个字中存放着该数组的长度,数组的首地址已放入DI存放器中,AX中存放着一个数。要求编一个程序:在数组中查找该数,如果找到此数那么把它从数组中删除。分析:先找是否有〔AX〕在数组中,假设无那么结束程序。用串处理指令REPNZSCASW,假设找到,那么应将数组中找出的元素的后面所有的字〔即高于该元素地址的字〕前移〔向低地址方向〕一个字的位置。用循环结构完成。开始用串处理指令查找〔AX〕找到AX是末元素YN前移一个字数组结束否修改数组长度结束NYYN画框图写程序:del-ulprocfarcldpushdimovcx,es:[di]adddi,2repnescaswjedeletepopdijmpshortexitDelete:jcxzdec_cntnext_el:movbx,es:[di]moves:[di-2],bxadddi,2loopnext_eldec_cnt:popdidecwordptres:[di]exit:retdel_ulendp注意:1〕设置DF=0,CLD

2〕保存首地址以便修改数组的个数

3〕next-el:将高地址里的内容覆盖删除局部下面介绍在循环程序设计中设立标志位的方法,这种标志位是为了正确执行所做操作面设立的,其中有一种常用的方法称为逻辑方法例3设数组X和Y,X数组中有x1,…,x10Y=〔y1,…,y10〕编程计算Z1=x1+y1,Z2=x2+y2,Z3=x3-y3Z4=x4-y4,Z5=x5-y5,Z6=x6+y6Z7=x7-y7,Z8=x8-y8,Z9=X9-Y9Z10=x10+y10结果存入Z数组解:尽管每个算式不相同,也可用循环结构来完成:循环数值为10,所做的操作有二种——加法,减法。为了区别每次操作是加还是减,我们设置标志位:如果标志位为0加法如果标志位为1减法此题有10次操作,那么应该设10个标志位,故用二个字节来表示〔16位,最高6位无意义——设为0〕。并将它存入存储单元中,该存储单元称为逻辑尺——单元名设为LOGIC-RULE其内容为:0000000111011100=01dcH开始初始化CX=10i=1

测逻辑尺第i位xi+yixi-yiZi结果iI+1CX=0?结果=0=1画框图写程序

datareasegmentxdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw01dchdetareaendsprogramsegmentassumecs:program,ds:datareastart: mov ax,datarea mov ds,ax mov bx,0 mov cx,10 mov dx,logic_ruleNext: mov ax,x[bx] shr dx,1 jc subtract add ax,y[bx] jmp shortresultsubtract: sub ax,y[bx]result: mov z[bx],ax add bx,2 loop nextprogram ends end start问:1.用什么方式取得x,y数组中的不同元素?2.逻辑尺是如何实现它的判断功能的〔用的什么指令〕?3.逻辑尺中最高位是无意义的,这对程序的执行有无影响?为什么?多重循环程序设计循环可以有多重结构。它的根本方法与单重循环程序设计是一致的:

1.分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。2.在每次通过外层循环再次进入内层循环时,初始条件必须重置。例4、有一个地址为A的N字数组,请编制程序使该数组中的数按从大到小的次序排列。算法:采用起泡排序法:第一遍比较〔N-1〕次,将最小的数放到最后。第二遍比较〔N-2〕次,将最小的数放到倒数第二位。...最多比较N-1遍看程序如何实现多重循环:movcx,n;置循环初始为ndeccx;循环次数减1Loop1:movdx,cx;保存内层出值movbx,0;取数组:从第一个开始Loop2:movax,a[bx]cmpax,a[bx+2];前后两字比较jgecontinue;a[bx]>=a[bx+2]那么转移xchgax,a[bx+2]mova[bx],axcontinue:addbx,2;为取下一个数作准备looploop2movcx,dx;修改内层循环记数值:原始初值放入cx。looploop1;将〔cx-1〕cx;这样就完成了内层循环的记数初值的改变分支程序的两种结构形式判断条件分支一IF—THEN—ELSE分支二判断条件分支一分支二分支n……case:分支程序设计方法例5,在附加段中,有一个按从小到大顺序排列的无符号字数组,其首地址存放在DI存放器中可,数组中的第一个单元存放着数组长度,在AX中有一个无符号数,要求在数组中查找〔AX〕,如找到,那么使CF=0,并在SI中给出该元素在数组的偏移地址;如未找到那么是CF=1解:对已排序的数组,可用折半查找法以提高效率。折半查找法:〔1〕取有序数组的中间元素与查找值比较假设相等那么查找成功。假设大于中间值,那么取高半部的中间元素

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论