版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 . 編 號:B04900083學(xué) 號:3課 程 設(shè) 計教 學(xué) 院計算機學(xué)院課程名稱數(shù)據(jù)結(jié)構(gòu)課程設(shè)計題 目個人帳簿管理系統(tǒng)專 業(yè)網(wǎng)絡(luò)工程班 級1班姓 名夏能同組人員羅四維、邱少雄、王歡指導(dǎo)教師珊2012年12月25日目 錄一概述2二總體方案設(shè)計3三詳細設(shè)計7四程序的調(diào)試與運行結(jié)果說明22五課程設(shè)計總結(jié)25參考文獻27附錄28一 概述1. 課程設(shè)計的目的(1)理解和掌握該課程中的有關(guān)基本概念,程序設(shè)計思想和方法。(2)培養(yǎng)綜合運用所學(xué)知識獨立完成課題的能力。(3)培養(yǎng)勇于探索、嚴(yán)謹推理、實事、有錯必改,用實踐來檢驗理論,全方位考慮問題等科學(xué)技術(shù)人員應(yīng)具有的素質(zhì)。(4)掌握從資料文獻、科學(xué)實驗中獲
2、得知識的能力,提高學(xué)生從別人經(jīng)驗中找到解決問題的新途徑的悟性,初步培養(yǎng)工程意識和創(chuàng)新能力。2. 課程設(shè)計的要求個人帳簿管理系統(tǒng)記錄某人每月的全部收入與各項開支情況,包括食品消費,房租,子女教育費用,水電費,醫(yī)療費,儲蓄等。該系統(tǒng)采用了Windows XP操作系統(tǒng)結(jié)合Visual C+ 6.0,TC 2.0等軟件開發(fā),可以輸入和修改某月的收支情況,可以對每月的開支從小到大進行排序,可以根據(jù)輸入的月份查詢每月的收支情況。該課程設(shè)計中會頻繁的使用到C語言里的文件操作的知識點,而文件操作又是我們平常的學(xué)習(xí)當(dāng)中使用的比較少的地方,所以在課程設(shè)計之前我們組的成員專門花了一節(jié)課的時間重新閱讀了C程序設(shè)計教程
3、以與C primer plus里的文件操作的相關(guān)知識。二 總體方案設(shè)計1.系統(tǒng)整體設(shè)計思路本課程序中主要通過C語言的文件操作實現(xiàn)文件的讀寫操作來存放管理數(shù)據(jù),里面主要包含功能函數(shù)有接收鍵盤輸入數(shù)據(jù)、將數(shù)據(jù)寫入指定文件、將.dat文件文件轉(zhuǎn)換.txt文件顯示出來、找到對應(yīng)月份、對一個月各項支出進行排序、修改其中一項數(shù)據(jù)以與刪除整月數(shù)據(jù)。整個系統(tǒng)的界面以與對各功能函數(shù)的調(diào)用都放在了主函數(shù)之中。整個程序中一個指針變量a貫穿始終,可以使各個函數(shù)共享指針變量a所指向的存區(qū)域的數(shù)據(jù)。整個程序涉與到的功能較多,代碼普遍較長,根據(jù)課程設(shè)計教學(xué)大綱里的要求以與我們對程序的整體設(shè)計我們將整個程序分為了6個功能,7
4、個功能函數(shù)以與主函數(shù)來調(diào)度各個函數(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;為了方便使用,所以每一個變量基本上都使用了拼音。另外為了方便查詢與排序,又另外定義了typedef struct int no; int data; pType;方便排序時候使用。整個程序流程圖如下:整個程序在主函數(shù)中由switch調(diào)用各個功能函數(shù)來執(zhí)行整個程序。3.主要特點本程序可以在
5、控制臺里錄入數(shù)據(jù)后寫入文件當(dāng)中,即使退出了程序,只要不刪除自己所寫的文件都可以隨時通過程序?qū)ξ募锏娜我鈹?shù)據(jù)進行增刪改查,并且可以實現(xiàn)對多文件的管理,在修改數(shù)據(jù)的時候我們可以對指定文件里的指定月份的指定數(shù)據(jù)項進行修改體現(xiàn)了修改的靈活性,在查詢的時候我們可以在控制臺中查詢一個文件中里的一個月的數(shù)據(jù)也可以在控制臺中查詢指定文件里的直徑月份的數(shù)據(jù),還可以對指定文件里的指定月份的數(shù)據(jù)整項刪除。最后該程序還可以對每個月中的各項開支進行從小到大的排序。4.具備功能該程序可以接收鍵盤輸入數(shù)據(jù)、將數(shù)據(jù)寫入指定文件、將.dat文件文件轉(zhuǎn)換為txt文件顯示出來方便查看、找到對應(yīng)月份、對一個月各項支出進行排序、修改
6、其中一項數(shù)據(jù)以與刪除整月數(shù)據(jù)最后在主函數(shù)中對小組成員的各個函數(shù)進行整體的調(diào)試調(diào)用。詳細情況見下表:void input(Infor *a)該函數(shù)接受一個從主函數(shù)傳過來的指針變量,將數(shù)據(jù)寫入a所指向的存區(qū)域void writeinfor(Infor *a)該函數(shù)將a所指向的存區(qū)域的數(shù)據(jù)寫入到指定的.dat文件中void changeFormat()該函數(shù)用于查詢的時候?qū)?dat文件里的數(shù)據(jù)寫入到控制臺中,并轉(zhuǎn)化一個.txt文件顯示出來,最后關(guān)閉這個文件。函數(shù)執(zhí)行完畢并刪除該.txt文件int search(Infor *a)接受主函數(shù)中傳來的指針變量,尋找該指針指向的存區(qū)域中a->mont
7、h與你所需要查找的month值相等的位置,使a指針剛好指向這個月的數(shù)據(jù),若找到了標(biāo)志位為1返回正確,如果沒找到的話就顯示為找到對應(yīng)月份。void paixu(Infor *a)對指定月份里的數(shù)據(jù)項里的數(shù)據(jù)從小到大進行排序。void modify(Infor *a,int mon)對指定文件的指定月份的指定的數(shù)據(jù)項的數(shù)據(jù)進行修改void delRecord(int mon) 對指定的文件的指定月份的數(shù)據(jù)整月進行刪除我在本程序中承擔(dān)的主要任務(wù)是查找對應(yīng)月份,查詢數(shù)據(jù)或修改該月份中的一項數(shù)。該三項功能主要解決的問題是如何在指定的文件中找到對應(yīng)的數(shù)據(jù)項并對該數(shù)據(jù)項進行相應(yīng)的操作。最后在主函數(shù)過swit
8、ch對各個功能模塊進行整體調(diào)用最終實現(xiàn)該系統(tǒng)。我所主要要解決的問題是如何使用正確的文件讀寫操作模式字符串來打開文件以與對指定的.dat文件讀取后轉(zhuǎn)換為.txt文件并最終按照以定的格式顯示在屏幕上。另外在查詢函數(shù)中我們要在相應(yīng)的文件中找到對應(yīng)的月份,并將指針移動到這里指向該數(shù)據(jù)區(qū)域,這樣的話我們就可以利用該指針變量方便的查詢、修改數(shù)據(jù),這也正是體現(xiàn)出指針變量使用的靈活性。其中文件操作中fopen函數(shù)模式字符串的功能如下:模式字符串意義“r”打開已過文件,可以讀取文件“w”打開已文件,可以寫入文件,先將文件的長度截為0,如果該文件不存在則創(chuàng)建之“a”打開一個文本文件,可以寫入文件,向已有文件的尾部
9、追加容,如果該文件不存在則先創(chuàng)建之“r+”打開一個文本文件,可以進行更新,也可以讀取和寫入文件“w+”打開已隔文本文件,可以進行更新(寫入),如果該文件存在則首先將其長度截為0;如果不存在則先創(chuàng)建之“a+”打開一個文本文件,可以進行更新(讀取和寫入),向已有的文件的尾部追加容,如果該文件不存在則先創(chuàng)建之;可以讀取整個文件,但寫入時只能追加容“rb”,”wb+”,”ab”,”ab+”,”a+b”,”wb+”,”w+b”“ab+”,”a+b”與前面的模式一樣,只是使用二進制模式而非文本模式打開文件三 詳細設(shè)計1. changeFormat()該函數(shù)功首先在控制臺上打印一排語句提示用戶輸入想要查找的
10、文件名,若該文件不存在的話該程序就會終止。若該文件存在的話使用文件類型指針fp1指向該文件,以二進制文件讀寫方式打開該文件,接著我用相通的名字卻用.txt后綴創(chuàng)建了另一個文件,并用文件類型指針fp2指向它,并在該文件中打印一些展示文字使輸出結(jié)果更加好看,同時將這些文字也打印在了控制臺上,最后將fp1文件指向的容用格式化輸出fprintf全部寫入fp2中,最后分別關(guān)閉fp1,fp2,并將剛剛的.txt文件顯示出來,同時刪除剛剛創(chuàng)建的.txt文件。void changeFormat() FILE *fp1,*fp2; Infor *a; char filename100; int i; a=(In
11、for *)malloc(sizeof(Infor); printf("請輸入您要查詢的數(shù)據(jù)所在的文件名(以.dat為后綴的文件名)"); scanf("%s",filename); fp1=fopen(filename,"rb+");/以讀寫方式打開一個二進制文件 if(fp1=NULL) printf("無法找到文件n");exit(0); for(i=0;filenamei!='.'i+) filename2i=filenamei; if(filename2i!='.') st
12、rcat(filename2,".txt");/將filename的后綴改為.txt文件 fp2=fopen(filename2,"wb+"); if(fp2=NULL) printf("無法創(chuàng)建文件n"); return ; /返回主函數(shù) fputs(" n個人帳簿管理系統(tǒng)rn",fp2); fputs("記錄月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 本月收入 rn",fp2); fputs("- rn",fp2); printf("n記錄
13、月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 本月收入 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-&
14、gt;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(fp
15、1); fclose(fp2); system(filename2); /調(diào)用打開轉(zhuǎn)換的文本文件remove(filename2);2. search(infor *a)該函數(shù)功首先在控制臺上打印一排語句提示用戶輸入想要查找的文件名,若該文件不存在的話該程序就會終止。若該文件存在的話使用文件類型指針fp1指向該文件,以二進制文件讀寫方式打開該文件,接著我用相通的名字卻用.txt后綴創(chuàng)建了另一個文件,并用文件類型指針fp2指向它,并在該文件中打印一些展示文字使輸出結(jié)果更加好看,同時將這些文字也打印在了控制臺上,最后將fp1文件指向的容用格式化輸出fprintf全部寫入fp2中,最后分別關(guān)閉fp1
16、,fp2,并將剛剛的.txt文件顯示出來,同時刪除剛剛創(chuàng)建的.txt文件。int search(Infor *a) FILE *fp1; int mon; int isfound=0;/標(biāo)志變量,初始為0代表為找到對應(yīng)的月份,若找到對應(yīng)的月份這設(shè)置為1 char filename100; printf("請輸入文件名字(.dat文件):"); scanf("%s",filename); printf("請正確輸入月份:"); scanf("%d",&mon); fflush(stdin); /清除緩沖區(qū) f
17、p1=fopen(filename,"rb+"); if(fp1=NULL) printf("無法找到文件n");exit(0); rewind(fp1);/將fp1指向文件頭,這樣更加嚴(yá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(&
18、quot;未找到對應(yīng)的月份n");return 1;3. void modify(Infor *a,int mon)該函數(shù)主要功能在于修改指定文件下指定月份的指定數(shù)據(jù)項,首先用fp1指向指定的文件,同時用fp2打開一個temp.dat文件。月份是通過前面的search函數(shù)找到后,通過指針變量a”傳遞”過來的。首先選擇修改哪一項數(shù)據(jù),然后輸入要修改的數(shù)據(jù)的容將其寫入a指向的存區(qū)域里對應(yīng)的數(shù)據(jù)項。此時我們用printf在控制臺打印出修改后的月份的數(shù)據(jù)。然后用指針變量b來存儲從fp1文件中讀取的數(shù)據(jù),當(dāng)它不是對應(yīng)的月份就直接寫入fp2指向的temp.dat文件中,當(dāng)它是對應(yīng)的月份的時候就將
19、a指向的存區(qū)域的數(shù)據(jù)寫入fp2指向的temp.dat文件中,該過程還是一個直到fp1指向文件結(jié)尾時才結(jié)束的函數(shù)。最后關(guān)閉fp1,fp2指向的文件,刪除源文件,將temp.dat文件的名字命名為與先前文件一樣的名字并在控制臺上打印出修改成功的字樣。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ù)所要插入的文件(注意與前面的文件名一定要是一致的!)"
20、);scanf("%s",filename); fp1=fopen(filename,"rb+"); fp2=fopen("temp.dat","wb+");/temp.dat作為臨時文件printf("你要修改哪一項數(shù)據(jù)?(1代表食品,2代表房租,3代表子女費用,4代表水電費用,5代表醫(yī)療費用,6代表儲蓄,7代表收入):");scanf("%d",&i);while(i<1|i>7)printf("請重新輸入:");scanf(&qu
21、ot;%d",&i);printf("請將修改后的數(shù)據(jù)輸入進來:");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->
22、shouru=money;break;default:break;printf("修改后的:n");printf("n記錄月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 本月收入 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->shour
23、u); 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(&qu
24、ot;修改數(shù)據(jù)成功!n" );4主函數(shù)調(diào)試主函數(shù)部分通過switch語句來對實現(xiàn)整個程序功能的調(diào)度。首先case1里通過input函數(shù)將變量寫入a所指向的存區(qū)域,然后調(diào)用writeinfor函數(shù)將指針變量a所指向區(qū)域的數(shù)據(jù)寫入用戶自己指定的文件中。case2是對用戶指定的文件的數(shù)據(jù)進行整個文件查詢,結(jié)果最終會打印在控制臺中并且還會顯示一個.txt文件這樣更加方便更加直觀。case3中調(diào)用了search函數(shù),并且通過標(biāo)志位變量flag來接收search函數(shù)所返回的值,若flag值不是OK的話就打印出沒有符合條件的記錄的語句,flag是OK的話就通過指針變量a將其所指向的存區(qū)域的數(shù)據(jù)格式
25、化的打印在屏幕上,然后調(diào)用modify函數(shù)對該該月份的數(shù)據(jù)指定的數(shù)據(jù)項進行修改。case4中前面部分的流程與case3還是一樣的,同樣是調(diào)用search函數(shù)找到指定文件里的指定月份的數(shù)據(jù)并使a指向它,最后通過指針變量a打印在屏幕上。case5中還是通過search函數(shù)來找到指定的月份然后通過paixu函數(shù)來對指定月份的數(shù)據(jù)進行從小到大的排序,最后還是打印到控制臺上。case6中同樣是通過search函數(shù)找到指定的月份,并刪除這個月份的所有數(shù)據(jù)。case7過<stdlib.h>函數(shù)中的exit()函數(shù)來退出整個程序。主函數(shù)的整個流程圖如算法整體思路里的函數(shù)流程圖所示,在這里就省略掉了
26、。int main()while(TRUE)int flag;/標(biāo)志位,用來保存查詢函數(shù)所返回的結(jié)果int item;/功能項目號int mon;Infor *a;/信息指針a=(Infor *)malloc(sizeof(Infor);/動態(tài)分配存空間doprintf("nt*歡迎進入個人帳簿管理系統(tǒng)*n"); printf("t*t *n");printf("t*t 主菜單 *n");printf("t*t *n");printf("t*t 1.錄 入 數(shù) 據(jù) *n");printf(&qu
27、ot;t* t 2.查 看 數(shù) 據(jù) *n");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");printf("t*t 0.退 出 系 統(tǒng) *n");printf("t*t *n");printf("t*nn");printf("請輸入要進行的操作: " );sc
28、anf("%d",&item);while(item>7 | item<0);/選擇功能switch(item)/錄入數(shù)據(jù)case 1: input(a);writeinfor(a);break;/查看數(shù)據(jù)case 2: changeFormat();/將dat文件轉(zhuǎn)換為txt文件來進行查詢break;/修改數(shù)據(jù)case 3: flag=search(a);mon=a->month;if (flag!=OK) printf("n沒有符合條件的記錄!n"); elseprintf("n記錄月份 食品消費 房租費用 子女費
29、用 水電費用 醫(yī)療費用 儲蓄費用 本月收入 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);modify(a,mon);break;/查詢數(shù)據(jù)case 4: flag=search(a);if (flag!=OK) printf("n沒有符合條件的記錄!n&qu
30、ot;);elseprintf("n記錄月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 本月收入 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); break;/排序數(shù)據(jù)case 5: flag=search(a); if (flag!=OK)
31、 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記錄月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 本月收入 n");printf("- n");printf("%7d %8d %8d %8d %8d %8d %8d %8dn",a->m
32、onth,a->shipin,a->fangzu,a->zinv,a->shuidian,a->yiliao,a->chuxu,a->shouru);delRecord(mon);break;/退出系統(tǒng)case 0: printf("n指導(dǎo)老師:珊n"); printf("小組成員:夏能,王歡,邱少雄,羅四維n");exit(0);break;free(a);/釋放存空間return 0;四 程序的調(diào)試與運行結(jié)果說明1.查詢函數(shù)首先是測試查詢函數(shù),數(shù)據(jù)已經(jīng)先通過第一項功能提前寫入到了test.dat文件中,我們在
33、主函數(shù)界面中輸入2選擇查看數(shù)據(jù)這時在控制臺中我們可以看到數(shù)據(jù)按照一定的格式輸出了,同時也打開了一個名為test.txt文件顯示出了同樣的數(shù)據(jù),這是我們看到目錄結(jié)構(gòu)中同時有test.dat文件和test.txt文件,test.txt文件中提示用戶關(guān)閉本程序繼續(xù)源程序,關(guān)閉程序后我們發(fā)現(xiàn)回到了主函數(shù)界面中,并且text.txt文件被刪除掉了。2.查詢數(shù)據(jù)其次測試第四項查詢數(shù)據(jù)功能,該功能與前者的區(qū)別在于,前者是對整個文件的數(shù)據(jù)進行查詢,而該項功能是對于指定文件的指定月份來進行查詢。我們首先在主函數(shù)界面下輸入4來選擇功能,然后控制臺會提示我們輸入要查詢的文件名,還是輸入剛剛的test.dat,然后控
34、制臺接著會提示用戶輸入查詢的月份,我們輸入了10,這時候會發(fā)現(xiàn)控制臺將10月份的數(shù)據(jù)直接打印在了控制臺上。3.修改數(shù)據(jù)接著測試修改數(shù)據(jù)的功能,這時我們在主界面中輸入3,這里調(diào)用前面的search來指定文件與月份,所以控制臺上還是誰提示我們輸入相應(yīng)的文件與響應(yīng)的月份,我們輸入好test.dat與10后,會發(fā)現(xiàn)控制臺上提示我們選擇要修改哪一項,這時我們選擇修改的是第一項即食品消費這一項,將其數(shù)字從150改為380,最后在控制臺中顯示出來了,我們發(fā)現(xiàn)結(jié)果是完全正確的。五 課程設(shè)計總結(jié)該課程設(shè)計主要是通過C語言里的文件操作對文件進行讀寫操作,來實現(xiàn)一個賬簿管理系統(tǒng),從這一點上類似于一個小型的文件類型數(shù)
35、據(jù)庫?;镜牡膶τ谖募锏脑鰟h改查的功能都在該程序里實現(xiàn)了,界面搭建的也很友好,提示性輸出語句很多,操作起來也比較方便。查詢的文件可以通過一個.txt文件顯示出來,也可以指定對應(yīng)文件里的對應(yīng)月份的數(shù)據(jù)打印在控制條中。并且可以通過該程序?qū)崿F(xiàn)對多文件的管理操作,在這一點上與一個文件型DBMS是一樣的(當(dāng)然功能沒有那么強大)。在整個程序的編寫過程中遇到的最大困難就是關(guān)于文件的讀寫,以與如何以一種良好的格式輸出讓用戶看的更加清晰直觀。最先我們對文件操作函數(shù)里的模式字符串的含義理解比較含糊,沒有正確的使用以與文件操作了以后忘了重定向文件指針的位置導(dǎo)致文件指針指向異常往往在某些時候的測試下與我們所期待實現(xiàn)
36、的功能大相徑庭,所以我們在文件指針操作之前都會先將指針的位置定位好。另外如我們在功能2中以一個.txt文件將整個文件的數(shù)據(jù)都輸出出來了,在這里格式就看起來比較舒服,但最先的時候顯示的效果并不是這樣的。我們當(dāng)時忽略了windows里的換行與dos命令控制臺里的換行的轉(zhuǎn)義字符是不一樣的,所以無論怎樣使用n最后結(jié)果都是所有的數(shù)據(jù)都擠在了一排顯得特別難看,但是后來突然想起來在windows中的換行使用的是r后來替換掉了n后一經(jīng)調(diào)試就達到了滿意的輸出效果。另外在整個程序中是分模塊來編寫的,怎樣使各個模塊能共享數(shù)據(jù)又成了一大難題,后來經(jīng)過討論我們決定整個程序在主函數(shù)中創(chuàng)建一個Infor類型的指針變量,通過
37、指針變量我們就可以方便的共享其所指向的存區(qū)域以達到共享數(shù)據(jù)的效果。整個程序的缺點在于該程序的某些步驟操作起來比較繁瑣,比方說前面的修改數(shù)據(jù)項的功能,在前面已經(jīng)指定好了一個文件名,在后面又要重新指定一遍文件名,這個問題主要是因為分模塊編寫所造成的缺陷,曾經(jīng)想到用一個全局變量來彌補該缺陷,但是后來由于時間的問題一旦修改必然又會對整個程序大動干戈進行一番修改就此作罷。另外整個程序設(shè)計的異常處理很不完善,但這個責(zé)任也不全然在于我們身上,因為C語言是面向過程的語言,它并不具備類似C+、JAVA里強大的異常處理機制(沒有定義那么多的異常類),所以整個程序雖然可以正常的運行使用,但并不健壯,一旦遇到非法的操
38、作程序就必然崩潰,如果采用C+或JAVA這樣的面向?qū)ο笳Z言來進行編程的話程序應(yīng)該可以設(shè)計的更加完善一些。畢竟是一個賬簿管理系統(tǒng),對于不同的用戶我們應(yīng)該限制不同的使用權(quán)限。關(guān)于本程序的進一步設(shè)想就是我希望能夠?qū)崿F(xiàn)一個用戶權(quán)限管理,可以通過不同的文件操作模式字符串來指定不同類型的用戶有不同權(quán)限的操作。比方說有的用戶我們就在打開文件時給他指定“只讀”類型,那么他在整個操作過程中就只能進行查詢,而不能創(chuàng)建,增加,刪除,修改數(shù)據(jù),而有的級別比較高的用戶我們就給他指定為“既可讀既可寫”類型,那么他在整個程序的操作過程中就擁有最高的權(quán)限可以對數(shù)據(jù)進行任意的操作。如果這樣修改成功了以后的話就該程序就真真正正的
39、實現(xiàn)了一個小型的文件DBMS??偟膩碚f做完這一次課程設(shè)計題目以后使我原本比較薄弱的文件操作知識得到了加強并且也將數(shù)據(jù)庫課當(dāng)中學(xué)到的一些數(shù)據(jù)庫的思想也能在該程序中得到了一定的體現(xiàn),收獲還是很大的。參考文獻1 譚浩強,C程序設(shè)計題解與上機指導(dǎo)(第二版),清華大學(xué),2000年9月。2 Stephen Prata,C primer plus(第四版),人民郵電,2005年2月。3 嚴(yán)蔚敏 數(shù)據(jù)結(jié)構(gòu)(C語言版) ,清華大學(xué),2007年3月4譚浩強 C程序設(shè)計(第四版),清華大學(xué),附錄#include<stdio.h>#include<stdlib.h> #include<s
40、tring.h>#define OK 1#define ERROR 0#define TRUE 1/個人信息typedef struct int month; int shipin; int fangzu; int zinv; int shuidian; int yiliao; int chuxu; int shouru; Infor;/各個變量的名稱為了方便使用全部使用拼音char filename1100,filename2100;typedef struct / 查詢用自定義數(shù)據(jù)類型 int no; int data; pType;void input(Infor *a)/接收從鍵
41、盤輸入的數(shù)據(jù) printf("n請依次輸入數(shù)據(jù)(數(shù)據(jù)之間用空格隔開):n(本月月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 收入費用)n"); 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); fflush(stdin);/清除文件緩沖區(qū),文件以寫方式
42、打開時將緩沖區(qū)容寫入文件void writeinfor(Infor *a)/向文件寫入容char ch; FILE *fp;printf("請輸入要寫入的文件名(請以.dat做為文件名后綴):");scanf("%s",filename1);ch=getchar();/回收換行鍵if(fp=fopen(filename1,"ab+")=NULL)/第一次以讀寫方式建立一個新二進制文件,后面若該文件名存在則打開該文件在后面追加容printf("無法創(chuàng)建文件n");exit(0); fwrite(a,sizeof(In
43、for),1,fp);/向fp所指向的文件寫入一個數(shù)據(jù)項 fclose(fp); printf("數(shù)據(jù)寫入成功n");void changeFormat() FILE *fp1,*fp2; Infor *a; char filename100; int i; a=(Infor *)malloc(sizeof(Infor); printf("請輸入您要查詢的數(shù)據(jù)所在的文件名(以.dat為后綴的文件名)"); scanf("%s",filename); fp1=fopen(filename,"rb+");/以讀寫方式打
44、開一個二進制文件 if(fp1=NULL) printf("無法找到文件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("無法創(chuàng)建文件n"); return ; /返回主函數(shù) fput
45、s(" n個人帳簿管理系統(tǒng)rn",fp2); fputs("記錄月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 本月收入 rn",fp2); fputs("- rn",fp2); printf("n記錄月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 本月收入 n"); printf("- n"); rewind(fp1);/使fp1指向文件開頭 fread(a,sizeof(Infor),1,fp1); while(!feof(fp1)/從原文件.dat中讀數(shù)
46、據(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->yil
47、iao,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代表為找到對應(yīng)的月份,若找到對應(yīng)的月份這設(shè)置為1
48、 char filename100; printf("請輸入文件名字(.dat文件):"); scanf("%s",filename); printf("請正確輸入月份:"); scanf("%d",&mon); fflush(stdin); /清除緩沖區(qū) fp1=fopen(filename,"rb+"); if(fp1=NULL) printf("無法找到文件n");exit(0); rewind(fp1);/將fp1指向文件頭,這樣更加嚴(yán)謹 fread(a,si
49、zeof(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("未找到對應(yīng)的月份n");return 1;void paixu(Infor *a) int i=0,j=0;int temp; pType px8=0,0; char str810="記錄月份","食品
50、消費","房租費用","子女費用","水電費用","醫(yī)療費用","儲蓄費用","本月收入"/二維字符數(shù)組 for(;i<8;i+)pxi.no=i;/這里只能一一賦值 px0.data=a->month; px1.data=a->shipin; px2.data=a->fangzu; px3.data=a->zinv; px4.data=a->shuidian; px5.data=a->yiliao; px6.data=a->chuxu; px7.data=a->shouru;for(i=0;i<8;i+)for(j=0;j<7;j+)if(pxj.data>=pxj+1.data)temp=pxj.no;pxj.no=pxj+1.no;pxj+1
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度軟件購買及安裝合同標(biāo)的:企業(yè)級安全防護軟件3篇
- 旅游人才培訓(xùn)及招聘合同
- 二零二五年度跨境藝術(shù)品交易合同2篇
- 2025年LED照明產(chǎn)品節(jié)能補貼申請與執(zhí)行合同3篇
- 2025年度城市配送物流服務(wù)合同協(xié)議2篇
- 2025年度消防排煙系統(tǒng)安裝與驗收服務(wù)合同3篇
- 醫(yī)療法律若干問題解讀課件
- 2025年度環(huán)保工程委托協(xié)議書范本3篇
- 個性化正規(guī)借款協(xié)議模板2024版版A版
- 二零二五年技術(shù)專利權(quán)轉(zhuǎn)讓與知識產(chǎn)權(quán)運營及產(chǎn)業(yè)升級服務(wù)協(xié)議3篇
- 復(fù)旦大學(xué)留學(xué)生(本科)漢語入學(xué)考試大綱
- 送達地址確認書(完整版)
- 試講 關(guān)注合理營養(yǎng)與食品安全課件
- 2022年同等學(xué)力人員申請碩士學(xué)位日語水平統(tǒng)一考試真題
- 長距離輸氣管線工藝設(shè)計方案
- 北師大版小學(xué)五年級上冊數(shù)學(xué)第六單元《組合圖形的面積》單元測評培優(yōu)試卷
- 用特征方程求數(shù)列的通項
- 甲醇濃度密度對照表0~40
- 四年級奧數(shù)題(一)找規(guī)律
- 會計學(xué)原理課后習(xí)題與答案
- 縣領(lǐng)導(dǎo)在新錄用公務(wù)員培訓(xùn)班開班典禮上的講話
評論
0/150
提交評論