




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C 語(yǔ)言課程設(shè)計(jì) 個(gè)人消費(fèi)管理系統(tǒng) C 語(yǔ)言課程設(shè)計(jì) 個(gè)人消費(fèi)管理系統(tǒng) 目 錄 1 需求分析需求分析.1 1.1 問(wèn)題描述.1 1.2 輸入數(shù)據(jù)要求 .1 1.3 輸出數(shù)據(jù)要求 .1 1.4 開(kāi)發(fā)環(huán)境和工具 .1 1.5 成員分工 .1 2 總體設(shè)計(jì)總體設(shè)計(jì).2 2.1 總體設(shè)計(jì)思路.2 2.2 模塊結(jié)構(gòu)圖.2 2.3 模塊說(shuō)明.3 3 詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì).4 3.1 數(shù)據(jù)類(lèi)型定義.5 3.2 打開(kāi)模塊實(shí)現(xiàn).6 3.3 更新模塊實(shí)現(xiàn).6 3.4 統(tǒng)計(jì)模塊實(shí)現(xiàn).7 4 測(cè)試結(jié)果及分析測(cè)試結(jié)果及分析.12 5 總結(jié)總結(jié).17 參考文獻(xiàn)參考文獻(xiàn).18 附錄附錄.19 C 語(yǔ)言課程設(shè)計(jì) - 1 - 1
2、需求分析需求分析 1.1 問(wèn)題描述問(wèn)題描述 隨著社會(huì)經(jīng)濟(jì)的發(fā)展,大學(xué)生已經(jīng)成為這個(gè)社會(huì)上一個(gè)很重要的團(tuán)體,而他 們的消費(fèi)情況也越來(lái)越多的被更多的人關(guān)注,大學(xué)生自己也應(yīng)當(dāng)管理好自己的消 費(fèi)內(nèi)容,讓自己的消費(fèi)更加合理化,提高自己生活的質(zhì)量。在這種情況下,就需 要一個(gè)軟消費(fèi)表信息:編號(hào),時(shí)間,類(lèi)別,品名,單價(jià),數(shù)量,金額 對(duì)學(xué)生每天的消費(fèi)情況作一個(gè)較為詳細(xì)的統(tǒng)計(jì),該系統(tǒng)可以實(shí)現(xiàn)由計(jì)算機(jī)代 替人工執(zhí)行一些復(fù)雜而且較為繁瑣的操作,從而使大學(xué)生們能夠更為便捷地管理 自己的消費(fèi),也為其他的一些調(diào)查研究提供了方便。 1.2 輸入數(shù)據(jù)要求輸入數(shù)據(jù)要求 可錄入消費(fèi)者當(dāng)天的消費(fèi)情況,消費(fèi)表信息包括:編號(hào),時(shí)間,類(lèi)別
3、,品名, 單價(jià),數(shù)量,金額 消費(fèi)信息存放在文件中,以編號(hào)的先后順序存放 1.3 輸出數(shù)據(jù)要求輸出數(shù)據(jù)要求 打開(kāi):顯示文件中的所有消費(fèi)記錄,提供分頁(yè)顯示 保存:將消費(fèi)表的更新結(jié)果存入文件 更新:可插入、刪除、修改各消費(fèi)記錄 查找:按時(shí)間,類(lèi)別、品名查找消費(fèi)記錄 排序:按時(shí)間,類(lèi)別,金額 統(tǒng)計(jì):求各類(lèi)別消費(fèi)品的總金額,求各月的消費(fèi)總金額,求各年消費(fèi)總金額 1.4 開(kāi)發(fā)環(huán)境和工具開(kāi)發(fā)環(huán)境和工具 開(kāi)發(fā)環(huán)境:Windows 2000 開(kāi)發(fā)工具:Visual C+ 6.0 1.5 成員分工成員分工 劉倩鈺:主函數(shù)模塊,保存模塊,排序模塊 劉冬梅:打開(kāi)模塊,更新模塊,數(shù)據(jù)統(tǒng)計(jì)模塊 C 語(yǔ)言課程設(shè)計(jì) - 2
4、- 2 總體設(shè)總體設(shè)計(jì)計(jì) 2.1 總體設(shè)計(jì)思路總體設(shè)計(jì)思路 1. 設(shè)計(jì)思路設(shè)計(jì)思路 個(gè)人消費(fèi)系統(tǒng)管理包含的操作有:打開(kāi)、保存、更新、查找、排序和統(tǒng)計(jì)。在程序開(kāi)始 運(yùn)行的時(shí)候從文件加載已有數(shù)據(jù),并輸出可以進(jìn)行的操作提供給用戶, 1、打開(kāi):顯示文件中的所有消費(fèi)記錄,通過(guò)取模運(yùn)算提供分頁(yè)顯示功能 2、保存:以 wb 模式打開(kāi)文件,將修改的內(nèi)容寫(xiě)入文件 3、更新:可插入、刪除、修改各消費(fèi)記錄 4、查找:按時(shí)間,類(lèi)別、品名查找消費(fèi)記錄 5、排序:按時(shí)間,類(lèi)別,金額 6、統(tǒng)計(jì):分別按類(lèi)別、月、年統(tǒng)計(jì)消費(fèi)品的總金額 2. 數(shù)據(jù)存儲(chǔ)數(shù)據(jù)存儲(chǔ) 為了操作的方便,用 typedef 自定義了一些數(shù)據(jù)類(lèi)型,其中包含一
5、個(gè)長(zhǎng)度為 MAX 的數(shù)組, 用來(lái)存放從文件中讀取的數(shù)據(jù)。 2.2 模塊結(jié)構(gòu)圖模塊結(jié)構(gòu)圖 根據(jù)需求將系統(tǒng)劃分為六個(gè)功能模塊,函數(shù)之間的調(diào)用關(guān)系如圖 2.1 所示。 圖 2.1 個(gè)人消費(fèi)系統(tǒng)的模塊結(jié)構(gòu)圖 Main 主函數(shù) ShowTotal 統(tǒng)計(jì) CalleditUpdateRec 更新 SortRec 排序 FindRec 查找 SaveRec 保存 ShowRec 打開(kāi) C 語(yǔ)言課程設(shè)計(jì) - 3 - Calledit:在主函數(shù)的控制下,調(diào)用各個(gè)模塊 1)ShowRec: 輸出已存在的記錄。 2)SaveRec:保存更新的內(nèi)容。 3)UpdateRec: 按一定的方式更新記錄。 這個(gè)模塊下包含三
6、個(gè)子模塊 插入:Insert 刪除: DeleteByNum 修改:Modify 4)FindRec: 按一定的方式查找記錄。 這個(gè)模塊下也包含三個(gè)子模塊 按日期查找:FindBytime 按類(lèi)型查找:FindByType 按名稱(chēng)查找: FindByName 5)SortRec: 按一定的方式查找記錄。 這個(gè)模塊下也包含三個(gè)子模塊 按日期查找:SortBytime 按類(lèi)型查找:SortByType 按名稱(chēng)查找: SortBySum 6)ShowTotal: 顯示各種統(tǒng)計(jì)的結(jié)果 2.3 模塊說(shuō)明模塊說(shuō)明 (以從上至下,從左至右的順序說(shuō)明) 2.3.1:打開(kāi)模塊:打開(kāi)模塊: 自定義函數(shù):ShowR
7、ec( ) 函數(shù)功能:輸出已存在的歷史記錄 無(wú)參函數(shù):無(wú)參數(shù) 2.3.2:更新模塊:更新模塊: 自定義函數(shù):UpdateRec( ) 函數(shù)功能: 可對(duì)輸入數(shù)據(jù)實(shí)現(xiàn)插入,刪除,修改操作。 無(wú)參函數(shù):void 類(lèi)型,無(wú)返回值。調(diào)用 Insert()函數(shù),Delete()函數(shù)和 Modify() 插入模塊:自定義函數(shù):插入模塊:自定義函數(shù): Insert()() C 語(yǔ)言課程設(shè)計(jì) - 4 - 函數(shù)功能:實(shí)現(xiàn)插入新的信息并保存到記錄中,其中插入的數(shù)據(jù)最后金額可以 自己運(yùn)算出來(lái),插入的記錄保存在尾部。 無(wú)參函數(shù):返回值為 int 類(lèi)型 刪除模塊:自定義函數(shù)刪除模塊:自定義
8、函數(shù); RemoveByNum(int num) 函數(shù)功能:對(duì)所選信息按編號(hào)刪除,刪除過(guò)后,后面記錄到編號(hào)將全部減 1, 記錄的編號(hào)即下標(biāo)。 輸入?yún)?shù):int 類(lèi)型,返回值是 int 類(lèi)型。num-int 類(lèi)型,表示 define.h 文件中定 義的類(lèi)型 Rec_Con 中數(shù)組 record的下標(biāo),刪除過(guò)后,后面記錄到編號(hào)將全部減 1,記錄的編 號(hào)即下標(biāo)。后面的記錄全部向前移動(dòng)一個(gè)距離。 修改模塊:自定義修改函數(shù):修改模塊:自定義修改函數(shù):Modify() 函數(shù)功能:按名稱(chēng)修改記錄,先判斷要查找的名稱(chēng)所對(duì)應(yīng)的記錄是否存在,不 存在則直接返回。 無(wú)參函數(shù):返回值為 int 型 2
9、.3.3:統(tǒng)計(jì)模塊:統(tǒng)計(jì)模塊: 函數(shù)原型:函數(shù)原型:ShowTotal( ) 函數(shù)功能:顯示統(tǒng)計(jì)結(jié)果 無(wú)參函數(shù):void 類(lèi)型,無(wú)返回值。 按類(lèi)型統(tǒng)計(jì):按類(lèi)型統(tǒng)計(jì):ShowType( ) 函數(shù)功能:按類(lèi)型顯示統(tǒng)計(jì)結(jié)果 無(wú)參函數(shù); void 類(lèi)型,無(wú)返回值。 按月顯示統(tǒng)計(jì)結(jié)果:按月顯示統(tǒng)計(jì)結(jié)果: 函數(shù)原型函數(shù)原型:ShowMonth() 函數(shù)功能:忽略了年,按月顯示統(tǒng)計(jì)結(jié)果 無(wú)參函數(shù):void 類(lèi)型,無(wú)返回值。 按年顯示統(tǒng)計(jì)結(jié)果按年顯示統(tǒng)計(jì)結(jié)果: 函數(shù)原型函數(shù)原型:ShowYear() 函數(shù)功能:按年顯示統(tǒng)計(jì)結(jié)果 無(wú)參函數(shù):void 類(lèi)型,無(wú)返回值
10、。 C 語(yǔ)言課程設(shè)計(jì) - 5 - 3 詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì) 3.1 數(shù)據(jù)類(lèi)型定義數(shù)據(jù)類(lèi)型定義 關(guān)鍵數(shù)據(jù)都定義在關(guān)鍵數(shù)據(jù)都定義在 define.h 里里 #define MAX 100 /人為定義的一個(gè)上限 typedef struct / 定義記錄結(jié)構(gòu)體,并重新命名類(lèi)型名 int num; /編號(hào) char times11; /時(shí)間 char types20; /類(lèi)別 char name20; /品名 double price; /單價(jià) int quantity; /數(shù)量 double sum; /金額 Rec; typedef struct / 定義操作結(jié)構(gòu)體,并重新命名類(lèi)型名 Rec reco
11、rdMAX+1; /定義結(jié)構(gòu)體變量,可操作的記錄總數(shù),下標(biāo)為 0 和 MAX 不存放記 錄 int total_count; /整型變量,記錄總數(shù) Rec_Con,*PRec_Con; union /定義一個(gè)查找時(shí)使用的共用體 char times11; /存放按時(shí)間查找時(shí)輸入的時(shí)間 char types20; /存放按類(lèi)型查找時(shí)輸入的類(lèi)型 char name20; /存放按名稱(chēng)查找時(shí)輸入的名稱(chēng) found; C 語(yǔ)言課程設(shè)計(jì) - 6 - /下面三個(gè)變量都是全局變量 FILE *fp; /定義文件指針 Rec_Con rs; /用來(lái)定義變量,避免了動(dòng)態(tài)分配中的安全問(wèn)題 PRec_Con rec
12、ords= /定義操作指針變量 int type_count=0; /記錄里相關(guān)的類(lèi)型數(shù)目 int year_count=0; /記錄里相關(guān)的年數(shù)目 char *ptypeMAX+1; /字符型變量,記錄里相關(guān)的類(lèi)型 char pyearMAX+15; /字符型變量,記錄里相關(guān)的年 char tmp5; /字符型變量,取年份所用 char tmp015,tmp025; /存放 Get4 的返回值,在比較時(shí)使用 char c; /字符型變量,臨時(shí)使用變量,沒(méi)有固定的限制 3.2 ShowRec 模塊實(shí)現(xiàn)模塊實(shí)現(xiàn) 1.算法思想算法思想:按編號(hào), 時(shí)間,類(lèi)別,品名,單價(jià),數(shù)量,金額的順序打開(kāi)文件,并
13、顯示結(jié)果。 其中提供分頁(yè)顯示功能。 2.具體實(shí)現(xiàn):具體實(shí)現(xiàn): void OpenFile() /打開(kāi)文件函數(shù),以二進(jìn)制append形式操作 if(fp=fopen(consum,ab+)=NULL) printf(File open fail!n); return ; void ShowI(int i) /根據(jù)i值輸出記錄 printf(記錄:nn); printf(n編號(hào) 時(shí)間 類(lèi)別 品名 單價(jià) 數(shù)量 C 語(yǔ)言課程設(shè)計(jì) - 7 - 金額 n); printf(%-5d% -10s%15s%15s %8.2f%5d%8.2fn,records- recordi.num,records-reco
14、rdi.times,records-recordi.types,records- ,records-recordi.price,records-recordi.quantity,records- recordi.sum); int ShowRec() /顯示所有記錄 int i; for(i=1;itotal_count;i+) printf(%-5d%-10s%15s%15s%8.2f%5d%8.2fn,records- recordi.num,records-recordi.times,records-recordi.types,records- recordi.n
15、ame,records-recordi.price,records-recordi.quantity,records- recordi.sum); if(i%10)=0) /實(shí)現(xiàn)分頁(yè)功能 printf(Press any key show next pagen); getchar(); /cls(); return 1; 3.3 更新模三個(gè)塊:更新模三個(gè)塊: 更新包括內(nèi)容;插入,刪除,查找 1.算法思想:算法思想:利用三個(gè)自定義函數(shù):int Insert() /插入函數(shù),int DeleteByNum() /按編號(hào)刪除,int Modify() /按名稱(chēng)修改記錄。插入過(guò)程用MAX控制插入信息的
16、范圍; 刪除時(shí)按編號(hào)刪除,刪除過(guò)后,后面記錄到編號(hào)將全部減1,記錄的編號(hào)即下標(biāo)。修改時(shí) C 語(yǔ)言課程設(shè)計(jì) - 8 - 先利用int FindByName(char *name);按名稱(chēng)查找記錄函數(shù),找到相關(guān)信息,若無(wú)此信息 直接跳轉(zhuǎn),否則修改。 2.具體實(shí)現(xiàn):具體實(shí)現(xiàn): int Insert() /插入函數(shù) if(records-total_count=(MAX-1) printf(數(shù)據(jù)已達(dá)可控范圍,不能再插入!n); return 0; int i=(+records-total_count); records-recordi.num=i; /編號(hào)是連續(xù)的, printf(n 時(shí)間 類(lèi)別 品
17、名 單價(jià) 數(shù)量 金額 n); scanf(%s%s%s%lf%d,records-recordi.times,records- recordi.types,, if(strlen(records-recordi.times)!=10|records-recordi.times4!=- |records-recordi.times7!=-) /簡(jiǎn)單的判斷一下日期是否符合格式要求 printf(時(shí)間格式錯(cuò)誤,請(qǐng)重試!n); records-total_count-; return 0; records-recordi.sum = records-record
18、i.price * records- recordi.quantity; /金額是計(jì)算所得 #ifdef DEBUG C 語(yǔ)言課程設(shè)計(jì) - 9 - ShowI(i); #endif return 1; int RemoveByNum(int num) /刪除過(guò)后,后面記錄到編號(hào)將全部減1,記錄的編號(hào)即 下標(biāo) int i; if(numrecords-total_count) printf(位置錯(cuò)誤!n); return 0; for(i=num;itotal_count;i+) /i后面的記錄全部向前移動(dòng)一個(gè)距 離 records-recordi.num=records-recordi+1.n
19、um-1; strcpy(records-recordi.times,records-recordi+1.times); strcpy(records-recordi.types,records-recordi+1.types); strcpy(,records-recordi+1.name); records-recordi.price=records-recordi+1.price; records-recordi.quantity=records-recordi+1.quantity; records-recordi.sum=records-rec
20、ordi+1.sum; return 1; int DeleteByNum() /按編號(hào)刪除 C 語(yǔ)言課程設(shè)計(jì) - 10 - int num; printf(請(qǐng)輸入要?jiǎng)h除記錄的編號(hào):); scanf(%d, if(!(RemoveByNum(num) printf(程序執(zhí)行錯(cuò)誤,刪除失??!n); return 0; else return 1; int FindByName(char *name); /聲明按名稱(chēng)查找記錄函數(shù),下面就要使用到 int Modify() /按名稱(chēng)修改記錄 int i; char names20; printf(請(qǐng)輸入要修改的記錄名稱(chēng):); scanf(%s,nam
21、es); i=FindByName(names); if(!i) /判斷要查找的名稱(chēng)所對(duì)應(yīng)的記錄是否存在,不存在 則直接跳轉(zhuǎn) return 0; printf(請(qǐng)輸入所需信息:n); printf(n 時(shí)間 類(lèi)別 品名 單價(jià) 數(shù)量 金額 n); scanf(%s%s%s%lf%d,records-recordi.times,records- C 語(yǔ)言課程設(shè)計(jì) - 11 - recordi.types,, records-recordi.sum = records-recordi.price * records- recordi.quantity; ret
22、urn 1; 3.4 ShowTotal 模塊實(shí)現(xiàn)模塊實(shí)現(xiàn) ShowTotal 包括三種方式:類(lèi)型、月、年,以類(lèi)型為例說(shuō)明 1、算法思想、算法思想 為確保不會(huì)溢出,保存統(tǒng)計(jì)結(jié)果的 total 數(shù)組定義長(zhǎng)度為 MAX,接下來(lái)對(duì)記錄集進(jìn)行遍 歷,并與ptype數(shù)組中統(tǒng)計(jì)的類(lèi)型進(jìn)行比對(duì),按照對(duì)應(yīng)的下標(biāo)將統(tǒng)計(jì)結(jié)果加到 total數(shù)組中,這樣做便于 輸出時(shí)一一對(duì)應(yīng)。 (復(fù)雜算法用流程圖輔助說(shuō)明) 2、具體實(shí)現(xiàn)、具體實(shí)現(xiàn) (給出實(shí)現(xiàn)算法的關(guān)鍵代碼) 按類(lèi)型顯示統(tǒng)計(jì)結(jié)果 void ShowType() int i=1,j=0; double totalMAX=0.0; /定義保存統(tǒng)計(jì)結(jié)果的數(shù)組 while(
23、itotal_count i+; else j+; /輸出統(tǒng)計(jì)結(jié)果 C 語(yǔ)言課程設(shè)計(jì) - 12 - printf(按類(lèi)型統(tǒng)計(jì)結(jié)果如下:n); for(i=0;itype_count;i+) printf(%s:t%8.2fn,ptypei,totali); printf(n); 4 測(cè)試結(jié)果及分析測(cè)試結(jié)果及分析 1.1. 打開(kāi)程序,進(jìn)入主界面打開(kāi)程序,進(jìn)入主界面 2.2. 輸入輸入“1”“1” ,打開(kāi)歷史消費(fèi)記錄:,打開(kāi)歷史消費(fèi)記錄: 3.3. 輸入輸入“1”“1” ,測(cè)試更新模塊:,測(cè)試更新模塊: C 語(yǔ)言課程設(shè)計(jì) - 13 - 4.輸入輸入“1” ,插入信息數(shù)據(jù):,插入信息數(shù)據(jù): 5.輸入
24、輸入“2” ,按編號(hào)刪除數(shù)據(jù):,按編號(hào)刪除數(shù)據(jù): C 語(yǔ)言課程設(shè)計(jì) - 14 - 6.輸入輸入“3” ,修改歷史信息,修改歷史信息; 7.輸入輸入“0” ,返回主菜單:,返回主菜單: C 語(yǔ)言課程設(shè)計(jì) - 15 - 8.輸入輸入“6” ,測(cè)試統(tǒng)計(jì)結(jié)果;,測(cè)試統(tǒng)計(jì)結(jié)果; 9. 輸入“1”,按類(lèi)別統(tǒng)計(jì)結(jié)果: C 語(yǔ)言課程設(shè)計(jì) - 16 - 10,輸入“2”,按月顯示統(tǒng)計(jì)結(jié)果: 10. 輸入“3”,按年顯示統(tǒng)計(jì)結(jié)果: C 語(yǔ)言課程設(shè)計(jì) - 17 - 5.總結(jié)總結(jié) 為期四天的課程設(shè)計(jì)結(jié)束了,其中的酸甜苦辣恐怕只有經(jīng)歷過(guò)的人才會(huì)懂得。 其實(shí)課程設(shè)計(jì)的題目老師很早就發(fā)下來(lái)了,但由于自己時(shí)間觀念不強(qiáng),沒(méi)有提
25、前 準(zhǔn)備,所以搞得開(kāi)始做的時(shí)候發(fā)現(xiàn)很多東西都不會(huì),又臨時(shí)學(xué)占用了很多時(shí)間。 下次一定要吸取教訓(xùn),不能臨時(shí)抱佛腳?。〈舜握n程設(shè)計(jì)雖然很難,但也讓我學(xué) 到了很多東西。它讓我學(xué)會(huì)的不僅僅是怎么去編一個(gè)大的程序,更讓我學(xué)會(huì)了怎 樣去開(kāi)始做一件事,怎樣規(guī)劃自己的時(shí)間做好一件事。剛開(kāi)始看到提示真的是一 片茫然,不知如何下手,然后經(jīng)過(guò)自己上網(wǎng)查閱和看了一些課程設(shè)計(jì)的書(shū)之后漸 漸有了一點(diǎn)眉目。這些對(duì)我的自學(xué)能力鍛煉很大。另外,在編程過(guò)程中也遇到了 很多很多的問(wèn)題,比如統(tǒng)計(jì)模塊的數(shù)組元素定義錯(cuò)誤導(dǎo)致結(jié)果不能運(yùn)行,等等、 、 、我知道自己在 C 這條路上還有很長(zhǎng)的路要走,但這次得課程設(shè)計(jì)無(wú)疑給了我 更加堅(jiān)定走下去
26、的信心,他讓我體會(huì)了迷茫,煩躁,痛苦、 、 、但它也讓我學(xué)會(huì)了 淡定,從容,堅(jiān)持、 、 、它帶給我四個(gè)晚上熬夜到兩點(diǎn)半的記錄,它也帶給了我看 到程序運(yùn)行出結(jié)果的喜悅、 、 、程序中的各種各樣的錯(cuò)誤曾經(jīng)讓我失望甚至絕望, 想放棄,但同組的我們相互鼓勵(lì)視乎又看到了希望、 、 、在這次設(shè)計(jì)中還請(qǐng)教了幾 C 語(yǔ)言課程設(shè)計(jì) - 18 - 個(gè)學(xué)計(jì)算機(jī)的高中同學(xué),這讓我學(xué)會(huì)了要善于向他人求助,同時(shí)好久沒(méi)聯(lián)系的同 學(xué)通過(guò)這次設(shè)計(jì)也加強(qiáng)了我們的聯(lián)系。 我認(rèn)為這次課程設(shè)計(jì)對(duì)我們的鍛煉很大,它處在離考試只有三四天的時(shí)候, 這么緊迫的時(shí)刻有這么短的時(shí)間,這大大的鍛煉了我們的時(shí)間安排能力和不急不 躁心態(tài)。另外程序中還有
27、很多不完善的地方,希望以后加強(qiáng)學(xué)習(xí)能夠?qū)⑵涓恼?臻完善吧。非常感謝這次設(shè)計(jì)中給我們幫助的同學(xué),學(xué)長(zhǎng)和老師! 6.參考文獻(xiàn):參考文獻(xiàn): 參考文獻(xiàn): 1譚浩強(qiáng)等.C 語(yǔ)言程序設(shè)計(jì)教程.北京:高等教育出版社,1997. 2譚浩強(qiáng).C 程序設(shè)計(jì).第 2 版.北京:清華大學(xué)出版社,1999. 3徐士良.C 程序設(shè)計(jì)教程 附錄附錄 主函數(shù)源程序代碼:主函數(shù)源程序代碼: #include #include #include #include #includedefined.h #includearc.h int main(void) int chioce; /開(kāi)始的時(shí)候使用 char 試了一下,有些功能不
28、能實(shí)現(xiàn) records-total_count=0; #ifdef DEBUG printf(jskdljf:%dn,records-total_count); #endif void calledit(int chioce); /聲明中間過(guò)程函數(shù) OpenFile(ab+); /打開(kāi)文件并初始化數(shù)組,即加載數(shù)據(jù) while(!feof(fp) C 語(yǔ)言課程設(shè)計(jì) - 19 - fread( /record0 中并不存放記錄數(shù)據(jù),以后作為查找到前哨站 fclose(fp); #ifdef DEBUG printf(jskdljf:%dn,records-total_count); ShowRec
29、(); #endif while(1) /用一個(gè)死循環(huán)實(shí)現(xiàn)循環(huán)操作,只有選擇退出的時(shí)候才退出 system(cls); printf(-消費(fèi)記錄系統(tǒng)-n); printf(1-打開(kāi)n); printf(2-保存n); printf(3-更新n); printf(4-查找n); printf(5-排序n); printf(6-統(tǒng)計(jì)n); printf(Other-退出n); printf(請(qǐng)輸入操作序號(hào):); scanf(%d, system(cls); if(chioce6|chioce1) break; else calledit(chioce); /調(diào)用中間過(guò)程函數(shù) return 0; v
30、oid calledit(int chioce) void UpdateRec(); void FindRec(); void SortRec(); switch(chioce) case 1: ShowRec(); break; case 2: SaveRec(); break; case 3: C 語(yǔ)言課程設(shè)計(jì) - 20 - UpdateRec(); break; case 4: FindRec(); break; case 5: SortRec(); break; case 6: ShowTotal(); break; default: break; return ; void Upda
31、teRec() int mc; while(1) printf(1-插入n); printf(2-刪除n); printf(3-修改n); printf(0-離開(kāi)n); printf(請(qǐng)選擇:); scanf(%d, if(mc=1) Insert(); else if(mc=2) DeleteByNum(); else if(mc=3) Modify(); else if(mc=0) break; else printf(輸入有誤,請(qǐng)重試!n); continue; scanf(%c, C 語(yǔ)言課程設(shè)計(jì) - 21 - void FindRec() int mc; int i; while(1
32、) printf(1-按時(shí)間查找n); printf(2-按類(lèi)型查找n); printf(3-按名稱(chēng)查找n); printf(0-離開(kāi)n); printf(請(qǐng)選擇:); scanf(%d, if(mc=1) printf(請(qǐng)輸入時(shí)間(format:2011-12-31):); scanf(%s,found.times); if(strlen(found.times)!=10|found.times4!=- |found.times7!=-) /簡(jiǎn)單的判斷一下日期是否符合格式要求 printf(時(shí)間格式錯(cuò)誤,請(qǐng)重試!n); continue; i=FindByTime(found.times);
33、 if(i) ShowI(i); else if(mc=2) printf(請(qǐng)輸入類(lèi)型:); scanf(%s,found.types); i=FindByType(found.types); if(i) ShowI(i); else if(mc=3) printf(請(qǐng)輸入名稱(chēng):); scanf(%s,); i=FindByName(); C 語(yǔ)言課程設(shè)計(jì) - 22 - if(i) ShowI(i); else if(mc=0) break; else printf(輸入有誤,請(qǐng)重試!n); continue; scanf(%c, system(cls)
34、; void SortRec() int mc; while(1) printf(1-按時(shí)間排序n); printf(2-按類(lèi)型排序n); printf(3-按金額排序n); printf(0-離開(kāi)n); printf(請(qǐng)選擇:); scanf(%c, if(mc=1) SortByTime(); else if(mc=2) SortByType(); else if(mc=3) SortBySum(); else if(mc=0) break; else printf(輸入有誤,請(qǐng)重試!n); continue; scanf(%c, system(cls); Define.hDefine.h
35、文件代碼文件代碼: C 語(yǔ)言課程設(shè)計(jì) - 23 - #define MAX 100 /人為定義的一個(gè)上限 /#define DEBUG /控制調(diào)試信息的輸出 typedef struct int num; /編號(hào) char times11; /時(shí)間 char types20; /類(lèi)別 char name20; /品名 double price; /單價(jià) int quantity; /數(shù)量 double sum; /金額 Rec; typedef struct Rec recordMAX+1; /可操作的記錄總數(shù) int total_count; /記錄總數(shù) Rec_Con,*PRec_Con;
36、 union char times11; char types20; char name20; found; /下面三個(gè)變量都是全局變量 FILE *fp; /定義文件指針 Rec_Con rs; PRec_Con records= /定義指針變量 int type_count=0; /記錄里相關(guān)的類(lèi)型數(shù)目 int year_count=0; /記錄里相關(guān)的年數(shù)目 char *ptypeMAX+1; /記錄里相關(guān)的類(lèi)型 char pyearMAX+15; /記錄里相關(guān)的年 char tmp5; /取年份所用 char c; /使用頻率很高的一個(gè)變量,后來(lái)好像又沒(méi)聲明用了,先放著吧 arc.h
37、文件代碼文件代碼: #include void OpenFile(char * mode) /打開(kāi)文件函數(shù),以二進(jìn)制append形式操作 if(fp=fopen(consum,mode)=NULL) printf(File open fail!n); C 語(yǔ)言課程設(shè)計(jì) - 24 - return ; void ShowI(int i) /根據(jù)i值輸出記錄 printf(記錄:%-5d%-10s%15s%15s%8.2f%5d%8.2fn,records-recordi. num,records-recordi.times,records-recordi.types,records- recor
38、,records-recordi.price,records-recordi.quantity,records- recordi.sum); int ShowRec() /顯示所有記錄 int i; printf(tt-打印記錄-nn); printf(編號(hào)t 日期tt 類(lèi)型t 名稱(chēng)t 單價(jià) 數(shù)量t 金額n); for(i=1;itotal_count;i+) printf(%-5d %-10s%15s%15s%8.2f%5d %8.2fn,records- recordi.num,records-recordi.times,records-recordi.types,recor
39、ds- ,records-recordi.price,records-recordi.quantity,records- recordi.sum); if(i%9)=0) /實(shí)現(xiàn)分頁(yè)功能 printf(Press any key show next page); getchar();getchar(); /不明白這里為什么非要兩次getchar()? system(cls); printf(tt-打印記錄-nn); printf(編號(hào)t 日期tt 類(lèi)型t 名稱(chēng)t 單價(jià) 數(shù)量t 金額 n); printf(Press any key into main menu); re
40、turn 1; int SaveRec() /保存更新 int i; OpenFile(wb); for(i=1;itotal_count;i+) fwrite( C 語(yǔ)言課程設(shè)計(jì) - 25 - fclose(fp); return 1; int Insert() /插入函數(shù) if(records-total_count=(MAX-1) printf(數(shù)據(jù)已達(dá)可控范圍,不能再插入!n); return 0; int i=(+records-total_count); records-recordi.num=i; /編號(hào)是連續(xù)的,1n printf(請(qǐng)輸入所需信息(順序?yàn)椋簳r(shí)間,類(lèi)別,品名,單價(jià)
41、,數(shù)量):); scanf(%s%s%s%lf%d,records-recordi.times,records- recordi.types,, if(strlen(records-recordi.times)!=10|records-recordi.times4!=- |records-recordi.times7!=-) /簡(jiǎn)單的判斷一下日期是否符合格式要求 printf(時(shí)間格式錯(cuò)誤,請(qǐng)重試!n); records-total_count-; return 0; records-recordi.sum = records-recordi.price
42、 * records- recordi.quantity; /金額是計(jì)算所得 #ifdef DEBUG ShowI(i); #endif return 1; int RemoveByNum(int num) /刪除過(guò)后,后面記錄到編號(hào)將全部減1,記錄的編號(hào)即 下標(biāo) int i=num; if(numrecords-total_count) printf(位置錯(cuò)誤!n); return 0; #ifdef DEBUG ShowI(i); #endif for(i=num;itotal_count;i+) /i后面的記錄全部向前移動(dòng)一個(gè)距 C 語(yǔ)言課程設(shè)計(jì) - 26 - 離 records-rec
43、ordi.num=records-recordi+1.num-1; strcpy(records-recordi.times,records-recordi+1.times); strcpy(records-recordi.types,records-recordi+1.types); strcpy(,records-recordi+1.name); records-recordi.price=records-recordi+1.price; records-recordi.quantity=records-recordi+1.quantity; rec
44、ords-recordi.sum=records-recordi+1.sum; records-total_count-; return 1; int DeleteByNum() /按編號(hào)刪除 int num; printf(請(qǐng)輸入要?jiǎng)h除記錄的編號(hào):); scanf(%d, if(!(RemoveByNum(num) printf(程序執(zhí)行錯(cuò)誤,刪除失敗!n); return 0; elsereturn 1; int FindByName(char *name); /聲明按名稱(chēng)查找記錄函數(shù),下面就要使用到 int Modify() /按名稱(chēng)修改記錄 int i; char names20; p
45、rintf(請(qǐng)輸入要修改的記錄名稱(chēng):); scanf(%s,names); i=FindByName(names); if(!i) /判斷要查找的名稱(chēng)所對(duì)應(yīng)的記錄是否存在,不存在 則直接跳轉(zhuǎn) return 0; printf(請(qǐng)輸入所需信息(順序?yàn)椋簳r(shí)間,類(lèi)別,品名,單價(jià),數(shù)量):); scanf(%s%s%s%lf%d,records-recordi.times,records- recordi.types,, records-recordi.sum = records-recordi.price * records- recordi.quantity
46、; C 語(yǔ)言課程設(shè)計(jì) - 27 - #ifdef DEBUG ShowI(i); #endif return 1; int FindByTime(char *times) /按時(shí)間查找記錄 int i=1; strcpy(records-recordrecords-total_count+1.times,times); while(strcmp(records-recordi.times,times)!=0) i+; if(i=records-total_count+1) printf(記錄不存在!n); return 0; else return i; int FindByType(char
47、 *types) /按類(lèi)型查找記錄 int i=1; strcpy(records-recordrecords-total_count+1.types,types); while(strcmp(records-recordi.types,types)!=0) i+; if(i=records-total_count+1) printf(記錄不存在!n); return 0; else return i; int FindByName(char *name) /按名稱(chēng)查找記錄 int i=1; strcpy(records-recordrecords-total_count+1.name,nam
48、e); while(strcmp(,name)!=0) i+; if(i=records-total_count+1) printf(記錄不存在!n); return 0; C 語(yǔ)言課程設(shè)計(jì) - 28 - else return i; char * Get4(char times) /獲取時(shí)間字段的前四位,即年份 tmp0=times0; tmp1=times1; tmp2=times2; tmp3=times3; tmp4=0; return tmp; int SortByTime() /按時(shí)間排序 Rec rectmp; int i,j,t; for
49、(i=1;itotal_count;i+) for(j=i+1,t=i;jtotal_count;j+) if(strcmp(records-recordt.times,records-recordj.times)0) t=j; rectmp=records-recordt; records-recordt=records-recordi; records-recordi=rectmp; #ifdef DEBUG ShowRec(); #endif year_count=1; strcpy(pyear0,Get4(records-record1.times); for(i=1;itotal_c
50、ount;i+) if(strcmp(Get4(records-recordi.times),Get4(records- recordi+1.times)=0) /there is something wrong,還有最后一個(gè)bug,就在這 里 continue; else strcpy(pyearyear_count+,Get4(records- recordi+1.times); /遇到不同的年份,把最新的存儲(chǔ)進(jìn)來(lái) #ifdef DEBUG printf(nFrom SortByTimen); C 語(yǔ)言課程設(shè)計(jì) - 29 - for(i=0;iyear_count;i+) printf(%
51、st,pyeari); printf(n); #endif return 1; int SortByType() /按類(lèi)型排序 Rec rectmp; int i,j,t; for(i=1;itotal_count;i+) for(j=i+1,t=i;jtotal_count;j+) if(strcmp(records-recordt.types,records-recordj.types)0) t=j; rectmp=records-recordt; records-recordt=records-recordi; records-recordi=rectmp; #ifdef DEBUG ShowRec(); #endif type_count=1; ptype0=record
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)8寸袖珍折疊自行車(chē)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2019-2025年軍隊(duì)文職人員招聘之軍隊(duì)文職管理學(xué)自我檢測(cè)試卷B卷附答案
- 2019-2025年軍隊(duì)文職人員招聘之軍隊(duì)文職管理學(xué)與服務(wù)過(guò)關(guān)檢測(cè)試卷A卷附答案
- 康德三診物理試題及答案
- 保安文化測(cè)試試題及答案
- 小學(xué)生人際交往故事征文
- 企業(yè)虛擬專(zhuān)用網(wǎng)絡(luò)服務(wù)協(xié)議
- 《統(tǒng)計(jì)學(xué)的數(shù)據(jù)處理基礎(chǔ):初三數(shù)學(xué)教案》
- 產(chǎn)品銷(xiāo)量排行表-電商銷(xiāo)售統(tǒng)計(jì)
- 遼寧省朝陽(yáng)市建平縣2024-2025學(xué)年八年級(jí)上學(xué)期期末生物學(xué)試題(含答案)
- GB 1523-2013綿羊毛
- 2004年考研英語(yǔ)一真題及答案
- 過(guò)程裝備控制基礎(chǔ)過(guò)程裝備控制技術(shù)及應(yīng)用
- 博弈論與信息經(jīng)濟(jì)學(xué)課件
- 模塊二項(xiàng)目二觀察力課件
- DB64-T 1147-2022 寧夏工業(yè)單位產(chǎn)品能源消耗限額
- 中交項(xiàng)目標(biāo)準(zhǔn)化手冊(cè)-第一冊(cè)工地建設(shè)
- 公安機(jī)關(guān)業(yè)務(wù)技術(shù)用房和辦公用房規(guī)劃設(shè)計(jì)規(guī)范
- 校園華爾茲教案-2021-2022學(xué)年高中體育與健康人教版必修全一冊(cè)(表格式)
- L阿拉伯糖與排毒課件
- 《沖壓工藝與模具設(shè)計(jì)》知識(shí)點(diǎn) (2)
評(píng)論
0/150
提交評(píng)論