该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
计算机专业2008-2009年第一学期试题:
最后三道程序题:
一、编写模块程序:
要求如下:
主程序功能要求:首先从键盘接收一个长字符串,保存在字节字符串变量ARRAY中(ARRAY的长度不超过80字节),然后,不断的从键盘接收一个新字符并保存在字符变量CHAR中,显示字符CHAR以及它在ARRAY数组中出现的次数(假设字符CHAR出现的次数不超过15次,用十六进制形式显示次数)。
子程序功能要求:在字符串ARRAY中查找字符CHAR的出现的次数,然后将字符CHAR的出现次数返回给主程序。
这道题,几乎年年考
具体实现代码如下:有一个问题,我没有写程序出口,哈哈,不过题目要求的目标是达到了,有兴趣的同学可以修改一下,加几行代码就行了,使之更完善:
DATASEGMENT
ARRAYDB 81
DB ?
DB 81 DUP(0)
CHARDB ?
NUMDB 0
DATAENDS
STACKSEGMENTSTACK
DB 200 DUP(0)
STACKENDS
CODESEGMENT
ASSUMEDS:DATA,SS:STACK,CS:CODE,ES:DATA ;附加数据段必须要定义
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DX,ARRAY ;从键盘输入字符串
MOV AH,10
INT 21H
MOV DL,0AH ;回车换行
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
T:MOV AH,1 ;从键盘输入一个字符,并存在CHAR变量中
INT 21H
MOV CHAR,AL
CALL ABC ;调用子程序ABC
MOV DL,0AH ;回车换行
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
CMP NUM,10 ;下面的语句是判断是在0-9还是10-15之间
JB B
JMP C
B:ADD NUM,30H ;在0-9之内
JMP D
C:ADD NUM,37H ;在10-15之内
D:MOV DL,NUM ;输出次数
MOV AH,2
INT 21H
MOV DL,0AH ;回车换行
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
JMP T ;循环输入测试CHAR,我没有写退出程序的出口了
MOV AH,4CH
INT 21H
ABCPROC ;子程序
PUSH AX
PUSH DX
PUSH DI
LEA DI,ARRAY+2 ;因为是字符串从第三个位置开始存
MOV CL,ARRAY+1 ;一共输入的字符总数存在第二个位置
mov CH,0
MOV BL,0 ;计数专用寄存器
MOV AL,CHAR
CLD
P:REPNE SCASB ;字符串搜索指令
JE LOOP1 ;若找到,转LOOP1
MOV DI,0 ;没找到,转OUT1
JMP OUT1
LOOP1:INC BL ;计算开始,找到一个,累加一次
CMP CX,0 ;CX中存放的是从键盘输入的字符串的个数,若CX不为0,继续搜索
JNE P
OUT1:MOV NUM,BL ;把BL的值存入NUM变量中
POP DI
POP DX
POP AX
RET
ABCENDP
CODE ENDS
END START