個(gè)人帳簿管理系統(tǒng)課程設(shè)計(jì)論文.doc_第1頁(yè)
個(gè)人帳簿管理系統(tǒng)課程設(shè)計(jì)論文.doc_第2頁(yè)
個(gè)人帳簿管理系統(tǒng)課程設(shè)計(jì)論文.doc_第3頁(yè)
個(gè)人帳簿管理系統(tǒng)課程設(shè)計(jì)論文.doc_第4頁(yè)
個(gè)人帳簿管理系統(tǒng)課程設(shè)計(jì)論文.doc_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

課程設(shè)計(jì)(論文)編 號(hào): B04900083學(xué) 號(hào): 201240420113 課 程 設(shè) 計(jì)教 學(xué) 院計(jì)算機(jī)學(xué)院課程名稱數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題 目個(gè)人帳簿管理系統(tǒng)專 業(yè)網(wǎng)絡(luò)工程班 級(jí)1班姓 名夏能同組人員羅四維、邱少雄、王歡指導(dǎo)教師馮珊2012年12月25日 目 錄一 概述2矚慫潤(rùn)厲釤瘞睞櫪廡賴。二 總體方案設(shè)計(jì)3聞創(chuàng)溝燴鐺險(xiǎn)愛氌譴凈。三 詳細(xì)設(shè)計(jì)7殘騖樓諍錈瀨濟(jì)溆塹籟。四 程序的調(diào)試與運(yùn)行結(jié)果說(shuō)明22釅錒極額閉鎮(zhèn)檜豬訣錐。五 課程設(shè)計(jì)總結(jié)25彈貿(mào)攝爾霽斃攬磚鹵廡。參考文獻(xiàn)27謀蕎摶篋飆鐸懟類蔣薔。附錄28廈礴懇蹣駢時(shí)盡繼價(jià)騷。一 概述1. 課程設(shè)計(jì)的目的(1)理解和掌握該課程中的有關(guān)基本概念,程序設(shè)計(jì)思想和方法。(2)培養(yǎng)綜合運(yùn)用所學(xué)知識(shí)獨(dú)立完成課題的能力。(3)培養(yǎng)勇于探索、嚴(yán)謹(jǐn)推理、實(shí)事求是、有錯(cuò)必改,用實(shí)踐來(lái)檢驗(yàn)理論,全方位考慮問(wèn)題等科學(xué)技術(shù)人員應(yīng)具有的素質(zhì)。煢楨廣鰳鯡選塊網(wǎng)羈淚。(4)掌握從資料文獻(xiàn)、科學(xué)實(shí)驗(yàn)中獲得知識(shí)的能力,提高學(xué)生從別人經(jīng)驗(yàn)中找到解決問(wèn)題的新途徑的悟性,初步培養(yǎng)工程意識(shí)和創(chuàng)新能力。鵝婭盡損鵪慘歷蘢鴛賴。2. 課程設(shè)計(jì)的要求個(gè)人帳簿管理系統(tǒng)記錄某人每月的全部收入及各項(xiàng)開支情況,包括食品消費(fèi),房租,子女教育費(fèi)用,水電費(fèi),醫(yī)療費(fèi),儲(chǔ)蓄等。該系統(tǒng)采用了Windows XP操作系統(tǒng)結(jié)合Visual C+ 6.0,TC 2.0等軟件開發(fā),可以輸入和修改某月的收支情況,可以對(duì)每月的開支從小到大進(jìn)行排序,可以根據(jù)輸入的月份查詢每月的收支情況?;[叢媽羥為贍僨蟶練淨(jìng)。該課程設(shè)計(jì)中會(huì)頻繁的使用到C語(yǔ)言里的文件操作的知識(shí)點(diǎn),而文件操作又是我們平常的學(xué)習(xí)當(dāng)中使用的比較少的地方,所以在課程設(shè)計(jì)之前我們組的成員專門花了一節(jié)課的時(shí)間重新閱讀了C程序設(shè)計(jì)教程以及C primer plus里的文件操作的相關(guān)知識(shí)。預(yù)頌圣鉉儐歲齦訝驊糴。二 總體方案設(shè)計(jì)1.系統(tǒng)整體設(shè)計(jì)思路本課程序中主要通過(guò)C語(yǔ)言的文件操作實(shí)現(xiàn)文件的讀寫操作來(lái)存放管理數(shù)據(jù),里面主要包含功能函數(shù)有接收鍵盤輸入數(shù)據(jù)、將數(shù)據(jù)寫入指定文件、將.dat文件文件轉(zhuǎn)換.txt文件顯示出來(lái)、找到對(duì)應(yīng)月份、對(duì)一個(gè)月內(nèi)各項(xiàng)支出進(jìn)行排序、修改其中一項(xiàng)數(shù)據(jù)以及刪除整月數(shù)據(jù)。整個(gè)系統(tǒng)的界面以及對(duì)各功能函數(shù)的調(diào)用都放在了主函數(shù)之中。整個(gè)程序中一個(gè)指針變量a貫穿始終,可以使各個(gè)函數(shù)共享指針變量a所指向的內(nèi)存區(qū)域的數(shù)據(jù)。滲釤嗆儼勻諤鱉調(diào)硯錦。整個(gè)程序涉及到的功能較多,代碼普遍較長(zhǎng),根據(jù)課程設(shè)計(jì)教學(xué)大綱里的要求以及我們對(duì)程序的整體設(shè)計(jì)我們將整個(gè)程序分為了6個(gè)功能,7個(gè)功能函數(shù)以及主函數(shù)來(lái)調(diào)度各個(gè)函數(shù)以來(lái)實(shí)現(xiàn)功能。鐃誅臥瀉噦圣騁貺頂廡。2.算法的整體思路 數(shù)據(jù)類型設(shè)定為:typedef struct int month; int shipin; int fangzu; int zinv; int shuidian; int yiliao; int chuxu; int shouru; Infor;為了方便使用,所以每一個(gè)變量基本上都使用了拼音。另外為了方便查詢與排序,又另外定義了typedef struct int no; int data; pType;方便排序時(shí)候使用。整個(gè)程序流程圖如下:整個(gè)程序在主函數(shù)中由switch調(diào)用各個(gè)功能函數(shù)來(lái)執(zhí)行整個(gè)程序。3.主要特點(diǎn)本程序可以在控制臺(tái)里錄入數(shù)據(jù)后寫入文件當(dāng)中,即使退出了程序,只要不刪除自己所寫的文件都可以隨時(shí)通過(guò)程序?qū)ξ募锏娜我鈹?shù)據(jù)進(jìn)行增刪改查,并且可以實(shí)現(xiàn)對(duì)多文件的管理,在修改數(shù)據(jù)的時(shí)候我們可以對(duì)指定文件里的指定月份的指定數(shù)據(jù)項(xiàng)進(jìn)行修改體現(xiàn)了修改的靈活性,在查詢的時(shí)候我們可以在控制臺(tái)中查詢一個(gè)文件中里的一個(gè)月的數(shù)據(jù)也可以在控制臺(tái)中查詢指定文件里的直徑月份的數(shù)據(jù),還可以對(duì)指定文件里的指定月份的數(shù)據(jù)整項(xiàng)刪除。最后該程序還可以對(duì)每個(gè)月中的各項(xiàng)開支進(jìn)行從小到大的排序。擁締鳳襪備訊顎輪爛薔。4.具備功能該程序可以接收鍵盤輸入數(shù)據(jù)、將數(shù)據(jù)寫入指定文件、將.dat文件文件轉(zhuǎn)換為txt文件顯示出來(lái)方便查看、找到對(duì)應(yīng)月份、對(duì)一個(gè)月內(nèi)各項(xiàng)支出進(jìn)行排序、修改其中一項(xiàng)數(shù)據(jù)以及刪除整月數(shù)據(jù)最后在主函數(shù)中對(duì)小組成員的各個(gè)函數(shù)進(jìn)行整體的調(diào)試調(diào)用。詳細(xì)情況見下表:贓熱俁閫歲匱閶鄴鎵騷。void input(Infor *a)該函數(shù)接受一個(gè)從主函數(shù)傳過(guò)來(lái)的指針變量,將數(shù)據(jù)寫入a所指向的內(nèi)存區(qū)域void writeinfor(Infor *a)該函數(shù)將a所指向的內(nèi)存區(qū)域的數(shù)據(jù)寫入到指定的.dat文件中void changeFormat()該函數(shù)用于查詢的時(shí)候?qū)?dat文件里的數(shù)據(jù)寫入到控制臺(tái)中,并轉(zhuǎn)化一個(gè).txt文件顯示出來(lái),最后關(guān)閉這個(gè)文件。函數(shù)執(zhí)行完畢并刪除該.txt文件int search(Infor *a)接受主函數(shù)中傳來(lái)的指針變量,尋找該指針指向的內(nèi)存區(qū)域中a-month與你所需要查找的month值相等的位置,使a指針剛好指向這個(gè)月的數(shù)據(jù),若找到了標(biāo)志位為1返回正確,如果沒找到的話就顯示為找到對(duì)應(yīng)月份。void paixu(Infor *a)對(duì)指定月份里的數(shù)據(jù)項(xiàng)里的數(shù)據(jù)從小到大進(jìn)行排序。void modify(Infor *a,int mon)對(duì)指定文件的指定月份的指定的數(shù)據(jù)項(xiàng)的數(shù)據(jù)進(jìn)行修改void delRecord(int mon) 對(duì)指定的文件的指定月份的數(shù)據(jù)整月進(jìn)行刪除我在本程序中承擔(dān)的主要任務(wù)是查找對(duì)應(yīng)月份,查詢數(shù)據(jù)或修改該月份中的一項(xiàng)數(shù)。該三項(xiàng)功能主要解決的問(wèn)題是如何在指定的文件中找到對(duì)應(yīng)的數(shù)據(jù)項(xiàng)并對(duì)該數(shù)據(jù)項(xiàng)進(jìn)行相應(yīng)的操作。最后在主函數(shù)中通過(guò)switch對(duì)各個(gè)功能模塊進(jìn)行整體調(diào)用最終實(shí)現(xiàn)該系統(tǒng)。壇摶鄉(xiāng)囂懺蔞鍥鈴氈淚。我所主要要解決的問(wèn)題是如何使用正確的文件讀寫操作模式字符串來(lái)打開文件以及對(duì)指定的.dat文件讀取后轉(zhuǎn)換為.txt文件并最終按照以定的格式顯示在屏幕上。另外在查詢函數(shù)中我們要在相應(yīng)的文件中找到對(duì)應(yīng)的月份,并將指針移動(dòng)到這里指向該數(shù)據(jù)區(qū)域,這樣的話我們就可以利用該指針變量方便的查詢、修改數(shù)據(jù),這也正是體現(xiàn)出指針變量使用的靈活性。其中文件操作中fopen函數(shù)模式字符串的功能如下:蠟變黲癟報(bào)倀鉉錨鈰贅。模式字符串意義“r”打開已過(guò)文件,可以讀取文件“w”打開已文件,可以寫入文件,先將文件的長(zhǎng)度截為0,如果該文件不存在則創(chuàng)建之“a”打開一個(gè)文本文件,可以寫入文件,向已有文件的尾部追加內(nèi)容,如果該文件不存在則先創(chuàng)建之“r+”打開一個(gè)文本文件,可以進(jìn)行更新,也可以讀取和寫入文件“w+”打開已隔文本文件,可以進(jìn)行更新(寫入),如果該文件存在則首先將其長(zhǎng)度截為0;如果不存在則先創(chuàng)建之“a+”打開一個(gè)文本文件,可以進(jìn)行更新(讀取和寫入),向已有的文件的尾部追加內(nèi)容,如果該文件不存在則先創(chuàng)建之;可以讀取整個(gè)文件,但寫入時(shí)只能追加內(nèi)容“rb”,”wb+”,”ab”,”ab+”,”a+b”,”wb+”,”w+b”“ab+”,”a+b”與前面的模式相同,只是使用二進(jìn)制模式而非文本模式打開文件三 詳細(xì)設(shè)計(jì)1. changeFormat()該函數(shù)功首先在控制臺(tái)上打印一排語(yǔ)句提示用戶輸入想要查找的文件名,若該文件不存在的話該程序就會(huì)終止。若該文件存在的話使用文件類型指針fp1指向該文件,以二進(jìn)制文件讀寫方式打開該文件,接著我用相通的名字卻用.txt后綴創(chuàng)建了另一個(gè)文件,并用文件類型指針fp2指向它,并在該文件中打印一些展示文字使輸出結(jié)果更加好看,同時(shí)將這些文字也打印在了控制臺(tái)上,最后將fp1文件指向的內(nèi)容用格式化輸出fprintf全部寫入fp2中,最后分別關(guān)閉fp1,fp2,并將剛剛的.txt文件顯示出來(lái),同時(shí)刪除剛剛創(chuàng)建的.txt文件。買鯛鴯譖曇膚遙閆擷凄。void changeFormat() FILE *fp1,*fp2; Infor *a; char filename100; int i; a=(Infor *)malloc(sizeof(Infor); printf(請(qǐng)輸入您要查詢的數(shù)據(jù)所在的文件名(以.dat為后綴的文件名)); scanf(%s,filename); fp1=fopen(filename,rb+);/以讀寫方式打開一個(gè)二進(jìn)制文件 if(fp1=NULL) printf(無(wú)法找到文件n);exit(0); for(i=0;filenamei!=.;i+) filename2i=filenamei; if(filename2i!=.) strcat(filename2,.txt);/將filename的后綴改為.txt文件 fp2=fopen(filename2,wb+); if(fp2=NULL) printf(無(wú)法創(chuàng)建文件n); return ; /返回主函數(shù) fputs( n個(gè)人帳簿管理系統(tǒng)rn,fp2);綾鏑鯛駕櫬鶘蹤韋轔糴。 fputs(記錄月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 本月收入 rn,fp2);驅(qū)躓髏彥浹綏譎飴憂錦。 fputs(- rn,fp2);貓蠆驢繪燈鮒誅髏貺廡。 printf(n記錄月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 本月收入 n);鍬籟饗逕瑣筆襖鷗婭薔。 printf(- n);構(gòu)氽頑黌碩飩薺齦話騖。 rewind(fp1);/使fp1指向文件開頭 fread(a,sizeof(Infor),1,fp1); while(!feof(fp1)/從原文件.dat中讀數(shù)據(jù)寫入顯示文件.txt中 printf(%7d %8d %8d %8d %8d %8d %8d %8dn,a-month,a-shipin,a-fangzu,a-zinv,a-shuidian,a-yiliao,a-chuxu,a-shouru);輒嶧陽(yáng)檉籪癤網(wǎng)儂號(hào)澩。 fprintf(fp2,%7d %8d %8d %8d %8d %8d %8d %8drn,a-month,a-shipin,a-fangzu,a-zinv,a-shuidian,a-yiliao,a-chuxu,a-shouru);/格式化文件輸出堯側(cè)閆繭絳闕絢勵(lì)蜆贅。 fread(a,sizeof(Infor),1,fp1); fputs(- rn,fp2);識(shí)饒鎂錕縊灩筧嚌儼淒。 fputs(r關(guān)閉本程序繼續(xù)原程序!n,fp2); fclose(fp1); fclose(fp2); system(filename2); /調(diào)用打開轉(zhuǎn)換的文本文件remove(filename2);2. search(infor *a)該函數(shù)功首先在控制臺(tái)上打印一排語(yǔ)句提示用戶輸入想要查找的文件名,若該文件不存在的話該程序就會(huì)終止。若該文件存在的話使用文件類型指針fp1指向該文件,以二進(jìn)制文件讀寫方式打開該文件,接著我用相通的名字卻用.txt后綴創(chuàng)建了另一個(gè)文件,并用文件類型指針fp2指向它,并在該文件中打印一些展示文字使輸出結(jié)果更加好看,同時(shí)將這些文字也打印在了控制臺(tái)上,最后將fp1文件指向的內(nèi)容用格式化輸出fprintf全部寫入fp2中,最后分別關(guān)閉fp1,fp2,并將剛剛的.txt文件顯示出來(lái),同時(shí)刪除剛剛創(chuàng)建的.txt文件。凍鈹鋨勞臘鍇癇婦脛糴。int search(Infor *a) FILE *fp1; int mon; int isfound=0;/標(biāo)志變量,初始為0代表為找到對(duì)應(yīng)的月份,若找到對(duì)應(yīng)的月份這設(shè)置為1 char filename100; printf(請(qǐng)輸入文件名字(.dat文件):); scanf(%s,filename); printf(請(qǐng)正確輸入月份:); scanf(%d,&mon); fflush(stdin); /清除緩沖區(qū) fp1=fopen(filename,rb+); if(fp1=NULL) printf(無(wú)法找到文件n);exit(0); rewind(fp1);/將fp1指向文件頭,這樣更加嚴(yán)謹(jǐn) fread(a,sizeof(Infor),1,fp1); while(!feof(fp1)/查詢操作 if(a-month=mon) isfound=1; break; else isfound=0; fread(a,sizeof(Infor),1,fp1); fclose(fp1); if(isfound) return OK; elseprintf(未找到對(duì)應(yīng)的月份n);return 1;3. void modify(Infor *a,int mon)該函數(shù)主要功能在于修改指定文件下指定月份的指定數(shù)據(jù)項(xiàng),首先用fp1指向指定的文件,同時(shí)用fp2打開一個(gè)temp.dat文件。月份是通過(guò)前面的search函數(shù)找到后,通過(guò)指針變量a”傳遞”過(guò)來(lái)的。首先選擇修改哪一項(xiàng)數(shù)據(jù),然后輸入要修改的數(shù)據(jù)的內(nèi)容將其寫入a指向的內(nèi)存區(qū)域里對(duì)應(yīng)的數(shù)據(jù)項(xiàng)。此時(shí)我們用printf在控制臺(tái)打印出修改后的月份的數(shù)據(jù)。然后用指針變量b來(lái)存儲(chǔ)從fp1文件中讀取的數(shù)據(jù),當(dāng)它不是對(duì)應(yīng)的月份就直接寫入fp2指向的temp.dat文件中,當(dāng)它是對(duì)應(yīng)的月份的時(shí)候就將a指向的內(nèi)存區(qū)域的數(shù)據(jù)寫入fp2指向的temp.dat文件中,該過(guò)程還是一個(gè)直到fp1指向文件結(jié)尾時(shí)才結(jié)束的函數(shù)。最后關(guān)閉fp1,fp2指向的文件,刪除源文件,將temp.dat文件的名字命名為與先前文件相同的名字并在控制臺(tái)上打印出修改成功的字樣。恥諤銪滅縈歡煬鞏鶩錦。void modify(Infor *a,int mon)/修改數(shù)據(jù) FILE *fp1,*fp2;int i;int money;char filename100; Infor *b; b=(Infor *)malloc(sizeof(Infor);printf(修改后的數(shù)據(jù)所要插入的文件(注意與前面的文件名一定要是一致的?。?;scanf(%s,filename); fp1=fopen(filename,rb+); fp2=fopen(temp.dat,wb+);/temp.dat作為臨時(shí)文件printf(你要修改哪一項(xiàng)數(shù)據(jù)?(1代表食品,2代表房租,3代表子女費(fèi)用,4代表水電費(fèi)用,5代表醫(yī)療費(fèi)用,6代表儲(chǔ)蓄,7代表收入):);鯊腎鑰詘褳鉀溈懼統(tǒng)庫(kù)。scanf(%d,&i);while(i7)printf(請(qǐng)重新輸入:);scanf(%d,&i);printf(請(qǐng)將修改后的數(shù)據(jù)輸入進(jìn)來(lái):);scanf(%d,&money);switch(i)case 1:a-shipin=money;break;case 2:a-fangzu=money;break;case 3:a-zinv=money;break;case 4:a-shuidian=money;break;case 5:a-yiliao=money;break;case 6:a-chuxu=money;break;case 7:a-shouru=money;break;default:break;printf(修改后的:n);printf(n記錄月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 本月收入 n);碩癘鄴頏謅攆檸攜驤蘞。printf(- n);閿擻輳嬪諫遷擇楨秘騖。 printf(%7d %8d %8d %8d %8d %8d %8d %8dn,a-month,a-shipin,a-fangzu,a-zinv,a-shuidian,a-yiliao,a-chuxu,a-shouru);氬嚕躑竄貿(mào)懇彈瀘頷澩。 rewind(fp1); fread(b,sizeof(Infor),1,fp1); while (!feof(fp1)/重寫數(shù)據(jù) if(b-month=mon) fwrite(a,sizeof(Infor),1,fp2);/修改數(shù)據(jù) else fwrite(b,sizeof(Infor),1,fp2); fread(b,sizeof(Infor),1,fp1); fclose(fp1); fclose(fp2); remove(filename); /刪除源文件 rename(temp.dat,filename);/重命名中間文件 printf(修改數(shù)據(jù)成功!n );4主函數(shù)調(diào)試主函數(shù)部分通過(guò)switch語(yǔ)句來(lái)對(duì)實(shí)現(xiàn)整個(gè)程序功能的調(diào)度。首先case1里通過(guò)input函數(shù)將變量寫入a所指向的內(nèi)存區(qū)域,然后調(diào)用writeinfor函數(shù)將指針變量a所指向區(qū)域的數(shù)據(jù)寫入用戶自己指定的文件中。case2是對(duì)用戶指定的文件的數(shù)據(jù)進(jìn)行整個(gè)文件查詢,結(jié)果最終會(huì)打印在控制臺(tái)中并且還會(huì)顯示一個(gè).txt文件這樣更加方便更加直觀。case3中調(diào)用了search函數(shù),并且通過(guò)標(biāo)志位變量flag來(lái)接收search函數(shù)所返回的值,若flag值不是OK的話就打印出沒有符合條件的記錄的語(yǔ)句,flag是OK的話就通過(guò)指針變量a將其所指向的內(nèi)存區(qū)域的數(shù)據(jù)格式化的打印在屏幕上,然后調(diào)用modify函數(shù)對(duì)該該月份的數(shù)據(jù)指定的數(shù)據(jù)項(xiàng)進(jìn)行修改。case4中前面部分的流程與case3還是一樣的,同樣是調(diào)用search函數(shù)找到指定文件里的指定月份的數(shù)據(jù)并使a指向它,最后通過(guò)指針變量a打印在屏幕上。case5中還是通過(guò)search函數(shù)來(lái)找到指定的月份然后通過(guò)paixu函數(shù)來(lái)對(duì)指定月份的數(shù)據(jù)進(jìn)行從小到大的排序,最后還是打印到控制臺(tái)上。case6中同樣是通過(guò)search函數(shù)找到指定的月份,并刪除這個(gè)月份的所有數(shù)據(jù)。case7中通過(guò)函數(shù)中的exit()函數(shù)來(lái)退出整個(gè)程序。釷鵒資贏車贖孫滅獅贅。主函數(shù)的整個(gè)流程圖如算法整體思路里的函數(shù)流程圖所示,在這里就省略掉了。int main()while(TRUE)int flag;/標(biāo)志位,用來(lái)保存查詢函數(shù)所返回的結(jié)果int item;/功能項(xiàng)目號(hào)int mon;Infor *a;/信息指針a=(Infor *)malloc(sizeof(Infor);/動(dòng)態(tài)分配內(nèi)存空間doprintf(nt*歡迎進(jìn)入個(gè)人帳簿管理系統(tǒng)*n);慫闡譜鯪逕導(dǎo)嘯畫長(zhǎng)涼。 printf(t*t *n);諺辭調(diào)擔(dān)鈧諂動(dòng)禪瀉類。printf(t*t 主菜單 *n);嘰覲詿縲鐋囁偽純鉿錈。printf(t*t *n);熒紿譏鉦鏌觶鷹緇機(jī)庫(kù)。printf(t*t 1.錄 入 數(shù) 據(jù) *n);鶼漬螻偉閱劍鯫腎邏蘞。printf(t* t 2.查 看 數(shù) 據(jù) *n);紂憂蔣氳頑薟驅(qū)藥憫騖。printf(t*t 3.修 改 數(shù) 據(jù) *n);穎芻莖蛺餑億頓裊賠瀧。printf(t*t 4.查 詢 數(shù) 據(jù) *n);濫驂膽閉驟羥闈詔寢賻。printf(t*t 5.排 序 數(shù) 據(jù) *n);銚銻縵嚌鰻鴻鋟謎諏涼。printf(t*t 6.刪 除 數(shù) 據(jù) *n);擠貼綬電麥結(jié)鈺贖嘵類。printf(t*t 0.退 出 系 統(tǒng) *n);賠荊紳諮侖驟遼輩襪錈。printf(t*t *n);塤礙籟饈決穩(wěn)賽釙冊(cè)庫(kù)。printf(t*nn);裊樣祕(mì)廬廂顫諺鍘羋藺。printf(請(qǐng)輸入要進(jìn)行的操作: );scanf(%d,&item);while(item7 | itemmonth;if (flag!=OK) printf(n沒有符合條件的記錄!n); elseprintf(n記錄月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 本月收入 n);倉(cāng)嫗盤紲囑瓏詁鍬齊驁。printf(- n);綻萬(wàn)璉轆娛閬蟶鬮綰瀧。printf(%7d %8d %8d %8d %8d %8d %8d %8dn,a-month,a-shipin,a-fangzu,a-zinv,a-shuidian,a-yiliao,a-chuxu,a-shouru);驍顧燁鶚巰瀆蕪領(lǐng)鱺賻。modify(a,mon);break;/查詢數(shù)據(jù)case 4: flag=search(a);if (flag!=OK) printf(n沒有符合條件的記錄!n);elseprintf(n記錄月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 本月收入 n);瑣釙濺曖惲錕縞馭篩涼。printf(- n);鎦詩(shī)涇艷損樓紲鯗餳類。printf(%7d %8d %8d %8d %8d %8d %8d %8dn,a-month,a-shipin,a-fangzu,a-zinv,a-shuidian,a-yiliao,a-chuxu,a-shouru);櫛緶歐鋤棗鈕種鵑瑤錟。 break;/排序數(shù)據(jù)case 5: flag=search(a); if (flag!=OK) printf(n沒有找到符合排序條件的記錄!n); else paixu(a);break;/刪除數(shù)據(jù)case 6:flag=search(a);mon=a-month;if (flag!=OK) printf(n沒有符合條件的記錄!n); elseprintf(n記錄月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 本月收入 n);轡燁棟剛殮攬瑤麗鬮應(yīng)。printf(- n);峴揚(yáng)斕滾澗輻灄興渙藺。printf(%7d %8d %8d %8d %8d %8d %8d %8dn,a-month,a-shipin,a-fangzu,a-zinv,a-shuidian,a-yiliao,a-chuxu,a-shouru);詩(shī)叁撻訥燼憂毀厲鋨驁。delRecord(mon);break;/退出系統(tǒng)case 0: printf(n指導(dǎo)老師:馮珊n); printf(小組成員:夏能,王歡,邱少雄,羅四維n);exit(0);break;free(a);/釋放內(nèi)存空間return 0;四 程序的調(diào)試與運(yùn)行結(jié)果說(shuō)明1.查詢函數(shù)首先是測(cè)試查詢函數(shù),數(shù)據(jù)已經(jīng)先通過(guò)第一項(xiàng)功能提前寫入到了test.dat文件中,我們?cè)谥骱瘮?shù)界面中輸入2選擇查看數(shù)據(jù)這時(shí)在控制臺(tái)中我們可以看到數(shù)據(jù)按照一定的格式輸出了,同時(shí)也打開了一個(gè)名為test.txt文件顯示出了同樣的數(shù)據(jù),這是我們看到目錄結(jié)構(gòu)中同時(shí)有test.dat文件和test.txt文件,test.txt文件中提示用戶關(guān)閉本程序繼續(xù)源程序,關(guān)閉程序后我們發(fā)現(xiàn)回到了主函數(shù)界面中,并且text.txt文件被刪除掉了。則鯤愜韋瘓賈暉園棟瀧。2.查詢數(shù)據(jù)其次測(cè)試第四項(xiàng)查詢數(shù)據(jù)功能,該功能與前者的區(qū)別在于,前者是對(duì)整個(gè)文件的數(shù)據(jù)進(jìn)行查詢,而該項(xiàng)功能是對(duì)于指定文件的指定月份來(lái)進(jìn)行查詢。我們首先在主函數(shù)界面下輸入4來(lái)選擇功能,然后控制臺(tái)會(huì)提示我們輸入要查詢的文件名,還是輸入剛剛的test.dat,然后控制臺(tái)接著會(huì)提示用戶輸入查詢的月份,我們輸入了10,這時(shí)候會(huì)發(fā)現(xiàn)控制臺(tái)將10月份的數(shù)據(jù)直接打印在了控制臺(tái)上。脹鏝彈奧秘孫戶孿釔賻。3.修改數(shù)據(jù)接著測(cè)試修改數(shù)據(jù)的功能,這時(shí)我們?cè)谥鹘缑嬷休斎?,這里調(diào)用前面的search來(lái)指定文件與月份,所以控制臺(tái)上還是誰(shuí)提示我們輸入相應(yīng)的文件與響應(yīng)的月份,我們輸入好test.dat與10后,會(huì)發(fā)現(xiàn)控制臺(tái)上提示我們選擇要修改哪一項(xiàng),這時(shí)我們選擇修改的是第一項(xiàng)即食品消費(fèi)這一項(xiàng),將其數(shù)字從150改為380,最后在控制臺(tái)中顯示出來(lái)了,我們發(fā)現(xiàn)結(jié)果是完全正確的。鰓躋峽禱紉誦幫廢掃減。五 課程設(shè)計(jì)總結(jié)該課程設(shè)計(jì)主要是通過(guò)C語(yǔ)言里的文件操作對(duì)文件進(jìn)行讀寫操作,來(lái)實(shí)現(xiàn)一個(gè)賬簿管理系統(tǒng),從這一點(diǎn)上類似于一個(gè)小型的文件類型數(shù)據(jù)庫(kù)?;镜牡膶?duì)于文件里的增刪改查的功能都在該程序里實(shí)現(xiàn)了,界面搭建的也很友好,提示性輸出語(yǔ)句很多,操作起來(lái)也比較方便。查詢的文件可以通過(guò)一個(gè).txt文件顯示出來(lái),也可以指定對(duì)應(yīng)文件里的對(duì)應(yīng)月份的數(shù)據(jù)打印在控制條中。并且可以通過(guò)該程序?qū)崿F(xiàn)對(duì)多文件的管理操作,在這一點(diǎn)上與一個(gè)文件型DBMS是一樣的(當(dāng)然功能沒有那么強(qiáng)大)。稟虛嬪賑維嚌妝擴(kuò)踴糶。在整個(gè)程序的編寫過(guò)程中遇到的最大困難就是關(guān)于文件的讀寫,以及如何以一種良好的格式輸出讓用戶看的更加清晰直觀。最先我們對(duì)文件操作函數(shù)里的模式字符串的含義理解比較含糊,沒有正確的使用以及文件操作了以后忘了重定向文件指針的位置導(dǎo)致文件指針指向異常往往在某些時(shí)候的測(cè)試下與我們所期待實(shí)現(xiàn)的功能大相徑庭,所以我們?cè)谖募羔槻僮髦岸紩?huì)先將指針的位置定位好。另外如我們?cè)诠δ?中以一個(gè).txt文件將整個(gè)文件的數(shù)據(jù)都輸出出來(lái)了,在這里格式就看起來(lái)比較舒服,但最先的時(shí)候顯示的效果并不是這樣的。我們當(dāng)時(shí)忽略了windows里的換行與dos命令控制臺(tái)里的換行的轉(zhuǎn)義字符是不一樣的,所以無(wú)論怎樣使用n最后結(jié)果都是所有的數(shù)據(jù)都擠在了一排顯得特別難看,但是后來(lái)突然想起來(lái)在windows中的換行使用的是r后來(lái)替換掉了n后一經(jīng)調(diào)試就達(dá)到了滿意的輸出效果。另外在整個(gè)程序中是分模塊來(lái)編寫的,怎樣使各個(gè)模塊能共享數(shù)據(jù)又成了一大難題,后來(lái)經(jīng)過(guò)討論我們決定整個(gè)程序在主函數(shù)中創(chuàng)建一個(gè)Infor類型的指針變量,通過(guò)指針變量我們就可以方便的共享其所指向的內(nèi)存區(qū)域以達(dá)到共享數(shù)據(jù)的效果。陽(yáng)簍埡鮭罷規(guī)嗚舊巋錟。整個(gè)程序的缺點(diǎn)在于該程序的某些步驟操作起來(lái)比較繁瑣,比方說(shuō)前面的修改數(shù)據(jù)項(xiàng)的功能,在前面已經(jīng)指定好了一個(gè)文件名,在后面又要重新指定一遍文件名,這個(gè)問(wèn)題主要是因?yàn)榉帜K編寫所造成的缺陷,曾經(jīng)想到用一個(gè)全局變量來(lái)彌補(bǔ)該缺陷,但是后來(lái)由于時(shí)間的問(wèn)題一旦修改必然又會(huì)對(duì)整個(gè)程序大動(dòng)干戈進(jìn)行一番修改就此作罷。另外整個(gè)程序設(shè)計(jì)的異常處理很不完善,但這個(gè)責(zé)任也不全然在于我們身上,因?yàn)镃語(yǔ)言是面向過(guò)程的語(yǔ)言,它并不具備類似C+、JAVA里強(qiáng)大的異常處理機(jī)制(沒有定義那么多的異常類),所以整個(gè)程序雖然可以正常的運(yùn)行使用,但并不健壯,一旦遇到非法的操作程序就必然崩潰,如果采用C+或JAVA這樣的面向?qū)ο笳Z(yǔ)言來(lái)進(jìn)行編程的話程序應(yīng)該可以設(shè)計(jì)的更加完善一些。溈氣嘮戇萇鑿鑿櫧諤應(yīng)。畢竟是一個(gè)賬簿管理系統(tǒng),對(duì)于不同的用戶我們應(yīng)該限制不同的使用權(quán)限。關(guān)于本程序的進(jìn)一步設(shè)想就是我希望能夠?qū)崿F(xiàn)一個(gè)用戶權(quán)限管理,可以通過(guò)不同的文件操作模式字符串來(lái)指定不同類型的用戶有不同權(quán)限的操作。比方說(shuō)有的用戶我們就在打開文件時(shí)給他指定“只讀”類型,那么他在整個(gè)操作過(guò)程中就只能進(jìn)行查詢,而不能創(chuàng)建,增加,刪除,修改數(shù)據(jù),而有的級(jí)別比較高的用戶我們就給他指定為“既可讀既可寫”類型,那么他在整個(gè)程序的操作過(guò)程中就擁有最高的權(quán)限可以對(duì)數(shù)據(jù)進(jìn)行任意的操作。如果這樣修改成功了以后的話就該程序就真真正正的實(shí)現(xiàn)了一個(gè)小型的文件DBMS。鋇嵐縣緱虜榮產(chǎn)濤團(tuán)藺??偟膩?lái)說(shuō)做完這一次課程設(shè)計(jì)題目以后使我原本比較薄弱的文件操作知識(shí)得到了加強(qiáng)并且也將數(shù)據(jù)庫(kù)課當(dāng)中學(xué)到的一些數(shù)據(jù)庫(kù)的思想也能在該程序中得到了一定的體現(xiàn),收獲還是很大的。懨俠劑鈍觸樂(lè)鷴燼觶騮。參考文獻(xiàn)1 譚浩強(qiáng),C程序設(shè)計(jì)題解與上機(jī)指導(dǎo)(第二版),北京,清華大學(xué)出版社,2000年9月。2 Stephen Prata,C primer plus(第四版),北京,人民郵電出版社,2005年2月。謾飽兗爭(zhēng)詣繚鮐癩別瀘。3 嚴(yán)蔚敏 數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版) 北京,清華大學(xué)出版社,2007年3月4譚浩強(qiáng) C程序設(shè)計(jì)(第四版),北京,清華大學(xué)出版社,附錄#include#include #include#define OK 1#define ERROR 0#define TRUE 1/個(gè)人信息typedef struct int month; int shipin; int fangzu; int zinv; int shuidian; int yiliao; int chuxu; int shouru; Infor;/各個(gè)變量的名稱為了方便使用全部使用拼音char filename1100,filename2100;typedef struct / 查詢用自定義數(shù)據(jù)類型 int no; int data; pType;void input(Infor *a)/接收從鍵盤輸入的數(shù)據(jù) printf(n請(qǐng)依次輸入數(shù)據(jù)(數(shù)據(jù)之間用空格隔開):n(本月月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 收入費(fèi)用)n);咼鉉們歟謙鴣餃競(jìng)蕩賺。 scanf(%d%d%d%d%d%d%d%d,&a-month,&a-shipin,&a-fangzu,&a-zinv,&a-shuidian,&a-yiliao,&a-chuxu,&a-shouru);瑩諧齷蘄賞組靄縐嚴(yán)減。 fflush(stdin);/清除文件緩沖區(qū),文件以寫方式打開時(shí)將緩沖區(qū)內(nèi)容寫入文件void writeinfor(Infor *a)/向文件內(nèi)寫入內(nèi)容char ch; FILE *fp;printf(請(qǐng)輸入要寫入的文件名(請(qǐng)以.dat做為文件名后綴):);scanf(%s,filename1);ch=getchar();/回收換行鍵if(fp=fopen(filename1,ab+)=NULL)/第一次以讀寫方式建立一個(gè)新二進(jìn)制文件,后面若該文件名存在則打開該文件在后面追加內(nèi)容麩肅鵬鏇轎騍鐐縛縟糶。printf(無(wú)法創(chuàng)建文件n);exit(0); fwrite(a,sizeof(Infor),1,fp);/向fp所指向的文件寫入一個(gè)數(shù)據(jù)項(xiàng) fclose(fp); printf(數(shù)據(jù)寫入成功n);void changeFormat() FILE *fp1,*fp2; Infor *a; char filename100; int i; a=(Infor *)malloc(sizeof(Infor); printf(請(qǐng)輸入您要查詢的數(shù)據(jù)所在的文件名(以.dat為后綴的文件名)); scanf(%s,filename); fp1=fopen(filename,rb+);/以讀寫方式打開一個(gè)二進(jìn)制文件 if(fp1=NULL) printf(無(wú)法找到文件n);exit(0); for(i=0;filenamei!=.;i+) filename2i=filenamei; if(filename2i!=.) strcat(filename2,.txt);/將filename的后綴改為.txt文件 fp2=fopen(filename2,wb+); if(fp2=NULL) printf(無(wú)法創(chuàng)建文件n); return ; /返回主函數(shù) fputs( n個(gè)人帳簿管理系統(tǒng)rn,fp2);納疇鰻吶鄖禎銣膩鰲錟。 fputs(記錄月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 本月收入 rn,fp2);風(fēng)攆鮪貓鐵頻鈣薊糾廟。 fputs(- rn,fp2);滅噯駭諗鋅獵輛覯餿藹。 printf(n記錄月份 食品消費(fèi) 房租費(fèi)用 子女費(fèi)用 水電費(fèi)用 醫(yī)療費(fèi)用 儲(chǔ)蓄費(fèi)用 本月收入 n);鐒鸝餉飾鐔閌貲諢癱騮。 printf(- n);攙閿頻嶸陣澇諗譴隴瀘。 rewind(fp1);/使fp1指向文件開頭 fread(a,sizeof(Infor),1,fp1); while(!feof(fp1)/從原文件.dat中讀數(shù)據(jù)寫入顯示文件.txt中 printf(%7d %8d %8d %8d %8d %8d %8d %8dn,a-month,a-shipin,a-fangzu,a-zinv,a-shuidian,a-yiliao,a-chuxu,a-shouru);趕輾雛紈顆鋝討躍滿賺。 fprintf(fp2,%7d %8d %8d %8d %8d %8d %8d %8drn,a-month,a-shipin,a-fangzu,a-zinv,a-shuidian,a-yiliao,a-chuxu,a-shouru);/格式化文件輸出夾覡閭輇駁檔驀遷錟減。 fread(a,sizeof(Infor),1,fp1); fputs(- rn,fp2);視絀鏝鴯鱭鐘腦鈞欖糲。 fputs(r關(guān)閉本程序繼續(xù)原程序!n,fp2); fclose(fp1); fclose(fp2); system(filename2); /調(diào)用打開轉(zhuǎn)換的文本文件remove(filename2);int search(Infor *a) FILE *fp1; int mon; int isfound=0;/標(biāo)志變量,初始為0代表為找到對(duì)應(yīng)的月份,若找到對(duì)應(yīng)的月份這設(shè)置為1 char f

溫馨提示

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

評(píng)論

0/150

提交評(píng)論