版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p><b> 1 需求分析1</b></p><p><b> 1.1問(wèn)題描述1</b></p><p> 1.2 輸入數(shù)據(jù)要求1</p><p> 1.3 輸出數(shù)據(jù)要求1</p><
2、p> 1.4 開(kāi)發(fā)環(huán)境和工具1</p><p> 1.5 成員分工1</p><p><b> 2總體設(shè)計(jì)2</b></p><p> 2.1 總體設(shè)計(jì)思路2</p><p> 2.2 模塊結(jié)構(gòu)圖2</p><p> 2.3 模塊說(shuō)明3</p>&
3、lt;p><b> 3 詳細(xì)設(shè)計(jì)4</b></p><p> 3.1 數(shù)據(jù)類(lèi)型定義5</p><p> 3.2 打開(kāi)模塊實(shí)現(xiàn)6</p><p> 3.3 更新模塊實(shí)現(xiàn)6</p><p> 3.4 統(tǒng)計(jì)模塊實(shí)現(xiàn)7</p><p> 4測(cè)試結(jié)果及分析12</
4、p><p><b> 5 總結(jié)17</b></p><p><b> 參考文獻(xiàn)18</b></p><p><b> 附錄19</b></p><p><b> 1 需求分析</b></p><p><b>
5、1.1問(wèn)題描述</b></p><p> 隨著社會(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ù)量,金額</p><p> 對(duì)學(xué)生每天的消費(fèi)情況作一個(gè)較為詳細(xì)的統(tǒng)計(jì),該系統(tǒng)
6、可以實(shí)現(xiàn)由計(jì)算機(jī)代替人工執(zhí)行一些復(fù)雜而且較為繁瑣的操作,從而使大學(xué)生們能夠更為便捷地管理自己的消費(fèi),也為其他的一些調(diào)查研究提供了方便。</p><p> 1.2 輸入數(shù)據(jù)要求</p><p> 可錄入消費(fèi)者當(dāng)天的消費(fèi)情況,消費(fèi)表信息包括:編號(hào),時(shí)間,類(lèi)別,品名,單價(jià),數(shù)量,金額</p><p> 消費(fèi)信息存放在文件中,以編號(hào)的先后順序存放</p>
7、<p> 1.3 輸出數(shù)據(jù)要求</p><p> 打開(kāi):顯示文件中的所有消費(fèi)記錄,提供分頁(yè)顯示</p><p> 保存:將消費(fèi)表的更新結(jié)果存入文件</p><p> 更新:可插入、刪除、修改各消費(fèi)記錄</p><p> 查找:按時(shí)間,類(lèi)別、品名查找消費(fèi)記錄</p><p> 排序:按時(shí)間,類(lèi)別,
8、金額</p><p> 統(tǒng)計(jì):求各類(lèi)別消費(fèi)品的總金額,求各月的消費(fèi)總金額,求各年消費(fèi)總金額</p><p> 1.4 開(kāi)發(fā)環(huán)境和工具</p><p> 開(kāi)發(fā)環(huán)境:Windows 2000</p><p> 開(kāi)發(fā)工具:Visual C++ 6.0</p><p><b> 1.5 成員分工</b
9、></p><p> 劉倩鈺:主函數(shù)模塊,保存模塊,排序模塊</p><p> 劉冬梅:打開(kāi)模塊,更新模塊,數(shù)據(jù)統(tǒng)計(jì)模塊</p><p><b> 2總體設(shè)計(jì)</b></p><p> 2.1 總體設(shè)計(jì)思路</p><p><b> 設(shè)計(jì)思路</b><
10、/p><p> 個(gè)人消費(fèi)系統(tǒng)管理包含的操作有:打開(kāi)、保存、更新、查找、排序和統(tǒng)計(jì)。在程序開(kāi)始運(yùn)行的時(shí)候從文件加載已有數(shù)據(jù),并輸出可以進(jìn)行的操作提供給用戶(hù),</p><p> 1、打開(kāi):顯示文件中的所有消費(fèi)記錄,通過(guò)取模運(yùn)算提供分頁(yè)顯示功能</p><p> 2、保存:以wb模式打開(kāi)文件,將修改的內(nèi)容寫(xiě)入文件</p><p> 3、更新:可
11、插入、刪除、修改各消費(fèi)記錄</p><p> 4、查找:按時(shí)間,類(lèi)別、品名查找消費(fèi)記錄</p><p> 5、排序:按時(shí)間,類(lèi)別,金額</p><p> 6、統(tǒng)計(jì):分別按類(lèi)別、月、年統(tǒng)計(jì)消費(fèi)品的總金額</p><p><b> 數(shù)據(jù)存儲(chǔ)</b></p><p> 為了操作的方便,用typ
12、edef自定義了一些數(shù)據(jù)類(lèi)型,其中包含一個(gè)長(zhǎng)度為MAX的數(shù)組,用來(lái)存放從文件中讀取的數(shù)據(jù)。</p><p> 2.2 模塊結(jié)構(gòu)圖</p><p> 根據(jù)需求將系統(tǒng)劃分為六個(gè)功能模塊,函數(shù)之間的調(diào)用關(guān)系如圖2.1所示。</p><p> 圖2.1 個(gè)人消費(fèi)系統(tǒng)的模塊結(jié)構(gòu)圖</p><p> Calledit:在主函數(shù)的控制下,調(diào)用各個(gè)
13、模塊</p><p> 1)ShowRec: 輸出已存在的記錄。</p><p> 2)SaveRec:保存更新的內(nèi)容。</p><p> 3)UpdateRec: 按一定的方式更新記錄。</p><p> 這個(gè)模塊下包含三個(gè)子模塊 插入:Insert </p><p> 刪除: DeleteByNu
14、m </p><p> 修改:Modify </p><p> 4)FindRec: 按一定的方式查找記錄。</p><p> 這個(gè)模塊下也包含三個(gè)子模塊 按日期查找:FindBytime</p><p> 按類(lèi)型查找:FindByType </p><p> 按名稱(chēng)查找: FindByName
15、 </p><p> 5)SortRec: 按一定的方式查找記錄。</p><p> 這個(gè)模塊下也包含三個(gè)子模塊 按日期查找:SortBytime</p><p> 按類(lèi)型查找:SortByType </p><p> 按名稱(chēng)查找: SortBySum</p><p> 6)ShowTotal:
16、 顯示各種統(tǒng)計(jì)的結(jié)果</p><p><b> 2.3 模塊說(shuō)明</b></p><p> ?。ㄒ詮纳现料拢瑥淖笾劣业捻樞蛘f(shuō)明)</p><p> 2.3.1:打開(kāi)模塊:</p><p> 自定義函數(shù):ShowRec( )</p><p> 函數(shù)功能:輸出已存在的歷史記錄</p&
17、gt;<p><b> 無(wú)參函數(shù):無(wú)參數(shù)</b></p><p> 2.3.2:更新模塊:</p><p> 自定義函數(shù):UpdateRec( )</p><p> 函數(shù)功能: 可對(duì)輸入數(shù)據(jù)實(shí)現(xiàn)插入,刪除,修改操作。</p><p> 無(wú)參函數(shù):void類(lèi)型,無(wú)返回值。調(diào)用Insert()函數(shù),D
18、elete()函數(shù)和Modify()</p><p> 2.3.2.1插入模塊:自定義函數(shù): Insert()</p><p> 函數(shù)功能:實(shí)現(xiàn)插入新的信息并保存到記錄中,其中插入的數(shù)據(jù)最后金額可以自己運(yùn)算出來(lái),插入的記錄保存在尾部。</p><p> 無(wú)參函數(shù):返回值為int 類(lèi)型</p><p> 2.3.2.2刪除模塊:自定義函
19、數(shù); RemoveByNum(int num)</p><p> 函數(shù)功能:對(duì)所選信息按編號(hào)刪除,刪除過(guò)后,后面記錄到編號(hào)將全部減1,記錄的編號(hào)即下標(biāo)。</p><p> 輸入?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)。后面的記錄全部向前
20、移動(dòng)一個(gè)距離。</p><p> 2.3.2.3修改模塊:自定義修改函數(shù):Modify()</p><p> 函數(shù)功能:按名稱(chēng)修改記錄,先判斷要查找的名稱(chēng)所對(duì)應(yīng)的記錄是否存在,不存在則直接返回。</p><p> 無(wú)參函數(shù):返回值為int型</p><p> 2.3.3:統(tǒng)計(jì)模塊:</p><p> 函數(shù)原型
21、:ShowTotal( ) </p><p> 函數(shù)功能:顯示統(tǒng)計(jì)結(jié)果</p><p> 無(wú)參函數(shù):void 類(lèi)型,無(wú)返回值。</p><p> 2.3.3.1 按類(lèi)型統(tǒng)計(jì):ShowType( )</p><p> 函數(shù)功能:按類(lèi)型顯示統(tǒng)計(jì)結(jié)果</p><p> 無(wú)參函數(shù); void 類(lèi)型,無(wú)返回值。
22、</p><p> 2.3.3.2按月顯示統(tǒng)計(jì)結(jié)果:</p><p> 函數(shù)原型:ShowMonth() </p><p> 函數(shù)功能:忽略了年,按月顯示統(tǒng)計(jì)結(jié)果</p><p> 無(wú)參函數(shù):void 類(lèi)型,無(wú)返回值。</p><p> 2.3.3.3按年顯示統(tǒng)計(jì)結(jié)果:</p><p&g
23、t; 函數(shù)原型:ShowYear() </p><p> 函數(shù)功能:按年顯示統(tǒng)計(jì)結(jié)果</p><p> 無(wú)參函數(shù):void 類(lèi)型,無(wú)返回值。</p><p><b> 3 詳細(xì)設(shè)計(jì)</b></p><p> 3.1 數(shù)據(jù)類(lèi)型定義</p><p> 關(guān)鍵數(shù)據(jù)都定義在defin
24、e.h里</p><p> #define MAX 100 //人為定義的一個(gè)上限</p><p> typedef struct // 定義記錄結(jié)構(gòu)體,并重新命名類(lèi)型名</p><p><b> {</b></p><p> int num; //編號(hào)&l
25、t;/p><p> char times[11]; //時(shí)間</p><p> char types[20]; //類(lèi)別</p><p> char name[20]; //品名</p><p> double price; //單價(jià)</p><p>
26、 int quantity; //數(shù)量</p><p> double sum; //金額</p><p><b> }Rec;</b></p><p> typedef struct // 定義操作結(jié)構(gòu)體,并重新命名類(lèi)型名</p><p><b
27、> {</b></p><p> Rec record[MAX+1]; //定義結(jié)構(gòu)體變量,可操作的記錄總數(shù),下標(biāo)為0和MAX不存放記錄</p><p> int total_count; //整型變量,記錄總數(shù)</p><p> }Rec_Con,*PRec_Con;</p><p> union
28、 {//定義一個(gè)查找時(shí)使用的共用體</p><p> char times[11]; //存放按時(shí)間查找時(shí)輸入的時(shí)間</p><p> char types[20]; //存放按類(lèi)型查找時(shí)輸入的類(lèi)型</p><p> char name[20]; //存放按名稱(chēng)查找時(shí)輸入的名稱(chēng)</p>&
29、lt;p><b> }found;</b></p><p> //下面三個(gè)變量都是全局變量</p><p> FILE *fp; //定義文件指針</p><p> Rec_Con rs; //用來(lái)定義變量,避免了動(dòng)態(tài)分配中的安全問(wèn)題</p><p> PRec_Con records=
30、&rs; //定義操作指針變量</p><p> int type_count=0; //記錄里相關(guān)的類(lèi)型數(shù)目</p><p> int year_count=0; //記錄里相關(guān)的年數(shù)目</p><p> char *ptype[MAX+1]; //字符型變量,記錄里相關(guān)的類(lèi)型</p><p> c
31、har pyear[MAX+1][5]; //字符型變量,記錄里相關(guān)的年</p><p> char tmp[5]; //字符型變量,取年份所用</p><p> char tmp01[5],tmp02[5]; //存放Get4的返回值,在比較時(shí)使用</p><p> char c; //字符型變量,臨時(shí)使用變量,沒(méi)
32、有固定的限制</p><p> 3.2 ShowRec模塊實(shí)現(xiàn)</p><p> 1.算法思想:按編號(hào), 時(shí)間,類(lèi)別,品名,單價(jià),數(shù)量,金額的順序打開(kāi)文件,并顯示結(jié)果。其中提供分頁(yè)顯示功能。</p><p><b> 2.具體實(shí)現(xiàn):</b></p><p> void OpenFile() //打開(kāi)文件函數(shù),
33、以二進(jìn)制append形式操作</p><p><b> {</b></p><p> if((fp=fopen("consum","ab+"))==NULL)</p><p><b> {</b></p><p> printf("File
34、open fail!\n");</p><p><b> return ;</b></p><p><b> }</b></p><p><b> }</b></p><p> void ShowI(int i) //根據(jù)i值輸出記錄</p>
35、<p><b> {</b></p><p> printf("記錄:\n\n"); </p><p> printf("\n編號(hào) 時(shí)間 類(lèi)別 品名 單價(jià) 數(shù)量 金額 \n");</p><p> printf
36、("%-5d% -10s%15s%15s %8.2f%5d%8.2f\n",records->record[i].num,records->record[i].times,records->record[i].types,records->record[i].name,records->record[i].price,records->record[i].quanti
37、ty,records->record[i].sum);</p><p><b> }</b></p><p> int ShowRec() //顯示所有記錄</p><p><b> {</b></p><p><b> int i;</b><
38、/p><p> for(i=1;i<=records->total_count;i++)</p><p><b> {</b></p><p> printf("%-5d%-10s%15s%15s%8.2f%5d%8.2f\n",records->record[i].num,records->rec
39、ord[i].times,records->record[i].types,records->record[i].name,records->record[i].price,records->record[i].quantity,records->record[i].sum);</p><p> if((i%10)==0) //實(shí)現(xiàn)分頁(yè)功能</p><p&g
40、t;<b> {</b></p><p> printf("Press any key show next page……\n");</p><p> getchar();</p><p><b> //cls();</b></p><p><b> }<
41、/b></p><p><b> }</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> 3.3更新模三個(gè)塊:</p><p> 更新包括內(nèi)容;插入,刪除,查找</p
42、><p> 1.算法思想:利用三個(gè)自定義函數(shù):int Insert() //插入函數(shù),int DeleteByNum() //按編號(hào)刪除,int Modify() //按名稱(chēng)修改記錄。插入過(guò)程用MAX控制插入信息的范圍;刪除時(shí)按編號(hào)刪除,刪除過(guò)后,后面記錄到編號(hào)將全部減1,記錄的編號(hào)即下標(biāo)。修改時(shí)先利用int FindByName(char *name);按名稱(chēng)查找記錄函數(shù),找到相關(guān)信息,若無(wú)此信息
43、直接跳轉(zhuǎn),否則修改。</p><p><b> 2.具體實(shí)現(xiàn):</b></p><p> int Insert() //插入函數(shù)</p><p><b> {</b></p><p> if(records->total_count==(MAX-1))</p>&
44、lt;p><b> {</b></p><p> printf("數(shù)據(jù)已達(dá)可控范圍,不能再插入!\n"); </p><p><b> return 0;</b></p><p><b> }</b></p><p> int i=(+
45、+records->total_count);</p><p> records->record[i].num=i; //編號(hào)是連續(xù)的,</p><p> printf("\n 時(shí)間 類(lèi)別 品名 單價(jià) 數(shù)量 金額 \n");</p><p> scanf("
46、%s%s%s%lf%d",records->record[i].times,records->record[i].types,records->record[i].name,&records->record[i].price,&records->record[i].quantity);</p><p> if(strlen(records->reco
47、rd[i].times)!=10||records->record[i].times[4]!='-'||records->record[i].times[7]!='-') //簡(jiǎn)單的判斷一下日期是否符合格式要求</p><p><b> {</b></p><p> printf("時(shí)間格式錯(cuò)誤,請(qǐng)重試!
48、\n");</p><p> records->total_count--;</p><p><b> return 0;</b></p><p><b> }</b></p><p> records->record[i].sum = records->reco
49、rd[i].price * records->record[i].quantity; //金額是計(jì)算所得</p><p> #ifdef DEBUG</p><p><b> ShowI(i);</b></p><p><b> #endif</b></p><p><b&g
50、t; return 1;</b></p><p><b> }</b></p><p> int RemoveByNum(int num) //刪除過(guò)后,后面記錄到編號(hào)將全部減1,記錄的編號(hào)即下標(biāo)</p><p><b> {</b></p><p><b> i
51、nt i;</b></p><p> if(num<1||num>records->total_count)</p><p><b> {</b></p><p> printf("位置錯(cuò)誤!\n");</p><p><b> return 0;<
52、;/b></p><p><b> }</b></p><p> for(i=num;i<records->total_count;i++) //i后面的記錄全部向前移動(dòng)一個(gè)距離</p><p><b> {</b></p><p> records->reco
53、rd[i].num=records->record[i+1].num-1;</p><p> strcpy(records->record[i].times,records->record[i+1].times);</p><p> strcpy(records->record[i].types,records->record[i+1].types);&l
54、t;/p><p> strcpy(records->record[i].name,records->record[i+1].name);</p><p> records->record[i].price=records->record[i+1].price;</p><p> records->record[i].quantity=
55、records->record[i+1].quantity;</p><p> records->record[i].sum=records->record[i+1].sum;</p><p><b> }</b></p><p><b> return 1;</b></p><
56、p><b> }</b></p><p> int DeleteByNum() //按編號(hào)刪除</p><p><b> {</b></p><p><b> int num;</b></p><p> printf("請(qǐng)輸入要?jiǎng)h除記錄的
57、編號(hào):");</p><p> scanf("%d",&num);</p><p> if(!(RemoveByNum(num)))</p><p><b> {</b></p><p> printf("程序執(zhí)行錯(cuò)誤,刪除失??!\n");</p&g
58、t;<p><b> return 0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> return 1;</b></p><p><b> }<
59、/b></p><p> int FindByName(char *name); //聲明按名稱(chēng)查找記錄函數(shù),下面就要使用到</p><p> int Modify() //按名稱(chēng)修改記錄</p><p><b> {</b></p><p><b> int i;</b>
60、</p><p> char names[20];</p><p> printf("請(qǐng)輸入要修改的記錄名稱(chēng):");</p><p> scanf("%s",names);</p><p> i=FindByName(names);</p><p> if(!i)
61、 //判斷要查找的名稱(chēng)所對(duì)應(yīng)的記錄是否存在,不存在則直接跳轉(zhuǎn)</p><p><b> return 0;</b></p><p> printf("請(qǐng)輸入所需信息:\n");</p><p> printf("\n 時(shí)間 類(lèi)別 品名
62、 單價(jià) 數(shù)量 金額 \n");</p><p> scanf("%s%s%s%lf%d",records->record[i].times,records->record[i].types,records->record[i].name,&records->record[i].price,&records->rec
63、ord[i].quantity);</p><p> records->record[i].sum = records->record[i].price * records->record[i].quantity;</p><p><b> return 1;</b></p><p><b> }</b&
64、gt;</p><p> 3.4 ShowTotal模塊實(shí)現(xiàn)</p><p> ShowTotal包括三種方式:類(lèi)型、月、年,以類(lèi)型為例說(shuō)明</p><p><b> 1、算法思想</b></p><p> 為確保不會(huì)溢出,保存統(tǒng)計(jì)結(jié)果的total數(shù)組定義長(zhǎng)度為MAX,接下來(lái)對(duì)記錄集進(jìn)行遍歷,并與ptype[]
65、數(shù)組中統(tǒng)計(jì)的類(lèi)型進(jìn)行比對(duì),按照對(duì)應(yīng)的下標(biāo)將統(tǒng)計(jì)結(jié)果加到total[]數(shù)組中,這樣做便于輸出時(shí)一一對(duì)應(yīng)。</p><p> (復(fù)雜算法用流程圖輔助說(shuō)明)</p><p><b> 2、具體實(shí)現(xiàn)</b></p><p> ?。ńo出實(shí)現(xiàn)算法的關(guān)鍵代碼)</p><p><b> 按類(lèi)型顯示統(tǒng)計(jì)結(jié)果</b&
66、gt;</p><p> void ShowType() {</p><p> int i=1,j=0;</p><p> double total[MAX]={0.0}; //定義保存統(tǒng)計(jì)結(jié)果的數(shù)組</p><p> while(i<=records->total_count&&j<typ
67、e_count){ //遍歷并記錄統(tǒng)計(jì)結(jié)果</p><p> if(strcmp(ptype[j],records->record[i].types)==0){</p><p> total[j] += records->record[i].sum;</p><p><b> i++;</b></p>&
68、lt;p><b> }</b></p><p><b> elsej++;</b></p><p><b> }</b></p><p><b> //輸出統(tǒng)計(jì)結(jié)果</b></p><p> printf("按類(lèi)型統(tǒng)計(jì)結(jié)果如下:
69、\n"); </p><p> for(i=0;i<type_count;i++){</p><p> printf("%s:\t%8.2f\n",ptype[i],total[i]);</p><p><b> }</b></p><p> printf("\n&q
70、uot;);</p><p><b> }</b></p><p><b> 4測(cè)試結(jié)果及分析</b></p><p> 打開(kāi)程序,進(jìn)入主界面</p><p> 輸入“1”,打開(kāi)歷史消費(fèi)記錄:</p><p> 輸入“1”,測(cè)試更新模塊:</p>&l
71、t;p> 輸入“1”,插入信息數(shù)據(jù):</p><p> 輸入“2”,按編號(hào)刪除數(shù)據(jù):</p><p> 輸入“3”,修改歷史信息;</p><p> 輸入“0”,返回主菜單:</p><p> 輸入“6”,測(cè)試統(tǒng)計(jì)結(jié)果;</p><p> 輸入“1”,按類(lèi)別統(tǒng)計(jì)結(jié)果:</p><p
72、> 10,輸入“2”,按月顯示統(tǒng)計(jì)結(jié)果:</p><p> 輸入“3”,按年顯示統(tǒng)計(jì)結(jié)果:</p><p><b> 5.總結(jié)</b></p><p> 為期四天的課程設(shè)計(jì)結(jié)束了,其中的酸甜苦辣恐怕只有經(jīng)歷過(guò)的人才會(huì)懂得。其實(shí)課程設(shè)計(jì)的題目老師很早就發(fā)下來(lái)了,但由于自己時(shí)間觀念不強(qiáng),沒(méi)有提前準(zhǔn)備,所以搞得開(kāi)始做的時(shí)候發(fā)現(xiàn)很多東西都
73、不會(huì),又臨時(shí)學(xué)占用了很多時(shí)間。下次一定要吸取教訓(xùn),不能臨時(shí)抱佛腳啊!此次課程設(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)
74、行,等等、、、我知道自己在C這條路上還有很長(zhǎng)的路要走,但這次得課程設(shè)計(jì)無(wú)疑給了我更加堅(jiān)定走下去的信心,他讓我體會(huì)了迷茫,煩躁,痛苦、、、但它也讓我學(xué)會(huì)了淡定,從容,堅(jiān)持、、、它帶給我四個(gè)晚上熬夜到兩點(diǎn)半的記錄,它也帶給了我看到程序運(yùn)行出結(jié)果的喜悅、、、程序中的各種各樣的錯(cuò)誤曾經(jīng)讓我失望甚至絕望,想放棄,但同組的我們相互鼓勵(lì)視乎又看到了希望、、、在這次設(shè)計(jì)中還請(qǐng)教了幾個(gè)學(xué)計(jì)算機(jī)的高</p><p> 我認(rèn)為這次課
75、程設(shè)計(jì)對(duì)我們的鍛煉很大,它處在離考試只有三四天的時(shí)候,這么緊迫的時(shí)刻有這么短的時(shí)間,這大大的鍛煉了我們的時(shí)間安排能力和不急不躁心態(tài)。另外程序中還有很多不完善的地方,希望以后加強(qiáng)學(xué)習(xí)能夠?qū)⑵涓恼琳橥晟瓢?。非常感謝這次設(shè)計(jì)中給我們幫助的同學(xué),學(xué)長(zhǎng)和老師!</p><p><b> 6.參考文獻(xiàn):</b></p><p> 參考文獻(xiàn):[1]譚浩強(qiáng)等.C語(yǔ)言程序設(shè)計(jì)
76、教程.北京:高等教育出版社,1997.[2]譚浩強(qiáng).C程序設(shè)計(jì).第2版.北京:清華大學(xué)出版社,1999.[3]徐士良.C程序設(shè)計(jì)教程附錄</p><p><b> 主函數(shù)源程序代碼:</b></p><p> #include<stdio.h></p><p> #include<stdlib.h></
77、p><p> #include<string.h></p><p> #include<windows.h></p><p> #include"defined.h"</p><p> #include"arc.h"</p><p> int mai
78、n(void)</p><p><b> {</b></p><p> int chioce; //開(kāi)始的時(shí)候使用char試了一下,有些功能不能實(shí)現(xiàn)</p><p> records->total_count=0;</p><p> #ifdef DEBUG</p><p>
79、printf("jskdljf:%d\n",records->total_count);</p><p><b> #endif</b></p><p> void calledit(int chioce); //聲明中間過(guò)程函數(shù)</p><p> OpenFile("ab+");
80、 //打開(kāi)文件并初始化數(shù)組,即加載數(shù)據(jù)</p><p> while(!feof(fp))</p><p><b> {</b></p><p> fread(&records->record[++rs.total_count],sizeof(Rec),1,fp); //record[0]中并不存放記錄數(shù)據(jù),以后作為查找
81、到前哨站</p><p><b> }</b></p><p> fclose(fp);</p><p> #ifdef DEBUG</p><p> printf("jskdljf:%d\n",records->total_count);</p><p>
82、ShowRec();</p><p><b> #endif</b></p><p> while(1) //用一個(gè)死循環(huán)實(shí)現(xiàn)循環(huán)操作,只有選擇退出的時(shí)候才退出</p><p><b> {</b></p><p> system("cls");</p>
83、<p> printf("--------消費(fèi)記錄系統(tǒng)-------\n");</p><p> printf("1--打開(kāi)\n");</p><p> printf("2--保存\n");</p><p> printf("3--更新\n");</p>
84、<p> printf("4--查找\n");</p><p> printf("5--排序\n");</p><p> printf("6--統(tǒng)計(jì)\n");</p><p> printf("Other--退出\n");</p><p>
85、 printf("請(qǐng)輸入操作序號(hào):");</p><p> scanf("%d",&chioce);</p><p> system("cls");</p><p> if(chioce>6||chioce<1)</p><p><b> bre
86、ak;</b></p><p><b> else</b></p><p> calledit(chioce); //調(diào)用中間過(guò)程函數(shù)</p><p><b> }</b></p><p><b> return 0;</b></p>
87、<p><b> }</b></p><p> void calledit(int chioce)</p><p><b> {</b></p><p> void UpdateRec();</p><p> void FindRec();</p><
88、p> void SortRec();</p><p> switch(chioce)</p><p><b> {</b></p><p><b> case 1:</b></p><p> ShowRec();</p><p><b> bre
89、ak;</b></p><p><b> case 2:</b></p><p> SaveRec();</p><p><b> break;</b></p><p><b> case 3:</b></p><p> Updat
90、eRec();</p><p><b> break;</b></p><p><b> case 4:</b></p><p> FindRec();</p><p><b> break;</b></p><p><b> cas
91、e 5:</b></p><p> SortRec();</p><p><b> break;</b></p><p><b> case 6:</b></p><p> ShowTotal();</p><p><b> break;<
92、;/b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> return ;</b></p><p>&
93、lt;b> }</b></p><p> void UpdateRec()</p><p><b> {</b></p><p><b> int mc;</b></p><p><b> while(1)</b></p><p
94、><b> {</b></p><p> printf("1--插入\n");</p><p> printf("2--刪除\n");</p><p> printf("3--修改\n");</p><p> printf("0--離開(kāi)
95、\n");</p><p> printf("請(qǐng)選擇:");</p><p> scanf("%d",&mc);</p><p><b> if(mc==1)</b></p><p><b> Insert();</b></p&
96、gt;<p> else if(mc==2)</p><p> DeleteByNum();</p><p> else if(mc==3)</p><p><b> Modify();</b></p><p> else if(mc==0)</p><p><b&g
97、t; break;</b></p><p><b> else</b></p><p><b> {</b></p><p> printf("輸入有誤,請(qǐng)重試!\n");</p><p><b> continue;</b></
98、p><p><b> }</b></p><p> scanf("%c",&c);</p><p><b> }</b></p><p><b> }</b></p><p> void FindRec()</p
99、><p><b> {</b></p><p><b> int mc;</b></p><p><b> int i;</b></p><p><b> while(1)</b></p><p><b> {<
100、;/b></p><p> printf("1--按時(shí)間查找\n");</p><p> printf("2--按類(lèi)型查找\n");</p><p> printf("3--按名稱(chēng)查找\n");</p><p> printf("0--離開(kāi)\n");
101、</p><p> printf("請(qǐng)選擇:");</p><p> scanf("%d",&mc);</p><p><b> if(mc==1)</b></p><p><b> {</b></p><p> pr
102、intf("請(qǐng)輸入時(shí)間(format:2011-12-31):");</p><p> scanf("%s",found.times);</p><p> if(strlen(found.times)!=10||found.times[4]!='-'||found.times[7]!='-') //簡(jiǎn)單的判斷
103、一下日期是否符合格式要求</p><p><b> {</b></p><p> printf("時(shí)間格式錯(cuò)誤,請(qǐng)重試!\n");</p><p><b> continue;</b></p><p><b> }</b></p>&l
104、t;p> i=FindByTime(found.times);</p><p><b> if(i)</b></p><p><b> {</b></p><p><b> ShowI(i);</b></p><p><b> }</b>&
105、lt;/p><p><b> }</b></p><p> else if(mc==2)</p><p><b> {</b></p><p> printf("請(qǐng)輸入類(lèi)型:");</p><p> scanf("%s",foun
106、d.types);</p><p> i=FindByType(found.types);</p><p><b> if(i)</b></p><p><b> {</b></p><p><b> ShowI(i);</b></p><p>
107、<b> }</b></p><p><b> }</b></p><p> else if(mc==3)</p><p><b> {</b></p><p> printf("請(qǐng)輸入名稱(chēng):");</p><p> sc
108、anf("%s",found.name);</p><p> i=FindByName(found.name);</p><p><b> if(i)</b></p><p><b> {</b></p><p><b> ShowI(i);</b>
109、</p><p><b> }</b></p><p><b> }</b></p><p> else if(mc==0)</p><p><b> break;</b></p><p><b> else</b><
110、;/p><p><b> {</b></p><p> printf("輸入有誤,請(qǐng)重試!\n");</p><p><b> continue;</b></p><p><b> }</b></p><p> scanf(&q
111、uot;%c",&c);</p><p> system("cls");</p><p><b> }</b></p><p><b> }</b></p><p> void SortRec()</p><p><b&g
112、t; {</b></p><p><b> int mc;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> printf("1--按時(shí)間排序\n");</p>
113、;<p> printf("2--按類(lèi)型排序\n");</p><p> printf("3--按金額排序\n");</p><p> printf("0--離開(kāi)\n");</p><p> printf("請(qǐng)選擇:");</p><p>
114、 scanf("%c",&mc);</p><p><b> if(mc==1)</b></p><p> SortByTime();</p><p> else if(mc==2)</p><p> SortByType();</p><p> else i
115、f(mc==3)</p><p> SortBySum();</p><p> else if(mc==0)</p><p><b> break;</b></p><p><b> else</b></p><p><b> {</b><
116、;/p><p> printf("輸入有誤,請(qǐng)重試!\n");</p><p><b> continue;</b></p><p><b> }</b></p><p> scanf("%c",&c);</p><p>
117、 system("cls");</p><p><b> }</b></p><p> Define.h文件代碼:</p><p> #define MAX 100 //人為定義的一個(gè)上限</p><p> //#define DEBUG //控制調(diào)試信息的輸出</p
118、><p> typedef struct</p><p><b> {</b></p><p> int num; //編號(hào)</p><p> char times[11]; //時(shí)間</p><p> char types[20];
119、//類(lèi)別</p><p> char name[20]; //品名</p><p> double price; //單價(jià)</p><p> int quantity; //數(shù)量</p><p> double sum; //金額</p><
120、p><b> }Rec;</b></p><p> typedef struct</p><p><b> {</b></p><p> Rec record[MAX+1]; //可操作的記錄總數(shù)</p><p> int total_count; //記錄總
121、數(shù)</p><p> }Rec_Con,*PRec_Con;</p><p><b> union {</b></p><p> char times[11]; </p><p> char types[20]; </p><p> char name[2
122、0]; </p><p><b> }found;</b></p><p> //下面三個(gè)變量都是全局變量</p><p> FILE *fp; //定義文件指針</p><p> Rec_Con rs; </p><p> PRec_Con records=&r
123、s; //定義指針變量</p><p> int type_count=0; //記錄里相關(guān)的類(lèi)型數(shù)目</p><p> int year_count=0; //記錄里相關(guān)的年數(shù)目</p><p> char *ptype[MAX+1]; //記錄里相關(guān)的類(lèi)型</p><p> char pyear[MAX+1][
124、5]; //記錄里相關(guān)的年</p><p> char tmp[5]; //取年份所用</p><p> char c; //使用頻率很高的一個(gè)變量,后來(lái)好像又沒(méi)聲明用了,先放著吧</p><p> arc.h文件代碼:</p><p> #include<string.h></
125、p><p> void OpenFile(char * mode) //打開(kāi)文件函數(shù),以二進(jìn)制append形式操作</p><p><b> {</b></p><p> if((fp=fopen("consum",mode))==NULL)</p><p><b> {</b
126、></p><p> printf("File open fail!\n");</p><p><b> return ;</b></p><p><b> }</b></p><p><b> }</b></p><p&g
127、t; void ShowI(int i) //根據(jù)i值輸出記錄</p><p><b> {</b></p><p> printf("記錄:%-5d%-10s%15s%15s%8.2f%5d%8.2f\n",records->record[i].num,records->record[i].times,records-&g
128、t;record[i].types,records->record[i].name,records->record[i].price,records->record[i].quantity,records->record[i].sum);</p><p><b> }</b></p><p> int ShowRec() //
129、顯示所有記錄</p><p><b> {</b></p><p><b> int i;</b></p><p> printf("\t\t--------------打印記錄-------------\n\n");</p><p> printf("編號(hào)\t
130、 日期\t\t 類(lèi)型\t 名稱(chēng)\t 單價(jià) 數(shù)量\t 金額\n");</p><p> for(i=1;i<=records->total_count;i++)</p><p><b> {</b></p><p> printf("%-5d %-10s%15s%15s%8.2f%5d
131、 %8.2f\n",records->record[i].num,records->record[i].times,records->record[i].types,records->record[i].name,records->record[i].price,records->record[i].quantity,records->record[i].sum);</p&g
132、t;<p> if((i%9)==0) //實(shí)現(xiàn)分頁(yè)功能</p><p><b> {</b></p><p> printf("Press any key show next page……");</p><p> getchar();getchar(); //不明白這里為什么非要兩次getcha
133、r()?</p><p> system("cls"); </p><p> printf("\t\t--------------打印記錄-------------\n\n");</p><p> printf("編號(hào)\t 日期\t\t 類(lèi)型\t 名稱(chēng)\t 單價(jià) 數(shù)量\t 金額\n&quo
134、t;);</p><p><b> }</b></p><p><b> }</b></p><p> printf("Press any key into main menu……");</p><p><b> return 1;</b></
135、p><p><b> }</b></p><p> int SaveRec() //保存更新</p><p><b> {</b></p><p><b> int i;</b></p><p> OpenFile("wb&q
136、uot;);</p><p> for(i=1;i<=records->total_count;i++)</p><p><b> {</b></p><p> fwrite(&records->record[i],sizeof(Rec),1,fp);</p><p><b>
137、 }</b></p><p> fclose(fp);</p><p><b> return 1;</b></p><p><b> }</b></p><p> int Insert() //插入函數(shù)</p><p><b> {&
138、lt;/b></p><p> if(records->total_count==(MAX-1))</p><p><b> {</b></p><p> printf("數(shù)據(jù)已達(dá)可控范圍,不能再插入!\n"); </p><p><b> return 0;<
139、;/b></p><p><b> }</b></p><p> int i=(++records->total_count);</p><p> records->record[i].num=i; //編號(hào)是連續(xù)的,1~n</p><p> printf("請(qǐng)輸入所需信息(順序?yàn)?/p>
140、:時(shí)間,類(lèi)別,品名,單價(jià),數(shù)量):");</p><p> scanf("%s%s%s%lf%d",records->record[i].times,records->record[i].types,records->record[i].name,&records->record[i].price,&records->record[i]
141、.quantity);</p><p> if(strlen(records->record[i].times)!=10||records->record[i].times[4]!='-'||records->record[i].times[7]!='-') //簡(jiǎn)單的判斷一下日期是否符合格式要求</p><p><b>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c語(yǔ)言課程設(shè)計(jì)---個(gè)人消費(fèi)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告(宿舍管理系統(tǒng))
- c語(yǔ)言課程設(shè)計(jì)報(bào)告--車(chē)票管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告--成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告(宿舍管理系統(tǒng))
- c語(yǔ)言課程設(shè)計(jì)報(bào)告---銷(xiāo)售管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告-物資管理系統(tǒng)
- 車(chē)票管理系統(tǒng)c語(yǔ)言課程設(shè)計(jì)報(bào)告
- c語(yǔ)言課程設(shè)計(jì)---職工管理系統(tǒng)設(shè)計(jì)報(bào)告
- c語(yǔ)言課程信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- c語(yǔ)言課程設(shè)計(jì)報(bào)告課程信息管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告~圖書(shū)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)銷(xiāo)售管理系統(tǒng)報(bào)告
- c語(yǔ)言課程設(shè)計(jì)報(bào)告----網(wǎng)上購(gòu)物管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)銷(xiāo)售管理系統(tǒng)報(bào)告
- c++語(yǔ)言課程設(shè)計(jì)報(bào)告--影像管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告——機(jī)房管理系統(tǒng)
- 人事管理系統(tǒng)c語(yǔ)言課程設(shè)計(jì)報(bào)告
- c語(yǔ)言圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- c語(yǔ)言圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論