




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第31頁共31頁GuangxiUniversityofScienceandTechnology課程設計報告課程名稱:數據結構與編程綜合實訓課題名稱:通訊錄管理系統的設計與實現姓名:熊信萌學號:201400402003院系:計算機科學與通信工程學院專業班級:通信141班指導教師:周堅和完成日期:2015-12-18
目錄第一部分課程設計報告…………3第1章課程設計目的……………………3第2章課程設計內容和要求……………32.1問題描述………32.2設計要求…………4第3章課程設計總體方案及分析………53.1問題分析………43.2概要設計…………53.3詳細設計…………63.4調試分析………183.5測試結果………183.6參考文獻………22第二部分課程設計總結………23附錄(源代碼)…………………24第一部分課程設計報告第1章課程設計目的課程設計是實踐教學中的重要環節,它以某一門課程為基礎,涉及和課程相關的各方面知識,是一門獨立于課程外的特殊課程。課程設計就是讓所有同學對課程更全面的應用。本次實驗項目“通訊錄管理”就是針對數據結構的一門應用較為廣泛的系統管理方法。1.實現意義本次實驗應用性能很好,結構清楚,能隨時添加、刪除、查找、修改、輸出聯系人;并且可以用姓名、編號兩種方式;而且其中增加了排序功能,使得插入之后排序為接下來的操作提供便利,操作更精確,以人性化的方式展現出來,效果十分突出。2.系統分析編程完成通訊錄的一般性管理工作如通訊錄中記錄的增加、修改、查找、刪除、輸出、計算男女人數等功能。每個記錄包含編號、姓名、性別、電話號碼個人基本信息。用《數據結構》中的鏈表做數據結構結合c語言基本知識編寫一個通訊錄管理系統。本程序相對簡單,使用方便,幾乎不用特殊的命令,只需按提示輸入即可。對于建立通訊錄管理系統,則需了解并掌握數據結構與算法的設計方法,尤其在算法方面,鏈表及結點的聯系,提高綜合運用所學的理論知識和方法獨立分析和解決問題的能力。第2章課程設計內容和要求2.1問題描述:設計并實現一個通訊錄信息系統建立通訊錄信息,信息包含編號、姓名、性別、電話;能夠提供添加、刪除和修改通訊錄信息的功能;能夠提供查詢的功能;能夠提供性別統計的功能;能夠輸出通訊錄信息。2.2設計要求:要求設計程序輸出如下:用鏈表實現學生信息管理系統,完成鏈表建立(至少包括50個節點),以及鏈表中信息(節點)的插入、查找、刪除、修改、輸出等操作,具體的模塊要求如下(用“文本文件”按照自定義格式存儲數據記錄集)。第一個模塊——主函數main()實現功能:根據菜單的選項調用各函數,并完成相應的功能。第二個模塊——Menu()實現功能:顯示提示菜單。第三個模塊——Quit()實現功能:退出菜單。第四個模塊——Create()實現功能:創建新的學生信息記錄。第五個模塊——Add()實現功能:增加新的學生信息記錄,并返回菜單。第六個模塊——Find()實現功能:按要求查詢相關的信息,如果找到則顯示該學生信息,如果未找到則提示文件中沒有該信息,并返回菜單。第七個模塊——Alter()實現功能:修改某條學生記錄的信息,如果未找到要修改的學生記錄,則提示系統中無此學生記錄,并返回菜單。第八個模塊——Delete()實現功能:刪除某條學生記錄,如果未找到要刪除的學生記錄,則提示該學生記錄集中沒有,并返回菜單。第九個模塊——List()實現功能:能夠分頁顯示數據記錄集中的所有學生的記錄。第十個模塊——Searchbysex()實現功能:統計通訊錄中男性人數及女性人數第3章課程設計總體方案及分析3.1問題分析:該程序是要將幾個不同功能的函數用鏈表串聯起來,來組成一個通訊錄信息系統。因為鏈表能讓數據既有獨立性又便于數據之間的相互聯系,也便于數據的添加和刪除。用模塊化程序設計的理念,對幾個不同功能的函數,分塊處理,這樣有利于后期的調試及今后對功能的完善。菜單中的每一個選項對應著一個子程序,這個系統就由這些子程序建立起來。下面是這個程序的設計流程圖:圖3.1設計流程圖3.2概要設計1.①構建一個結構體用于建立一個鏈表。②鏈表里面包括了要儲存學生的信息的代號。③屏幕上顯示出菜單。2.本程序包含8個函數:(1)主函數main()(2)創建函數LinkListCreateList()(3)增加通訊錄人員函數voidAddNode(LinkListhead,ListNode*p)(4)刪除某個學生信息的函數voidDeleteNode(LinkListhead)(5)查詢通訊錄人員的函數ListNode*ListFind(LinkListhead)(6)修改通訊錄人員的函數voidAlterNode(LinkListhead)(7)性別統計的函數voidSeachbysex(LinkListhead)(8)通訊錄輸出函數voidPrintList(LinkListhead)(9)退出系統函數3.3詳細設計實現概要設計中定義的所有數據類型及操作的偽代碼算法節點類型和指針類型結構體里面的數據類型:typedefstruct//通訊錄數據類型{charnumber[3];//編號charname[9];//姓名charsex[10];//性別chartelephone[11];//電話}DataType 主函數voidmain(){ intk,j=1; ListNode*l; while(j) { printf("\t\t\t熊信萌通訊錄課程設計\n"); printf("\t\t\t********************************"); printf("\n\t\t\t1.通訊錄的建立"); printf("\n\t\t\t2.通訊者的插入"); printf("\n\t\t\t3.通訊者的查詢"); printf("\n\t\t\t4.通訊者的刪除");printf("\n\t\t\t5.通訊者的修改"); printf("\n\t\t\t6.通訊錄的輸出"); printf("\n\t\t\t7.男生女生的人數"); printf("\n\t\t\t0.退出通訊錄管理系統"); printf("\n\t\t\t******************************"); printf("\n請選擇菜單號(0--6):"); scanf("%d",&k); getchar(); switch(k) { case1: { printf("\n1.通訊錄的建立\n"); head=CreateList(); flag1=1; break; } case2: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n2.通訊者信息的插入\n"); printf("\n編號姓名性別電話\n"); printf("\n"); p=(ListNode*)malloc(sizeof(ListNode));/*申請新結點*/ printf("輸入編號:\n"); scanf("%s",p->data.number); printf("輸入姓名:\n"); scanf("%s",p->); printf("輸入性別:\n"); scanf("%s",p->data.sex); printf("輸入電話:\n"); scanf("%s",p->data.telephone); AddNode(head,p); printf("排序:\n");OrderList(l);//調用通訊錄排序函數此處放在插入模塊下面} break; } case3: { if(flag1!=1) { printf("請先建立表!"); getchar(); system("cls"); } else { printf("\n3.通訊錄信息的查詢\n"); p=ListFind(head); if(p!=NULL) { printf("編號姓名性別聯系電話\n"); printf("\n"); printf("編號:%s\n姓名:%s\n性別:%s\n聯系電話:%s\n", p->data.number,p->,p->data.sex,p->data.telephone); printf("\n"); } elseprintf("沒有查到要查詢的通訊者!\n"); break; } case4: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n4.通訊錄信息的刪除\n"); DeleteNode(head);/*刪除結點*/ } break; } case5: { if(flag1!=1) { printf("請先建立表!"); getchar(); system("cls"); } else { printf("\n5.通訊錄信息的修改\n"); AlterNode(head); } break; } case6: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n6.通訊錄鏈表的輸出\n"); PrintList(head); } break; } case7: { if(flag1!=1) { printf("請先建立表!"); getchar(); system("cls"); } else { printf("\n7.通訊錄中男生女生的人數\n"); Seachbysex(head); } break; } case0: printf("是否退出(y/n)?"); k=getchar(); if(k=='y'||k=='Y') { j=0; printf("\n\n\t\t\t謝謝使用!謝謝使用!"); printf("\n按任意鍵退出"); } break; default: printf("\n輸入有錯,請重新輸入!\n"); printf("\n按任意鍵繼續..."); getchar(); break; } }}}通訊錄信息系統的具體操作:(1)添加:可以添加通訊錄記錄,依次輸入編號、姓名、性別、電話號碼后,會提示是否繼續添加。LinkListCreateList()//尾插法建立帶頭結點的通訊錄鏈表算法{ LinkListhead=(ListNode*)malloc(sizeof(ListNode));//申請頭結點 ListNode*p,*rear; charflag='y'; //結束標志置y rear=head;//尾指針初始指向頭結點 while(flag=='y') { p=(ListNode*)malloc(sizeof(ListNode));//申新結點 printf("編號姓名性別電話\n"); printf("\n"); printf("輸入的編號:\n"); scanf("%s",p->data.number); printf("輸入的姓名:\n"); scanf("%s",p->); printf("輸入性別:\n"); scanf("%s",p->data.sex); printf("輸入電話:\n"); scanf("%s",p->data.telephone); rear->next=p;//新結點連接到尾結點之后 rear=p;//尾指針指向新結點 printf("繼續建表?(y/n):"); scanf("%s",&flag); } rear->next=NULL;//終端結點指針置空 returnhead;//返回鏈表頭指針}開始開始輸入y或n用if判斷輸入了y還是nyn輸入要輸入的資料將數據保存到指定的文件里結束圖3.2添加通訊錄記錄流程(2)增加通訊錄人員函數voidAddNode(LinkListhead,ListNode*p)//在通訊錄鏈表head中插入結點{ListNode*p1,*p2;p1=head;p2=p1->next;while(p2!=NULL&&strcmp(p2->data.number,p->data.number)<0){p1=p2;//p1指向剛訪問過的結點p2=p2->next;//p2指向表的下一個結點}p1->next=p;//插入p所指向的結點p->next=p2;//連接表中剩余的結點}圖3.3增加通訊錄記錄流程圖(3)刪除通訊錄信息函數:輸入欲刪除的那個人的編號或名字后,會自動刪除他(她)的記錄內容。voidDeleteNode(LinkListhead)//通訊錄鏈表上的結點刪除{ chars; ListNode*p,*q; p=ListFind(head);//調用查找函數 if(p==NULL) { printf("沒有查到要刪除的通訊者!\n"); return; }printf("%s%s%s%s\n",p->data.number,p->,p->data.sex,p->data.telephone);printf("真的要刪除該結點嗎?(y/n):"); scanf("%s",&s); if(s=='y') {q=head; while(p!=NULL&&q->next!=p) q=q->next; q->next=p->next;//刪除結點 free(p);//釋放被刪除的結點空間 printf("通訊者已被刪除!\n"); return; } printf("通訊者沒有被刪除!\n");}圖3.4刪除通訊錄記錄流程圖(4)查詢通訊錄的函數:用姓名、編號兩種方式查詢。ListNode*ListFind(LinkListhead)//有序通訊錄鏈表的查找{ListNode*p;charnumber[10];charname[20]; chart;printf("\n");printf("1.按編號\n");printf("2.按姓名\n");printf("\n");printf("請選擇1/2:");p=head->next;//假定通訊錄表帶有結點 scanf("%d",&t);if(t==1) { printf("請輸入所求的編號:"); scanf("%s",number); while(p&&strcmp(p->data.number,number)<0)//優化的地方 p=p->next; if(p==NULL||strcmp(p->data.number,number)>0) p=NULL;//沒有查到要查找的通訊者 } else if(t==2) { printf("請輸入要求的姓名:"); scanf("%s",name); while(p&&strcmp(p->,name)!=0) p=p->next; }returnp;}圖3.6查詢通訊錄信息流程圖(5)修改通訊錄的函數:輸入欲修改的那個人的名字后,再依次輸入編號、姓名、性別、電話號碼。voidAlterNode(LinkListhead)//通訊錄鏈表上的結點修改{ charch; ListNode*p,*q1; p=ListFind(head); if(p==NULL) { printf("沒有查到要修改的通訊者!\n"); return; } elseif(p!=NULL) { printf("真的要修改該結點嗎?(y/n)"); scanf("%s",&ch); if(ch=='y'||ch=='Y') { q1=head; printf("\n輸出新編號:"); scanf("%s",p->data.number);printf("輸出新姓名:\n"); scanf("%s",p->);printf("輸出新性別:\n"); scanf("%s",p->data.sex);printf("輸出新電話:\n"); scanf("%s",p->data.telephone); printf("修改成功!\n"); } if(ch=='n'||ch=='N') printf("無需修改\n"); }}圖3.7修改通訊錄信息(6)統計性別信息的函數:可以統計男性人數和女性人數。voidSeachbysex(LinkListhead){ ListNode*p; p=head; intmen=0,women=0;while(p!=NULL) {if(strcmp(p->data.sex,"男")==0)men++;if(strcmp(p->data.sex,"女")==0) women++;p=p->next; } printf("women=%d\nmen=%d\n",women,men);}圖3.8統計性別信息流程圖3.菜單選擇intk,j=1; ListNode*l; while(j) { printf("\t\t\t熊信萌通訊錄課程設計\n"); printf("\t\t\t********************************"); printf("\n\t\t\t1.通訊錄的建立"); printf("\n\t\t\t2.通訊者的插入"); printf("\n\t\t\t3.通訊者的查詢"); printf("\n\t\t\t4.通訊者的刪除");printf("\n\t\t\t5.通訊者的修改"); printf("\n\t\t\t6.通訊錄的輸出"); printf("\n\t\t\t7.男生女生的人數"); printf("\n\t\t\t0.退出通訊錄管理系統"); printf("\n\t\t\t******************************"); printf("\n請選擇菜單號(0--6):"); scanf("%d",&k); getchar();注:具體源代碼見附錄3.4調試分析在寫統計男女生人數的函數時,一開始只能顯示出女生的人數,而且我也沒有用到strcmp,所以一直遍歷整個鏈表不成功,后來請教了同學了之后才寫出統計的函數。原來開始沒有把整個鏈表傳入該函數中。3.5測試結果1.主菜單:2.建立通訊錄:3.顯示通訊錄信息:4.刪除某個通訊錄信息5.查詢通訊錄記錄:6.修改通訊錄信息7.通訊錄性別統計:9.退出系統3.6參考文獻①徐鳳生.《數據結構(C語言版)》.機械工業出版社,2009年9月.②譚浩強.《C程序設計(第三版)》.清華大學出版社.2009年1月.
第2部分課程設計總結課程設計,使我懂得了做什么事情只要專心去做,就能夠克服各種困難,達到自己的說想要的結果。當然了,同學們和老師的幫助必不可少。從理論中得出結論。此次課程設計使我對自己的專業有了更深刻的認識,從而提高了自己實際動手能力和獨立思考問題的能力,總而言之,此次課程設計讓我受益頗豐。⑴該通訊錄管理系統可以順利高效運行,實現相關的要求,當然任何程序都存在不足,我這個程序也不例外:雖然努力在程序中添加了排序模塊增加了程序的優化和可讀性但是我可以將其中的排序模塊的調用放到輸出模塊中,最后的輸出可以更優化些,而不是放在插入后,這樣只能根據指示一步一步去調用,相對繁瑣一點,其次在程序中增加了修改模塊,通過全局的頭結點head可以任意修改相關信息,使程序更加可讀性和靈活性。⑵同時在這次課程設計中讓我們認識到做程序設計這項工作中我門要具備以下素質:①良好的文檔是正規研發流程中非常重要的環節,缺乏文檔,一個軟件系統就缺乏生命力,在未來的查錯,升級以及模塊的復用時就都會遇到極大的麻煩。②此外編程是一項高要求的工作所以我們要有規范化,標準化的代碼編寫習慣通過這次編程我們深深的感受到對代碼的變量命名,代碼內注釋格式,良好的編寫習慣,不但有助于代碼的移植和糾錯,也有助于不同人員之間的協作。③我們還要有模塊化思維能力,模塊化思維就是編程任何一個功能模塊或函數的時候,要多想一些,不要局限在完成當前任務的簡單思路上,想想看該模塊是否可以脫離這個系統存在,是否可以通過簡單的修改參數的方式在其他系統和應用環境下直接引用,這樣就能極大避免重復性的開發工作。在編制過程中,可能在實際應用中有些功能不到位,對更多的功能也未能實現。我將不斷提高自己,尤其在相關結點知識方面多努力去學習,多看書,多實踐,爭取今后在編制程序時,能夠認真努力編寫出有個性且可讀性和應用性較強的數據結構系統。附錄源文件#include<stdio.h>#include<stdlib.h>#include<string.h>#include"LinkList.h"intflag1=0; //全局變量flag1為0voidmain(){ intk,j=1; ListNode*l; while(j) { printf("\t\t\t熊信萌通訊錄課程設計\n"); printf("\t\t\t********************************"); printf("\n\t\t\t1.通訊錄的建立"); printf("\n\t\t\t2.通訊者的插入"); printf("\n\t\t\t3.通訊者的查詢"); printf("\n\t\t\t4.通訊者的刪除");printf("\n\t\t\t5.通訊者的修改"); printf("\n\t\t\t6.通訊錄的輸出"); printf("\n\t\t\t7.男生女生的人數"); printf("\n\t\t\t0.退出通訊錄管理系統"); printf("\n\t\t\t******************************"); printf("\n請選擇菜單號(0--6):"); scanf("%d",&k); getchar(); switch(k) { case1: { printf("\n1.通訊錄的建立\n"); head=CreateList(); flag1=1; break; } case2: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n2.通訊者信息的插入\n"); printf("\n編號姓名性別電話\n"); printf("\n"); p=(ListNode*)malloc(sizeof(ListNode));/*申請新結點*/ printf("輸入編號:\n"); scanf("%s",p->data.number); printf("輸入姓名:\n"); scanf("%s",p->); printf("輸入性別:\n"); scanf("%s",p->data.sex); printf("輸入電話:\n"); scanf("%s",p->data.telephone); AddNode(head,p); printf("排序:\n");OrderList(l);//調用通訊錄排序函數此處放在插入模塊下面} break; } case3: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n3.通訊錄信息的查詢\n"); p=ListFind(head); if(p!=NULL) { printf("編號姓名性別聯系電話\n"); printf("\n"); printf("編號:%s\n姓名:%s\n性別:%s\n聯系電話:%s\n", p->data.number,p->,p->data.sex,p->data.telephone); printf("\n"); } elseprintf("沒有查到要查詢的通訊者!\n"); break; } case4: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n4.通訊錄信息的刪除\n"); DeleteNode(head);/*刪除結點*/ } break; } case5: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n5.通訊錄信息的修改\n"); AlterNode(head); } break; } case6: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n6.通訊錄鏈表的輸出\n"); PrintList(head); } break; } case7: { if(flag1!=1) { printf("請先建立表!"); getchar(); } else { printf("\n7.通訊錄中男生女生的人數\n"); Seachbysex(head); } break; } case0: printf("是否退出(y/n)?"); k=getchar(); if(k=='y'||k=='Y') { j=0; printf("\n\n\t\t\t謝謝使用!謝謝使用!"); printf("\n按任意鍵退出"); } break; default: printf("\n輸入有錯,請重新輸入!\n"); printf("\n按任意鍵繼續..."); getchar(); break; } }}}頭文件typedefstruct//通訊錄數據類型{charnumber[3];//編號charname[9];//姓名charsex[10];//性別chartelephone[11];//電話}DataType;typedefstructnode//結點類型定義{ DataTypedata;//結點數據域structnode*next;//結點指針域}ListNode;typedefListNode*LinkList;LinkListhead;ListNode*p;LinkListCreateList()//尾插法建立帶頭結點的通訊錄鏈表算法{ LinkListhead=(ListNode*)malloc(sizeof(ListNode));//申請頭結點 ListNode*p,*rear; charflag='y'; //結束標志置y rear=head;//尾指針初始指向頭結點 while(flag=='y') { p=(ListNode*)malloc(sizeof(ListNode));//申新結點 printf("編號姓名性別電話\n"); printf("\n"); printf("輸入的編號:\n"); scanf("%s",p->data.number); printf("輸入的姓名:\n"); scanf("%s",p->); printf("輸入性別:\n"); scanf("%s",p->data.sex); printf("輸入電話:\n"); scanf("%s",p->data.telephone); rear->next=p;//新結點連接到尾結點之后 rear=p;//尾指針指向新結點 printf("繼續建表?(y/n):"); scanf("%s",&flag); } rear->next=NULL;//終端結點指針置空 returnhead;//返回鏈表頭指針}voidAddNode(LinkListhead,ListNode*p)//在通訊錄鏈表head中插入結點{ListNode*p1,*p2;p1=head;p2=p1->next;while(p2!=NULL&&strcmp(p2->data.number,p->data.number)<0){p1=p2;//p1指向剛訪問過的結點p2=p2->next;//p2指向表的下一個結點}p1->next=p;//插入p所指向的結點p->next=p2;//連接表中剩余的結點}//新增通信錄排序模塊,排序比較簡單,通過不斷比較,結點指針相互賦值交換解決voidOrderList(ListNode*&l)//按編號排序,調用插入函數之后才可以排序{ ListNode*p,*q,*s; q=head; p=q->next->next; q->next->next=NULL; while(p) { while(q->next&&(strcmp(p->data.number,q->next->data.number)>0))//比較字符串 q=q->next; s=p->next; p->next=q->next; q->next=p; p=s; q=head; }} ListNode*ListFind(LinkListhead)//有序通訊錄鏈表的查找{ListNode*p;charnumber[10];charname[20]; chart;printf("\n");printf("1.按編號\n");printf("2.按姓名\n");printf("\n");printf("請選擇1/2:");p=head->next;//假定通訊錄表帶有結點 scanf("%d",&t);if(t==1) { printf("請輸入所求的編號:"); scanf("%s",number); while(p&&strcmp(p->data.number,number)<0)//優化的地方 p=p->next; if(p==NULL||strcmp(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業環保技術的發展及影響
- 工業節能減排的技術路徑
- 工作技能精進高效辦公、文件管理等具體實 用技能培訓
- 工業節能技術創新與應用
- 工業風老房裝修的設計思路與實踐
- 工作場所改善與企業生產力提升
- 工作場所的多元化與包容性培養
- 工程圖紙解析中的邏輯與數學知識
- 工作安全與勞動保護培訓
- 工程機械的設計與維護技巧
- 單體藥店GSP質量管理制度
- 2025年江蘇省高考化學試卷真題
- 室內婦科診室管理制度
- 2025年現代圖書館管理與信息服務考試試題及答案
- 2025年高等教育心理學考試試卷及答案
- 2025年河北省中考二模道德與法治試題(啟光卷含答案)
- 材料力學知到智慧樹期末考試答案題庫2025年遼寧工程技術大學
- 敦煌文化介紹課件
- 2025貴州中考:歷史必考知識點
- 肝硬化門靜脈高壓癥食管、胃底靜脈曲張破裂出血診治專家共識2025解讀
- 2025年重癥醫學科ICU護理標準化建設計劃
評論
0/150
提交評論