软件流程与软件程序的例子课设参考资料之一.docx
《软件流程与软件程序的例子课设参考资料之一.docx》由会员分享,可在线阅读,更多相关《软件流程与软件程序的例子课设参考资料之一.docx(42页珍藏版)》请在冰豆网上搜索。
软件流程与软件程序的例子课设参考资料之一
微机原理与接口技术——程序与流程
编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择:
(1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。
用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:
<原字符串>例如:
abcdgyt0092
<新字符串>ABCDGYT0092
按任一键重做;按Esc键返回主菜单。
(2)按数字键“2”,完成在字符串中找最大值。
用户输入由英文大小写字母或数字
0~9组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:
<原字符串>Themaximumis<最大值>.
按任一键重做;按Esc键返回主菜单。
(3)按数字键“3”,完成输入数据组的排序。
用户输入一组十进制数值(小于255),
然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:
<原数值串>
<新数值串>
按任一键重做;按Esc键返回主菜单。
(4)按数字键“4”,完成时间的显示。
首先提示用户对时,即改变系统的定时器
HH:
MM:
SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时
间:
HH:
MM:
SS。
按任一键重新对时;按Esc键返回主菜单。
(5)按数字键“5”,结束程序的运行,返回操作系统。
解答过程:
※主程序的编程思路:
此程序共5个功能,可采用跳转表法来实现多路分支结构程序设计。
现将这5个程序段,各程序段的首地址分别标号为G1,G2,G3,G4,G5。
将5个程序段的入口地址做成表TABLE放入数据段,程序根据给定的参数计算出欲转入的程序段的首地址在TABLE中的位置后,取出该地址,跳转至该程序段。
首先,通过调用子程序MENU,设置显示器,并输出提示文档。
接着,读取‘1’-‘5’之间的ASCII表示数。
然后,通过跳转表TABLE实现由输入参数转入相应的程序段。
由于表中按“字”存放数据,则每个数据的位移量是:
0、2、4、6、8。
对于输入参数N,计算位移量的公式是N=(N-1)*2。
当输入‘1’时,跳转到标号G1。
调用子程序CHGLTR,完成将输入字符串中的小写字母变换成大写字母。
用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G1;
当输入‘2’时,跳转到标号G2。
调用子程序MAXLTR,完成在输入字符串中找最大值。
用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G2;
当输入‘3’时,跳转到标号G3。
调用子程序SORTNUM,完成输入数据组的排序。
用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G3。
当输入‘4’时,跳转到标号G4。
调用子程序TIMCHK,完成时间的显示。
用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G4。
当输入‘5’时,跳转到标号G5。
结束程序的运行,返回操作系统。
其流程框图见图3-1。
※子程序MENU的编程思路:
注意:
子程序不要用START开头!
设置显示器显示方式为80*25彩色文本方式,清屏。
逐行设置光标位置,使提示文档左对齐整体居中。
输出1-5的提示文档,再输出输入N的提示。
其流程框图见图3-2。
※子程序CHGLTR的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。
设置光标位置,使提示文档左对齐整体居中。
输出输入字符串提示文档,读取输入字符串并将其放入KEYBUF。
在输入字符串尾加结束标志$,输出输入字符串。
从前往后,依次取字符串中的每个字符,若其为小写字母,则将其ASCII码减去20H。
输出变换后的字符串。
最后输出说明文档。
其流程框图见图3-3。
※子程序MAXLTR的编
程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。
设置光标位置,使提示文档左对齐整体居中。
输出输入字符串提示文档,读取输入字符串并将其放入KEYBUF。
在输入字符串尾加结束标志$,输出输入字符串。
预设字符串中最大值为0。
从前往后,依次取字符串中的每个字符,若其大于当前最大值,则进行替换,即可得到字符串中的最大值,并输出。
最后输出说明文档。
其流程框图见图3-4。
※子程序SORTNUM的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。
设置光标位置,使提示文档左对齐整体居中。
输出输入数据组提示文档,读取输入数据组字符串并将其放入KEYBUF。
调用子程序CIN_INT,将字符串转换成数据串。
判断数据串是否有错误或者为空,若是,则重新输入数据组。
调用子程序MPSORT,采用冒泡法对数据串进行排序。
再调用子程序INT_OUT,输出排序后的数据组。
最后输出说明文档。
其流程框图见图3-5。
※子程序CIN_INT的编程思路:
入口参数为:
无;出口参数为:
AL(有无错误标志,0为有,1为无)。
从前往后,依次取字符串中的每个字符进行判断。
CH表示数据组数据个数,AL表示当前数据x,DL作为有无数据标志。
若当前字符为空格,则转到ADDNUM,判断DL是否为1,若为1,则CH增1,调用子程序ADDNEW,增加新数x,然后DL、AL清零;否则判断当前字符c是否在‘0’-‘9’之间,若不是,则判错,将AL置0,子程序CIN_INT返回;否则,DL置1,x=x*10+c-‘0’,判断x是否超过255,若是,则判错,将AL置0,子程序CIN_INT返回;否则,对下一个字符进行操作。
字符串判断结束后,若DL为1,则有新数x未加至数据组,调用子程序ADDNEW,增加新数x。
将数据组个数CH放入NUMBUF,将AL置1。
其流程框图见图3-6。
※子程序ADDNEW的编程思路:
入口参数为:
CH(数据组数据个数)、AL(当前数据x);出口参数为:
无。
取出数据组NUMBUF的首地址,加上数据组数据个数,即为当前数据x的地址,将x放入该地址。
其流程框图见图3-7。
※子程序MPSORT的编程思路:
对N个数据进行从小到大排序,采用“冒泡法”:
从前往后,每两个数据进行比较,当前者大于后者时,交换两者的次序;否则不变。
经过N-1次比较,可以将最大值交换到第N个单元。
接着对前N-1个数据,重复上述过程,使次大值交换到第N-1个单元;依此类推,若某次比较过程,无任何交换,则终止其后的所有比较过程。
最多进行N-1次比较过程,可以完成数据的排序操作。
其流程图见图3-8。
※子程序IN_OUT的编程思路:
从数据组中依次取出每个数据,调用OUTNUM,将十进制数据转成十六进制进行输出,数据之间输出一个空格作为分隔符。
其流程图见图3-9。
※子程序OUTNUM的编程思路:
入口参数:
AL(待转换的数据),BL(转换进制数);出口参数:
无。
待转换数据x除以转换进制数,商为新的x,余数y为转换后的低位。
保存y,调用子程序OUTNUM本身,对新的x进行进制转换并输入。
取出y,对其进行输入,若低于10,则直接输出,否则转换成字母输出。
其流程图见图3-10。
※子程序TIMCHK的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。
设置光标位置,输出设置时间提示文档。
读取输入时间字符串并将其放入KEYBUF。
分别判断时、分、秒是否在有效数字范围,若有效,则设置新的系统时间。
调用子程序TIME,在屏幕的右上角实时显示时间。
其流程框图见图3-11。
※子程序TIME的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。
设置光标位置,输出说明文档。
实时显示时间:
设置光标至屏幕右上角;读取系统时间,调用子程序SHOWNUM分别对时、分、秒进行显示,并用‘:
’作分隔符;设置光标等待位置,并进行延时;检查键盘状态,若无键盘输入,则重复上述步骤显示时间,否则子程序TIME返回。
其流程框图见图3-12。
※子程序SHOWNUM的编程思路:
入口参数:
AL(待显示的数据);出口参数:
无。
待显示数据x除以10,商为y,余数为z。
将数字y、z分别转换成字符数字,然后输出。
其流程框图见图3-13。
四、程序代码
STACKSEGMENTSTACK
DB256DUP(?
)
TOPLABELWORD
STACKENDS
DATASEGMENT
TABLEDWG1,G2,G3,G4,G5
STRING1DB'1.Changesmalllettersintocapitallettersofstring;',0DH,0AH,'$'
STRING2DB'2.Findthemaximumofstring;',0DH,0AH,'$'
STRING3DB'3.Sortfordatas;',0DH,0AH,'$'
STRING4DB'4.ShowTime;',0DH,0AH,'$'
STRING5DB'5.Exit.',0DH,0AH,'$'
STRINGNDB'Inputthenumberyouselect(1-5):
$'
IN_STRDB'Inputthestring(includingletters&numbers,lessthan60letters):
',0DH,0AH,'$'
PRESTRDB'Originalstring:
$'
NEWSTRDB'Newstring:
$'
OUT_STRDB'Thestringis$'
MAXCHRDB'Themaximumis$'
IN_NUMDB'Inputthenumbers(0-255,nomorethan20numbers):
',0DH,0AH,'$'
OUT_NUMDB'Sortednumbers:
',0DH,0AH,'$'
IN_TIMDB'Correctthetime(HH:
MM:
SS):
$'
HINTSTRDB'PressESC,gobacktothemenu;orpressanykeytoplayagain!
$'
KEYBUFDB61
DB?
DB61DUP(?
)
NUMBUFDB?
DB20DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETTOP
MAIN:
CALLFARPTRMENU;设置显示器
AGAIN:
MOVAH,2
MOVBH,0;页号
MOVDL,41;列号
MOVDH,10;行号
INT10H;光标位置设置
MOVAH,1
INT21H
CMPAL,'1'
JBAGAIN
CMPAL,'5'
JAAGAIN
SUBAL,'1';N-1
SHLAL,1;(N-1)*2
CBW;AL->AX
LEABX,TABLE
ADDBX,AX
JMPWORDPTR[BX]
G1:
CALLFARPTRCHGLTR
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPG1
G2:
CALLFARPTRMAXLTR
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPG2
G3:
CALLFARPTRSORTNUM
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPG3
G4:
CALLFARPTRTIMCHK
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPG4
G5:
MOVAH,4CH
INT21H
MENUPROCFAR;显示主界面
;设置显示器方式
MOVAH,0
MOVAL,3;
MOVBL,0;
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,5;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING1
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,6;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING2
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,7;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING3
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,8;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING4
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,9;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING5
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,10;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRINGN
INT21H
RET
MENUENDP
CHGLTRPROCFAR;将输入字符串中小写字母便换成大写字母
RECHG:
;设置显示器方式
MOVAH,0
MOVAL,3
MOVBL,0
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,5;行号
INT10H;输入提示光标位置设置
MOVAH,9
LEADX,IN_STR
INT21H;输入字符串提示
MOVAH,2
MOVDL,5;列号
MOVDH,6;行号
INT10H;输入字符串光标位置设置
MOVAH,0AH
LEADX,KEYBUF
INT21H;输入字符串
CMPKEYBUF+1,0
JZRECHG;判断输入字符串是否为空串
LEABX,KEYBUF+2
MOVAL,KEYBUF+1
CBW
MOVCX,AX
ADDBX,AX
MOVBYTEPTR[BX],'$';在输入字符串尾加结束标志$
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,7;行号
INT10H;源字符串提示光标位置设置
MOVAH,9
LEADX,PRESTR
INT21H;输出源字符串提示
MOVAH,9
LEADX,KEYBUF+2
INT21H;输出源字符串
LEABX,KEYBUF+2
LCHG:
CMPBYTEPTR[BX],61H
JBNOCHG
ANDBYTEPTR[BX],0DFH
NOCHG:
INCBX
LOOPLCHG;将字符串中小写字母转换成大写字母
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,8;行号
INT10H;新字符串提示光标位置设置
MOVAH,9
LEADX,NEWSTR
INT21H;输出新字符串提示
MOVAH,9
LEADX,KEYBUF+2
INT21H;输出新字符串
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,9;行号
INT10H;提示信息光标位置设置
MOVAH,9
LEADX,HINTSTR
INT21H;输出提示信息
RET
CHGLTRENDP
MAXLTRPROCFAR;在输入字符串中找出最大值
REMAX:
;设置显示器方式
MOVAH,0
MOVAL,3
MOVBL,0
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,5;行号
INT10H;输入提示光标位置设置
MOVAH,9
LEADX,IN_STR
INT21H;输入字符串提示
MOVAH,2
MOVDL,5;列号
MOVDH,6;行号
INT10H;输入字符串光标位置设置
MOVAH,0AH
LEADX,KEYBUF
INT21H;输入字符串
CMPKEYBUF+1,0
JZREMAX;判断输入字符串是否为空串
LEABX,KEYBUF+2
MOVAL,KEYBUF+1
CBW
MOVCX,AX
ADDBX,AX
MOVBYTEPTR[BX],'$';在输入字符串位加结束标志$
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,7;行号
INT10H;源字符串提示光标位置设置
MOVAH,9
LEADX,OUT_STR
INT21H;输出字符串提示
MOVAH,9
LEADX,KEYBUF+2
INT21H;输出字符串
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,8;行号
INT10H;新字符串提示光标位置设置
MOVAH,9
LEADX,MAXCHR
INT21H;输出字符串中最大值提示
MOVDL,0
LEABX,KEYBUF+2
LCMP:
CMP[BX],DL
JBNOLCHG
MOVDL,[BX]
NOLCHG:
INCBX
LOOPLCMP;找出字符串中最大字符,放入DL
MOVAH,2
INT21H;输出字符串中最大字符
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,9;行号
INT10H;提示信息光标位置设置
MOVAH,9
LEADX,HINTSTR
INT21H;输出提示信息
RET
MAXLTRENDP
SORTNUMPROCFAR;对输入数据组排序
RESORT:
;设置显示器方式
MOVAH,0
MOVAL,3
MOVBL,0
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,5;行号
INT10H;输入提示光标位置设置
MOVAH,9
LEADX,IN_NUM
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,6;行号
INT10H;输入数据组光标位置设置
MOVAH,0AH
LEADX,KEYBUF
INT21H;输入数据组字符串
CALLCIN_INT;字符串转换成数据串
CMPAL,0
JZRESORT;判断数据串是否有错
CMPNUMBUF,0
JZRESORT;判断数据串是否为空
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,7;行号
INT10H;输出提示光标位置设置
MOVAH,9
LEADX,OUT_NUM
INT21H;输出数据串提示
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,8;行号
INT10H;输出数据组光标位置设置
CALLFARPTRMPSORT;数据组排序
CALLFARPTRINT_OUT;数据组的输出
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,9;行号
INT10H;提示信息光标位置设置
MOVAH,9
LEADX,HINTSTR
INT21H;输出提示信息
RET
SORTNUMENDP
CIN_INTPROCNEAR;读入整型数
;入口参数:
无
;出口参数为:
AL(有无错误标志,0为有,1为无)
MOVCL,