资源描述
39.(上机题)编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择:
(1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。用户输入由英文大
小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:
<原字符串>例如:abcdgyt0092
<新字符串> ABCDGYT0092
按任一键重做;按Esc键返回主菜单。
(2)按数字键“2”,完成在字符串中找最大值。用户输入由英文大小写字母或数字
0~9 组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:
<原字符串> The maximum is <最大值>.
按任一键重做;按Esc键返回主菜单。
(3)按数字键“3”,完成输入数据组的排序。用户输入一组十进制数值(小于255),
然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:
<原数值串>
<新数值串>
按任一键重做;按Esc键返回主菜单。
(4)按数字键“4”,完成时间的显示。首先提示用户对时,即改变系统的定时器
HH:MM:SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时
间:HH:MM:SS。
按任一键重新对时;按Esc键返回主菜单。
(5)按数字键“5”,结束程序的运行,返回操作系统。
解:
※ 主程序的编程思路:
四、程序代码
STACK SEGMENT STACK
DB 256 DUP(?)
TOP LABELWORD
STACK ENDS
DATA SEGMENT
TABLE DW G1, G2, G3, G4, G5
STRING1 DB '1. Change small letters into capital letters of string;', 0DH, 0AH, '$'
STRING2 DB '2. Find the maximum of string;', 0DH, 0AH, '$'
STRING3 DB '3. Sort for datas;', 0DH, 0AH, '$'
STRING4 DB '4. Show Time;', 0DH, 0AH, '$'
STRING5 DB '5. Exit.', 0DH, 0AH, '$'
STRINGN DB 'Input the number you select (1-5) : $'
IN_STR DB 'Input the string (including letters & numbers, less than 60 letters) :', 0DH, 0AH, '$'
PRESTR DB 'Original string : $'
NEWSTR DB 'New string : $'
OUT_STR DB 'The string is $'
MAXCHR DB 'The maximum is $'
IN_NUM DB 'Input the numbers (0 - 255, no more than 20 numbers) : ', 0DH, 0AH, '$'
OUT_NUM DB 'Sorted numbers : ', 0DH, 0AH, '$'
IN_TIM DB 'Correct the time (HH:MM:SS) : $'
HINTSTR DB 'Press ESC, go back to the menu; or press any key to play again!$'
KEYBUF DB 61
DB ?
DB 61 DUP (?)
NUMBUF DB ?
DB 20 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOVAX, DATA
MOV DS, AX
MOVAX, STACK
MOV SS, AX
MOV SP, OFFSET TOP
MAIN: CALL FAR PTR MENU ; 设置显示器
AGAIN:
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 41 ; 列号
MOV DH, 10 ; 行号
INT 10H ; 光标位置设置
MOVAH, 1
INT 21H
CMPAL, '1'
JB AGAIN
CMPAL, '5'
JAAGAIN
SUB AL, '1' ; N-1
SHLAL, 1 ; (N-1)*2
CBW ; AL->AX
LEA BX, TABLE
ADD BX, AX
JMPWORD PTR [BX]
G1:
CALL FAR PTR CHGLTR
MOVAH, 8
INT 21H
CMPAL, 1BH
JZ MAIN
JMP G1
G2:
CALL FAR PTR MAXLTR
MOVAH, 8
INT 21H
CMPAL, 1BH
JZ MAIN
JMP G2
G3:
CALL FAR PTR SORTNUM
MOVAH, 8
INT 21H
CMPAL, 1BH
JZ MAIN
JMP G3
G4:
CALL FAR PTR TIMCHK
MOVAH, 8
INT 21H
CMPAL, 1BH
JZ MAIN
JMP G4
G5:
MOVAH, 4CH
INT 21H
MENU PROC FAR ; 显示主界面
;设置显示器方式
MOVAH, 0
MOVAL, 3;
MOV BL, 0;
INT 10H ; 清屏
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 5 ; 行号
INT 10H ; 光标位置设置
MOVAH, 9
LEA DX, STRING1
INT 21H
MOVAH, 2
MOV DL, 5 ; 列号
MOV DH, 6 ; 行号
INT 10H ; 光标位置设置
MOVAH, 9
LEA DX, STRING2
INT 21H
MOVAH, 2
MOV DL, 5 ; 列号
MOV DH, 7 ; 行号
INT 10H ; 光标位置设置
MOVAH, 9
LEA DX, STRING3
INT 21H
MOVAH, 2
MOV DL, 5 ; 列号
MOV DH, 8 ; 行号
INT 10H ; 光标位置设置
MOVAH, 9
LEA DX, STRING4
INT 21H
MOVAH, 2
MOV DL, 5 ; 列号
MOV DH, 9 ; 行号
INT 10H ; 光标位置设置
MOVAH, 9
LEA DX, STRING5
INT 21H
MOVAH, 2
MOV DL, 5 ; 列号
MOV DH, 10 ; 行号
INT 10H ; 光标位置设置
MOVAH, 9
LEA DX, STRINGN
INT 21H
RET
MENU ENDP
CHGLTR PROC FAR ; 将输入字符串中小写字母便换成大写字母
RECHG:
;设置显示器方式
MOVAH, 0
MOVAL, 3
MOV BL, 0
INT 10H ; 清屏
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 5 ; 行号
INT 10H ; 输入提示光标位置设置
MOVAH, 9
LEA DX, IN_STR
INT 21H ; 输入字符串提示
MOVAH, 2
MOV DL, 5 ; 列号
MOV DH, 6 ; 行号
INT 10H ; 输入字符串光标位置设置
MOVAH, 0AH
LEA DX, KEYBUF
INT 21H ; 输入字符串
CMP KEYBUF + 1, 0
JZ RECHG ; 判断输入字符串是否为空串
LEA BX, KEYBUF + 2
MOVAL, KEYBUF + 1
CBW
MOV CX, AX
ADD BX, AX
MOV BYTE PTR [BX], '$' ; 在输入字符串尾加结束标志$
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 7 ; 行号
INT 10H ; 源字符串提示光标位置设置
MOVAH, 9
LEA DX, PRESTR
INT 21H ; 输出源字符串提示
MOVAH, 9
LEA DX, KEYBUF + 2
INT 21H ; 输出源字符串
LEA BX, KEYBUF + 2
LCHG:
CMP BYTE PTR [BX], 61H
JB NOCHG
AND BYTE PTR [BX], 0DFH
NOCHG:
INC BX
LOOP LCHG ; 将字符串中小写字母转换成大写字母
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 8 ; 行号
INT 10H ; 新字符串提示光标位置设置
MOVAH, 9
LEA DX, NEWSTR
INT 21H ; 输出新字符串提示
MOVAH, 9
LEA DX, KEYBUF + 2
INT 21H ; 输出新字符串
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 9 ; 行号
INT 10H ; 提示信息光标位置设置
MOVAH, 9
LEA DX, HINTSTR
INT 21H ; 输出提示信息
RET
CHGLTR ENDP
MAXLTR PROC FAR ; 在输入字符串中找出最大值
REMAX:
;设置显示器方式
MOVAH, 0
MOVAL, 3
MOV BL, 0
INT 10H ; 清屏
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 5 ; 行号
INT 10H ; 输入提示光标位置设置
MOVAH, 9
LEA DX, IN_STR
INT 21H ; 输入字符串提示
MOVAH, 2
MOV DL, 5 ; 列号
MOV DH, 6 ; 行号
INT 10H ; 输入字符串光标位置设置
MOVAH, 0AH
LEA DX, KEYBUF
INT 21H ; 输入字符串
CMP KEYBUF + 1, 0
JZ REMAX ; 判断输入字符串是否为空串
LEA BX, KEYBUF + 2
MOVAL, KEYBUF + 1
CBW
MOV CX, AX
ADD BX, AX
MOV BYTE PTR [BX], '$' ; 在输入字符串位加结束标志$
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 7 ; 行号
INT 10H ; 源字符串提示光标位置设置
MOVAH, 9
LEA DX, OUT_STR
INT 21H ; 输出字符串提示
MOVAH, 9
LEA DX, KEYBUF + 2
INT 21H ; 输出字符串
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 8 ; 行号
INT 10H ; 新字符串提示光标位置设置
MOVAH, 9
LEA DX, MAXCHR
INT 21H ; 输出字符串中最大值提示
MOV DL, 0
LEA BX, KEYBUF + 2
LCMP:
CMP [BX], DL
JB NOLCHG
MOV DL, [BX]
NOLCHG:
INC BX
LOOP LCMP ; 找出字符串中最大字符,放入DL
MOVAH, 2
INT 21H ; 输出字符串中最大字符
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 9 ; 行号
INT 10H ; 提示信息光标位置设置
MOVAH, 9
LEA DX, HINTSTR
INT 21H ; 输出提示信息
RET
MAXLTR ENDP
SORTNUM PROC FAR ; 对输入数据组排序
RESORT:
;设置显示器方式
MOVAH, 0
MOVAL, 3
MOV BL, 0
INT 10H ; 清屏
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 5 ; 行号
INT 10H ; 输入提示光标位置设置
MOVAH, 9
LEA DX, IN_NUM
INT 21H
MOVAH, 2
MOV DL, 5 ; 列号
MOV DH, 6 ; 行号
INT 10H ; 输入数据组光标位置设置
MOVAH, 0AH
LEA DX, KEYBUF
INT 21H ; 输入数据组字符串
CALL CIN_INT ; 字符串转换成数据串
CMPAL, 0
JZ RESORT ; 判断数据串是否有错
CMP NUMBUF, 0
JZ RESORT ; 判断数据串是否为空
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 7 ; 行号
INT 10H ; 输出提示光标位置设置
MOVAH, 9
LEA DX, OUT_NUM
INT 21H ; 输出数据串提示
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 8 ; 行号
INT 10H ; 输出数据组光标位置设置
CALL FAR PTR MPSORT ; 数据组排序
CALL FAR PTR INT_OUT ; 数据组的输出
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 9 ; 行号
INT 10H ; 提示信息光标位置设置
MOVAH, 9
LEA DX, HINTSTR
INT 21H ; 输出提示信息
RET
SORTNUM ENDP
CIN_INTPROC NEAR ; 读入整型数
; 入口参数:无
; 出口参数为:AL(有无错误标志,0为有,1为无)
MOV CL, KEYBUF + 1
LEA SI, KEYBUF + 2
MOV CH, 0 ; 数据组数据个数置0
MOV DH, 10
MOVAL, 0 ; 当前数据x=0
MOV DL, 0 ; 有无数据标志置0,即无数据
FNDNUM:
CMP BYTE PTR [SI], ' '
JZ ADDNUM ; 判断当前字符是否为空格
CMP BYTE PTR [SI], '0'
JB ERRNUM
CMP BYTE PTR [SI], '9'
JA ERRNUM ; 判断当前字符是否在'0'-'9'之间
MOV DL, 1 ; 有无数据标志置1,即有数据
MULDH
XOR BH, BH
MOV BL, [SI]
ADD AX, BX
SUB AX, '0' ; 计算出当前数据x
CMPAH, 0
JA ERRNUM ; 判断x 是否越界
JMP NEXT
ADDNUM:
CMP DL, 1
JNZ NEXT ; 判断是否有数据
INC CH ; 数据组数据个数加1
CALLADDNEW
MOV DL, 0
MOVAL, 0 ; 清零
NEXT:
INC SI
DEC CL
CMP CL, 0
JNZ FNDNUM ; 依次检查各字符
CMP DL, 1
JNZ TOTAL ; 判断是否有未加入的数据
INC CH
CALLADDNEW
TOTAL:
MOV NUMBUF, CH ; 置数据组数据个数
MOVAL, 1 ; 输入数据无错误
JMP CRTNUM
ERRNUM:
MOVAL, 0 ; 输入数据有错误
CRTNUM:
RET
CIN_INT ENDP
ADDNEW PROC NEAR ; 增加新数
; 入口参数:CH(数据组数据个数)、AL(当前数据x)
; 出口参数:无
PUSH AX
LEA BX, NUMBUF
MOVAL, CH
CBW
ADD BX, AX
POPAX
MOV [BX], AL
RET
ADDNEW ENDP
MPSORT PROC FAR ; 数据组排序
MOVAL, NUMBUF
CMPAL, 1
JBE NOSORT ; 若只有一个元素,停止排序
CBW
MOV CX, AX
LEA SI, NUMBUF ; SI指向数据组首地址
ADD SI, CX ; SI指向数据组末地址
DEC CX ; 外循环次数
LP1: ; 外循环开始
PUSH CX
PUSH SI
MOV DL, 0 ; 交换标志置0
LP2: ; 内循环开始
MOVAL, [SI]
CMPAL, [SI - 1]
JAE NOXCHG
XCHG AL, [SI - 1] ; 交换操作
MOV [SI], AL
MOV DL, 1 ; 交换标志置1
NOXCHG:
DEC SI
LOOP LP2
POP SI
POP CX
CMP DL, 1
JNZ NOSORT ; 判断交换标志
LOOP LP1
NOSORT:RET
MPSORTENDP
INT_OUT PROC FAR ; 输出数据组
MOVAL, NUMBUF
CBW
MOV CX, AX
MOV BL, 10H
LEA SI, NUMBUF + 1
PRINT:
MOVAL, [SI]
CALL OUTNUM
INC SI
MOVAH, 2
MOV DL, ' '
INT 21H
LOOP PRINT
RET
INT_OUT ENDP
OUTNUM PROC NEAR ; 将十进制数以十六进制输出
; 入口参数:AL(待转换的数据),BL(转换进制数16)
; 出口参数:无
MOVAH, 0
DIV BL
PUSH AX
CMPAH, 10
JB PNUM
ADD AH, 7
PNUM: ADD AH, 30H
MOV DL, AH
POPAX
PUSH DX
CMPAL, 0
JZ OUTN
CALL OUTNUM
OUTN:
POPDX
MOVAH, 2
INT 21H
RET
OUTNUM ENDP
TIMCHK PROC FAR ; 设定并显示时间
;设置显示器方式
MOVAH, 0
MOVAL, 3;
MOV BL, 0;
INT 10H ; 清屏
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 5 ; 列号
MOV DH, 6 ; 行号
INT 10H ; 设置提示光标位置设置
MOVAH, 9
LEA DX, IN_TIM
INT 21H ; 时间串提示
MOVAH, 0AH
LEA DX, KEYBUF
INT 21H ; 输入时间串
MOV BL, 10
MOVAL, KEYBUF + 2
SUB AL, '0'
MUL BL
ADD AL, KEYBUF + 3
SUB AL, '0'
CMPAL, 0
JB INVALID
CMPAL, 24
JAE INVALID ; 判断时 有效性
MOV CH, AL
MOVAL, KEYBUF + 5
SUB AL, '0'
MUL BL
ADD AL, KEYBUF + 6
SUB AL, '0'
CMPAL, 0
JB INVALID
CMPAL, 60
JAE INVALID ; 判断分 有效性
MOV CL, AL
MOVAL, KEYBUF + 8
SUB AL, '0'
MUL BL
ADD AL, KEYBUF + 9
SUB AL, '0'
CMPAL, 0
JB INVALID
CMPAL, 60
JAE INVALID ; 判断秒 有效性
MOV DH, AL
MOV DL, 0
MOVAH, 2DH
INT 21H ; 置系统时间
INVALID:
CALL TIME
RET
TIMCHK ENDP
TIME PROC ; 显示时间子程序
;设置显示器方式
MOVAH, 0
MOVAL, 3;
MOV BL, 0;
INT 10H ; 清屏
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 10 ; 列号
MOV DH, 9 ; 行号
INT 10H ; 提示信息光标位置设置
MOVAH, 9
LEA DX, HINTSTR
INT 21H ; 输出提示信息
DISP1:
MOVAH, 2
MOV BH, 0 ; 页号
MOV DL, 72 ; 列号
MOV DH, 0 ; 行号
INT 10H ; 提示光标位置设置
MOVAH, 2CH ; 取系统时间,CH,CL,DH 分别存放时/分/秒
INT 21H
MOVAL, CH ; 显示时
CALL SHOWNUM
MOVAH, 2
MOV DL, ':'
INT 21H
MOVAL, CL ; 显示分
CALL SHOWNUM
MOVAH, 2
MOV DL, ':'
INT 21H
MOVAL, DH ; 显示: 秒
CALL SHOWNUM
MOVAH,02H ; 设置光标位置
MOV DX,090AH
MOV BH,0
INT 10H
MOV BX,0018H
RE: MOV CX,0FFFFH ; 延时
REA: LOOP REA
DEC BX
JNZ RE
MOVAH, 0BH ; 或MOVAH, 01H
INT 21H ; INT 16H
CMPAL, 0 ; JE DISP1
JZ DISP1 ; 检查键盘状态
RET
TIME ENDP
SHOWNUM PROC ; 把AL中的数字以十进制输出
; 入口参数:AL(待显示的数据)
; 出口参数:无
CBW
PUSH CX
PUSH DX
MOV CL, 10
DIV CL
ADD AH, '0'
MOV BH, AH
ADD AL, '0'
MOVAH, 2
MOV DL, AL
INT 21H
MOV DL, BH
INT 21H
POPDX
POP CX
RET
SHOWNUM ENDP
CODE ENDS
END START
五、实验结果
运行程序。
主菜单界面,如图5-1。
图5-1 主菜单界面
展开阅读全文