版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、學號:201240420113編號:B04900083課程設(shè)計目 錄一概述 0教 學 院課程名稱二總體方題目專業(yè)1班級姓名同組人員三詳細設(shè)指導教師計算機學院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計個人帳簿管理系統(tǒng)網(wǎng)絡工程1 班夏能羅四維、邱少雄、王歡馮珊案 設(shè) 計計 4四程序的調(diào)試2012 年12 月25日與運行結(jié)果說明 18五課程設(shè)計總結(jié)20參考文獻 21附錄 22一 概述1. 課程設(shè)計的目的(1) 理解和掌握該課程中的有關(guān)基本概念,程序設(shè)計思想和方法。(2) 培養(yǎng)綜合運用所學知識獨立完成課題的能力。(3) 培養(yǎng)勇于探索、嚴謹推理、實事求是、有錯必改,用實踐來檢驗理論,全方位考慮問題等科學技術(shù)人員應具有的素質(zhì)。(4
2、) 掌握從資料文獻、科學實驗中獲得知識的能力,提高學生從別人經(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 語言里的文件操作的知識點,而文件操作又是我們平常的學習當中使用的比較少的地方,所以在課程設(shè)計之前我們組的成員專
3、門花了一節(jié)課的時間重新閱讀了C 程序設(shè)計教程以及C primerplus里的文件操作的相關(guān)知識。二 總體方案設(shè)計1.系統(tǒng)整體設(shè)計思路本課程序中主要通過 C 語言的文件操作實現(xiàn)文件的讀寫操作來存放管理數(shù)據(jù),里面主要包含功能函數(shù)有接收鍵盤輸入數(shù)據(jù)、將數(shù)據(jù)寫入指定文件、將 .dat 文件文件轉(zhuǎn)換 .txt 文件顯示出來、找到對應月份、對一個月內(nèi)各項支出進行排序、修改其中一項數(shù)據(jù)以及刪除整月數(shù)據(jù)。整個系統(tǒng)的界面以及對各功能函數(shù)的調(diào)用都放在了主函數(shù)之中。整個程序中一個指針變量 a 貫穿始終,可以使各個函數(shù)共享指針變量 a 所指向的內(nèi)存區(qū)域的數(shù)據(jù)。整個程序涉及到的功能較多,代碼普遍較長,根據(jù)課程設(shè)計教案大
4、綱里的要求以及我們對程序的整體設(shè)計我們將整個程序分為了6 個功能, 7 個功能函數(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ù)中由swit
5、ch 調(diào)用各個功能函數(shù)來執(zhí)行整個程序。3.主要特點本程序可以在控制臺里錄入數(shù)據(jù)后寫入文件當中,即使退出了程序,只要不刪除自己所寫的文件都可以隨時通過程序?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
6、 文件顯示出來方便查看、找到對應月份、對一個月內(nèi)各項支出進行排序、修改其中一項數(shù)據(jù)以及刪除整月數(shù)據(jù)最后在主函數(shù)中對小組成員的各個函數(shù)進行整體的調(diào)試調(diào)用。詳細情況見下表:void input(Infor *a)該函數(shù)接受一個從主函數(shù)傳過來的指針變量,將數(shù)據(jù)寫入a 所指向的內(nèi)存區(qū)域void writeinfor(Infor *a)該函數(shù)將 a 所指向的內(nèi)存區(qū)域的數(shù)據(jù)寫入到指定的 .dat 文件中void changeFormat()該函數(shù)用于查詢的時候?qū)?.dat 文件里的數(shù)據(jù)寫入到控制臺中,并轉(zhuǎn)化一個 .txt文件顯示出來,最后關(guān)閉這個文件。函數(shù)執(zhí)行完畢并刪除該 .txt 文件int searc
7、h(Infor *a)接受主函數(shù)中傳來的指針變量,尋找該指針指向的內(nèi)存區(qū)域中a->month 與你所需 要查找的 month 值相等的位置,使 a 指針剛好指向這個月的數(shù)據(jù),若找到了標志位為1 返回正確,如果沒找到的話就顯示為找到對應月份。void paixu(Infor *a)對指定月份里的數(shù)據(jù)項里的數(shù)據(jù)從小到大進行排序。void modify(Infor *a,int mon)對指定文件的指定月份的指定的數(shù)據(jù)項的數(shù)據(jù)進行修改void delRecord(int mon)對指定的文件的指定月份的數(shù)據(jù)整月進行刪除我在本程序中承擔的主要任務是查找對應月份,查詢數(shù)據(jù)或修改該月份中的一項數(shù)。該
8、三項功能主要解決的問題是如何在指定的文件中找到對應的數(shù)據(jù)項并對該數(shù)據(jù)項進行相應的操作。最后在主函數(shù)中通過switch 對各個功能模塊進行整體調(diào)用最終實現(xiàn)該系統(tǒng)。我所主要要解決的問題是如何使用正確的文件讀寫操作模式字符串來打開文件以及對指定的 .dat 文件讀取后轉(zhuǎn)換為 .txt 文件并最終按照以定的格式顯示在屏幕上。另外在查詢函數(shù)中我們要在相應的文件中找到對應的月份,并將指針移動到這里指向該數(shù)據(jù)區(qū)域,這樣的話我們就可以利用該指針變量方便的查詢、修改數(shù)據(jù),這也正是體現(xiàn)出指針變量使用的靈活性。其中文件操作中fopen 函數(shù)模式字符串的功能如下:模式字符串意義“r”打開已過文件,可以讀取文件“w”打
9、開已文件,可以寫入文件,先將文件的長度截為0,如果該文件不存在則創(chuàng)建之“a”打開一個文本文件 ,可 以寫 入文件,向已有文件的尾部追加內(nèi)容,如果該文件不存在則先創(chuàng)建之“r+”打開一個文本文件 ,可 以進 行更新,也可以讀取和寫入文件“w+”打開已隔文本文件,可以進行更新(寫入),如果該文件存在則首先將其長度截為0;如果不存在則先創(chuàng)建之“a+”打開一個文本文件,可以進行更新(讀取和寫入),向已有的文件的尾部追加內(nèi)容,如果該文件不存在則先創(chuàng)建之;可以讀取整個文件,但寫入時只能追加內(nèi)容“rb”,”wb+”,”ab”,”ab+”,”a+b”,”wb+”,”w+b” 與前面的模式相同,只是使用二進“ab
10、+”,”a+b”制模式而非文本模式打開文件三 詳細設(shè)計1.changeFormat()該函數(shù)功首先在控制臺上打印一排語句提示用戶輸入想要查找的文件名,若該文件不存在的話該程序就會終止。若該文件存在的話使用文件類型指針 fp1 指向該文件,以二進制文件讀寫方式打開該文件,接著我用相通的名字卻用 .txt后綴創(chuàng)建了另一個文件,并用文件類型指針fp2指向它,并在該文件中打印一些展示文字使輸出結(jié)果更加好看,同時將這些文字也打印在了控制臺上,最后將fp1 文件指向的內(nèi)容用格式化輸出fprintf全部寫入 fp2 中,最后分別關(guān)閉 fp1,fp2,并將剛剛的 .txt 文件顯示出來,同時刪除剛剛創(chuàng)建的 .
11、txt 文件。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+")。/ 以讀寫方式打開一個二進制文件if(fp1=NULL)printf("無法找到文件 n") 。exit(0)。for(i=0。
12、filenamei!='.'。i+)filename2i=filenamei。if(filename2i!='.')strcat(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ī)療費用
13、 儲蓄費用本月收入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ù)據(jù)寫入顯示文件.txt中printf("%7d%8d %8d %8d%8d%8d%8d %8dn",a->month,a->shipin,a-&g
14、t;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",fp
15、2)。fputs("r關(guān)閉本程序繼續(xù)原程序!n",fp2)。fclose(fp1)。fclose(fp2)。system(filename2) 。 / 調(diào)用打開轉(zhuǎn)換的文本文件 remove(filename2) 。2.search(infor *a)該函數(shù)功首先在控制臺上打印一排語句提示用戶輸入想要查找的文件名,若該文件不存在的話該程序就會終止。若該文件存在的話使用文件類型指針 fp1 指向該文件,以二進制文件讀寫方式打開該文件,接著我用相通的名字卻用.txt后綴創(chuàng)建了另一個文件,并用文件類型指針fp2指向它,并在該文件中打印一些展示文字使輸出結(jié)果更加好看,同時將這些文字也
16、打印在了控制臺上,最后將fp1文件指向的內(nèi)容用格式化輸出fprintf全部寫入fp2中,最后分別關(guān)閉fp1,fp2,并將剛剛的.txt文件顯示出來,同時刪除剛剛創(chuàng)建的.txt文件。int search(Infor *a)FILE *fp1。int mon。int isfound=0。 /標志變量,初始為0 代表為找到對應的月份,若找到對應的月份這設(shè)置為1char filename100。printf("請輸入文件名字(.dat文件 ):")。scanf("%s",filename)。printf("請正確輸入月份:")。scanf(&
17、quot;%d",&mon)。fflush(stdin)。/清除緩沖區(qū)fp1=fopen(filename,"rb+")。if(fp1=NULL)printf("無法找到文件n")。exit(0)。rewind(fp1)。/ 將 fp1fread(a,sizeof(Infor),1,fp1)指向文件頭,這樣更加嚴謹。while(!feof(fp1)/查詢操作if(a->month=mon)isfound=1。break。elseisfound=0。fread(a,sizeof(Infor),1,fp1)。fclose(fp1)。i
18、f(isfound)return OK。elseprintf("未找到對應的月份 n") 。return 1。3.void modify(Infor *a,int mon)該函數(shù)主要功能在于修改指定文件下指定月份的指定數(shù)據(jù)項,首先用fp1 指向指定的文件,同時用fp2 打開一個temp.dat 文件。月份是通過前面的 search函數(shù)找到后,通過指針變量 a”傳遞 ”過來的。首先選擇修改哪一項數(shù)據(jù),然后輸入要修改的數(shù)據(jù)的內(nèi)容將其寫入 a 指向的內(nèi)存區(qū)域里對應的數(shù)據(jù)項。此時我們用 printf 在控制臺打印出修改后的月份的數(shù)據(jù)。然后用指針變量 b 來存儲從 fp1 文件中讀取
19、的數(shù)據(jù),當它不是對應的月份就直接寫入 fp2 指向的 temp.dat 文件中,當它是對應的月份的時候就將 a 指向的內(nèi)存區(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(siz
20、eof(Infor)。printf("修改后的數(shù)據(jù)所要插入的文件(注意與前面的文件名一定要是一致的!) ") 。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(
21、"%d",&i)。while(i<1|i>7)printf("請重新輸入: ") 。scanf("%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=
22、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記錄月份食品消費房租費用子女費用水電費用醫(yī)療費用儲蓄費用本月收入n")。printf("- n")。printf("%7d%8d %8d %8d %8d %8d %8d %8dn",a->month,a-&
23、gt;shipin,a->fangzu,a->zinv,a->shuidian,a->yiliao,a->chuxu,a->shouru) 。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ù)elsefwrite(b,sizeof(Infor),1,fp2)。fread(b,sizeof(Infor),1,fp1)。fclose(fp1)。fclose(fp2)。remov
24、e(filename)。/刪除源文件rename("temp.dat",filename)。/ 重命名中間文件printf("修改數(shù)據(jù)成功!n" )。4主函數(shù)調(diào)試主函數(shù)部分通過 switch 語句來對實現(xiàn)整個程序功能的調(diào)度。首先 case1 里通過 input 函數(shù)將變量寫入 a 所指向的內(nèi)存區(qū)域,然后調(diào)用 writeinfor 函數(shù)將指針變量 a 所指向區(qū)域的數(shù)據(jù)寫入用戶自己指定的文件中。 case2 是對用戶指定的文件的數(shù)據(jù)進行整個文件查詢,結(jié)果最終會打印在控制臺中并且還會顯示一個 .txt文件這樣更加方便更加直觀。case3 中調(diào)用了 search
25、 函數(shù),并且通過標志位變量 flag 來接收 search函數(shù)所返回的值,若 flag 值不是 OK的話就打印出沒有符合條件的記錄的語句,flag 是 OK的話就通過指針變量 a 將其所指向的內(nèi)存區(qū)域的數(shù)據(jù)格式化的打印在屏幕上,然后調(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ù)進行從小到大的排序,最后還是打印到控制臺上。 c
26、ase6中同樣是通過 search函數(shù)找到指定的月份,并刪除這個月份的所有數(shù)據(jù)。 case7 中通過 <stdlib.h>函數(shù)中的 exit()函數(shù)來退出整個程序。主函數(shù)的整個流程圖如算法整體思路里的函數(shù)流程圖所示,在這里就省略掉了。int main()while(TRUE)int flag。 / 標志位,用來保存查詢函數(shù)所返回的結(jié)果int item。 / 功能工程號int mon 。Infor *a。 / 信息指針a=(Infor *)malloc(sizeof(Infor)。/ 動態(tài)分配內(nèi)存空間doprintf("nt*歡迎進入個人帳簿管理系統(tǒng) *n")。p
27、rintf("t*t*n")。printf("t*t主菜單*n")。printf("t*t*n")。printf("t*t1.錄入數(shù)據(jù)*n")。printf("t*t2.查看數(shù)據(jù)*n")。printf("t*t3.修改數(shù)據(jù)*n")。printf("t*t4.查詢數(shù)據(jù)*n")。printf("t*t5.排序數(shù)據(jù)*n")。printf("t*t6.刪除數(shù)據(jù)*n")。printf("t*t0.退出系統(tǒng)*n&quo
28、t;)。printf("t*t*n")。printf("t* *nn") 。printf("請輸入要進行的操作 : " )。scanf("%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
29、(a)。mon=a->month。if (flag!=OK) printf("n沒有符合條件的記錄 !n")。else租費用子女費用水電費用醫(yī)療費用printf("n記錄月份儲蓄費用本月收入 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->s
30、houru) 。modify(a,mon) 。break 。/ 查詢數(shù)據(jù)case 4: flag=search(a)。if (flag!=OK) printf("n沒有符合條件的記錄 !n")。elseprintf("n記錄月份食品消費房租費用子女費用水電費用醫(yī)療費用儲蓄費用本月收入n")。printf("- n")。printf("%7d%8d %8d%8d %8d%8d%8d %8dn",a->month,a->shipin,a->fangzu,a->zinv,a->shuidia
31、n,a->yiliao,a->chuxu,a->shouru) 。break 。/ 排序數(shù)據(jù)case 5: flag=search(a)。if (flag!=OK)printf("n沒有找到符合排序條件的記錄 !n")。elsepaixu(a)。break 。/ 刪除數(shù)據(jù)case 6:flag=search(a)。mon=a->month。if (flag!=OK) printf("n沒有符合條件的記錄 !n")。else租費用子女費用水電費用醫(yī)療費用printf("n記錄月份儲蓄費用本月收入 n")食品消費。
32、房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) 。delRecord(mon) 。break 。/ 退出系統(tǒng)case 0:printf("n指導老師:馮珊n")。printf("小組成員:夏能,王歡,邱少雄,羅四維n")。exit(0)。break 。fr
33、ee(a)。/釋放內(nèi)存空間return 0。四 程序的調(diào)試與運行結(jié)果說明1.查詢函數(shù)首先是測試查詢函數(shù),數(shù)據(jù)已經(jīng)先通過第一項功能提前寫入到了test.dat文件中,我們在主函數(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ū)別在于,前者是對整個文件
34、的數(shù)據(jù)進行查詢,而該項功能是對于指定文件的指定月份來進行查詢。我們首先在主函數(shù)界面下輸入 4 來選擇功能,然后控制臺會提示我們輸入要查詢的文件名,還是輸入剛剛的 test.dat,然后控制臺接著會提示用戶輸入查詢的月份,我們輸入了 10,這時候會發(fā)現(xiàn)控制臺將 10 月份的數(shù)據(jù)直接打印在了控制臺上。3. 修改數(shù)據(jù)接著測試修改數(shù)據(jù)的功能,這時我們在主界面中輸入3,這里調(diào)用前面的 search來指定文件與月份,所以控制臺上還是誰提示我們輸入相應的文件與響應的月份,我們輸入好 test.dat與 10 后,會發(fā)現(xiàn)控制臺上提示我們選擇要修改哪一項,這時我們選擇修改的是第一項即食品消費這一項,將其數(shù)字從1
35、50改為 380,最后在控制臺中顯示出來了,我們發(fā)現(xiàn)結(jié)果是完全正確的。五 課程設(shè)計總結(jié)該課程設(shè)計主要是通過 C 語言里的文件操作對文件進行讀寫操作,來實現(xiàn)一個賬簿管理系統(tǒng),從這一點上類似于一個小型的文件類型數(shù)據(jù)庫?;镜牡膶τ谖募锏脑鰟h改查的功能都在該程序里實現(xiàn)了,界面搭建的也很友好,提示性輸出語句很多,操作起來也比較方便。查詢的文件可以通過一個.txt 文件顯示出來,也可以指定對應文件里的對應月份的數(shù)據(jù)打印在控制條中。并且可以通過該程序?qū)崿F(xiàn)對多文件的管理操作,在這一點上與一個文件型DBMS 是一樣的(當然功能沒有那么強大)。在整個程序的編寫過程中遇到的最大困難就是關(guān)于文件的讀寫,以及如何以
36、一種良好的格式輸出讓用戶看的更加清晰直觀。最先我們對文件操作函數(shù)里的模式字符串的含義理解比較含糊,沒有正確的使用以及文件操作了以后忘了重定向文件指針的位置導致文件指針指向異常往往在某些時候的測試下與我們所期待實現(xiàn)的功能大相徑庭,所以我們在文件指針操作之前都會先將指針的位置定位好。另外如我們在功能 2 中以一個 .txt 文件將整個文件的數(shù)據(jù)都輸出出來了,在這里格式就看起來比較舒服,但最先的時候顯示的效果并不是這樣的。我們當時忽略了 windows 里的換行與 dos命令控制臺里的換行的轉(zhuǎn)義字符是不一樣的,所以無論怎樣使用 n最后結(jié)果都是所有的數(shù)據(jù)都擠在了一排顯得特別難看,但是后來突然想起來在
37、windows 中的換行使用的是 r后來替換掉了 n后一經(jīng)調(diào)試就達到了滿意的輸出效果。另外在整個程序中是分模塊來編寫的,怎樣使各個模塊能共享數(shù)據(jù)又成了一大難題,后來經(jīng)過討論我們決定整個程序在主函數(shù)中創(chuàng)建一個 Infor 類型的指針變量,通過指針變量我們就可以方便的共享其所指向的內(nèi)存區(qū)域以達到共享數(shù)據(jù)的效果。整個程序的缺點在于該程序的某些步驟操作起來比較繁瑣,比方說前面的修改數(shù)據(jù)項的功能,在前面已經(jīng)指定好了一個文件名,在后面又要重新指定一遍文件名,這個問題主要是因為分模塊編寫所造成的缺陷,曾經(jīng)想到用一個全局變量來彌補該缺陷,但是后來由于時間的問題一旦修改必然又會對整個程序大動干戈進行一番修改就此
38、作罷。另外整個程序設(shè)計的異常處理很不完善,但這個責任也不全然在于我們身上,因為C 語言是面向過程的語言,它并不具備類似C+、 JAVA 里強大的異常處理機制(沒有定義那么多的異常類),所以整個程序雖然可以正常的運行使用,但并不健壯,一旦遇到非法的操作程序就必然崩潰,如果采用 C+或 JAVA 這樣的面向?qū)ο笳Z言來進行編程的話程序應該可以設(shè)計的更加完善一些。畢竟是一個賬簿管理系統(tǒng),對于不同的用戶我們應該限制不同的使用權(quán)限。關(guān)于本程序的進一步設(shè)想就是我希望能夠?qū)崿F(xiàn)一個用戶權(quán)限管理,可以通過不同的文件操作模式字符串來指定不同類型的用戶有不同權(quán)限的操作。比方說有的用戶我們就在打開文件時給他指定“只讀”
39、類型,那么他在整個操作過程中就只能進行查詢,而不能創(chuàng)建,增加,刪除,修改數(shù)據(jù),而有的級別比較高的用戶我們就給他指定為“既可讀既可寫”類型,那么他在整個程序的操作過程中就擁有最高的權(quán)限可以對數(shù)據(jù)進行任意的操作。如果這樣修改成功了以后的話就該程序就真真正正的實現(xiàn)了一個小型的文件DBMS 。總的來說做完這一次課程設(shè)計題目以后使我原本比較薄弱的文件操作知識得到了加強并且也將數(shù)據(jù)庫課當中學到的一些數(shù)據(jù)庫的思想也能在該程序中得到了一定的體現(xiàn),收獲還是很大的。參考文獻1 譚浩強, C 程序設(shè)計題解與上機指導(第二版),北京,清華大學出版社,2000 年 9月。2 Stephen Prata, C prime
40、r plus (第四版),北京,人民郵電出版社,2005 年 2 月。3 嚴蔚敏 數(shù)據(jù)結(jié)構(gòu)( C 語言版) 北京,清華大學出版社,2007年3月4 譚浩強 C 程序設(shè)計(第四版),北京,清華大學出版社,附錄#include<stdio.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define TRUE 1/個人信息typedef struct int month。int shipin 。int fangzu。int zinv 。int shuidian。int yilia
41、o 。int chuxu。int shouru。 Infor 。/各個變量的名稱為了方便使用全部使用拼音char filename1100,filename2100。typedef struct / 查詢用自定義數(shù)據(jù)類型int no。int data。pType。void input(Infor *a)/ 接收從鍵盤輸入的數(shù)據(jù)printf("n 請依次輸入數(shù)據(jù) (數(shù)據(jù)之間用空格隔開 ):n( 本月月份 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 收入費用 )n")。scanf("%d%d%d%d%d%d%d%d",&a->m
42、onth,&a->shipin,&a->fangzu,&a->zinv,&a->shuidian,&a->yiliao,&a->chuxu,&a->shouru) 。fflush(stdin) 。 /清除文件緩沖區(qū),文件以寫方式打開時將緩沖區(qū)內(nèi)容寫入文件void writeinfor(Infor *a)/ 向文件內(nèi)寫入內(nèi)容char ch。FILE *fp 。printf(" 請輸入要寫入的文件名(請以 .dat 做為文件名后綴 ):")。scanf("%s"
43、,filename1)。ch=getchar()。/回收換行鍵if(fp=fopen(filename1,"ab+")=NULL)/第一次以讀寫方式建立一個新二進制文件,后面若該文件名存在則打開該文件在后面追加內(nèi)容printf(" 無法創(chuàng)建文件 n")。exit(0) 。fwrite(a,sizeof(Infor),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+") 。 /以讀寫方式打開一個二進制文件if(fp1=NULL)printf(" 無法找到文件 n")。exit(0) 。for(i=0 。filenamei!='.' 。i+)filen
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024店鋪委托設(shè)計及施工裝修合同
- 電業(yè)局年終總結(jié)
- 蘇州科技大學天平學院《儀器分析》2021-2022學年第一學期期末試卷
- 2024土地及廠房轉(zhuǎn)讓合同
- 2024購買節(jié)電器合同范本
- 塑料制品的微觀結(jié)構(gòu)與性能關(guān)聯(lián)考核試卷
- 世界各地的玉石文化巡禮考核試卷
- 廣告創(chuàng)作與智能媒體考核試卷
- 化學品生產(chǎn)單位八大安全規(guī)范考核試卷
- 建筑物拆除技術(shù)創(chuàng)新實踐案例考核試卷
- IATF16949-2016質(zhì)量管理體系程序文件全套
- 2024年江蘇省安全生產(chǎn)知識競賽考試題庫(含答案)
- 2024年高中語文選修上冊理解性默寫全集(含答案)
- 電氣工程施工驗收規(guī)范
- 單位涉密人員保密審查表
- MTM(預定動作標準法)
- 集貿(mào)市場安全隱患分析報告
- MOOC 探索管理世界的心理與行為-組織行為學-西北大學 中國大學慕課答案
- MOOC 紡紗學-東華大學 中國大學慕課答案
- 高血壓急癥的護理查房
- 數(shù)據(jù)倫理:科技與道德的交鋒課件
評論
0/150
提交評論