第一篇:軟件工程 通訊錄查詢系統
《數據結構》課程設計報告
計算機學院 軟件工程專業
題目: 通信錄查詢系統(查找應用)
班級:軟件102班 第11組
組長:
姓名:李偉
學號:1006550222 組員:
姓名:李呢
學號:1006550219 姓名:李強
學號:1006550221
指導老師:xxx
日期:2011 年 12月 30日
程序設計書目錄
一、程序設計目標
二、問題描述
三、需求分析(說明課程設計的任務)
四、概要設計(說明課程設計中用到的抽象數據類型的定義、主程序的流程以及各程序模塊之間的調用關系等)
五、詳細設計(實現程序模塊的具體算法)
六、軟件說明書(給出軟件應如何使用,使用時的注意事項)
七、源程序清單(要求400行以上,要有注釋說明)
八、測試報告(調試過程中遇到的問題及解決方法,并列出測試結果,包括輸入和輸出)
九、課程設計總結
一、程序設計目標
通過本次課設進一步的了解哈希表函數及哈希表等有關概念,2 掌握哈希表查找的過程及方法。復習鞏固大一時期學過的c語言知識。進一步加深對c語言、數據結構、離散數學等基礎技能的理解和掌握。
讓我們有一個既動手又動腦,獨立實踐的機會,可以讓我們將課本上的理論知識和實際郵寄的結合起來,鍛煉我們的分析解決實際問題的能力。提高我們實踐編程能力。
通過本項課程設計,掌握工程軟件設計的基本方法,強化上機動手編程能力,闖過理論與實踐相 結合的難關!更加了解了c語言的好處和其可用性!同時增加了同學之間的團隊合作精神!更加也體會到以后在工作中團隊合作的重要性和必要性!通過C語言課程設計,使學生了解高級程序設計語言的結構,掌握基本的程序設計過程和技巧,掌握基本的分析問題和利用計算機求解問題的能力,具備初步的高級語言程序設計能力。為后續各門計算機課程的學習和畢業設計打下堅實基礎。
二、問題描述
設計散列表實現通訊錄查找系統。
(1)設每個記錄有下列數據項:電話號碼、用戶名、地址;
(2)從鍵盤輸入各記錄,分別以電話號碼為關鍵字建立散列表;
(3)采用二次探測再散列法解決沖突;(4)查找并顯示給定電話號碼的記錄;(5)通訊錄信息文件保存;
(6)要求人機界面友好,使用圖形化界面;
三、需求分析
一.查詢:用戶有一個電話號碼,但不知道此電話號碼是誰的,則需要輸入號碼來查詢該號碼是不是此通訊錄中已記錄的人的 號碼,若是即顯示該號碼及姓名、所在地,若不是則顯示“無記錄”。
進入主菜單界面,輸入4,進入通訊錄查詢模塊。輸入你想要搜索通訊人的電話號碼。屏幕輸出所搜通訊人的先關信息。二.通訊錄信息添加:
若要向通訊錄中添加新號碼,也分兩種情況:1若該通訊錄是新的,既沒有任何通訊記錄的,則直接往里添加,需先輸入姓名,隨即輸入號碼和所在地,用于存儲。2若通訊錄不是空的,再添加新號碼時則需在最后一個號碼后面進行添加(輸入姓名、電話號碼及所在地),以此類推。
進入主菜單,輸入1,進入通訊錄信息添加模塊。按照要求依次輸入姓名、電話號碼、住址。三.通訊錄信息刪除:
若要對通訊錄中的內容進行刪除: 然后輸入所要刪除的號碼進行刪除
刪除成功。出現提示信息。按任意鍵回到主菜單。
四、概要設計
對功能鍵相對應的函數分別對各個函數在程序中進行定義如下:
void Menu()void Create()void Append()void CreateHash()void Find()void Delete()void Alter()void List()void Save()
void Load()
然后根據各功能鍵的選擇主函數分別調用功能鍵相對應 4 的函數來實現通訊錄的查詢系統。
五、詳細設計
1、定義結構體變量
typedef struct people //記錄 { NA name;NA tel;//關鍵字
NA add;}Record;//查找表中記錄類型
typedef struct //建立哈希表 { Record *elem[HASHSIZE];//數據元素存儲基址 int count;//當前數據元素個數 int size;//當前容量 }HashTable;
2、定義顯示函數 void Menu()
3、定義建立時間的函數 void benGetTime()
4、定義創建新的通訊錄并添加信息的函數
void Create(Record* a)
5、定義關鍵字比較函數
Status eq(NA x,NA y)
6、定義添加信息函數
void Append(Record* a)
7、定義顯示通訊錄中所有信息函數
void List(Record* a)
8、定義哈希函數
int Hash(NA str)
9、定義沖突處理函數
Status collision(int p,int &c)
10、定義建立散列表的函數
void CreateHash(HashTable* H,Record* a)
11、定義通訊錄查找的函數
void Find(HashTable* H,int &c)
12、定義修改信息的函數
void Alter(HashTable* H,int &c)
13、定義刪除信息的函數
void Delete(HashTable* H,int &c)
14、定義保存信息到指定文件的函數
void Save(HashTable* H)
15、定義從指定文件中讀取信息的函數
void Load()
16、定義主函數
int main(int argc, char* argv[]){ system(“color FO”);system(“CLS”);int c,flag=1;HashTable *H;H=(HashTable*)malloc(LEN);for(int i=0;i
case 0:Quit();return 0;break;case 10:;;break;default: printf(“你輸錯了,請重新輸入!”);printf(“n”);}
system(“CLS”);} return 0;}
六、軟件說明書
雙擊程序,程序運行后,進入通信錄查詢系統菜單的操作界面,然后采用鍵盤進行操作。各功能鍵的選擇如下:
1、創建新的通訊錄并寫入新的信息
2、添加某人的信息
3、以電話號碼建立散列表
4、查找并顯示給定電話號碼的記錄
5、刪除某人的信息
6、修改某人的信息
7、顯示通訊錄中所有記錄
8、保存通訊錄所有記錄到指定文件
9、從指定文件中讀取通訊錄中的記錄 0、退出選單
選擇1,建立新的通訊錄,通訊錄創建成功,按Enter鍵進入添加信息界面,界面會出現
根據系統提示進行相應的添寫,添加成功之后,按Enter鍵返回主菜單。
選擇2,在通訊錄的末尾寫入新的信息,與上訴添加信息操作相同。同樣按Enter鍵返回主菜單。
選擇3,會立即調用沖突處理函數以及建立散列表,界面上會顯示沖突次數,哈希表容量和當前儲存記錄的個數,按Enter鍵返回主菜單。3功能鍵必須在4、5、6功能鍵之前選擇,才能使4、5、6功能鍵派上用場。
選擇4,查找某人信息,寫入查找的電話號碼,如果通訊錄中有則會出現查找成功否則出現此人不存在,查找不成功。按Enter鍵返回主菜單。
選擇5,刪除某人信息,寫入刪除的電話號碼,如果通訊錄中有則會出現刪除成功否則出現此人不存在,刪除不成功。按Enter鍵返回主菜單。
選擇6,修改某人信息,寫入修改的電話號碼,通過查找函數找到要修改的信息,在對找的的信息進行修改,如果通訊錄中 有則會出現原信息讓用戶輸入修改后的信息,根據系統的提示輸入修改后的信息,按Enter鍵會出現修改成功,否則出現此人不存在,修改不成功。按Enter鍵返回主菜單。
選擇7,界面會輸出全部成員的信息。按Enter鍵返回主菜單。選擇8,利用存盤函數保存數據到指定文件,界面會出現保存成功,按Enter鍵返回主菜單。
選擇9,載入存儲過的電話、姓名、地址,界面會出現指定文件所存儲的所有信息。按Enter鍵返回主菜單。選擇0,顯示再見,按Enter鍵退出系統。
七、源程序清單
#include
typedef struct people //記錄 { NA name;NA tel;//關鍵字 NA add;}Record;//查找表中記錄類型
typedef struct //建立哈希表
{ Record *elem[HASHSIZE];//數據元素存儲基址 int count;//當前數據元素個數 int size;//當前容量 }HashTable;int i;void Menu(){ printf(“
n”);printf(“ ## ttt ―――――― ttt ##n”);printf(“
# ttt
丨
1.創建
丨 # n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
2.寫入
丨 #n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
3.建表
丨 #n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
4.查找
丨 #n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
5.刪除
丨 #n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
6.修改
丨 #n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
7.查看
丨 #n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
8.保存
丨
#n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
9.讀取
丨 #n”);printf(“
# ttt
―――――― #n”);printf(“
# ttt
丨
0.退出
丨 #n”);printf(“
## ttt
―――――― ##n”);printf(“
n”);}
void benGetTime()//建立時間函數 { SYSTEMTIME sys;GetLocalTime(&sys);printf(“%4d/%02d/%02d %02d:%02d:%02d.%03d n”,sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);}
Status NUM_BER;//記錄的個數 Status NUM_BER1;
void Create(Record* a)//創建新的通訊錄 { system(“CLS”);//調用DOS命令CLS能夠清屏
FILE *fp1,*fp2;if((fp1=fopen(“record.txt”,“r”))!=NULL)//打開文件
{ fclose(fp1);//關閉文件
} else {
fp2=fopen(“record.txt”,“w”);//如果不存在record.txt就創建一個
fclose(fp2);11 }
printf(“n”);
printf(“
#####n”);printf(“==================== → 創建成功 ← ===================n”);
printf(“
#####n”);
printf(“n”);printf(“◇◆請按ENTER進入添加通訊信息菜單◇◆n”);getchar();system(“CLS”);system(“CLS”);//調用DOS命令CLS能夠清屏
printf(“
#####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”);
printf(“
#####n”);printf(“輸入要添加的個數:n”);scanf(“%d”,&NUM_BER);for(i=0;i { printf(“請輸入第%d個記錄的用戶名:n”,i+1);scanf(“%s”,a[i].name);printf(“請輸入%d個記錄的電話號碼:n”,i+1);scanf(“%s”,a[i].tel);printf(“請輸入第%d個記錄的地址:n”,i+1);scanf(“%s”,a[i].add); } getchar(); printf(“ #n”); printf(“添加成功!!n”); benGetTime();printf(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“◇◆請按ENTER返回功能操作菜單◇◆n”);printf(“ #n”);12 getchar();} Status eq(NA x,NA y)//關鍵字比較,相等返回SUCCESS;否則返回UNSUCCESS { if(strcmp(x,y)==0){ return SUCCESS;} else return UNSUCCESS;} void Append(Record* a)//鍵盤輸入各人的信息 { system(“CLS”);//調用DOS命令CLS能夠清屏 printf(“ #####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”); printf(“ #####n”);printf(“輸入要添加的個數:n”);scanf(“%d”,&NUM_BER1);int j=i;for(i;i printf(“ #n”); printf(“添加成功!!n”); benGetTime();13 printf(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“◇◆請按ENTER返回功能操作菜單◇◆n”);printf(“ #n”);getchar();} void List(Record* a)//顯示通訊錄中所有記錄 { Record *p;p=a;int i;system(“CLS”);//調用DOS命令CLS能夠清屏 printf(“ #####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”); printf(“ #####n”);if(a!=NULL){ printf(“nn姓名t電話號tt地址n”); printf(“_____________________________________________________n”);for(i=0;i { printf(“%st%stt%sn”,a[i].name,a[i].tel,a[i].add); printf(“_____________________________________________________n”); } } else { printf(“對不起!沒有任何聯系人記錄!nn”); printf(“===============n”);} benGetTime();printf(“ #####n”);14 printf(“◇◆請按ENTER返回功能操作菜單◇◆n”);printf(“ #####n”);getchar();} int Hash(NA str)//哈希函數 { system(“CLS”);//調用DOS命令CLS能夠清屏 long n;int m;n = atoi(str);//整型數.m=n%HASHSIZE;//造哈希函數 return m;//} Status collision(int p,int &c)//用二次探測再散列法解決沖突 { int i,q;i=c/2+1;while(i { return q; } else { i=c/2+1; } } else { q=(p-i*i)%HASHSIZE;把字符串轉換成用除留余數法構并返回模值 沖突處理函數,采15 c++;if(q>=0) { return q; } else { i=c/2+1; } } } return UNSUCCESS;} void CreateHash(HashTable* H,Record* a)//建表,以電話號碼為關鍵字,建立相應的散列表 { system(“CLS”);//調用DOS命令CLS能夠清屏 int i,p=-1,c,pp;for(i=0;i { pp=collision(p,c);//若哈希地址沖突,進行沖突處理 if(pp<0) { printf(“ #####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”); printf(“ #####n”);printf(“第%d記錄無法解決沖突”,i+1);//需要顯示沖突次數時輸出 continue; } //無法解決沖突,跳入下一循環 } H->elem[pp]=&(a[i]);//求得哈希地址,將信息存入 H->count++; printf(“ #####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”); printf(“ #####n”);printf(“第%d個記錄沖突次數為%d。n”,i+1,c);//需要顯示沖突次數時輸出 } printf(“n建表完成!n此哈希表容量為%d,當前表內存儲的記錄個數為%d.n”,HASHSIZE,H->count);benGetTime();printf(“ #####n”);printf(“◇◆請按ENTER返回功能操作菜單◇◆n”);printf(“ #####n”);getchar();} void Find(HashTable* H,int &c)//在通訊錄里查找電話號碼關鍵字,若查找成功,顯示信息 { system(“CLS”);//調用DOS命令CLS能夠清屏 printf(“ #####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”); printf(“ #####n”);benGetTime();17 NA tele;printf(“n請輸入要查找記錄的電話號碼:n”);scanf(“%s”,tele);int p,pp;p=Hash(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){ printf(“ #####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”); printf(“ #####n”);printf(“n查找成功!n查找過程沖突次數為%d.以下是您需要要查找的信息:nn”,c);// printf(“姓 名:%sn電話號碼:%sn聯系地址:%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); printf(“nn姓名t電話號tt地址n”); printf(“_____________________________________________________n”); printf(“%st%stt%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); printf(“_____________________________________________________n”);} else printf(“n此人不存在,查找不成功!n”);benGetTime();getchar();printf(“ #####n”);printf(“◇◆請按ENTER返回功能操作菜單◇◆n”);printf(“ #####n”);getchar();} void Alter(HashTable* H,int &c)//在通訊錄里修改某人信息 { system(“CLS”);//調用DOS命令CLS能夠清屏 printf(“ #####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”); printf(“ #####n”);benGetTime();NA tele;printf(“n請輸入要修改記錄的電話號碼:n”);scanf(“%s”,tele);int p,pp;p=Hash(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){ printf(“ #####n”);printf(“==================== → 用戶信息記錄表 ← ===================n”); printf(“ #####n”); printf(“n以下是您需要修改的信息:”); printf(“n”); printf(“nn姓名t電話號tt地址n”); printf(“_____________________________________________________n”); printf(“%st%stt%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); printf(“_____________________________________________________n”); (H->elem)[pp]->tel[0]='
主站蜘蛛池模板:
国产下药迷倒白嫩美女网站|
日本a级特黄特黄刺激大片|
一本丁香综合久久久久不卡网站|
亚洲日韩一区二区一无码|
88久久精品无码一区二区毛片|
国产无遮挡又黄又爽无vip|
无码人妻一区二区三区精品视频|
亚洲一区二区三区香蕉|
国产免费爽爽视频在线观看|
性色av一区二区三区夜夜嗨|
十八禁视频在线观看免费无码无遮挡骂过|
亚洲欧美乱日韩乱国产|
国产v亚洲v天堂无码久久久|
久久綾合久久鬼色88|
久久777国产线看观看精品|
粗大黑人巨精大战欧美成人|
欧美性猛交xxxx黑人猛交|
亚洲一区二区色一琪琪|
国产未成女一区二区|
丝袜足控一区二区三区|
国产熟女内射oooo|
久久影院午夜理论片无码|
天天爽夜夜爱|
无码人妻一区二区三区精品视频|
无码爆乳超乳中文字幕在线|
国产精品一区二区在线蜜芽tv|
天天拍天天看天天做|
人人婷婷人人澡人人爽|
男人猛吃奶女人爽视频|
青青青在线香蕉国产精品|
无码人妻精品中文字幕不卡|
久天啪天天久久99久孕妇|
国产欧美va天堂在线观看视频|
亚洲色无码专区在线观看精品|
欧美精品日韩精品一卡|
国产亚洲欧美一区二区三区在线播放|
国产成人精品日本亚洲11|
国产精品综合av一区二区国产馆|
黑巨茎大战俄罗斯美女|
久久精品国产久精国产果冻传媒|
日韩欧美亚洲中文乱码|