C語言課程設(shè)計手機(jī)通信錄管理系統(tǒng)計



C程序上機(jī)實習(xí)報告C語言課程設(shè)計???課程名稱 C語言課程設(shè)計 教師姓名 本科生姓名 本科生學(xué)號 本科生專業(yè) 所在院系 類別: 日期: 課程設(shè)計評語對課程論文的評語:平時成績:課程論文成績:總 成 績:評閱人簽名:注:1、無評閱人簽名成績無效;2、必須用鋼筆或圓珠筆批閱,用鉛筆閱卷無效;3、如有平時成績,必須在上面評分表中標(biāo)出,并計算入總成績 目 錄課程設(shè)計評語…………………………………………………………..2目錄……………………………………………………………………..31.課程論文題目………………………………………………………. 42. 程序設(shè)計思路…………………………….……………….…….…..43.功能模塊圖…………………………………………………………..44.?dāng)?shù)據(jù)結(jié)構(gòu)設(shè)計………………………………………………………..55.算法設(shè)計……………………………………………………………..56.程序代碼……………………………………………………………157.程序運(yùn)行結(jié)果………………………………………………………218.編程中遇到的問題及解決辦法…………………………………289.總結(jié)心得及良好建議……………………………………………2810.致謝………………………………………………………………291.課程論文題目手機(jī)通信錄管理系統(tǒng)設(shè)計模擬手機(jī)通訊錄管理系統(tǒng),實現(xiàn)對手機(jī)中的通訊錄進(jìn)行管理。
功能要求下: (1)查看功能:選擇此功能時,列出下列三類選擇 A 辦公類 B 個人類 C 商務(wù)類 ,當(dāng)選中某類型時,顯示出此類所有數(shù)據(jù)中的姓名和電話號(2)增加功能:能錄入新數(shù)據(jù)一個結(jié)點(diǎn)包括:姓名、電話號碼、分類(可選項有:A 辦公類 B 個人類C商務(wù)類)、電子郵件例如:楊春 13589664454 商務(wù)類 chuny@ 當(dāng)錄入了重復(fù)的姓名和電話號碼時,則提示數(shù)據(jù)錄入重復(fù)并取消錄入;當(dāng)通信錄中超過15條信息時,存儲空間已滿,不能再錄入新數(shù)據(jù);錄入的新數(shù)據(jù)能按遞增的順序自動進(jìn)行條目編號 (3)修改功能:選中某個人的姓名時,可對此人的相應(yīng)數(shù)據(jù)進(jìn)行修改 (4)刪除功能:選中某個人的姓名時,可對此人的相應(yīng)數(shù)據(jù)進(jìn)行刪除,并自動調(diào)整后續(xù)條目的編號2.程序設(shè)計思路根據(jù)題目要求,通訊錄中的每一條信息應(yīng)當(dāng)是以文本文件的方式存放,所以要提供文件的輸入輸出等操作;在程序中需要對通訊錄內(nèi)容的管理,應(yīng)提供查看,增加,修改,刪除條目等操作;另外還應(yīng)提供鍵盤是選擇菜單實現(xiàn)功能的選擇3.功能模塊圖手機(jī)通信錄管理系統(tǒng)退 出刪除功能修改功能增加功能 4.?dāng)?shù)據(jù)結(jié)構(gòu)設(shè)計根據(jù)題目要求,也是為了方便以后調(diào)用,我們選擇應(yīng)用結(jié)構(gòu)體來進(jìn)行該程序的編寫。
本程序也可以使用數(shù)組和鏈表完成,但是考慮到,鏈表對于我們還過于復(fù)雜,時間有限,且題目中有所謂“儲存空間”的限制,所以沒有必要應(yīng)用鏈表沒有應(yīng)用數(shù)組是考慮到結(jié)構(gòu)體能更好的完成調(diào)用工作而且可以使程序看起來更有條理程序中應(yīng)用函數(shù)調(diào)用是必須的這種程序中,應(yīng)用函數(shù)調(diào)用可以使系統(tǒng)更具模塊化本程序的函數(shù)調(diào)用中,主函數(shù)只是對菜單函數(shù)進(jìn)行了調(diào)用,這樣由于子函數(shù)之間是可以相互調(diào)用的關(guān)系,所以,為后面調(diào)用菜單提供方便5. 算法設(shè)計1、主函數(shù)主函數(shù)設(shè)計得應(yīng)簡單、直觀,所以我應(yīng)用了大量的函數(shù)調(diào)用為了方便主菜單也可以調(diào)用,所以把菜單設(shè)計成了一個調(diào)用函數(shù),具體方法流程可見流程圖流程圖】顯示菜單列出功能輸入n選擇需要的功能,判斷n的值是否在1—5之間 否 是根據(jù)n的值調(diào)用各功能模塊函數(shù)【程序】 /*菜單函數(shù)*/void menu(){int n,w1; do {puts("\n\t\t*歡迎使用手機(jī)通訊錄管理系統(tǒng)*\n"); puts("\t\t************菜單************\n"); puts("\t\t\t1.查看功能"); puts("\t\t\t2.增加功能"); puts("\t\t\t3.修改功能"); puts("\t\t\t4.刪除功能"); puts("\t\t\t5.退出"); puts("\n\t\t****************************\n"); printf("請選擇你想要的功能序號(1-5):"); scanf("%d",&n); if(n<1||n>5) {w1=1;getchar();printf("輸入錯誤返回主菜單\n");menu();} else w1=0;}while(w1==1); switch(n) {case 1:search();break; case 2:add();break; case 3:modify();break; case 4:del();break; case 5:exit(0);break; }}/*主函數(shù)*/main(){menu();}2、各功能模塊設(shè)計(1)查看功能模塊 【需求分析】 該模塊的功能是選擇一個查詢的類別就可以顯示出該類別中的所有信息條目(辦公類,個人類,商務(wù)類),并且其重要考慮到該類中的內(nèi)容是否有為空的情況,以及在選擇類別的過程中是否有輸入錯誤的情況。
流程圖】顯示已有的種類菜單輸入n選擇想要查看的種類,并判斷n的值是否在1-3之間 根據(jù)n值輸出各種類中所有成員信息是 否 返回主菜單【程序】 /*查看功能*/void search(){int n,w1;do{puts("\t\t**********查看類別**********\n");puts("\t\t\tA.辦公類\t\n");puts("\t\t\tB.個人類\t\n");puts("\t\t\tC.商務(wù)類\t\n");puts("\t\t****************************\n");printf("請輸入類別(辦公類請輸入“1”,個人類請輸入“2”,商務(wù)類請輸入“3”):");scanf("%d",&n);printf("\n");if(n<1||n>3){w1=1;getchar();printf("輸入錯誤返回主菜單\n");menu();}else w1=0;}while(w1==1);switch(n){case 1:putout(1);break; case 2:putout(2);break; case 3:putout(3);break;}}(2)添加功能模塊 【需求分析】 該模塊的功能是要求增添一個信息條目(其中包括姓名、電話號碼、分類、電子郵件),觀察這種信息條目,很容易就聯(lián)想到用結(jié)構(gòu)體的方式來儲存。
在添加之前應(yīng)該先檢查儲存器是否已滿;當(dāng)然在添加過程應(yīng)考慮到是否有姓名或電話號碼重復(fù)的情況,在這種情況下應(yīng)提醒操作者并退出操作調(diào)用加載函數(shù)n=load();并計算可以記錄個數(shù)n 【流程圖】 判斷儲存器是否已滿 是 否 輸入姓名判斷輸入的姓名是否存在 是 否輸入電話號碼 判斷輸入的電話號碼是否存在 是 否通過n來輸入類別,并判斷n是否在1-3之間 是 輸入電子郵件地址 返回主菜單 【程序】/*添加功能*/void add(){int i,n,m,w1;do{n=load();/*打開文件*/ if(n==N) {printf("儲存器已滿返回主菜單\n");menu();}/*判斷儲存是否已滿*/ if(n!=0) {printf("請輸入姓名:"); scanf("%s",&a[n].name); for(i=0;i
判斷通訊錄是否為空【流程圖】 是 否 輸入想要修改的姓名判斷要修改的姓名是否存在 是 否 輸入新的類別輸入新的姓名輸入新的電話號碼輸入新的電子郵箱地址返回主菜單 【程序】/*修改功能*/void modify(){int i,n,k,w1;do{char c[100]; n=load();if(n==0) {printf("\n");printf("通訊錄為空返回主菜單\n\n");menu();}printf("請輸入你要修改的人物名稱:");scanf("%s",&c);for(i=0;i /if(i==n){printf("\n");printf("查無此人返回主菜單\n\n");menu();}printf("%-20s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);printf("請輸入新的類別(辦公類請輸入“1”,個人類請輸入“2”,商務(wù)類請輸入“3”,取消修改請輸入“4”):");scanf("%d",&a[i].zhonglei);k=a[i].zhonglei;if(k<1||k>5) {w1=1;getchar();printf("輸入錯誤返回主菜單\n");menu(); } else w1=0;}while(w1==1);switch(k){case 1:strcpy(a[i].type,"BGL");break; case 2:strcpy(a[i].type,"GRL");break; case 3:strcpy(a[i].type,"SWL");break; case 4:printf("取消操作返回上一菜單\n");menu(); }printf("請輸入新的姓名:"); scanf("%s",&(a[i].name)); printf("請輸入新的電話號碼:"); scanf("%s",&(a[i].phone));printf("請輸入新的郵箱地址:"); scanf("%s",&(a[i].mail)); saveB(n);choice();}(4) 刪除功能模塊【需求分析】該模塊的功能是通過輸入某一姓名,判斷改姓名是否存在,如果不存在,返回主菜單;如果存在則輸出該姓名的全部信息,再由操作者判斷是否刪除該條目。 刪除后將其他的數(shù)據(jù)保存流程圖】判斷通訊錄是否為空 是 否輸入想要刪除的姓名判斷該姓名是否存在 否 是確定刪除? 是刪除成功,保存數(shù)據(jù) 否返回主菜單【程序】/*刪除功能*/void del(){int i,n,j,w1,k;char b[100];do{n=load();if(n==0) {printf("\n");printf("通訊錄為空返回主菜單\n\n");menu();}printf("請輸入你要刪除的人物名稱:");scanf("%s",&b);for(i=0;i 1) 加載函數(shù)load()【說明】 該函數(shù)可以用來加載所有的記錄,并且可以返回所有記錄的個數(shù)define MAGE struct messageMAGE{int zhonglei; char name[20]; char phone[15]; char type[5]; char mail[100]; };(在整個程序的開頭有聲明)【程序】load(){FILE *fp;int i;if((fp=fopen("file.txt","ab+"))==NULL){printf("\n不能打開此文件返回主菜單\n"); return NULL;}for(i=0;!feof(fp);i++) fread(&a[i],sizeof(MAGE),1,fp);fclose(fp);return(i-1);}(2)用于添加時的保存函數(shù)saveA()【說明】 該函數(shù)用于在將新信息添加至文件尾程序】void saveA(int i){FILE *fp;if((fp=fopen("file.txt","ab"))==NULL){printf("\n不能打開此文件\n"); return NULL;}if(fwrite(&a[i],sizeof(MAGE),1,fp)!=1)printf("讀寫錯誤\n");fclose(fp);}(3)用于將修改或刪除之后記錄的保存函數(shù)saveB()【說明】 該函數(shù)與上面的函數(shù)不同在于,它是將原有的文件覆蓋后重新將記錄全部錄入【程序】void saveB(int n){FILE *fp;int i;if((fp=fopen("file.txt","wb"))==NULL)/* 以wb的方式打開時,會將原來的文件刪去重建*/{printf("\n無法打開文件\n");return NULL;}for(i=0;i 程序】void putout(int m){int i,n; int k=0; n=load(); for(i=0;i 8.編程中遇到的困難及解決方法 此次的編程對于我而言無疑是一件巨大的挑戰(zhàn),因自己的能力的問題,在編程過程中可以說是困難重重,首先便是時間的問題,雖然足足有好幾天的時間讓我們在完成一個程序,但是水平確實比較水,在程序中發(fā)現(xiàn),由于函數(shù)過多,鏈接的問題自己無法解決在運(yùn)行程序的時候發(fā)現(xiàn)了其中的一些問題,并且得以解決,如運(yùn)行中使用查看的時候,排版因為字?jǐn)?shù)問題產(chǎn)生錯位,這個可以通過轉(zhuǎn)移字符來糾正該程序應(yīng)用了文件的儲存、調(diào)用文件在載入和保存的使用上可以應(yīng)用不同的函數(shù)來完成,在此我使用了wb的方式來打開文件,并且用fwrite及fread進(jìn)行文件的讀寫文件在進(jìn)行調(diào)用或打開時應(yīng)注意文件是否正常打開,這個細(xì)節(jié)十分重要,可以防止在操作過程中產(chǎn)生不必要的麻煩最大的問題便是由于大量并且長時間的運(yùn)轉(zhuǎn),程序中的函數(shù)調(diào)用過多之后部分細(xì)節(jié)出現(xiàn)問題,目前自己依舊是無法通過更改程序數(shù)據(jù)來更改,但是通過推出保存,再重新運(yùn)行便可以了9.總結(jié)心得及良好建議通過這次設(shè)計,讓我得到了真正的鍛煉我的程序中還有一些不足,但是由于時間問題,和自己經(jīng)驗不足的原因,導(dǎo)致沒能得到及時修改,請老師見諒該程序應(yīng)用了數(shù)組,這是因為題目中有要求,有所謂“儲存空間”的限制。 但是現(xiàn)實生活中,一般儲存設(shè)備都已很大,更適合用鏈表完成,這點(diǎn)可以在以后進(jìn)行改進(jìn),通過判斷再完成,儲存空間的提示這樣通用性會大大提高到的自然,上面只是一個例子,程序中自然還有很多或大或小的毛病比如,在對程序長期操作后,可能出現(xiàn)計算運(yùn)行錯誤這點(diǎn)是平常不容易看出來的我到現(xiàn)在仍沒有找到問題的原因還需要后續(xù)檢測 此次的課程設(shè)計基本上是我們所以同學(xué)的第一次經(jīng)歷,日后這樣的機(jī)會還會有,并且以后我們會更多的去獨(dú)立完成這樣的項目但是對于初次體驗的我們而言,確實由于時間以及經(jīng)驗不足等等方面的原因,這個任務(wù)很艱巨,相信很多同學(xué)雖然盡了自己的努力依舊無法完成,因此我希望老師在我們學(xué)習(xí)的過程中能夠給予我們更多的幫助以及稍微的減輕一下課程的難度,這樣的話同學(xué)們會更專心的投入到編程的快樂之中,品嘗到c語言,計算機(jī)給我們帶來的,以及老師們不懈努力下讓我們收獲的成果這樣可以更好的達(dá)到老師們的目的,也更能讓學(xué)生們學(xué)到更多的知識10.致謝這次學(xué)期結(jié)束的C語言課程設(shè)計雖然只有幾天,但是卻充實了我的整個假期,這次經(jīng)歷讓我對編程產(chǎn)生了更多興趣,讓我渴望用更多的時間在編程上同樣這次的學(xué)習(xí)讓我了解了許多不止是編程的東西,我對電腦的理解范圍也進(jìn)一步擴(kuò)大,作為一名計算機(jī)學(xué)院的學(xué)生,這是意義深遠(yuǎn)的。 非常感謝老師們給予我們這樣一個學(xué)習(xí)的平臺,不但讓我們得到了展現(xiàn)自我能力的機(jī)會同樣讓我們發(fā)現(xiàn)許多自身存在的問題,也在學(xué)習(xí)交流之中得到一些重要信息這讓我對計算機(jī)產(chǎn)生了更多的熱情,豐富了我的學(xué)習(xí)以及課余生活,感謝學(xué)校給予的機(jī)會,感謝老師們的付出衷心的希望老師們身體健康,活到老學(xué)到老,在幫助我們的同時也能夠有所收獲謝謝?。。。玻?。
