版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、子程序设计2.6显示学生名次表rank编制一个程序,要求接受键盘输入的一个班的学生成绩,并存放于一个50字的grade数组中,其中grade+i保存学号为1+1的学生成绩。然后根据grade中的学生成绩,把学生成绩依次填入50字的rank数组中,其中rank+i的内容是学号为i+1的学生的名次。再按学号顺序把名次从终端上显示出来。本题要做的主要工作和例2.2的内容是完全一样的,只是增加了由用户键入学生成绩及输出学生名次两个部分的内容,因此这三个部分可以用子程序结构来完成。子程序结构划分的层次图如图2.17所示,可以看出,main为主要模块,其下一层的三个模块为程序的三大部分。现将各模块说明如下
2、:模块名:main为总模块输入:从键盘输入一个班的学生成绩输出:显示一个班的学生成绩功能:根据输入的学生成绩,计算并显示学生名次。算法如下:一个学生名次等于成绩高于该学生的人数+1.模块名:input输入:以学号为序型键盘输入一个班的学生成绩。各个成绩之间用逗号隔开,最后以回车符号结束。输出:把一个班的学生成绩存入grade数组。功能:接受一个班的学生成绩。调用子模块decibin把键盘输入的一个十进制数转换为二进制数。调用子模块crlf完成回车,换行功能。模块名:rankp输入:从grade数组取得一个班的学生成绩。输出:以学号为序计算出该班每个学生的名次存入rank数组。功能:计算一个班的
3、学生成绩。算法为:一个学生的名次等于成绩高于该生的学生人数加1.4,0模块名;output输入:把rank数组取得一个班的学生名次。输出:把一个班的学生名次以学号为序在总端上显示出来。功能:先是一个班的学生名次。调用子模块decibin把键盘输入的一个十进制数转换为二进制数。调用子模块crlf完成回车,换行功能。5:模块名:decilin输入:从键盘输入一个十进制数。输出:把该数转换成二进制数并存入BX寄存器中功能:从键盘输入一个十进制数转换成二进制数并存入BX寄存器中6模块名:crlf输出:向终端发出回车换行符。功能:完成一次回车换行操作。7模块名:binidec输入:从BX寄存器取得一个二
4、进制数。输出:在终端屏幕显示一个十进制数。功能:把BX寄存器中的二进制数转换为十进制数,并在终端显示出来。调用子模块DCE_DIV用来作除法运算并显示字符。8.模块名:dec_div输入:从BX寄存器中的二进制数除以相应的十的幕,并在屏幕显示一位商。余数保存在BX寄存器中。有了以上的层次图及模块说明,对程序的全貌有了基本了解。在图2.18中,我们给出了除rankp以外的其余各个子程序的程序框图。Rankp的框图与图2.4相同。图2.19是程序清单,图2.20是本例的运行情况。;PROGRAMTITLEGOESHEERank*Jdatareasegmentgraderankdw50dupdw50
5、dupcountdw?mess1dbGrade?$mess2db13,10,InputError!,13,10,$mess3dbRank:$datareaends*Jprognamsegmentmainprocfarassumecs:prognam,ds:datareastart:;setupstackforreturnpushdssubax,axpushax;setDSregistertocurrentdatasegmentmovax,datareamovds,ax;MAINPARTOFPROGRAMGOESHEREcallinputcallrankpcalloutputretmainend
6、pinputprocnearleadx,mess1movah,09int21hJmovsi,0movcount,0enter:calldecibininccountcmpdl,jestorecmpdl,13jeexit2jneerrorstore:movgradesi,bxaddsi,2jmpentererror:leadx,mess2movah,09int21hexit2:movgradesi,bxcallcrlfretinputendprankpprocnearmovdi,countmovbx,0Ioop1:movax,gradebxmovwordptrrankbx,0movcx,coun
7、tleasi,gradenext:cmpax,sijgno_countincwordptrrankbxno_count:addsi,2loopnextaddbx,2decdijneloop1retrankpendpoutputprocnearleadx,mess3movah,09int21hJmovsi,0movdi,countnext1:movbx,ranksicallbinidecmovdl,movah,02int21haddsi,2decdijnznext1callcrlfretoutputendpdecibinprocnear;proceduretoconverdecimalonkey
8、bdtobinary.;resultisleftinBXregister.movbx,0;getdigitfromkeyboard,converttobinarynewchar:movah,1int21hmovdl,alsubal,30hjlexit1cmpal,9djgexit1cbw;(digitisnowinAX)multiplynumberinBXby10decimal.xchgax,bxmovcx,10dmulcxxchgax,bx;adddigitinAXtonumberinBXaddbx,axjmpnewcharexit1:retdecibinendpbinidecprocnea
9、r;proceduretoconvertbinarynumberinBXtodecimal;onconsolescreenpushbxpushcxpushsipushdimovcx,100dcalldec_divmovcx,10dcalldec_divmovcx,1dcalldec_divpopdipopsipopcxpopbxretbinidecendpdec_divprocnear;sub_subroutinetodividenumberinBXybnumberinCX;printquotientonscreenmovax,bxmovdx,0divcxmovbx,dxmovdl,al;pr
10、intthecontentsofDLonscreenadddl,30hmovah,02hint21hretdec_divendpcrlfprocnear;printcarriagereturnandlinefeedmovdl,0ahmovah,02hint21h5movdl,0dhmovah,02hint21h5retcrlfendpprognamends*5endstart程序框图如下:S3实验截图如下:G:masmranhNicmsofcOverlayLinkei*Uersion3.fCopyright6我们知道,对于16位整数而言,及其允许的最大数是65535,对于NODEC6的数,移位
11、因子将=10000,该数已经超过机器允许的范围,因此本例限制NODEC的值必须6则作为溢出处理,此时将输出值变为0。NODEC=36此时移位因子SHIFT=(10)Anodec2舍入值ADJUST=2SHIFT例如:输入工作时间为8.52,工资率为10.25,则乘机为Product=852X1025=873300移位因子为shift=(10)Anodec2舍入值ADJUST=2SHIFT=50作舍入及移位处理(Product+adjust)/shift=(873300+50)/100=8733又如:输入工作时间为65.245,工资率为8.52则,product=65245X852=555887
12、40SHIFT=(10)A5-2=1000Adjust=500作舍入及移位处理55588740+500/1000=55589240/1000=55589金处理的值只是取得了答案的有效值,并未考录小数点的位置,这个问题将会在输出时得到解决。NODEC=02在这种情况下,乘积的结果不必做舍入及移位处理,只需记录NODEC的值,并在输出显示是解决小数点的问题即可在计算时还需啊哟说明一个问题:由于采用整数运算,要求输入数不超过6535,任意输入数超过改制就做溢出处理,在这里我们用输出0来表示。此外,两个输入数的成绩可能得到三十二位二进制数的结果,这用一般的运算乘法指令就可以得到。对于这样的双精度数作除
13、法运算时,尽管我们已经限制shift的值不超过65535,但字运算的出发指令要求双精度被除数和单精度的除数相除,其结果应该是双精度的商,否则作为溢出处理。为了避免这种溢出情况的发生,我们采用以下程序段来作为除法。设在以下程序段运行前,我们已取得双精度被除数在DX:AX中,除数在shift单元中,除法运算结果的商在DX,AX中。模块名:begin为中控制模块输入:接受从键盘输入的工作时间hour和工资rate输出:在屏幕上显示工资值wage功能:根据工作时间和工资率计算工资Wage=hour*rate调用:2:模块名:Q10SCR功能:清除屏幕3:模块名:Q20CURS功能:置于光标位置4模块名
14、:B10inpt输入:接受从键盘输入的以小时为单位的工作时间及工资率输出:把工作时间缓存HASPAF缓存区,吧工资率存入ratepar缓冲区功能:接受从键盘输入的工作时间及工资率,分别存入相应的缓存区中。5模块名:D10HOUR输入:从HRSPAR中取出工作时间输出:把转换为二进制的时间存入BINHRS单元中。功能:调用子过程M10ASBI把工作时间从ASCLL马转换为二进制数。6模块名:E10RATE输入:从RATEPA中取出工资率。输出:把转换为二进制的工资率存入BINRATE单元中。功能:调用子过程M10ASBI把工资率从ASCL码转换为二进制数。7:模块名:M10ASBI输入:根据调用
15、过程给出的指针以及字符个数取得一个ASCLL字符窜、输出:将ASCLL字符窜转换为二进制数,结果存放与BINAL单元中功能:把ASCLL字符窜转换为二进制数。同时记录输入的小数点后的位数累计在NODEC单元中。&模块名:F10MULT输入:从binHRAS中取得工作时间,从BINRAT冲取得工资率。输出:根据工作时间及工资率的取值将其结果存放在DX,AX中功能:把工作时间和工资率的成绩经过舍入和移位处理后得到的二进制工资值存放在DX.:AX中。9模块名:G10WAGE输入:DX,AX中的二进制工资数以及NODEC单元中的小数点后的位数输出:把二进制的工资数转换为ASCLL码存放在ASCWAGE
16、为首地址的字符窜当中功能:10模块名输入:ASCWAG中的字符窜输出:把字符窜在屏幕上显示出来功能:显示工资数;PROGRAMTITLEGOESHERE-SCREMP;Enterhours&rate,displaywage*Jstacksgsegmentparastackstackdw32dup(?)stacksgends*Jdatasgsegmentparadatahrsparlabelbyte;Hoursparameterlist;maxhlendb6acthlendb?hrsflddb6dup(?)rateparlabelbyte;rateparameterlist;maxrlendb6
17、actrlendb?rateflddb6dupmessg1dbHoursworked?,$messg2dbRateofpay?,$messg3dbWage=ascwagedb14dup(30h),13,10,$messg4db13,10,0verflow!,13,10,$adjustdw?binvaldw0binhrsdw0binratedw0coldb0decinddb0mult10dw01nodecdw0rowdb3shiftdw?tenwddw10tempdxdw?tempaxdw?datasgends.*Jcodesgsegmentparacodebeginprocfar;mainpa
18、rtofprogramassumecs:codesg,ds:datasg,ss:stacksg,es:datasg;setupstackforreturnpushdssubax,axpushax;setDSregistertocurrentdatasegmentmovax,datasgmovds,axmoves,ax;mainpartofprogramgoesheremovax,0600h;CALLDISPcallq10scrcallq20cursa20loop:callb10inptcmpacthlen,0jea30calld10hourcalle10ratecallf10multcallg
19、10wagecallk10dispjmpa20loopa30:;calltimedatemovax,0600hcallq10scrretbeginendp;Inputhours&rateJb10inptprocnearleadx,messg1movah,09hint21hleadx,hrsparmovah,0ahint21hcmpacthlen,0jneb20retb20:movcol,25callq20cursleadx,messg2movah,09hint21hleadx,rateparmovah,0ahint21hretb10inptendp;Processhours:dIOhourpr
20、ocnearmovnodec,0movcl,acthlensubch,chleasi,hrsfld-1addsi,cxcallmIOasbimovax,binvalmovbinhrs,axretdIOhourendp;Processrate:elOrateprocnearmovcl,actrlensubch,chleasi,ratefld-1addsi,cxcallm10asbimovax,binvalmovbinrate,axrete10rateendp;Multiply,round,&shiftf10multprocnearmovcx,07leadi,ascwagemovax,3030hc
21、ldrepstoswmovshift,10movadjust,0movcx,nodeccmpcl,06jaf40deccxdeccxjlef30movnodec,02movax,01f20:multenwdloopf20movshift,axshrax,1movadjust,axf30:movax,binhrsmulbinrateaddax,adjustadcdx,0movtempdx,dxmovtempax,axJcmpadjust,0jzf50Jmovax,dxmovdx,0divshiftmovtempdx,axmovax,tempaxdivshiftmovdx,tempdxmovtem
22、pax,axjmpf50Jf40:movax,0movdx,0f50:retf10multendp;ConverttoASCg10wageprocnearleasi,ascwage+11movbyteptrsi,.addsi,nodecg30:cmpbyteptrsi,.jneg35decsig35:cmpdx,0jnzg40cmpax,0010jbg50g40:movax,dxmovdx,0divtenwdmovtempdx,axmovax,tempaxdivtenwdmovtempax,axordl,30hmovsi,dldecsimovdx,tempdxjmpg30g50:oral,30
23、hmovsi,alretg10wageendp;Displaywagek10dispprocnearmovcol,50callq20cursmovcx,10leasi,ascwagek20:cmpbyteptrsi,30hjnek30movbyteptrsi,20hincsiloopk20k30:leadx,messg3movah,09int21hcmprow,20jaek80incrowjmpk90k80:movax,0601hcallqlOscrmovcol,0callq20cursk90:retk10dispendp;ConvertASCtobinarym10asbiprocnearmo
24、vmult10,01movbinval,0movdecind,0subbx,bxm20:moval,sicmpal,.jnem40movdecind,01jmpm90m40:andax,000fhmulmult10jcoverflowaddbinval,axjcoverflowmovax,mult10multenwdmovmult10,axcmpdecind,0jnzm90incbxm90:decsiloopm20cmpdecind,0jzm100addnodec,bxjmpm100overflow:movbinval,0m100:retmIOasbiendp;ScrollscreenqlOs
25、crprocnearmovbh,07subcx,cxmovdx,184fhint10hretq10screndp;Setcursorq20cursprocnearmovah,2subbh,bhmovdh,rowmovdl,colint10hretq20cursendpcodesgendsendbegin该部分的程序框图如下:1RE|G和NbnIWATT实验截图如下:I-丿I5Di、onnBL#实验总结:在进行接受用户工作时间及工资率的时候必须先画好结构框图,避免出现前后不对应的情况,字的除法运算指令要求双精度的被除数和单精度的除数相处,结果应该是单精度的商。2.8HAN0I塔题编写HAN0塔的
26、程序,在这个谜题中,A轴自下而上的叠有大小逐渐见效的N的盘子,现在要求把它们都移到C轴上并保持原来的秩序。移动时允许把盘子暂时存放在B轴但必须遵循以下规则:1:一次只能有一个盘子从一个轴移动打另外一个轴2:一个盘子不能放在比他小的盘子上面。这是一个经典的递归子程序的例子。我们用N表示盘子数,并从小到大把盘子编号为1,2,3,。No用X,Y,Z,表示起始轴,宗建洲和最终轴。用UVI表示第I个盘子从U轴移动到V轴,V可以是X,Y,Z,中的任意一个轴基数:HANOI(1,X,Y,Z)显示X1Z归纳步骤:HANOI(N,X,Y,Z)(N1)做以下三步1执行HANOI(N-1,X,Z,Y)2显示XNZ3
27、执行HANOI(N-1,X,Y,Z)根据这一算法可以分析出HANO的执行过程如图所示1模块名:main为总控制块输入:接受从键盘输入的盘子数N及起始中间和最终轴名,存放在BX,CX,SI,DI,寄存器当中。输出:以UIV形式,顺序显示出盘子的移动办法功能:用递归计算并显示出HANO的移动办法基数:HANOI(1,X,Y,Z)显示XIZ归纳步骤:HANOI(N,X,Y,Z,)(N-1)执行HANOI(N-1,X,Z,Y)显示XNZ执行HANOI(N-1,Y,X,Z)调用子程序接受盘子数调用子程序实现回车,换行功能2模块名:decibin输入:键盘接受盘子数N输出:把转换为二进制的N值存入BX寄存
28、器当中。功能:把从键盘接受的十进制装换为二进制数并存入BX寄存器当中3:模块名:HANOI输入:从BX寄存器中取得盘子数N输出:显示盘子的移动办法功能:用递归算法计算并显示HANO的结果4模块名:CTRF功能:显示回车,换行5:模块名:save功能:保存NX,Y,Z,入站6:模块名:restore功能:恢复N,X,Y,Z7:模块名:PRINT功能:显示XNZ调用子程序BINIDEC把N值从二进制转换为十进制并在屏幕上显示出来调用子程序CRLF回车换行&模块名:BINIDEC输入:从BX寄存器中取得N值输出:把N值以是十进制形式在屏幕上显示出来功能:把BX中的二进制N值转换为十进制形式,并在屏幕
29、上显示出来。源程序如下:*Jdatareasegmentmessage1dbN=?,0ah,0dh,$message2dbWhatisthenameofspindleX?db0ah,0dh,$message3dbWhatisthenameofspindleY?db0ah,0dh,$message4dbWhatisthenameifspindleZ?db0ah,0dh,$flagdw0constantdw10000,1000,100,10,1datareaends.*Jprognamsegmentmainprocfarassumecs:prognam,ds:datareastart:;setup
30、stackforreturnpushdssubax,axpushax;setDSregistertocurrentdatasegmentmovax,datareamovds,ax;mainpartofprogramgoeshereleadx,message1movah,09hint21hcalldecibincallcrlfJcmpbx,0jzexitJleadx,message2movah,09hint21hmovah,01hint21hmovah,0movcx,axcallcrlfJleadx,message3movah,09hint21hmovah,01hint21hmovah,0mov
31、si,axcallcrlfJleadx,message4movah,09hint21hmovah,O1hint21hmovah,0movdi,axcallcrlfJcallhanoiJexit:ret;returntoDOSJmainendphanoiprocnear;definesubprocedure;SolvestowerofHANOIpuzzle;Argement:(BX)=N,(CX)=X,(SI)=Y,(DI)=Zcmpbx,1jebasiscallsavedecbxxchgsi,dicallhanoicallrestorcallprintdecbxxchgcx,sicallhan
32、oijmpreturnbasis:callprintreturn:rethanoiendpprintprocnear;printxnzmovdx,cxmovah,02hint21hcallbinidecmovdx,dimovah,02hint21hcallcrlfretprintendpsaveprocnear;pushN,X,Y,Zontostackpopbppushbxpushcxpushsipushdipushbpretsaveendprestorprocnearpopbppopdipopsipopcxpopbxpushbpretrestorendpdecibinprocnearmovb
33、x,0newchar:movah,1int21hsubal,30hjlexit1cmpal,9djgexit1cbwxchgax,bxmovcx,10dmulcxxchgax,bxJaddbx,axjmpnewcharexit1:retdecibinendpbinidecprocnearpushbxpushcxpushsipushdimovflag,0movcx,5leasi,constantJdec_div:movax,bxmovdx,0divwordptrsimovbx,dxmovdl,alJcmpflag,0jnzprint1cmpdl,0jeskipmovflag,1;printthe
34、contetsofDLonscreenprint1:adddl,30hmovah,02hint21hskip:addsi,2loopdec_divpopdipopsipopcxpopbxretbinidecendpcrlfprocnear;printcarriagereturnandlinefeedmovdl,0ahmovah,02hint21hJmovdl,0dhmovah,02hint21hretcrlfendpprognamends.*Jendstart实验结构框图如下:实验截图如下:贾命令提示符|c:C:masnHanoiMicrosoftRMacroAssemblerUersion5
35、.00CopyrightMicrosoftCorp1981-1985,1987.Allrightsreserved.ObjectfilenaneHanoi.OBJ-SourcelistingNUL.LST:Cross-referenceNULCRF:50390415594Bytessymbolspacefree0WarningErrors0SevereErrorsC:linkhanoiMicrosoftOverlayLinkerUersion3.60CopyrightMicrosoftCorp1983-198?.Allrightsreserved.RunFile(HANOI.EXE:Li?tF
36、ileNULHAP=Libraries.LIB:LINK:warningL4021:nostacksegnent药命令提示符CopyrightMicrosoftCorp1983-198?.Allrightsreserved.RunFileHANOI.EXE:ListFileNUL.MAP:Libraries(.LIBI:ILINK:viarningL4021:nostacksegmentCN3wAwBwCAacABBAc71ianOliat1stiIdt1st:iatistnaneofspindleX?naneofspindleY?naneifspindleZ?)eCBBCACC1213121
37、-iDlxlthenaneofspindleX?thenaneofspindleY?thenaneifspindleZ?isBCCBABBCCAACBCCN=4vnAMBwcn1A2B1A3C1C2A1A4B1B2C1B3A1A2B1金令提示符,|q|x|頁命令提示符-debughanoi.exeBICC:debughanoi.exe-g59N-?3WhatisthenaneofspindleX?Whatbisthenameofspindle?WliatisthenaneifspindleZ?AX=020DBX=0003DS-140AES=13FA1412:005983FB01-dla04:f
38、fe01A04:FFE0EE3A1A04:FFF00001CX=0061DX=000DSP=FFFASS=140ACS=1412IP=0059CMPBX,*01000011000000-010000EE3A00001100-000001BP=0000SI=0062DI=0063NUUPElPLNZNAPENC00000084000000000000AX=020DBX=0003IDS=140AES=13FA1412:005C7418CX=006iDX=000DSP=FFFASS=140ACS=1412IP=005CJZ00?6BP=0000SI=0062DI=0063NUUPElPLNZNAPO
39、NC,|q|x|ca命令捺示符一debughanoi.exe1412:005C?418JZ00?6AX=020DBX=0003DS-140AES-13FA1412:005EE82C00-PCX=0061DX=000DSP=FFFASS-140ACS-1412IP=005ECALL008DBP=0000SI=0062DI=0063NUUPElPLNZNAPONCAX=020DBX=0003DS-140AES-13FA1412:00614B-dla04:ffe01A04:FFE0EE3A1A04:FFF00001CX=0061DX=000DSS-140ACS-1412DECBX000011EE3A
40、00SP=FFF2IP-0061BP=0061SI=0062DI=0063NUUPElPLNZNAPONC000000-010000001100-00000100000084000000000000AX=020DBX=0002DS=140AES=13FA1412:00628?F?CX=0061DX=000DSP=FFF2SS=140ACS=1412IP=0062XCHGSUDIBP=0061SI=0062DI=0063NUUPElPLNZNAPONCAX=020DBX=0002DS=140AES=13FA1412:0064E8F2FFCX=006iDX=000DSP=FFF2SS=140ACS=1412IP=0064CALL00S9BP=0061S1=0063DI=0062NUUPElPLNZNAPONC頁金令提不符debu(hanoi.exeC:debughanoi.exe3WhatisthenaneofspindleX?Whatisthenaneofspindle?WhatisthenaneifspindleZ?BX=0003ES-13FAAX=0063IDS-140A1412:00508BF8-dla04:ffe0CX=0061DX=0048SP=FFFCSS-140ACS-1412IP=00
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 从书中学会的成长心得分享(9篇)
- 电子商务平台运营方案优化策略工具
- 跨文化沟通与合作框架工具
- 企业信息数据化管理工具
- 河南省平顶山汝州市重点达标名校2026年初三下学期5月模拟考试语文试题含解析
- 四川省遂宁中学2026届初三第二学期月考英语试题试卷含解析
- 浙江省宁波镇海区六校联考2026届初三4月质量检查生物试题含解析
- 吉林省农安县新阳中学2025-2026学年初三5月检测试题语文试题含解析
- 资源开发合作契约承诺函(4篇)
- 2026年湖南省怀化市初三4月模拟考试(一模)语文试题含解析
- 餐厨废弃物综合处理项目突发环境事件应急预案
- 冷作工工艺展开放样
- 电信网络诈骗防范指南
- 2023年土地复垦技术标准
- 2024高考数学讲义:三角函数及其解题
- MOOC 跨文化交际通识通论-扬州大学 中国大学慕课答案
- 《低压配电设备安装与调试》课件 劳动 学习任务2 挂壁式配电箱安装与调试
- 入职申请表(完整版)
- 人教版2023七年级上册英语单词表
- 医院保洁员院感知识培训课件
- 招标邀请函模板范文
评论
0/150
提交评论