简易电话号码簿程序设计一、设计目标编写一个管理电话号码的程序。
二、设计要求1. 实现人名、电话号码的录入(假定一个人只有一个电话号码)。
2. 人名、电话号码的删除、修改。
3. 根据人名查询该人的电话号码。
4. 用文件保存电话簿。
5. 根据电话号码查询该人的名字。
6. 根据人名进行电话号码的模糊查询(如输入某人的姓,则同姓的其他人的电话号码也可以显示出来)。
三、设计提示文件操作、键盘操作和屏幕操作可利用DOS和BIOS系统中断完成。
相关核心提示见“单词记忆测试器程序设计”一题。
DATAS SEGMENTcount db 4buf db'li ','54698765 ', ;存储人名和电话号码的数据单元区'liu ','69856456 ','hu ','565664789 ','zhang ','569874123 ',20 dup(10 dup (0),10 dup (0)) ;为再存入数据开辟空间_name db 10, ?,10 dup(?) ;缓冲区——键盘输入name字符串num db 10, ?,10 dup(?) ;缓冲区——键盘输入num字符串temp db 20 dup(?),0dh,0ah,'$'; 缓冲区——存入人名和电话簿信息menuitem db' (people phonenumber management system)',0ah,0dh db' @************************&&&**************************@',0ah,0dhdb' # { this is main menu } #',0ah,0dhdb' # 1. query (q) #',0ah,0dhdb' # 2. insert (i) #',0ah,0dhdb' # 3. modify (m) #',0ah,0dhdb' # 4. delete (d) #',0ah,0dhdb' # 5. exit (e) #',0ah,0dhdb' @************************&&&**************************@',0ah,0dhdb'please select(q,i,m,d or e):',0ah,0dh,'$';显示主菜单相关信息mess1 db'name',10 dup(' '),'tel',0ah,0dh,'$'mess2 db'please Input the name:$'mess3 db'please Input the telephone number:$'mess4 db 0ah,0dh,'$';专门定义一个MESS4,以便在代码中用9号功能调用实现换行mess5 db'Insert succed!$'mess6 db'delete succed!$'mess7 db'the information!$'mess8 db'modify succed!$'mess9 db'please Input the new name:$'mess10 db'please Input the new number:$'err1 db'there is not exsit the people!',0ah,0dh,'$';错误提示信息DATAS ENDSSTACKS SEGMENTdb 2000 dup(?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSmain proc farmov ax,datasmov ds,axmov es,axn1: lea dx,menuitemmov ah,9int 21h ;显示主菜单选择界面mov ah,1int 21h ;从键盘输入字符cmp al,'q'jnz n2call query ;若所输字符是‘q‘,则调用子程序queryjmp n1n2: cmp al,'i'jnz n3call insert ; 若所输字符是‘i‘,则调用子程序insert jmp n1n3: cmp al,'m'jnz n4call modifyn4: cmp al,'d'jnz n5call deleten5: cmp al,'e'jz exitjmp n1exit:mov ah,7int 21hmov ah,4chint 21hret ;退出query proc near ;查找的主程序push dsxor ax,axpush axmov ax,datasmov ds,axmov es,axcld ;清除方向标志lea dx,mess4mov ah,9int 21h ;换行lea dx,mess2mov ah,9int 21hcall ipname ;调用子程序ipname,从键盘上输入人名lea dx,mess4mov ah,9int 21hcall search ;具体查找的子程序mov ah,7int 21hretquery endpipname proc near ;从键盘输入名字lea dx,_name ;存放待查找的人名地址mov ah,10int 21hmov bh,0mov bl,_name+1 ;bl 存放从键盘输入的字符串长度mov cx,10sub cx,bx ;计算剩下的长度r:mov _name[bx+2],20h ;剩下的地方补空格inc bxloop rretipname endpsearch proc nearlea di,buf ;di 中存放表首地址push dimov bl,countl:lea si,_name+2mov cx,10repe cmpsb ;比较si 和di的前10个字节jz n6 ;不相等时不跳转pop diadd di,20 ;di 偏移地址加20push didec bxjnz llea dx,err1 ;提示‘找不到。
‘信息mov ah,9int 21hjmp n1n6:pop dimov si,dilea di,tempmov cx,20rep movsb ; 将人名和号码信息传入temp lea dx,mess1mov ah,9int 21hlea dx,tempmov ah,9int 21h ;输出temp中的人名和号码retsearch endpinsert proc nearlea dx,mess4mov ah,9int 21hlea dx,mess2mov ah,9int 21hlea dx,mess4mov ah,9int 21hcall ipname ;调用输入人名的子程序lea dx,mess4mov ah,9int 21hlea dx,mess3int 21hcall ipnumber ;调用输入号码的子程序cldmov al,20mov cl,countmul cl ;ax 存放buf里已有数据的字节数lea di,bufadd di,ax ;将di移动指向数据单元中的已经存入的最后人的电话后lea si,_name+2mov cx,10rep movsb ;将si 中数据(人名)传di中lea si,num+2mov cx,10rep movsb ;再传数据(号码)到di中inc count ;count 加一条记录lea dx,mess5mov ah,9int 21hlea dx,mess4mov ah,9int 21hmov ah,7int 21hretinsert endpipnumber proc near ;从键盘输入号码lea dx,num ;存放待存入的电话号码mov ah,10int 21hlea dx,mess4mov ah,9int 21hmov bh,0mov bl,num+1 ;存放从键盘输入的字符串长度mov cx,10sub cx,bxc1: mov num[bx+2],20h ;补空格inc bxloop c1retipnumber endpdelete proc nearlea dx,mess4int 21hlea dx,mess2mov ah,9int 21hlea dx,mess4mov ah,9int 21hcall ipnamelea dx,mess4mov ah,9int 21hcall delete1retdelete endpdelete1 proc nearlea di,buf ;di 中存放表首地址push dimov bl,countmov bh,0p:lea si,_name+2mov cx,10repe cmpsb ;比较si 和di的前10个字节jz a ;不相等时不跳转pop diadd di,20 ;di 偏移地址加20push didec bxjnz plea dx,err1 ;提示‘找不到。
‘信息mov ah,9int 21hjmp n1a:pop dilea dx,mess4mov ah,9int 21hlea dx,mess7mov ah,9int 21hlea dx,mess4mov ah,9mov al,20 ;计算最后一个数据的偏移量dx mov cl,countdec clmul clmov dx,axlea si,bufadd si,dxmov cx,20cldrep movsbdec countlea dx,mess6mov ah,9int 21hlea dx,mess4mov ah,9int 21hmov ah,7int 21hretdelete1 endpmodify proc nearlea dx,mess4mov ah,9int 21hlea dx,mess2mov ah,9int 21hcall ipnamelea dx,mess4mov ah,9int 21hcall modify1lea dx,mess4mov ah,9int 21hlea dx,mess8mov ah,9int 21hlea dx,mess4mov ah,9int 21hint 21hretmodify endpmodify1 proc nearlea di,buf ;di 中存放表首地址push dimov bl,countmov bh,0m:lea si,_name+2mov cx,10repe cmpsb ;比较si 和di的前10个字节jz n ;不相等时不跳转pop diadd di,20 ;di 偏移地址加20push didec bxjnz mlea dx,err1 ;提示‘找不到。