实验2.4 查找电话号码

1.题目:查找电话号码phone

2.实验要求:

(1)要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)以及电话号码(8个字符)两部分。

(2)程序接收输入的电话号码和名字,并把他们存放在电话号码表。

(3)根据用户输入的名字查找对应的电话号码并显示出来。

程序运行结果

实验代码

assume cs:code, ds:data

data segment
        displayNameTip db 'Input name:$'  ;提示输入名字
        displayTelephoneTip db 'Input a telephone number:$';提示输入电话号码
        nameAndPhone db 33 dup(' '),'$'          ;数据的数据
        phoneTable db 1500 dup(' ')   ;电话表
        count db 0     ;当前电话表中存在数据的个数
        result db 'name                tel.$'
        enter db 0ah, 0dh,'$'  ;回车换行
        IncreasePhone db 'Do you want to add a phone book?[y/n]$'
        displayQueryTip db 'Do you need to query a phone number?[y/n]$'
        displayNotFindTip db 'Not found this name!$'
data ends

code segment
main proc far
start:
        push ds
        sub ax, ax
        push ax
        mov ax, data
        mov ds, ax
        mov es, ax

        mov cx, 2
        mov ax, 0  ;电话计数
        ;循环建立电话簿
keep:
        lea dx, IncreasePhone
        call show
        call memsetInputArray

        call inputChar
        cmp al, 'n'
        je sortName
        lea dx, enter
        call show

        ;输入名字
        lea dx, displayNameTip
        call show
        lea dx, nameAndPhone
        call inputFunction
        lea dx, enter
        call show

        ;输入电话号码
        lea dx, displayTelephoneTip
        call show
        lea dx, nameAndPhone+22
        call inputFunction
        lea dx, enter
        call show
        call clearThe_0D

        call saveNameAndPhone

        mov cx, 2
        loop keep

;电话表排序
sortName:
        call name_sort

;查询   
        lea dx, enter
        call show
query:
        mov cx, 2
        lea dx, displayQueryTip
        call show
        call inputChar
        cmp al, 'n'
        je exit
        lea dx, enter
        call show
        lea dx, displayNameTip
        call show
        lea dx, nameAndPhone
        call inputFunction
        lea dx, enter
        call show
        
        call clearThe_0D
        call queryByName
        cmp al, 1h
        jne notFound
        jmp Founded

Founded:
        mov ax, dx
        lea dx, result
        call show
        lea dx, enter
        call show
        mov dx, ax
        call show

        jmp nextQuery

notFound:
        lea dx, displayNotFindTip
        call show
        
nextQuery:
        lea dx, enter
        call show
        loop query

exit:        
        ret
main endp

queryByName proc near  ;通过名字查找电话号码,如果查到,将al值的是1,地址保存在dx中
        push si
        push di
        push cx
        push bx

        mov al, count
        cbw 
        mov bx, ax  ;总的号码个数
        lea si, nameAndPhone+1
        mov al, [si]
        cbw
        mov ax, 20
        lea si, nameAndPhone+2
        lea di, phoneTable
f6:
        push di
        mov cx, ax ;名字的长度
        cld 
        repe cmpsb
        pop di
        je hasFound
        dec bx
        add di, 30
        lea si, nameAndPhone+2
        cmp bx, 0
        jne f6

        pop bx
        pop cx
        pop di
        pop si

        mov al, 0
        ret

hasFound:
        mov dx, di
        pop bx
        pop cx
        pop di
        pop si
        mov al, 1h
        ret

queryByName endp

clearThe_0D proc near ;输入结束后末尾会加上0Dh,清理掉输入中的换行符

        push si
        push cx
        push ax
        mov cx, 34
        lea si, nameAndPhone
f5:     
        mov al, [si]
        cmp al,0dh
        je replace
        jmp next
replace:
        mov byte ptr [si], ' '
next:
        inc si
        loop f5
        
        pop ax
        pop cx
        pop si
        ret
clearThe_0D endp

memsetInputArray proc near  ;输入暂存数组清理
        push si
        push cx
        lea si, nameAndPhone
        mov cx, 32
f4:
        mov [si], ' '
        inc si
        loop f4
        pop cx
        pop si
        ret
memsetInputArray endp

name_sort proc near  ;名字排序
        push ax
        push cx
        push si
        push di
        push dx

        mov al, count
        mov ah, 0h
        mov cx, ax
        cmp cx, 1
        je exit1
        cmp cx, 0
        je exit1
        dec cx
        lea si, phoneTable
        
f1:     
        mov dx, cx
        mov di, si
f2:
        add di, 30
        push cx
        push di
        push si
        cld
        mov cx, 20
        repe cmpsb
        pop si
        pop di
        pop cx
        jna f2end
        call swapString
f2end:
        loop f2
        mov cx, dx
        add si, 30
        loop f1

exit1:
        pop dx
        pop di
        pop si
        pop cx
        pop ax
        ret
name_sort endp

swapString proc near ;冒泡排序交换30个字符
        push ax
        push bx
        push cx
        push si
        push di
        mov cx, 30

f3:
        mov al, [si]
        mov bl, [di]
        mov byte ptr [si], bl
        mov byte ptr [di], al
        inc di
        inc si
        loop f3

        pop di
        pop si
        pop cx
        pop bx
        pop ax
        ret
swapString endp

show proc near  ;显示提示符

        push ax
        cld
        mov ah, 09h
        int 21h
        pop ax
        ret

show endp

saveNameAndPhone proc near  ;将输入数据保存在电话表中
        push ax
        push bx
        push cx
        push si
        push di

        mov ah, 0
        mov al, count
        mov bl, 30
        mul bl
 
        ;名字
        mov bx, ax
        lea si, nameAndPhone+2
        lea di, phoneTable[bx]
        mov cx, 20
        cld
        rep movsb

        ;电话号码
        lea si, nameAndPhone+24
        lea di, phoneTable[bx+20]
        mov cx, 8
        cld 
        rep movsb
        mov [di], '$'

        ;计数器+1
        mov al, count
        inc al
        mov count, al

        pop di
        pop si
        pop cx
        pop bx
        pop ax

        ret
saveNameAndPhone endp

inputFunction proc near ;输入数据
        push ax
        mov ah, 0ah
        int 21h   
        pop ax     
        ret
inputFunction endp

inputChar proc near  ;单个字符
        mov ah, 01h
        int 21h
        ret
inputChar endp


code ends
end start

猜你喜欢

转载自blog.csdn.net/qq_65120254/article/details/134601991