用C++編寫通訊錄參考模板_第1頁
用C++編寫通訊錄參考模板_第2頁
用C++編寫通訊錄參考模板_第3頁
用C++編寫通訊錄參考模板_第4頁
用C++編寫通訊錄參考模板_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1/26課程設(shè)計報告課程名稱:數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計題目:用散列表建立通訊錄系別:專業(yè):組別:起止日期:指導(dǎo)教師:計算機(jī)科學(xué)與技術(shù)系二○一一年制課程設(shè)計任務(wù)書課程設(shè)計題目建立通訊錄組長學(xué)號班級系別專業(yè)組員指導(dǎo)教師課程設(shè)計目的(1)熟練掌握C語言的基本知識和技能;(2)基本掌握面向?qū)ο蟪绦蛟O(shè)計的基本思路和方法;(3)能夠利用所學(xué)的基本知識和技能,解決簡單的程序設(shè)計問題。課程設(shè)計所需環(huán)境MicrosoftVisualC++6.0課程設(shè)計任務(wù)要求(1)設(shè)每個記錄有下列數(shù)據(jù)項:電話號碼、用戶名、地址;(2)從鍵盤輸入各記錄,分別以電話號碼為關(guān)鍵字建立散列表;(3)采用二次探測再散列法解決沖突;(4)查找并顯示給定電話號碼的記錄;(5)通訊錄信息文件保存;(6)要求人機(jī)界面友好,使用圖形化界面;課程設(shè)計工作進(jìn)度計劃序號起止日期工作內(nèi)容分工情況12調(diào)試與操作說明3需求分析4詳細(xì)代碼5引言6總結(jié)與體會教研室審核意見:教研室主任簽字:年月日一、引言二、需求分析(1)課程設(shè)計題目這一組的課程設(shè)計題目是《用哈希表建立通訊錄》,并實現(xiàn)語言選單、創(chuàng)建、修改、查詢、刪除、文件的操作等。(2)課程設(shè)計的目的掌握數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)技術(shù),學(xué)會分析研究計算機(jī)加工的數(shù)據(jù)結(jié)構(gòu)的特性,以便應(yīng)用涉及的數(shù)據(jù)選擇適當(dāng)?shù)倪壿嫿Y(jié)構(gòu)、存儲結(jié)構(gòu)及其相應(yīng)的算法,應(yīng)用相關(guān)知設(shè)計設(shè)散列表實現(xiàn)電話號碼查找系統(tǒng)。(3)課程設(shè)計的要求【基本要求】eq\o\ac(○,1)設(shè)每個記錄有下列數(shù)據(jù)項:電話號碼、用戶名、地址;eq\o\ac(○,2)從鍵盤輸入各記錄,分別以電話號碼為關(guān)鍵字建立散列表;eq\o\ac(○,3)采用二次探測再散列法解決沖突;eq\o\ac(○,4)查找并顯示給定電話號碼的記錄;eq\o\ac(○,5)通訊錄信息文件保存;eq\o\ac(○,6)要求人機(jī)界面友好,使用圖形化界面;【選做內(nèi)容】eq\o\ac(○,1)系統(tǒng)功能的完善;eq\o\ac(○,2)設(shè)計不同的散列函數(shù),比較沖突率;eq\o\ac(○,3)在散列函數(shù)確定的前提下,嘗試各種不同類型處理沖突的方法,考察平均查找長度的變化。eq\o\ac(○,4)使用漢字顯示。(4)課程設(shè)計的主要思想課程設(shè)計中,通過不同的選擇輸入,實現(xiàn)不同的功能。有語言提示,它是通過不同的輸入選擇不同的語言。在通信錄的創(chuàng)建中,把輸入的信息保存在一個數(shù)組里,通過輸入的電話號碼,將其轉(zhuǎn)化為數(shù)據(jù),通過取余,找到它在哈希表的位置,如果位置沖突,就用二次探測處理。在查找中,通過輸入的電話號碼,調(diào)用哈希表尋找它在哈希表的位置,并把它輸出。同樣,修改于刪除都是通過同樣的的道理找到它在哈希表中的位置。在修改的時候,通過不同的修改選單實現(xiàn)不同的修改,在刪除的時候,找到它的位置,在輸出的的時候不輸出,其實它并沒有真正意義的被刪除。三、概要設(shè)計(1)流程圖eq\o\ac(○,1)概括圖通過得到不同的字符,實現(xiàn)不同的操作通過得到不同的字符,實現(xiàn)不同的操作語言選單,并返回主函數(shù)創(chuàng)建通訊錄,用哈希表實現(xiàn),并返回主函數(shù)查找操作,并返回主函數(shù)刪除某人的信息,并返回主函數(shù)修改某人的信息,并返回主函數(shù)顯示通訊錄中所有的信息,并返回主函數(shù)退出整個程序文件的存于讀,并返回主函數(shù)圖1概括圖結(jié)束eq\o\ac(○,2)創(chuàng)建開始字符轉(zhuǎn)化為數(shù)字在哈希表中位置地址沖突結(jié)束開始字符轉(zhuǎn)化為數(shù)字在哈希表中位置地址沖突保存二次哈希非負(fù)圖2創(chuàng)建的流程圖eq\o\ac(○,3)查找開始開始輸入要找的號碼,并轉(zhuǎn)化為數(shù)字在哈希表中的位置及號碼比較二次哈希找到下標(biāo)非負(fù),號碼比較結(jié)束圖3查找的流程圖eq\o\ac(○,4)修改結(jié)束開始輸入修改后的信息輸入要修改的號碼,并轉(zhuǎn)化為數(shù)字結(jié)束開始輸入修改后的信息輸入要修改的號碼,并轉(zhuǎn)化為數(shù)字二次哈希找到,并選擇修改項下標(biāo)非負(fù),號碼比較在哈希表中的位置及比較修改成功圖4修改的流程圖eq\o\ac(○,5)刪除輸入要刪除的號碼,并轉(zhuǎn)化為數(shù)字二次哈希開始下標(biāo)非負(fù),號碼比較輸入要刪除的號碼,并轉(zhuǎn)化為數(shù)字二次哈希開始下標(biāo)非負(fù),號碼比較在哈希表中位置及比較找到,刪除結(jié)束圖5刪除的流程圖(2)設(shè)計方法及原理主函數(shù)里,對不同的子函數(shù),通過的到的不同字符對其進(jìn)行調(diào)用。在建立通訊錄中,用了哈希表的建立,在哈希表中,是將字符型數(shù)字轉(zhuǎn)化為整形數(shù)據(jù),并對哈希表的原有長度取余得到存儲的位置,而得到的位置可能已被使用,故有調(diào)用了二次哈希,并以最后處理的下標(biāo)是否為非負(fù),來決定是存儲還是不存儲。,而在下面的查詢、刪除、修改中,都是調(diào)用哈希表,找到它在哈希表中的位置來進(jìn)行不同的操作。其中,在刪除時,用了一個全局變量來存儲要刪除的位置的下標(biāo),在輸出的時候不將其輸出,而真正意義上,它并沒有從保存的位置刪除。在修改中,通過選擇不同。來修改不同的信息。這個設(shè)計,主要就是對哈希表的調(diào)用與沖突的處理。四、詳細(xì)內(nèi)容程序代碼#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>//為了使用getch()方法#include<windows.h>#defineMAXSIZE200//電話薄記錄數(shù)量#defineMAX_SIZE20//人名的最大長度#defineHASHSIZE67//定義表長#defineLENsizeof(HashTable)typedefintStatus;typedefcharFRI[MAX_SIZE];intss=201;//用于幫助刪除typedefstruct{//記錄 FRIname;FRItel;FRIadd;}Record;typedefstruct{//哈希表 Record*elem[HASHSIZE];//數(shù)據(jù)元素存儲基址intcount;//當(dāng)前數(shù)據(jù)元素個數(shù)intsize;//最大容量}HashTable;voidSystemTime()//顯示系統(tǒng)時間{ SYSTEMTIMEsys;GetLocalTime(&sys);printf("%4d/%02d/%02d\n%02d:%02d:%02d.%03d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds);}voidPR1(){ printf("\t\t************************\n"); SystemTime(); printf("\t\t\t通訊錄操作的目錄\n\n"); printf("\t\t************************\n\n");}voidPR11(){ printf("\t\t************************\n\n"); printf("\t\t\tDirectoriesoperationdirectory\n\n"); printf("\t\t************************\n\n");}voidPR2(){ printf("\t按a鍵,顯示語言提示選單\t\t"); printf("按b鍵,創(chuàng)建新的通訊錄\n\n"); printf("\t按c鍵,在通信錄的末尾寫入新的信息\t\t"); printf("按d鍵,查詢某人的信息\n\n"); printf("\t按e鍵,修改某人的信息\t\t"); printf("按f鍵,刪除某人的信息\n\n"); printf("\t按g鍵,顯示通訊錄中的所有記錄\t\t"); printf("按h鍵,退出選單\n\n"); printf("\t按i鍵,保存通訊錄中的所有記錄到指定文件中\(zhòng)n\n"); printf("\t按j鍵,從指定文件中讀取通訊錄中的記錄\n"); printf("\n友情提示:\n\t先建立方可進(jìn)行查找、修改、刪除、顯示,在從文件讀取前,應(yīng)先存入文件\n\n"); printf("\t");}voidPR22(){ printf("\tPressingakey,Languagemenu\n\n"); printf("\tPressingbkey,Createanewaddressbook\n\n"); printf("\tPressingckey,Theendofthecommunicationrecordtowriteanew\n\tinformation\n\n"); printf("\tPressingdkey,Inquirestheinformation.Someone\n\n"); printf("\tPressingekey,Modifysomeone'sinformation\n\n"); printf("\tPressingfkey,Removesomeone'sinformation\n\n"); printf("\tPressinggkey,Alltherecordsshowdirectories\n\n"); printf("\tPressinghkey,Exitmenu\n\n"); printf("\tPressingikey,Savealltherecordstothespecifieddirectoryfile\n\n"); printf("\tPressingjkey,Readdirectoriesfromaspecifiedfilerecordin\n\n"); printf("\nHelpfulhints:\n\tTocreatecansearch,modify,delete,display,inreadfromthefile,"); printf("\n\tshouldfirstbeforedepositfiles\n\n"); printf("\t"); }voidPR3(){ printf("\n\t\t************************\n"); SystemTime(); printf("\t\t\t創(chuàng)建通訊錄\n\n"); printf("\t\t************************\n\n");}voidPR4(inti){ printf("\n\t\t************************\n"); SystemTime(); printf("\t\t\t查詢某人的信息\n\n");printf("\t\t************************\n\n");}voidPR5(){ printf("\n\t\t************************\n"); SystemTime(); printf("\t\t\t修改某人的信息\n\n"); printf("\t\t************************\n\n");}voidPR6(){ printf("\n\t\t************************\n"); SystemTime(); printf("\t\t\t\t刪除某人的信息\n\n"); printf("\t\t************************\n\n");}voidPR7(){ printf("\n\t\t************************\n"); SystemTime(); printf("\t\t\t在通信錄的末尾寫入新的信息\n\n"); printf("\t\t************************\n\n");}voidPR8(){ printf("\n\t\t************************\n"); SystemTime(); printf("\t\t\t通訊錄中已存信息\n\n");printf("\t\t************************\n\n");}voidPR9(){ printf("\n\t\t************************\n"); SystemTime(); printf("\t\t\t從文件中讀取結(jié)果\n\n");printf("\t\t************************\n\n");}voidMenu(){ system("cls"); intn; printf("\n\n\n\n\n\n\n\n\n\t\t\t輸入1(漢語)、2(英語)選擇語言:"); scanf("%d",&n); system("cls"); if(n==1) { PR1(); PR2(); } if(n==2) { PR11(); PR22(); }}intNUM_BER=0;intcollision(intp,int&c){ inta,pp; a=c/2+1; while(a<HASHSIZE) { if(a%2==0) { c++; pp=(p+2*a)%HASHSIZE; if(pp>0) returnpp; else a=c/2+1; } else { pp=(p-2*a)%HASHSIZE; c++; if(pp>0) returnpp; else a=c/2+1; } } return-1;}intHASH(FRIte)//哈希函數(shù){ intm; longn; n=atoi(te); m=n%HASHSIZE; returnm;}voidAppend()//寫入后繼內(nèi)容{ system("cls"); FILE*fp; FRIpa; PR7(); if((fp=fopen("D:\\wo.txt","ab+"))==NULL) printf("\tFileopenerroe!"); printf("\n\t輸入追加的內(nèi)容:"); gets(pa); fwrite(pa,sizeof(FRI),1,fp); fclose(fp); printf("\n\n\n\t\t按Esc鍵,返回主菜單");}voidCreateHash(HashTable*H,Record*a)//以電話號碼為關(guān)鍵字{// SystemTime(); inti,c,p=-1,pp; for(i=0;i<NUM_BER;i++) { c=0; p=HASH(a[i].tel);pp=p; while(H->elem[pp]!=NULL) { pp=collision(p,c); if(pp<0) { printf("\t第%d記錄無法解決沖突",i+1); continue; } } H->elem[pp]=&(a[i]); H->count++; } printf("\n\t\t\t建表完成!\n\n\t\t散列表的容量為%d,當(dāng)前容量為%d",HASHSIZE,H->count);}voidgetin(Record*a,HashTable*H)//鍵盤輸入個人的信息{ system("cls"); PR3(); printf("\t輸入要添加的個數(shù):"); scanf("%d",&NUM_BER); inti; for(i=0;i<NUM_BER;i++) { printf("\n\t\t\t\t請輸入第%d個的記錄\n",i+1); printf("\t輸入其姓名:"); fflush(stdin); gets(a[i].name); printf("\n\t輸入其電話號碼:"); fflush(stdin); gets(a[i].tel); printf("\n\t輸入其地址:"); fflush(stdin); gets(a[i].add); } CreateHash(H,a);//建立散列表存儲 printf("\n\n\t按Esc鍵,返回主菜單");}intbj(FRItel1,FRItel2)//字符串的比較{ if(strcmp(tel1,tel2)==0) return1; else return0;}voidFind(HashTable*H,int&c)//查找{ system("cls"); PR4(0); fflush(stdin); FRItel; intp,pp; printf("\n\t輸入要查找的號碼:");gets(tel);p=HASH(tel); pp=p; while(H->elem[pp]!=NULL&&bj(tel,H->elem[pp]->tel)==0) pp=collision(p,c); if(H->elem[pp]!=NULL&&bj(tel,H->elem[pp]->tel)==1) { printf("\n\t\t\t查找成功\n\n"); printf("\t姓名:%s\n\n\t電話號碼:%s\n\n\t聯(lián)系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); } else printf("\n\t此人不存在,失敗!\n"); printf("\n\t按Esc鍵,返回主菜單");}voidAlter(HashTable*H,int&c)//修改{ system("cls"); PR5(); fflush(stdin); FRItel; FRIgai; intp,pp,i; printf("\n\t輸入要修改信息的號碼:");gets(tel);p=HASH(tel); pp=p; while(H->elem[pp]!=NULL&&bj(tel,H->elem[pp]->tel)==0) pp=collision(p,c); if(H->elem[pp]!=NULL&&bj(tel,H->elem[pp]->tel)==1) { printf("\n\t輸入1,2來選擇修改項【1:修改姓名,2:修改地址】:"); scanf("%d",&i); switch(i) { case1: fflush(stdin); printf("\n\t輸入要修改后的姓名:"); gets(gai); strcpy(H->elem[pp]->name,gai); break; case2: fflush(stdin); printf("\n\t輸入要修改后的地址:"); gets(gai); strcpy(H->elem[pp]->add,gai); break; default: printf("\n\t輸入錯誤!"); } } else printf("\n\t此人不存在,失敗!\n"); printf("\n\n\n\t按Esc鍵,返回主菜單");}voidDelete(HashTable*&H,intc,Record*a)//刪除{ system("cls"); PR6(); fflush(stdin); FRItel; printf("\n\n\t輸入要刪除的電話號碼:"); gets(tel); inti=0;while(strcmp(a[i].tel,tel)!=0) i++; ss=i; intp,pp; p=HASH(tel); pp=p; while(H->elem[pp]!=NULL&&bj(tel,H->elem[pp]->tel)==0) pp=collision(p,c); if(H->elem[pp]!=NULL&&bj(tel,H->elem[pp]->tel)==1) { H->elem[pp]=NULL; H->count--; } printf("\n\t按Esc鍵,返回主菜單");}voidList(Record*a,HashTable*H)//輸出{ system("cls"); PR8(); inti; printf("\t\t姓名\t電話號碼\t\t聯(lián)系地址\n\n"); for(i=0;i<NUM_BER;i++) if(i!=ss) printf("\t\t%s\t%s\t\t%s\n\n",a[i].name,a[i].tel,a[i].add); printf("\n\n\t\t\t按Esc鍵,返回主菜單");}voidSave(Record*a)//寫入文件{ FILE*fp; Record*pp;if((fp=fopen("D:\\wo.txt","wb"))==NULL) printf("\nFileopenerror");pp=a; fwrite(pp,sizeof(Record),NUM_BER,fp);fclose(fp);printf("\n\t按Esc鍵,返回主菜單");}voidLoad(Record*a)//從文件讀取{ system("cls"); FILE*fp; Record*pp; pp=a; PR9(); if((fp=fopen("D:\\wo.txt","rb"))==NULL) printf("\nFileopenerror"); printf("\t姓名\t電話號碼\t\t聯(lián)系地址\n\n"); fread(pp,sizeof(Record),NUM_BER,fp); for(inti=0;i<NUM_BER;i++,pp++) printf("\t%s\t%s\t\t%s\n\n",pp->name,pp->tel,pp->add); fclose(fp); printf("\n\t按Esc鍵,返回主菜單");}intQuit()//結(jié)束程序{ return0;}intmain(){ intc,flag=1; HashTable*H; H=(HashTable*)malloc(LEN); for(inti=0;i<HASHSIZE;i++) H->elem[i]=NULL; H->count=0; H->size=HASHSIZE; Recorda[MAXSIZE];loop:PR1();PR2(); for(i=0;;i++) switch(getch())//根據(jù)得到的字符,執(zhí)行相應(yīng)的操作 { case'a':Menu();break;//的功能:顯示語言提示選單。case'b':getin(a,H);break;//的功能:創(chuàng)建新的通訊錄。case'c':Append();break;//的功能:在通訊錄的末尾寫入新的信息,并返回選單。case'd':c=0; Find(H,c);break;//查詢某人的信息,如果找到了,則顯示該人的信息, //如果沒有則提示通訊錄中沒有此人的信息,并返回選單。case'e':c=0; Alter(H,c);break;//的功能:修改某人的信息,如果未找到要修改的人,則提示通訊錄中沒有此人的信息,并返回選單。case'f':c=0; Delete(H,c,a);break;//的功能:刪除某人的信息,如果未找到要刪除的人,則提示通訊錄中沒有此人的信息,并返回選單。case'g':List(a,H);break;//的功能:顯示通訊錄中的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論