emu编程统计字符串中的数字、字母、其它字符的个数,统计结果分别存放在 num, char, other 单元中。
时间: 2024-02-18 13:05:14 浏览: 69
你可以参考下面的 C 语言代码实现:
```c
#include <stdio.h>
#include <ctype.h>
int main() {
char str[100];
int i, num = 0, char_cnt = 0, other = 0;
printf("请输入字符串:");
fgets(str, sizeof(str), stdin);
for (i = 0; str[i] != '\0'; i++) {
if (isdigit(str[i])) {
num++;
} else if (isalpha(str[i])) {
char_cnt++;
} else {
other++;
}
}
printf("数字个数:%d\n", num);
printf("字母个数:%d\n", char_cnt);
printf("其它字符个数:%d\n", other);
return 0;
}
```
这个程序使用了 `isdigit()` 和 `isalpha()` 函数来判断字符是否为数字和字母,如果不是就认为是其它字符。程序首先从标准输入读入一个字符串,然后遍历字符串中的每个字符,统计数字、字母和其它字符的个数,并将结果分别存放在 `num`、`char_cnt` 和 `other` 变量中,最后输出统计结果。
相关问题
用emu8086编写一个程序,它先通过DOS调用接受一个字符串(长度255以内),然后通过DOS调用显示其数字的个数、英文字母的个数、以及字符串的长度
在emu8086模拟环境下编写一个简单的DOS调用程序,首先你需要了解基本的汇编指令和如何处理输入输出操作。以下是一个简化的示例程序,用于完成上述任务:
```assembly
[ORG] 0x7c00 ; DOS调用开始地址
; 定义DOS功能号和实参偏移量
COUNT_PARAMS equ 4 ; 字符串长度的参数位置
NUM_CHARS_PARAMS equ COUNT_PARAMS + 2 ; 数字字符计数的参数位置
LETTERS_PARAMS equ NUM_CHARS_PARAMS + 2 ; 英文字符计数的参数位置
; DOS函数入口点
start:
; 设置堆栈指针
MOV AX, @DATA
MOV DS, AX
; 打印 "Enter a string (max 255 characters):"
MOV AH, 9
LEA DX, prompt
INT 21h
; 读取用户输入,最多255个字符
MOV AH, 1
MOV CX, 255
LEA DX, input_buffer
INT 21h
; 计算字符串长度
MOV BX, input_buffer
XOR SI, SI
count_loop:
CMP BYTE [BX], 0
JE count_done
INC SI
INC BX
JMP count_loop
count_done:
MOV [input_length], SI ; 存储长度到内存
; 清空计数变量
MOV AL, 0
MOV [num_chars], AL
MOV [letter_count], AL
; 遍历字符串,统计数字和字母字符数
mov DI, input_buffer
check_char:
CMP BYTE [DI], '0'
JL check_alpha
CMP BYTE [DI], '9'
JLE check_num_done
INC [num_chars]
jmp check_alpha
check_num_done:
CMP BYTE [DI], 'a'
JL check_lowercase
CMP BYTE [DI], 'z'
JLE check_uppercase
CMP BYTE [DI], 'A'
JL check_alpha
CMP BYTE [DI], 'Z'
JLE check_alpha
INC [letter_count]
check_alpha:
INC DI
LOOP check_char
; 显示结果
MOV AH, 9
LEA DX, result_msg
INT 21h
MOV DL, [num_chars]
ADD DL, '0' ; ASCII码转字符
MOV AH, 2
INT 21h
MOV DL, ' '
INT 21h
MOV DL, [letter_count]
ADD DL, '0'
INT 21h
MOV DL, ' '
INT 21h
MOV DL, [input_length]
ADD DL, '0'
INT 21h
MOV AH, 9
LEA DX, newline
INT 21h
; 结束程序
MOV AH, 4Ch
INT 21h
prompt db 'Enter a string (max 255 characters):', 0Ah, 0Dh, '$'
input_buffer times 256 db 0
input_length resw 1 ; 字符串长度
num_chars resb 1 ; 数字字符计数
letter_count resb 1 ; 英文字符计数
result_msg db 'Number of digits:', '$'
newline db 0Dh, 0Ah, '$'
[END start] ; 段结束标志
```
这个程序通过INT 21H中断服务将信息打印到屏幕上,并使用简单的方式来检查字符串中的字符类型。注意,这只是一个基础示例,实际的emu8086环境可能会需要更复杂的中断处理和内存管理。
用emu8086实现按数字键“1”,按成将字符串中的小写字母变换成大写字母。用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按照下列格式在屏幕上显示:
以下是使用emu8086汇编语言实现该功能的代码:
```
assume cs:code, ds:data
data segment
inputStr db 20, 0 ; 存储输入字符串
outputStr db 20, 0 ; 存储输出字符串
crlf db 0dh, 0ah, '$' ; 换行符
data ends
code segment
start:
mov ax, data
mov ds, ax
; 输出提示信息
mov ah, 09h
lea dx, prompt
int 21h
; 读取用户输入的字符串
mov ah, 0ah
lea dx, inputStr
int 21h
; 将小写字母转换成大写字母
lea si, inputStr+2 ; 跳过输入字符串长度和缓冲区标识符
lea di, outputStr+2 ; 跳过输出字符串长度和缓冲区标识符
mov cx, [inputStr+1] ; 获取输入字符串的长度
convert_loop:
mov al, [si] ; 取出一个字符
cmp al, 'a' ; 判断是否为小写字母
jb not_lower
cmp al, 'z'
ja not_lower
sub al, 20h ; 转换成大写字母
not_lower:
mov [di], al ; 存储转换后的字符
inc si
inc di
loop convert_loop
; 输出转换后的字符串
mov ah, 09h
lea dx, outputStr+2
int 21h
mov ah, 09h
lea dx, crlf
int 21h
; 程序结束
mov ah, 4ch
int 21h
prompt db 'Please enter a string: $'
code ends
end start
```
代码说明:
1. 首先定义了两个数据段,分别存储输入字符串、输出字符串和换行符。
2. 在代码段中定义了一个 `start` 标号,作为程序入口。
3. 在 `start` 中,首先将数据段地址存入 `ds` 寄存器中。
4. 使用 `int 21h` 中断调用输出提示信息。
5. 使用 `int 21h` 中断调用读取用户输入的字符串,将其存入 `inputStr` 中。
6. 使用 `lea` 指令将 `si` 和 `di` 分别指向输入字符串和输出字符串的第一个字符。
7. 使用 `mov` 指令将输入字符串的长度存入 `cx` 中。
8. 使用 `loop` 指令循环处理输入字符串中的每一个字符。
9. 对于每一个字符,判断是否为小写字母,如果是则将其转换成大写字母,并存入输出字符串中。
10. 处理完所有字符后,使用 `int 21h` 中断调用输出转换后的字符串。
11. 使用 `int 21h` 中断调用输出换行符。
12. 使用 `int 21h` 中断调用程序结束。
注意:在使用emu8086进行汇编时,需要将源代码保存为扩展名为 .asm 的文件,并在EMU8086中打开该文件进行编译和运行。
阅读全文