




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
PAGE55數(shù)據(jù)結(jié)構(gòu)課程實訓(xùn)報告設(shè)計題目:(1)建立通訊錄(2)電網(wǎng)建設(shè)造價系統(tǒng)專業(yè)計算機(jī)科學(xué)與技術(shù)班級09計算機(jī)科學(xué)與技術(shù)(1)班學(xué)生學(xué)號指導(dǎo)教師起止時間南昌工程學(xué)院2010年12月目錄緒言11.1課程設(shè)計的目的21.2課程設(shè)計的基本要求2課程設(shè)計內(nèi)容32.1建立通訊錄32.2電網(wǎng)建設(shè)造價系統(tǒng)10實訓(xùn)總結(jié)15附:程序源代碼一、課程設(shè)計的目的數(shù)據(jù)結(jié)構(gòu)課程主要是研究非數(shù)值計算的程序設(shè)計問題中所出現(xiàn)的計算機(jī)操作對象以及它們之間的關(guān)系和操作的學(xué)科。數(shù)據(jù)結(jié)構(gòu)是介于數(shù)學(xué)、計算機(jī)軟件和計算機(jī)硬件之間的一門計算機(jī)專業(yè)的核心課程,它是計算機(jī)程序設(shè)計、數(shù)據(jù)庫、操作系統(tǒng)、編譯原理及人工智能等的重要基礎(chǔ),廣泛的應(yīng)用于信息學(xué)、系統(tǒng)工程等各種領(lǐng)域。學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是為了將實際問題中所涉及的對象在計算機(jī)中表示出來并對它們進(jìn)行處理。通過課程實訓(xùn)可以提高學(xué)生的思維能力,促進(jìn)學(xué)生的綜合應(yīng)用能力和專業(yè)素質(zhì)的提高。通過此次課程實訓(xùn)主要達(dá)到以下目的:了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計方法,具備初步的獨(dú)立分析和設(shè)計能力;初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計、程序編碼、測試等基本方法和技能;提高綜合運(yùn)用所學(xué)的理論知識和方法獨(dú)立分析和解決問題的能力;訓(xùn)練用系統(tǒng)的觀點(diǎn)和軟件開發(fā)一般規(guī)范進(jìn)行軟件開發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學(xué)的工作方法和作風(fēng)。二、課程設(shè)計的基本要求1、獨(dú)立思考,獨(dú)立完成:課程實訓(xùn)中各任務(wù)的設(shè)計和調(diào)試要求獨(dú)立完成,遇到問題可以討論,但不可以拷貝。2、做好上機(jī)準(zhǔn)備:每次上機(jī)前,要事先編制好準(zhǔn)備調(diào)試的程序,認(rèn)真想好調(diào)試步驟和有關(guān)環(huán)境的設(shè)置方法,準(zhǔn)備好有關(guān)的文件。3、按照課程設(shè)計的具體要求寫課程實訓(xùn)報告,要求題目按照如下幾個內(nèi)容認(rèn)真完成;其中包括:a)需求分析:在該部分中敘述,每個模塊的功能要求b)概要設(shè)計在此說明每個部分的算法設(shè)計說明(可以是描述算法的流程圖),每個程序中使用的存儲結(jié)構(gòu)設(shè)計說明(如果指定存儲結(jié)構(gòu)請寫出該存儲結(jié)構(gòu)的定義。c)詳細(xì)設(shè)計各個算法實現(xiàn)的源程序,對每個題目要有相應(yīng)的源程序(可以是一組源程序,每個功能模塊采用不同的函數(shù)實現(xiàn))源程序要按照寫程序的規(guī)則來編寫。要結(jié)構(gòu)清晰,重點(diǎn)函數(shù)的重點(diǎn)變量,重點(diǎn)功能部分要加上清晰的程序注釋。d)調(diào)試分析測試數(shù)據(jù),測試輸出的結(jié)果,和每個模塊設(shè)計和調(diào)試時存在問題的思考(問題是哪些?問題如何解決?),算法的改進(jìn)設(shè)想。三、課程設(shè)計內(nèi)容1、建通訊錄【問題描述】設(shè)實現(xiàn)通訊錄查找系統(tǒng)。【基本要求】(1)設(shè)每個記錄有下列數(shù)據(jù)項:電話號碼、用戶名、地址;(2)從鍵盤輸入各記錄,分別以電話號碼為關(guān)鍵字建立表;(3)顯示、插入、刪除、查找并顯示給定電話號碼的記錄;(4)要求人機(jī)界面友好,使用圖形化界面;【實現(xiàn)提示】主函數(shù):根據(jù)選單的選項調(diào)用各函數(shù),并完成相應(yīng)的功能。Menu()的功能:顯示英文提示選單。Quit()的功能:退出選單。Create()的功能:創(chuàng)建新的通訊錄。Append()的功能:在通訊錄的末尾寫入新的信息,并返回選單。Find():查詢某人的信息,如果找到了,則顯示該人的信息,如果沒有則提示通訊錄中沒有此人的信息,并返回選單。Alter()的功能:修改某人的信息,如果未找到要修改的人,則提示通訊錄中沒有此人的信息,并返回選單。Delete()的功能:刪除某人的信息,如果未找到要刪除的人,則提示通訊錄中沒有此人的信息,并返回選單。List()的功能:顯示通訊錄中的所有記錄。算法描述:首先用結(jié)構(gòu)體的類型定義姓名、電話號碼、住址。然后建立線性鏈表存儲通訊錄,每次增加記錄時,從鍵盤上輸入新紀(jì)錄的基本信息插入表中,要修改記錄時按輸入的電話號碼為關(guān)鍵字查找記錄,若有則修改,若無則不能修改;查找記錄時從鍵盤輸入關(guān)鍵字,即記錄的電話號碼,從表中查找是否有記錄的號碼等于查找關(guān)鍵字,若有則查找成功,否則查找不成功;刪除時,先在通訊錄中查找記錄,若查找成功則刪除,否則無法刪除。算法實現(xiàn):#include<stdlib.h>#include<windows.h>#include<iostream.h>#include<string.h>#include<stdio.h>#include<malloc.h>typedefstructpnode/*個人記錄結(jié)點(diǎn)類型*/{charname[8];/*姓名*/chartel[16];/*電話號碼*/charaddress[30];/*住址*/}personnode;personnode*person;charfilename[20];/*存儲通訊錄名稱的數(shù)組*/FILE*fp;voidcreate()/*增加記錄*/{personnode*person;person=(personnode*)malloc(sizeof(personnode));printf("\n請輸入通訊錄名:");scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){ printf("\n沒有輸入通訊錄名,不能建立通訊錄!"); exit(0);}fprintf(fp,"%-10s%-20s%-50s\n","姓名","電話號碼","住址");printf("\n請輸入姓名、電話號碼及住址(以空格隔開,以#結(jié)束)\n");scanf("%s",person->name);while(strcmp(person->name,"#")){ scanf("%s%s",person->tel,person->address); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); scanf("%s",person->name);}fclose(fp);}voidlist()/*顯示通訊錄的信息*/{if((fp=fopen(filename,"r"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} printf("\n************************************************\n"); printf("%24s\n","通訊錄"); while(!feof(fp)) {fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address);printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); } fclose(fp); printf("**************************************************\n\n");}voidappend()/*增加記錄*/{ personnode*person; person=(personnode*)malloc(sizeof(personnode));if((fp=fopen(filename,"a"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} printf("\n請輸入要添加的姓名、電話號碼及住址\n"); scanf("%s%s%s",person->name,person->tel,person->address); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); fclose(fp);}voidfind()/*查找記錄*/{ intk=0; chartelkey[16]; printf("\n請輸入要查找記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"rb"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { fscanf(fp,"%s%s%s",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { printf("\n\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); k=1; } }if(!k)printf("\n\n對不起,通訊錄中沒有此人的記錄!\n");fclose(fp);}voidalter()/*修改記錄*/{ longoffset; intk=0; chartelkey[16]; printf("\n請輸入要修改記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"r+"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { offset=ftell(fp); fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { k=1; break; } } if(k) { printf("\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); printf("\n請輸入新姓名、電話號碼及住址:"); scanf("%s%s%s",person->name,person->tel,person->address); fseek(fp,offset,SEEK_SET); printf("%ld",ftell(fp)); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); } else printf("\n對不起,通訊錄中沒有此人的記錄!\n"); fclose(fp);}voidcancel()/*刪除記錄*/{longoffset; intk=0; charm; chartelkey[16]; printf("\n請輸入要刪除記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"r+"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { offset=ftell(fp); fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { k=1; break; } } if(k) { printf("\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); printf("\n確實要刪除?y/n"); scanf("%c",&m); if(m='y') { fseek(fp,offset,SEEK_SET); fprintf(fp,"%-14s%-24s%-48s\n","","",""); } } else printf("\n對不起,通訊錄中沒有此人的記錄!\n"); fclose(fp);}voidmain(){ intm,n=1; system("CLS"); create(); while(n) { printf("\n"); printf("\t\t1append\n"); printf("\t\t2find\n"); printf("\t\t3alter\n"); printf("\t\t4cancel\n"); printf("\t\t5list\n"); printf("\t\t6quit\n"); printf("\n"); printf("\t請選擇(1~~6)\n"); scanf("%d",&m); switch(m) { case1:append();break; case2:find();break; case3:alter();break; case4:cancel();break; case5:list();break; case6:exit(0); } }}心得體會:許多運(yùn)算中都用到查找,針對不同的數(shù)據(jù)對象可以選用不同的查找方法,例如現(xiàn)在的通訊錄記錄數(shù)據(jù)時,整個通訊錄的狀態(tài)可能經(jīng)常變化,因此,首先就要確定通訊錄的存儲結(jié)構(gòu)必須采用鏈?zhǔn)降?,否則在頻繁的插入和刪除操作中其效率會較低,在確定好存儲結(jié)構(gòu)后,才決定選用何種查找方法。有時在程序設(shè)計中,不一定非要全部采用自己編寫的源代碼,如果有標(biāo)準(zhǔn)的庫函數(shù),同樣可以使用標(biāo)準(zhǔn)的庫函數(shù),這樣既可以節(jié)約時間,也便于統(tǒng)一規(guī)范。如果要想較好的利用某種編程語言自帶的庫函數(shù),則必須充分地理解該編程語言庫函數(shù)的功能、特點(diǎn),否則就無法引用。應(yīng)注意的問題:在C++中“delete”為關(guān)鍵字,因此在編程時應(yīng)將函數(shù)“delete()”的名稱進(jìn)行修改,在此改為“cancel()”否則在編譯時會出現(xiàn)錯誤。在C++中清屏函數(shù)不能用“clrscr()”可改為system("CLS")可起到同樣的效果,頭文件為"#include<windows.h>"在寫插入、刪除、修改、添加、顯示等函數(shù)時不需要每個函數(shù)都定義“personnode*person”只需在程序前面定義一下就好了,否則編譯時將出現(xiàn)警告!運(yùn)行結(jié)果如下圖所示:2、電網(wǎng)建設(shè)造價模擬系統(tǒng)【問題描述】假設(shè)一個城市有n個小區(qū),要實現(xiàn)n個小區(qū)之間的電網(wǎng)都能夠相互接通,構(gòu)造這個城市n個小區(qū)之間的電網(wǎng),使總工程造價最低?!净疽蟆浚?)用連通圖來表示n個城市之間以及n個城市之間可能設(shè)置的電網(wǎng)線路。(2)用菜單選擇方式完成下列功能:創(chuàng)建電網(wǎng)頂點(diǎn);添加電網(wǎng)的邊;構(gòu)造最小生成樹;顯示最小生成樹;退出程序。算法描述:設(shè)無向連通網(wǎng)G=(V,E),其中V為網(wǎng)圖中所有頂點(diǎn)的集合(即問題描述中的城市集合),E為網(wǎng)圖中所有帶權(quán)邊的集合。設(shè)置兩個新的集合U和T,其中集合U用于存放G的最小生成樹中的頂點(diǎn),集合T存放G的最小生成樹中的邊。令集合U的初值為U={u1}(假設(shè)構(gòu)造最小生成樹時,從頂點(diǎn)u1出發(fā)),集合T的初值為T={}。Prim算法的思想是,從所有u屬于U,v屬于V-U的邊中,選取具有最小權(quán)值的邊(u,v),將頂點(diǎn)v加入集合U中,將邊(u,v)加入集合T中,如此不斷反復(fù),直到U=V時,最小生成樹構(gòu)造完畢,這時集合T中包含了最小生成樹的所有邊。算法實現(xiàn):#include<stdio.h>#include<windows.h>#include<stdlib.h>#definemaxlen10#definelarge999#definenull0typedefstruct{ inta[maxlen],b[maxlen],w[maxlen];/*第k條邊的起點(diǎn),終點(diǎn),權(quán)值*/ charvexs[maxlen];/*頂點(diǎn)信息集合*/ intvexnum,arcnum;/*頂點(diǎn)數(shù)和邊數(shù)*/ intarcs[maxlen][maxlen];/*鄰接矩陣*/}graph;graphg;/*g為圖類型變量*/voidprint_graph(graphg)/*輸出鄰接矩陣*/{ inti,j; printf("鄰接矩陣:\n"); printf("vertex\t");/*vertex為頂點(diǎn)標(biāo)識*/ for(i=0;i<g.vexnum;i++) printf("%4c",g.vexs[i]);/*輸出鄰接矩陣中的所有頂點(diǎn)*/ printf("\n"); for(i=0;i<g.vexnum;i++)/*輸出鄰接矩陣中的所有值*/ { printf("%4c\t",g.vexs[i]); for(j=0;j<g.vexnum;j++) printf("%4d",g.arcs[i][j]); printf("\n"); }}graphcre_grah(graphg)/*創(chuàng)建圖結(jié)構(gòu)*/{ inti,j,k,c=999;/*設(shè)c值999為無窮大*/ for(i=0;i<g.vexnum;i++) for(j=0;j<g.vexnum;j++) g.arcs[i][j]=c;/*初始化鄰接矩陣中的所有元素值為無窮大*/ for(k=0;k<g.arcnum;k++) { g.arcs[g.a[k]-1][g.b[k]-1]=g.w[k];/*對鄰接矩陣賦值*/ g.arcs[g.b[k]-1][g.a[k]-1]=g.w[k]; } returng;/*返回創(chuàng)建的圖*/}voidprim(graphg)/*用prim算法求最小生成樹*/{ inti,j,k,min; intlowcost[maxlen];/*保存權(quán)值的數(shù)組*/ intcloset[maxlen];/*保存最小生成樹結(jié)點(diǎn)的數(shù)組*/ printf("最小生成樹的邊為:\n"); for(i=1;i<g.vexnum;i++)/*將鄰接矩陣中第1行的所有權(quán)值存入lowcost數(shù)組*/ { lowcost[i]=g.arcs[0][i]; closet[i]=1; } closet[1]=0;/*選擇頂點(diǎn)1作為出發(fā)點(diǎn)*/ j=1; for(i=1;i<g.vexnum;i++)/*找權(quán)值最小的邊*/ { min=lowcost[j]; k=i; for(j=1;j<g.vexnum;j++) if(lowcost[j]<min&&closet[j]!=0) { min=lowcost[j]; k=j; } printf("(%c,%c),",g.vexs[closet[k]],g.vexs[k]);/*輸出權(quán)值最小的邊*/ closet[k]=0;/*設(shè)置為已訪問標(biāo)志*/ for(j=1;j<g.vexnum;j++)/*考慮經(jīng)過已選出的最短邊,修改其他邊的權(quán)值*/ if(g.arcs[k][j]<lowcost[j]&&closet[j]!=0) { lowcost[j]=g.arcs[k][j]; closet[j]=k; } }}voidmain(){ inti,j,k; system("CLS"); printf("請輸入城市的個數(shù),城市間道路的條數(shù):"); scanf("%d,%d",&i,&j); g.vexnum=i; g.arcnum=j; for(i=0;i<g.vexnum;i++)/*輸入所有頂點(diǎn)信息*/ { getchar(); printf("\n第%d個頂點(diǎn)的信息:",i+1); g.vexs[i]=getchar(); } for(k=1;k<=g.arcnum;k++) { printf("\t請輸入第%d條邊的起點(diǎn):",k); scanf("%d",&g.a[k-1]); printf("\n請輸入第%d條邊的終點(diǎn):",k); scanf("%d",&g.b[k-1]); printf("\n請輸入第%d條邊的權(quán)值:",k); scanf("%d",&g.w[k-1]); } cre_grah(g); prim(g);}心得體會:圖是基本數(shù)據(jù)結(jié)構(gòu)類型中最為復(fù)雜的一類,也是最有應(yīng)用價值的一類數(shù)據(jù)結(jié)構(gòu),許多應(yīng)用問題可以通過它來解決。如現(xiàn)在的工程造價問題就是一類重要的應(yīng)用問題。在利用圖解決各類問題時,首先要確定選用何種存儲結(jié)構(gòu)最為合適。選用何種存儲結(jié)構(gòu)必須依據(jù)具體的實際情況而定,因為不同的存儲結(jié)構(gòu)都具有其適用的情形。利用圖的相關(guān)算法解決實際問題時,一定要對算法思想有深刻的理解。應(yīng)注意的問題:在C++中清屏函數(shù)不能用“clrscr()”可改為system("CLS")可起到同樣的效果,頭文件為"#include<windows.h>"。在運(yùn)行程序時輸入城市的個數(shù),城市間道路的條數(shù)應(yīng)輸入正確,否則將得不到正確的結(jié)果。應(yīng)將函數(shù)“voidprint_grah(graphg)”放在函數(shù)“graphcre_grah(graphg)”之前,否則就會出錯!運(yùn)行結(jié)果如下圖所示:實訓(xùn)總結(jié):剛開始學(xué)數(shù)據(jù)結(jié)構(gòu)時感覺不是很好學(xué),但是現(xiàn)在學(xué)完了整本書,再回頭看看書又覺得也不是那么難學(xué)!可能是剛開始學(xué)吧,對編程還不是很了解,所以為了完成這次實訓(xùn)著實花了我不少時間,而且程序也不是設(shè)計的很好。在這次實訓(xùn)中遇到了不少問題,比如:在C++中清屏函數(shù)不能用“clrscr()”可改為system("CLS")可起到同樣的效果,頭文件為"#include<windows.h>"、在C++中“delete”為關(guān)鍵字,因此在編程時應(yīng)將函數(shù)“delete()”的名稱進(jìn)行修改,在此改為“cancel()”否則在編譯時會出現(xiàn)錯誤等,一開始還不知道是怎么回事,后來經(jīng)過查閱資料才漸漸明白。通過這次實訓(xùn)我覺得數(shù)據(jù)結(jié)構(gòu)這門課程比較重要,也學(xué)到了不少東西。讓我漸漸開始對數(shù)據(jù)結(jié)構(gòu)感興趣,對編程感興趣。通過這次實訓(xùn),我覺得要學(xué)好編程應(yīng)該多看看別人的程序,應(yīng)該通過圖書館、上網(wǎng)多查閱資料,這樣日積月累,才能真正提高自己的編程能力。像這次實訓(xùn),要不是有網(wǎng),好多錯誤真的是改不出來??偠灾?,這次實訓(xùn)對我?guī)椭Υ蟮模?數(shù)據(jù)結(jié)構(gòu) 課程實訓(xùn)報告設(shè)計題目:(1)建立通訊錄(2)電網(wǎng)建設(shè)造價系統(tǒng)專業(yè)計算機(jī)科學(xué)與技術(shù)班級09計算機(jī)科學(xué)與技術(shù)(1)班學(xué)生余飛學(xué)號2009101101指導(dǎo)教師康平起止時間2010.12.27——2011.1.7南昌工程學(xué)院2010年12月一.建立通訊錄a)需求分析:(1)設(shè)每個記錄有下列數(shù)據(jù)項:電話號碼、用戶名、地址;(2)從鍵盤輸入各記錄,分別以電話號碼為關(guān)鍵字建立表;(3)顯示、插入、刪除、查找并顯示給定電話號碼的記錄;(4)要求人機(jī)界面友好,使用圖形化界面;b)概要設(shè)計主函數(shù):根據(jù)選單的選項調(diào)用各函數(shù),并完成相應(yīng)的功能。Menu()的功能:顯示英文提示選單。Quit()的功能:退出選單。Create()的功能:創(chuàng)建新的通訊錄。Append()的功能:在通訊錄的末尾寫入新的信息,并返回選單。Find():查詢某人的信息,如果找到了,則顯示該人的信息,如果沒有則提示通訊錄中沒有此人的信息,并返回選單。Alter()的功能:修改某人的信息,如果未找到要修改的人,則提示通訊錄中沒有此人的信息,并返回選單。Delete()的功能:刪除某人的信息,如果未找到要刪除的人,則提示通訊錄中沒有此人的信息,并返回選單。List()的功能:顯示通訊錄中的所有記錄。c)詳細(xì)設(shè)計#include<stdlib.h>#include<windows.h>#include<iostream.h>#include<string.h>#include<stdio.h>#include<malloc.h>typedefstructpnode{charname[8];chartel[16];charaddress[30];}personnode;personnode*person;charfilename[20];/*存儲通訊錄名稱的數(shù)組*/FILE*fp;voidcreate()/*增加記錄*/{personnode*person;person=(personnode*)malloc(sizeof(personnode));printf("\n請輸入通訊錄名:");scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){ printf("\n沒有輸入通訊錄名,不能建立通訊錄!"); exit(0);}fprintf(fp,"%-10s%-20s%-50s\n","姓名","電話號碼","住址");printf("\n請輸入姓名、電話號碼及住址(以空格隔開,以#結(jié)束)\n");scanf("%s",person->name);while(strcmp(person->name,"#")){ scanf("%s%s",person->tel,person->address); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); scanf("%s",person->name);}fclose(fp);}voidlist()/*顯示通訊錄的信息*/{if((fp=fopen(filename,"r"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} printf("\n**********************\n"); printf("%24s\n","通訊錄"); while(!feof(fp)) {fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address);printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); } fclose(fp); printf("**************************************************\n\n");}voidappend()/*增加記錄*/{ personnode*person; person=(personnode*)malloc(sizeof(personnode));if((fp=fopen(filename,"a"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} printf("\n請輸入要添加的姓名、電話號碼及住址\n"); scanf("%s%s%s",person->name,person->tel,person->address); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); fclose(fp);}voidfind()/*查找記錄*/{ intk=0; chartelkey[16]; printf("\n請輸入要查找記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"rb"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { fscanf(fp,"%s%s%s",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { printf("\n\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); k=1; } }if(!k)printf("\n\n對不起,通訊錄中沒有此人的記錄!\n");fclose(fp);}voidalter()/*修改記錄*/{ longoffset; intk=0; chartelkey[16]; printf("\n請輸入要修改記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"r+"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { offset=ftell(fp); fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { k=1; break; } } if(k) { printf("\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); printf("\n請輸入新姓名、電話號碼及住址:"); scanf("%s%s%s",person->name,person->tel,person->address); fseek(fp,offset,SEEK_SET); printf("%ld",ftell(fp)); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); } else printf("\n對不起,通訊錄中沒有此人的記錄!\n"); fclose(fp);}voidcancel()/*刪除記錄*/{longoffset; intk=0; charm; chartelkey[16]; printf("\n請輸入要刪除記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"r+"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { offset=ftell(fp); fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { k=1; break; } } if(k) { printf("\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); printf("\n確實要刪除?y/n"); scanf("%c",&m); if(m='y') { fseek(fp,offset,SEEK_SET); fprintf(fp,"%-14s%-24s%-48s\n","","",""); } } else printf("\n對不起,通訊錄中沒有此人的記錄!\n"); fclose(fp);}voidmain(){ intm,n=1; system("CLS"); create(); while(n) { printf("\n"); printf("\t\t1append\n"); printf("\t\t2find\n"); printf("\t\t3alter\n"); printf("\t\t4cancel\n"); printf("\t\t5list\n"); printf("\t\t6quit\n"); printf("\n"); printf("\t請選擇(1~~6)\n"); scanf("%d",&m); switch(m) { case1:append();break; case2:find();break; case3:alter();break; case4:cancel();break; case5:list();break; case6:exit(0); } }}d)調(diào)試分析二、電網(wǎng)建設(shè)造價模擬系統(tǒng)a)需求分析:(1)用連通圖來表示n個城市之間以及n個城市之間可能設(shè)置的電網(wǎng)線路。(2)用菜單選擇方式完成下列功能:創(chuàng)建電網(wǎng)頂點(diǎn);添加電網(wǎng)的邊;構(gòu)造最小生成樹;顯示最小生成樹;退出程序。b)概要設(shè)計設(shè)無向連通網(wǎng)G=(V,E),其中V為網(wǎng)圖中所有頂點(diǎn)的集合(即問題描述中的城市集合),E為網(wǎng)圖中所有帶權(quán)邊的集合。設(shè)置兩個新的集合U和T,其中集合U用于存放G的最小生成樹中的頂點(diǎn),集合T存放G的最小生成樹中的邊。令集合U的初值為U={u1}(假設(shè)構(gòu)造最小生成樹時,從頂點(diǎn)u1出發(fā)),集合T的初值為T={}。Prim算法的思想是,從所有u屬于U,v屬于V-U的邊中,選取具有最小權(quán)值的邊(u,v),將頂點(diǎn)v加入集合U中,將邊(u,v)加入集合T中,如此不斷反復(fù),直到U=V時,最小生成樹構(gòu)造完畢,這時集合T中包含了最小生成樹的所有邊。c)詳細(xì)設(shè)計#include<stdio.h>#include<windows.h>#include<stdlib.h>#definemaxlen10#definelarge999#definenull0typedefstruct{ inta[maxlen],b[maxlen],w[maxlen];/*第k條邊的起點(diǎn),終點(diǎn),權(quán)值*/ charvexs[maxlen];/*頂點(diǎn)信息集合*/ intvexnum,arcnum;/*頂點(diǎn)數(shù)和邊數(shù)*/ intarcs[maxlen][maxlen];/*鄰接矩陣*/}graph;graphg;/*g為圖類型變量*/voidprint_graph(graphg)/*輸出鄰接矩陣*/{ inti,j; printf("鄰接矩陣:\n"); printf("vertex\t");/*vertex為頂點(diǎn)標(biāo)識*/ for(i=0;i<g.vexnum;i++) printf("%4c",g.vexs[i]);/*輸出鄰接矩陣中的所有頂點(diǎn)*/ printf("\n"); for(i=0;i<g.vexnum;i++)/*輸出鄰接矩陣中的所有值*/ { printf("%4c\t",g.vexs[i]); for(j=0;j<g.vexnum;j++) printf("%4d",g.arcs[i][j]); printf("\n"); }}graphcre_grah(graphg)/*創(chuàng)建圖結(jié)構(gòu)*/{ inti,j,k,c=999;/*設(shè)c值999為無窮大*/ for(i=0;i<g.vexnum;i++) for(j=0;j<g.vexnum;j++) g.arcs[i][j]=c;/*初始化鄰接矩陣中的所有元素值為無窮大*/ for(k=0;k<g.arcnum;k++) { g.arcs[g.a[k]-1][g.b[k]-1]=g.w[k];/*對鄰接矩陣賦值*/ g.arcs[g.b[k]-1][g.a[k]-1]=g.w[k]; } returng;/*返回創(chuàng)建的圖*/}voidprim(graphg)/*用prim算法求最小生成樹*/{ inti,j,k,min; intlowcost[maxlen];/*保存權(quán)值的數(shù)組*/ intcloset[maxlen];/*保存最小生成樹結(jié)點(diǎn)的數(shù)組*/ printf("最小生成樹的邊為:\n"); for(i=1;i<g.vexnum;i++)/*將鄰接矩陣中第1行的所有權(quán)值存入lowcost數(shù)組*/ { lowcost[i]=g.arcs[0][i]; closet[i]=1; } closet[1]=0;/*選擇頂點(diǎn)1作為出發(fā)點(diǎn)*/ j=1; for(i=1;i<g.vexnum;i++)/*找權(quán)值最小的邊*/ { min=lowcost[j]; k=i; for(j=1;j<g.vexnum;j++) if(lowcost[j]<min&&closet[j]!=0) { min=lowcost[j]; k=j; } printf("(%c,%c),",g.vexs[closet[k]],g.vexs[k]);/*輸出權(quán)值最小的邊*/ closet[k]=0;/*設(shè)置為已訪問標(biāo)志*/ for(j=1;j<g.vexnum;j++)/*考慮經(jīng)過已選出的最短邊,修改其他邊的權(quán)值*/ if(g.arcs[k][j]<lowcost[j]&&closet[j]!=0) { lowcost[j]=g.arcs[k][j]; closet[j]=k; } }}voidmain(){ inti,j,k; system("CLS"); printf("請輸入城市的個數(shù),城市間道路的條數(shù):"); scanf("%d,%d",&i,&j); g.vexnum=i; g.arcnum=j; for(i=0;i<g.vexnum;i++)/*輸入所有頂點(diǎn)信息*/ { getchar(); printf("\n第%d個頂點(diǎn)的信息:",i+1); g.vexs[i]=getchar(); } for(k=1;k<=g.arcnum;k++) { printf("\t請輸入第%d條邊的起點(diǎn):",k); scanf("%d",&g.a[k-1]); printf("\n請輸入第%d條邊的終點(diǎn):",k); scanf("%d",&g.b[k-1]); printf("\n請輸入第%d條邊的權(quán)值:",k); scanf("%d",&g.w[k-1]); } cre_grah(g); prim(g);}d)調(diào)試分析三.課程實訓(xùn)總結(jié):1.調(diào)試程序前先進(jìn)行人工檢查。在寫好一個程序以后,不要匆匆忙忙上機(jī),而應(yīng)對紙面上的程序進(jìn)行人工檢查。這一步是十分重要的,它能發(fā)現(xiàn)程序設(shè)計人員由于疏忽而造成的多數(shù)錯誤。而這一步驟往往容易被人忽視。有人總希望把一切推給計算機(jī)系統(tǒng)去做,但這樣就會多占用機(jī)器時間,作為一個程序人員應(yīng)當(dāng)養(yǎng)成嚴(yán)謹(jǐn)?shù)目茖W(xué)作風(fēng),每一步都要嚴(yán)格把關(guān),不把問題留給后面的程序。2.調(diào)試程序的時候不可避免的會出現(xiàn)錯誤,有的時候就那么幾個,但有時會有很多,如果系統(tǒng)提示的出錯信息多,應(yīng)當(dāng)從上到下一一改正。有時顯示出一大片出錯信息往往使人感到問題嚴(yán)重,無從下手。其實可能只有一二個錯誤。例如,對使用的變量未定義,編譯時就會對所有含該變量的語句發(fā)出出錯信息;有的是少了“}”或多了“}”有的是書寫語句時忘記寫“;”或是全角的“;”了,只要加上一個變量定義,或填加“};”就所有錯誤都消除了。3.在編譯時給出語法錯誤的信息,可以根據(jù)提示的信息具體找出程序中出錯之處并改正之。應(yīng)當(dāng)注意的是有時提示的出錯并不是真正出錯的行,如果在提示出錯的行上找不到錯誤的話應(yīng)當(dāng)?shù)缴弦恍性僬?。有時提示出錯的類型并非絕對準(zhǔn)確,由于出錯的情況繁多各種錯誤互有關(guān)聯(lián),因止要善于分析,找出真正的錯誤,而不要只從字面意義上找出錯信息,鉆牛角尖。4.有時在程序設(shè)計中,不一定非要全部采用自己編寫的源代碼,如果有標(biāo)準(zhǔn)的庫函數(shù),同樣可以使用標(biāo)準(zhǔn)的庫函數(shù),這樣既可以節(jié)約時間,也便于統(tǒng)一規(guī)范。5.所編的程序應(yīng)當(dāng)采用結(jié)構(gòu)化程序方法編程,以增加可讀性并且可以盡可能多加注釋,以幫助理解每段程序的作用。6.通過實訓(xùn),我們更加認(rèn)識到:數(shù)據(jù)結(jié)構(gòu)這門課程的學(xué)習(xí)不應(yīng)當(dāng)只局限在課本里,我們應(yīng)當(dāng)多去機(jī)房里編輯程序,然后不斷調(diào)試,這樣才能在實踐中掌握理論知識,做到學(xué)以致用。數(shù)據(jù)結(jié)構(gòu)課程實訓(xùn)報告設(shè)計題目:(1)電網(wǎng)建設(shè)造價系統(tǒng)(2)建通訊錄專業(yè)計算機(jī)科學(xué)與技術(shù)系班級計算機(jī)科學(xué)與技術(shù)(1)班學(xué)生朱曦學(xué)號2009101142指導(dǎo)教師康平起止時間2010.12.27-2011.01.07南昌工程學(xué)院2010年12月一、課程設(shè)計的目的數(shù)據(jù)結(jié)構(gòu)課程主要是研究非數(shù)值計算的程序設(shè)計問題中所出現(xiàn)的計算機(jī)操作對象以及它們之間的關(guān)系和操作的學(xué)科。數(shù)據(jù)結(jié)構(gòu)是介于數(shù)學(xué)、計算機(jī)軟件和計算機(jī)硬件之間的一門計算機(jī)專業(yè)的核心課程,它是計算機(jī)程序設(shè)計、數(shù)據(jù)庫、操作系統(tǒng)、編譯原理及人工智能等的重要基礎(chǔ),廣泛的應(yīng)用于信息學(xué)、系統(tǒng)工程等各種領(lǐng)域。學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是為了將實際問題中所涉及的對象在計算機(jī)中表示出來并對它們進(jìn)行處理。通過課程實訓(xùn)可以提高學(xué)生的思維能力,促進(jìn)學(xué)生的綜合應(yīng)用能力和專業(yè)素質(zhì)的提高。通過此次課程實訓(xùn)主要達(dá)到以下目的:了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計方法,具備初步的獨(dú)立分析和設(shè)計能力;初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計、程序編碼、測試等基本方法和技能;提高綜合運(yùn)用所學(xué)的理論知識和方法獨(dú)立分析和解決問題的能力;訓(xùn)練用系統(tǒng)的觀點(diǎn)和軟件開發(fā)一般規(guī)范進(jìn)行軟件開發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學(xué)的工作方法和作風(fēng)。二、課程設(shè)計的基本要求1、獨(dú)立思考,獨(dú)立完成:課程實訓(xùn)中各任務(wù)的設(shè)計和調(diào)試要求獨(dú)立完成,遇到問題可以討論,但不可以拷貝。2、做好上機(jī)準(zhǔn)備:每次上機(jī)前,要事先編制好準(zhǔn)備調(diào)試的程序,認(rèn)真想好調(diào)試步驟和有關(guān)環(huán)境的設(shè)置方法,準(zhǔn)備好有關(guān)的文件。3、按照課程設(shè)計的具體要求寫課程實訓(xùn)報告,要求題目按照如下幾個內(nèi)容認(rèn)真完成;其中包括:a)需求分析:在該部分中敘述,每個模塊的功能要求b)概要設(shè)計在此說明每個部分的算法設(shè)計說明(可以是描述算法的流程圖),每個程序中使用的存儲結(jié)構(gòu)設(shè)計說明(如果指定存儲結(jié)構(gòu)請寫出該存儲結(jié)構(gòu)的定義。c)詳細(xì)設(shè)計各個算法實現(xiàn)的源程序,對每個題目要有相應(yīng)的源程序(可以是一組源程序,每個功能模塊采用不同的函數(shù)實現(xiàn))源程序要按照寫程序的規(guī)則來編寫。要結(jié)構(gòu)清晰,重點(diǎn)函數(shù)的重點(diǎn)變量,重點(diǎn)功能部分要加上清晰的程序注釋。d)調(diào)試分析測試數(shù)據(jù),測試輸出的結(jié)果,和每個模塊設(shè)計和調(diào)試時存在問題的思考(問題是哪些?問題如何解決?),算法的改進(jìn)設(shè)想。課程實訓(xùn)總結(jié):(保存在word文檔中)總結(jié)可以包括:課程實訓(xùn)過程的收獲、遇到問題解決問題過程的思考、程序調(diào)試能力的思考、對數(shù)據(jù)結(jié)構(gòu)這門課程的思考、在課程實訓(xùn)過程中對《數(shù)據(jù)結(jié)構(gòu)》課程的認(rèn)識等內(nèi)容;4、每組實現(xiàn)的結(jié)果必須進(jìn)行檢查和演示;程序源代碼和程序的說明文件必須上交,作為考核內(nèi)容的一部分;(上交時每人交一份,文件夾的取名規(guī)則為:“學(xué)號姓名”,如“200413498高魁”。該文件夾下至少包括:“源代碼”、“課程實訓(xùn)報告”、“可執(zhí)行文件”。由學(xué)習(xí)委員收集刻盤按規(guī)定時間統(tǒng)一上交)。5、課程實訓(xùn)報告不要附原代碼,可以對重點(diǎn)函數(shù)及結(jié)構(gòu)進(jìn)行說明。報告格式參照附件。6、報告提交時間:第19周星期五檢查,遲交無成績。形式:課程設(shè)計報告(要求打?。┖碗娮游臋n(統(tǒng)一刻盤)。電網(wǎng)建設(shè)造價模擬系統(tǒng)算法描述:設(shè)無向連通網(wǎng)G=(V,E),其中V為網(wǎng)圖中所有頂點(diǎn)的集合(即問題描述中的城市集合),E為網(wǎng)圖中所有帶權(quán)邊的集合。設(shè)置兩個新的集合U和T,其中集合U用于存放G的最小生成樹中的頂點(diǎn),集合T存放G的最小生成樹中的邊。令集合U的初值為U={u1}(假設(shè)構(gòu)造最小生成樹時,從頂點(diǎn)u1出發(fā)),集合T的初值為T={}。Prim算法的思想是,從所有u屬于U,v屬于V-U的邊中,選取具有最小權(quán)值的邊(u,v),將頂點(diǎn)v加入集合U中,將邊(u,v)加入集合T中,如此不斷反復(fù),直到U=V時,最小生成樹構(gòu)造完畢,這時集合T中包含了最小生成樹的所有邊。算法實現(xiàn):#include<stdio.h>#include<windows.h>#include<stdlib.h>#definemaxlen10#definelarge999#definenull0typedefstruct{ inta[maxlen],b[maxlen],w[maxlen];/*第k條邊的起點(diǎn),終點(diǎn),權(quán)值*/ charvexs[maxlen];/*頂點(diǎn)信息集合*/ intvexnum,arcnum;/*頂點(diǎn)數(shù)和邊數(shù)*/ intarcs[maxlen][maxlen];/*鄰接矩陣*/}graph;graphg;/*g為圖類型變量*/voidprint_graph(graphg)/*輸出鄰接矩陣*/{ inti,j; printf("鄰接矩陣:\n"); printf("vertex\t");/*vertex為頂點(diǎn)標(biāo)識*/ for(i=0;i<g.vexnum;i++) printf("%4c",g.vexs[i]);/*輸出鄰接矩陣中的所有頂點(diǎn)*/ printf("\n"); for(i=0;i<g.vexnum;i++)/*輸出鄰接矩陣中的所有值*/ { printf("%4c\t",g.vexs[i]); for(j=0;j<g.vexnum;j++) printf("%4d",g.arcs[i][j]); printf("\n"); }}graphcre_grah(graphg)/*創(chuàng)建圖結(jié)構(gòu)*/{ inti,j,k,c=999;/*設(shè)c值999為無窮大*/ for(i=0;i<g.vexnum;i++) for(j=0;j<g.vexnum;j++) g.arcs[i][j]=c;/*初始化鄰接矩陣中的所有元素值為無窮大*/ for(k=0;k<g.arcnum;k++) { g.arcs[g.a[k]-1][g.b[k]-1]=g.w[k];/*對鄰接矩陣賦值*/ g.arcs[g.b[k]-1][g.a[k]-1]=g.w[k]; } returng;/*返回創(chuàng)建的圖*/}voidprim(graphg)/*用prim算法求最小生成樹*/{ inti,j,k,min; intlowcost[maxlen];/*保存權(quán)值的數(shù)組*/ intcloset[maxlen];/*保存最小生成樹結(jié)點(diǎn)的數(shù)組*/ printf("最小生成樹的邊為:\n"); for(i=1;i<g.vexnum;i++)/*將鄰接矩陣中第1行的所有權(quán)值存入lowcost數(shù)組*/ { lowcost[i]=g.arcs[0][i]; closet[i]=1; } closet[1]=0;/*選擇頂點(diǎn)1作為出發(fā)點(diǎn)*/ j=1; for(i=1;i<g.vexnum;i++)/*找權(quán)值最小的邊*/ { min=lowcost[j]; k=i; for(j=1;j<g.vexnum;j++) if(lowcost[j]<min&&closet[j]!=0) { min=lowcost[j]; k=j; } printf("(%c,%c),",g.vexs[closet[k]],g.vexs[k]);/*輸出權(quán)值最小的邊*/ closet[k]=0;/*設(shè)置為已訪問標(biāo)志*/ for(j=1;j<g.vexnum;j++)/*考慮經(jīng)過已選出的最短邊,修改其他邊的權(quán)值*/ if(g.arcs[k][j]<lowcost[j]&&closet[j]!=0) { lowcost[j]=g.arcs[k][j]; closet[j]=k; } }}voidmain(){ inti,j,k; system("CLS"); printf("請輸入城市的個數(shù),城市間道路的條數(shù):"); scanf("%d,%d",&i,&j); g.vexnum=i; g.arcnum=j; for(i=0;i<g.vexnum;i++)/*輸入所有頂點(diǎn)信息*/ { getchar(); printf("\n第%d個頂點(diǎn)的信息:",i+1); g.vexs[i]=getchar(); } for(k=1;k<=g.arcnum;k++) { printf("\t請輸入第%d條邊的起點(diǎn):",k); scanf("%d",&g.a[k-1]); printf("\n請輸入第%d條邊的終點(diǎn):",k); scanf("%d",&g.b[k-1]); printf("\n請輸入第%d條邊的權(quán)值:",k); scanf("%d",&g.w[k-1]); } cre_grah(g); prim(g);}心得體會:圖是基本數(shù)據(jù)結(jié)構(gòu)類型中最為復(fù)雜的一類,也是最有應(yīng)用價值的一類數(shù)據(jù)結(jié)構(gòu),許多應(yīng)用問題可以通過它來解決。如現(xiàn)在的工程造價問題就是一類重要的應(yīng)用問題。在利用圖解決各類問題時,首先要確定選用何種存儲結(jié)構(gòu)最為合適。選用何種存儲結(jié)構(gòu)必須依據(jù)具體的實際情況而定,因為不同的存儲結(jié)構(gòu)都具有其適用的情形。利用圖的相關(guān)算法解決實際問題時,一定要對算法思想有深刻的理解。應(yīng)注意的問題:在C++中清屏函數(shù)不能用“clrscr()”可改為system("CLS")可起到同樣的效果,頭文件為"#include<windows.h>"。在運(yùn)行程序時輸入城市的個數(shù),城市間道路的條數(shù)應(yīng)輸入正確,否則將得不到正確的結(jié)果。應(yīng)將函數(shù)“voidprint_grah(graphg)”放在函數(shù)“graphcre_grah(graphg)”之前,否則就會出錯!運(yùn)行結(jié)果如下圖所示:建立通訊錄算法描述:首先在計算機(jī)存儲器上建立一個表,即所需的通訊錄,通訊錄中記錄的基本信息由姓名、電話號碼、住址組成。每次增加記錄時,從鍵盤上輸入新紀(jì)錄的基本信息,然后寫入表;而修改記錄,則打開表,在表中查找相應(yīng)的記錄,如有則修改,否則不能修改;查找記錄時從鍵盤輸入關(guān)鍵字,即記錄的電話號碼,然后打開表,從表中查找是否有記錄的號碼等于查找關(guān)鍵字,若有則查找成功,否則查找不成功;刪除時,先在通訊錄中查找記錄,若查找成功則刪除,否則無法刪除。算法實現(xiàn):#include<stdlib.h>#include<windows.h>#include<iostream.h>#include<string.h>#include<stdio.h>#include<malloc.h>typedefstructpnode/*個人記錄結(jié)點(diǎn)類型*/{charname[8];/*姓名*/chartel[16];/*電話號碼*/charaddress[30];/*住址*/}personnode;personnode*person;charfilename[20];/*存儲通訊錄名稱的數(shù)組*/FILE*fp;voidcreate()/*增加記錄*/{personnode*person;person=(personnode*)malloc(sizeof(personnode));printf("\n請輸入通訊錄名:");scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){ printf("\n沒有輸入通訊錄名,不能建立通訊錄!"); exit(0);}fprintf(fp,"%-10s%-20s%-50s\n","姓名","電話號碼","住址");printf("\n請輸入姓名、電話號碼及住址(以空格隔開,以#結(jié)束)\n");scanf("%s",person->name);while(strcmp(person->name,"#")){ scanf("%s%s",person->tel,person->address); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); scanf("%s",person->name);}fclose(fp);}voidlist()/*顯示通訊錄的信息*/{if((fp=fopen(filename,"r"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} printf("\n************************************************\n"); printf("%24s\n","通訊錄"); while(!feof(fp)) {fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address);printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); } fclose(fp); printf("**************************************************\n\n");}voidappend()/*增加記錄*/{ personnode*person; person=(personnode*)malloc(sizeof(personnode));if((fp=fopen(filename,"a"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} printf("\n請輸入要添加的姓名、電話號碼及住址\n"); scanf("%s%s%s",person->name,person->tel,person->address); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); fclose(fp);}voidfind()/*查找記錄*/{ intk=0; chartelkey[16]; printf("\n請輸入要查找記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"rb"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { fscanf(fp,"%s%s%s",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { printf("\n\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); k=1; } }if(!k)printf("\n\n對不起,通訊錄中沒有此人的記錄!\n");fclose(fp);}voidalter()/*修改記錄*/{ longoffset; intk=0; chartelkey[16]; printf("\n請輸入要修改記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"r+"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { offset=ftell(fp); fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { k=1; break; } } if(k) { printf("\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); printf("\n請輸入新姓名、電話號碼及住址:"); scanf("%s%s%s",person->name,person->tel,person->address); fseek(fp,offset,SEEK_SET); printf("%ld",ftell(fp)); fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->address); } else printf("\n對不起,通訊錄中沒有此人的記錄!\n"); fclose(fp);}voidcancel()/*刪除記錄*/{longoffset; intk=0; charm; chartelkey[16]; printf("\n請輸入要刪除記錄的電話號碼:"); scanf("%s",telkey);if((fp=fopen(filename,"r+"))==NULL){ printf("\n不能打開通訊錄!"); exit(0);} while(!feof(fp)) { offset=ftell(fp); fscanf(fp,"%s%s%s\n",person->name,person->tel,person->address); if(!strcmp(telkey,person->tel)) { k=1; break; } } if(k) { printf("\n已查到,記錄為:"); printf("%-10s%-20s%-50s\n",person->name,person->tel,person->address); printf("\n確實要刪除?y/n"); scanf("%c",&m); if(m='y') { fseek(fp,offset,SEEK_SET); fprintf(fp,"%-14s%-24s%-48s\n","","",""); } } else printf("\n對不
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年液壓破拆屬具項目建議書
- 一級建筑實務(wù)練習(xí)題庫+參考答案
- 第14課 法西斯國家的侵略擴(kuò)張 教學(xué)設(shè)計-2023-2024學(xué)年浙江省部編版歷史與社會九年級下冊
- Module 3 Journey to space Unit 1 (教學(xué)設(shè)計)-2023-2024學(xué)年外研版英語八年級下冊
- 第四單元 生命的思考 教學(xué)設(shè)計-2023-2024學(xué)年統(tǒng)編版道德與法治七年級上冊
- 《第9節(jié) 多媒體元素與超鏈接》教學(xué)設(shè)計教學(xué)反思-2023-2024學(xué)年初中信息技術(shù)北師大版八年級上冊自編模擬
- 2025至2030年中國氧化鋁瓷管數(shù)據(jù)監(jiān)測研究報告
- 2025年湖南電氣職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫參考答案
- 湖南省部分學(xué)校2024-2025學(xué)年高三上學(xué)期期中聯(lián)考地理試題(解析版)
- 2025年哈爾濱北方航空職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫審定版
- 餐飲及食品安全管理制度
- 2025年安徽電氣工程職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案1套
- 2025年房屋交易代持策劃協(xié)議書
- 課題申報參考:“四新”建設(shè)背景下教育創(chuàng)新與課程數(shù)字化實踐研究
- 2025年上半年贛州市于都縣招聘城管協(xié)管員易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年煙臺汽車工程職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年江蘇農(nóng)牧科技職業(yè)學(xué)院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 2024年廣東省《輔警招聘考試必刷500題》考試題庫及答案【易錯題】
- 中考數(shù)學(xué)總復(fù)習(xí)第一章第3課時二次根式課件
- 天然氣脫硫完整版本
- 2025年中國電子煙行業(yè)發(fā)展前景與投資戰(zhàn)略規(guī)劃分析報告
評論
0/150
提交評論