版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 1 需求分析1</b></p><p><b> 1.1問題描述</b></p><p> 1.2 輸入數(shù)據(jù)要求..................................................
2、..............................................1</p><p> 1.2輸出數(shù)據(jù)要求1</p><p> 1.3開發(fā)環(huán)境和工具2</p><p> 1.4成員分工2</p><p> 2總體設(shè)計.........................................
3、...........................................................................3</p><p> 2.1 總體設(shè)計思路.................................................................................................3</p>
4、<p> 2.2模塊結(jié)構(gòu)圖3</p><p> 2.3模塊說明4</p><p><b> 3詳細(xì)設(shè)計5</b></p><p> 3.1 數(shù)據(jù)類型定義5</p><p> 3.2 算法思想 6</p><p> 3.3 具體實現(xiàn)
5、 7</p><p> A 讀入及保存文件模塊 7</p><p> B 信息插入、刪除模塊 7</p><p> C 查找及顯示信息模塊 9</p><p> D 排序模塊:按時間,類別,金額 11</p><p> E 統(tǒng)計模塊
6、 15</p><p> 4測試結(jié)果及分析21</p><p><b> 5總結(jié)23</b></p><p> 參考文獻(xiàn)………………………………………………………….............................25</p><p> 附錄...............
7、..............................................................................................................26</p><p><b> 1 需求分析</b></p><p><b> 問題描述</b></p>&l
8、t;p> 當(dāng)代大學(xué)生有著旺盛的消費需求,消費觀念的超前和消費實力的滯后決定了他們特殊的消費心理和消費行為。大學(xué)生科學(xué)消費觀的建立和合理消費規(guī)劃不僅關(guān)系到大學(xué)生健康消費心理的形成,還影響到大學(xué)生邁入社會后社會經(jīng)濟生活的適應(yīng)能力,本系統(tǒng)將提供一個日常消費記錄,統(tǒng)計,分析的平臺,幫助大學(xué)生合理的管理自己的日常消費。</p><p><b> 輸入數(shù)據(jù)要求</b></p>&
9、lt;p> 消費表信息:時間,類別,品名,單價,數(shù)量,金額</p><p> 消費信息存放在文件中,以編號的先后順序存放</p><p> 用戶從鍵盤讀入消費時間,類別,品名,單價,數(shù)量,金額,保存到文件中</p><p><b> 例如:</b></p><p> sum:40.000000index:
10、1 time:2009-8-4 type:1 name:hzw price:0.700000 num:5 sum:3.500000index:0 time:2010-8-9 type:1 name:hzw price:0.900000 num:4</p><p><b> 輸出數(shù)據(jù)要求</b></p><p> 打開:顯示文
11、件中的所有消費記錄,提供分頁顯示</p><p> 保存:將消費表的更新結(jié)果存入文件</p><p> 更新:可插入、刪除、修改各消費記錄</p><p> 查找:按時間,類別、品名查找消費記錄</p><p> 排序:按時間,類別,金額</p><p> 統(tǒng)計:求各類別消費品的總金額,求各月的消費總金額,求
12、各年的消費總金額</p><p><b> 例如:</b></p><p><b> 開發(fā)環(huán)境和工具</b></p><p> 開發(fā)環(huán)境:Windows 2000</p><p> 開發(fā)工具:C Free5.0</p><p><b> 成員分工</
13、b></p><p> 超 人(郭振興):系統(tǒng)測試、主調(diào)模塊、、總體設(shè)計……</p><p> 蜘蛛俠(林莉莎):、查詢模塊、排序模塊、更新模塊……</p><p><b> 2總體設(shè)計</b></p><p><b> 2.1總體設(shè)計思路</b></p><p&
14、gt; 本設(shè)計主要包括數(shù)據(jù)錄入模塊,信息刪除模塊,查詢顯示模塊,數(shù)據(jù)排序模塊, 數(shù)據(jù)統(tǒng)計模塊.</p><p><b> 2.2模塊結(jié)構(gòu)圖</b></p><p> 根據(jù)需求將系統(tǒng)劃分為五個功能模塊如圖所示</p><p><b> 2.3模塊說明</b></p><p> 1.數(shù)據(jù)錄入模
15、塊. 本模塊的設(shè)計主要包括三個函數(shù),struct Time(消費時間),enum TYPE(消費類型)struct ConsumeRecord(完整的消費記錄)struct ConsumeRecord 函數(shù)主要實現(xiàn)程序的初始建庫,把數(shù)據(jù)添加到文件中,其主要過程是打開文件,調(diào)用Time ,TYPE函數(shù),將需要錄入的數(shù)據(jù)從鍵盤輸入,添加到文件中。</p><p> 2.信息刪除模塊. 本模塊通過輸入需要查找
16、的條目的索引號,程序循環(huán)遍歷所有已存的消費條目,如果消費條目的索引號等于要刪除的索引號,刪除該索引號對應(yīng)的消費條目,并將其后面的消費條目依次往前移動。</p><p> 3.查詢顯示模塊. 本模塊通過輸入需要查找的條目的索引號,程序循環(huán)遍歷所有已存的消費條目,直到查找完或者找到。找到后顯示從record指針開始的number個條目,遍歷需要查找的條目,依次顯示。</p><p>
17、 4.數(shù)據(jù)排序模塊. 本模塊交換兩個條目的內(nèi)容,將record數(shù)組用選擇冒泡法分別以消費時間,類型,價格進(jìn)行排序。</p><p> 5.數(shù)據(jù)統(tǒng)計模塊. 本模塊已存條目指針和已存?zhèn)€數(shù)如果已存條目小于等于零,退出統(tǒng)計, 將條目按時間排序,如果只有一條記錄直接輸出,如果有多條記錄,則遍歷所有記錄并分別打印如果當(dāng)前記錄與下一條記錄年份月份相同,則將其歸于一個月,并累加該月的總金額. 月份變了,打印統(tǒng)計月份
18、的總金額,/將年份金額賦值為下一月份,開始記錄下一月份.</p><p><b> 3詳細(xì)設(shè)計</b></p><p><b> 3.1數(shù)據(jù)類型定義</b></p><p> //時間結(jié)構(gòu)體記錄消費時間</p><p> struct Time</p><p><
19、;b> {</b></p><p><b> int year;</b></p><p> int month;</p><p><b> int day;</b></p><p><b> };</b></p><p>
20、類型結(jié)構(gòu)體記錄消費類型</p><p><b> enum TYPE</b></p><p><b> {</b></p><p><b> STUDY,</b></p><p><b> EAT,</b></p><p>
21、<b> PLAY</b></p><p><b> };</b></p><p> //消費條目結(jié)構(gòu)體,用以記錄完整的消費記錄</p><p> struct ConsumeRecord</p><p><b> {</b></p><p>
22、 int index;//消費索引</p><p> Time time;//消費時間</p><p> TYPE type;//消費類型</p><p> char name[256];//消費名稱</p><p> float price;//單價</p><p> int num;//數(shù)目</p
23、><p> float sum;//總價</p><p> nt _tmain(int argc, _TCHAR* argv[]</p><p> ConsumeRecord* recordTmp;//臨時條目指針</p><p> int indexToDelete;//需要刪除的條目的索引號</p><p>
24、 int indexToFind;//需要查找的條目的索引號</p><p> char sortType=0;//排序類型</p><p> int nCurrent=0;//已存條目的個數(shù)</p><p> int nCurrentDump;//暫存“已存條目的個數(shù)”,用以分頁顯示的時候,還原已存條目個數(shù)</p><p> cha
25、r next;//分頁顯示時輸入變量,輸入‘n’顯示下一頁(十行)</p><p> FILE *file;//文件指針,用以從文件讀取記錄,或?qū)懳募?lt;/p><p> ConsumeRecord* pCurrent;//現(xiàn)在所指向的條目的指針</p><p> ConsumeRecord record[100];//現(xiàn)存條目數(shù)組</p><
26、;p> char input='o';//記錄需要做的操作的變量</p><p><b> 3.2算法思想</b></p><p> 分別用時間結(jié)構(gòu)體記錄消費時間, 類型結(jié)構(gòu)體記錄消費類型, 消費條目結(jié)構(gòu)體記錄完整的消費記錄.其中查詢和刪除模塊通過掃描已建立的所有數(shù)據(jù),索引出符合條件的條目,統(tǒng)計模塊先通過以時間,類型,價格進(jìn)行排序,再統(tǒng)計各
27、類別消費品的總金額,各月的消費總金額,各年的消費總金額.</p><p><b> 3.3具體實現(xiàn)</b></p><p> A.讀入及保存文件模塊</p><p> 將消費數(shù)據(jù)以文件的形式儲存,定義一個文件指針file使其指向該文件,利用標(biāo)準(zhǔn)輸入函數(shù)fopen讀入文件內(nèi)數(shù)據(jù)。具體是用指針指向條目的第一行,判斷如果已存文件數(shù)小于最大文件數(shù)
28、,讀取文件。讀取一條后,指針指向下一個地方以讀取下一條目,同時使讀入條目數(shù)nCurrent加一。如此循環(huán)讀完數(shù)據(jù)后,將文件關(guān)閉。</p><p> 以同樣的方法打開文件,遍歷所有的條目直到結(jié)束,將消費一個條目寫入文件,消費條目指針指向下一個消費條目,用以將下一個消費條目寫入文件,最后關(guān)閉文件。</p><p> B.信息插入、刪除模塊</p><p> 自定義
29、函數(shù)DeleteRecord(ConsumeRecord* record,int& nCurrent,int index) 其中record是消費條目指針,nCurrent是已存消費條目的個數(shù),index為索引號,利用循環(huán)遍歷所有的索引號,如果遇到的索引號與要刪除的索引號相同,則實現(xiàn)調(diào)用刪除函數(shù)DeleteRecord(ConsumeRecord* record,int& nCurrent,int index)功能,即:
30、</p><p><b> {</b></p><p> for (int i = 0;i<nCurrent;i++)</p><p><b> {</b></p><p> if (record->index==index)</p><p><b&
31、gt; {</b></p><p> for (int j = i;j<nCurrent;j++)</p><p><b> {</b></p><p> record[j]=record[j+1];</p><p><b> }</b></p><p
32、> nCurrent--;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 插入數(shù)據(jù)時首先要判斷條目是否已滿,若已滿則輸出printf("the record is f
33、ull!");即已經(jīng)存滿不能再插入數(shù)據(jù),否則將pCurrent指向已存條目的下一個位置指針即pCurrent=&record[nCurrent];循環(huán)直到正確輸入</p><p> 若輸入不正確,打印警告信息即:</p><p> if (pCurrent->num<0)</p><p><b> {</b>
34、</p><p> printf("unrecomannd fomat!\n");</p><p><b> }</b></p><p><b> }</b></p><p><b> 插入后計算總金額</b></p><p>
35、; pCurrent->sum=pCurrent->price*pCurrent->num;</p><p> pCurrent++; nCurrent++;</p><p><b> }</b></p><p> pCurrent=&record[nCurrent];</p><p&
36、gt;<b> 如下:</b></p><p> C.查找及顯示信息模塊</p><p> Record:指向消費條目記錄數(shù)組,</p><p> nCurrent:已存條目數(shù),</p><p> index:需要查找的條目的索引號</p><p> 利用ConsumeRecord*
37、FindRecord(ConsumeRecord* record,int& nCurrent,int index)</p><p> 遍歷所有已存的消費條目,直到查找完或者找到如果消費條目的索引號為需要查找的索引號才,找到了,返回;遍歷完了沒有找到,輸出“not found!”即:</p><p><b> {</b></p><p&
38、gt; for (int i = 0;i<nCurrent;i++,record++)</p><p><b> {</b></p><p> if (record->index==index)</p><p><b> {</b></p><p> return record
39、;</p><p><b> }</b></p><p><b> }</b></p><p> printf("not found!");</p><p><b> return 0;</b></p><p><b&g
40、t; }</b></p><p> 查找完后調(diào)用ShowRecord輸出要顯示的條目。</p><p> ShowRecord函數(shù)功能如下:</p><p> void ShowRecord(ConsumeRecord* record)</p><p><b> {</b></p>&
41、lt;p> printf("index:%d %d-%d-%d type:%d name:%s price:%f num:%d sum:%f\n",\record->index,record->time.year,record->time.month,record->time.day,record->type,record->name
42、,record->price,record->num,record->sum);</p><p><b> }</b></p><p> 然后調(diào)用顯示ShowRecords查找到的從指針開始的總的條目,ShowRecords功能如下:</p><p> void ShowRecords(ConsumeRecord* re
43、cord,int number)</p><p><b> {</b></p><p> for (int i=0;i<number;i++)</p><p><b> {</b></p><p> ShowRecord(record+i);</p><p>&
44、lt;b> }</b></p><p><b> }</b></p><p> 注:number:需要顯示的條目數(shù)。</p><p> Record:指向第一個要顯示的指針。</p><p> D.排序模塊:按時間,類別,金額</p><p> 具體來說是定義了一個函
45、數(shù),實現(xiàn)三種方式的排序,其中運用了switch語句,根據(jù)不同的排序類型劃分了不同的case,然后選擇出相應(yīng)的功能來實現(xiàn)要求,比較實用而且簡潔。函數(shù)內(nèi)部是采用冒泡法排序,首先判斷選擇的類型然后進(jìn)入相應(yīng)的功能區(qū)。定義函數(shù)</p><p> void SortRecord(ConsumeRecord* record,int nCurrent,char type)</p><p> 其中 re
46、cord:排序數(shù)組頭指針,nCurrent:數(shù)組的個數(shù),type:排序類型</p><p> void SortRecord(ConsumeRecord* record,int nCurrent,char type)</p><p><b> {</b></p><p><b> int i,j;</b></p
47、><p> switch(type)</p><p><b> {</b></p><p> case 't': //按時間排序</p><p> for(i=0;i<nCurrent-1;i++)</p><p><b> {</b></p
48、><p> for(j=0;j<nCurrent-1-i;j++)</p><p><b> {</b></p><p> //比較兩個條目的年份,前一個年份大則交換 </p><p> if(record[j].time.year>record[j+1].time.year)</p>&l
49、t;p><b> {</b></p><p> swap(&record[j],&record[j+1]);</p><p><b> }</b></p><p><b> else if </b></p><p> //年份相同,比較月份<
50、;/p><p> (record[j].time.year==record[j+1].time.year&&record[j].time.month>record[j+1].time.month)</p><p><b> {</b></p><p> swap(&record[j],&record[j+
51、1]);</p><p><b> }</b></p><p><b> else if</b></p><p> //年份月份相同,比較日期 (record[j].time.year==record[j+1].time.year&&record[j].time.month==record[j+1].
52、time.month&&record[j].time.day>record[j+1].time.day)</p><p><b> {</b></p><p> swap(&record[j],&record[j+1]);</p><p><b> }</b></p>
53、<p><b> }</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> //按類型排序</b></p><p><b> case 'l'
54、;:</b></p><p> for(i=0;i<nCurrent-1;i++)</p><p><b> {</b></p><p> for(j=0;j<nCurrent-1-i;j++)</p><p><b> {</b></p><p&
55、gt; //比較類型,前面的條目大就交換</p><p> if(record[j].type>record[j+1].type)</p><p><b> {</b></p><p> swap(&record[j],&record[j+1]);</p><p><b> }&
56、lt;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> //按價格排序</b></p><p><b&g
57、t; case 'p':</b></p><p> for(i=0;i<nCurrent-1;i++)</p><p><b> {</b></p><p> for(j=0;j<nCurrent-1-i;j++)</p><p><b> {</b>
58、;</p><p> //遍歷價格,前面的大就交換</p><p> if(record[j].price>record[j+1].price)</p><p><b> {</b></p><p> swap(&record[j],&record[j+1]);</p><
59、;p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><
60、;p><b> }</b></p><p><b> 如下:</b></p><p><b> E.統(tǒng)計模塊</b></p><p> 為了便于統(tǒng)計,現(xiàn)將數(shù)據(jù)進(jìn)行排序,根據(jù)不同的統(tǒng)計方式進(jìn)行不同的排序,如為了計算每年的消費總額,需要將數(shù)據(jù)按時間排序,然后進(jìn)行統(tǒng)計,按類型排序就利于統(tǒng)計每個
61、項目的消費情況。在程序中就要在統(tǒng)計之前根據(jù)需要調(diào)用相應(yīng)的函數(shù)實現(xiàn)排序功能。具體如下所示:</p><p> void Statistic(ConsumeRecord* record,int nCurrent)</p><p><b> {</b></p><p> //如果已存條目小于等于零,退出</p><p>
62、 if (nCurrent<=0)</p><p><b> {</b></p><p><b> return;</b></p><p><b> }</b></p><p> //將條目按時間排序</p><p> SortReco
63、rd(record,nCurrent,'t');</p><p> double sumYear = record->sum;//按年統(tǒng)計的總金額,將第一條記錄的金額付給他</p><p> double sumMonth = record->sum;//按月統(tǒng)計的總金額,將第一條記錄的金額付給他</p><p> double s
64、umType = record->sum;//按類型統(tǒng)計的總金額,將第一條記錄的金額付給他</p><p> //如果只有一條記錄直接輸出</p><p> if (nCurrent == 1)</p><p><b> {</b></p><p> //輸出按年統(tǒng)計的總金額</p><
65、p> printf("year:%d sum:%f\n",record[0].time.year,sumYear);</p><p> //輸出按月統(tǒng)計的總金額</p><p> printf("year:%d--month%d: sum:%f\n",record[0].time.year,record[0].time.mon
66、th,sumMonth);</p><p> //輸出按類型統(tǒng)計的總金額</p><p> printf("type:%d sum:%f\n",record[0].type,sumType);</p><p><b> return;</b></p><p><b> }<
67、;/b></p><p> //如果有多條記錄,則遍歷所有記錄并分別打印</p><p> for (int i=0;i<nCurrent;i++)</p><p><b> {</b></p><p> //如果當(dāng)前記錄與下一條記錄年份相同,則將其歸于一年,并累加改年的總金額</p>
68、<p> if (record[i].time.year==record[i+1].time.year)</p><p><b> {</b></p><p> sumYear+=record[i+1].sum;</p><p><b> }</b></p><p><b&g
69、t; else</b></p><p><b> {</b></p><p> //年份變了,打印統(tǒng)計年份的總金額</p><p> printf("year:%d sum:%f\n",record[i].time.year,sumYear);</p><p> //將年份
70、金額賦值為下一年份,開始記錄下一年分</p><p> sumYear=record[i+1].sum;</p><p><b> }</b></p><p> //如果當(dāng)前記錄與下一條記錄年份月份相同,則將其歸于一個月,并累加該月的總金額</p><p> if (record[i].time.year==re
71、cord[i+1].time.year&&record[i].time.month==record[i+1].time.month)</p><p><b> {</b></p><p> sumMonth+=record[i+1].sum;</p><p><b> }</b></p>
72、<p><b> else</b></p><p><b> {</b></p><p> //月份變了,打印統(tǒng)計月份的總金額</p><p> printf("year:%d--month%d: sum:%f\n",record[i].time.year,record[i].
73、time.month,sumMonth);</p><p> //將年份金額賦值為下一月份,開始記錄下一月分</p><p> sumMonth=record[i+1].sum;</p><p><b> }</b></p><p><b> }</b></p><p&g
74、t; //按類型將記錄排序</p><p> SortRecord(record,nCurrent,'l');</p><p><b> //遍歷所有記錄</b></p><p> for (int i=0;i<nCurrent;i++)</p><p><b> {</b
75、></p><p> //如果當(dāng)前記錄與下一條記錄類型相同,則將其歸于同一類型,并累加改類型的總金額</p><p> if (record[i].type==record[i+1].type)</p><p><b> {</b></p><p> sumType+=record[i+1].sum;<
76、;/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> //類型變了,打印該類型的總金額</p><p> printf("type:%d sum:%
77、f\n",record[i].type,sumType);</p><p> //將類型金額賦值為下一類型,開始記錄下一類型</p><p> sumType = record[i+1].sum;</p><p><b> }</b></p><p><b> }</b></
78、p><p><b> }</b></p><p><b> 如下:</b></p><p> //輸入‘e’則退出,否則一直運行</p><p> 以上是各個函數(shù)功能,在實際運行時要建立一個dos菜單輸入不同的指令來實現(xiàn)相應(yīng)的功能,即下面的顯示信息:</p><p>
79、提示用戶選擇想要的操作</p><p><b> 4.測試結(jié)果及分析</b></p><p><b> 部分結(jié)果如下:</b></p><p> 本次測試主要對程序的五個模塊功能進(jìn)行了檢驗,剛開始的時候也出現(xiàn)了很多沒有預(yù)想到的錯誤,接著一步步查找錯誤,認(rèn)真分析,最終正確地實現(xiàn)了功能,結(jié)果與預(yù)期基本相同.最終通過給老師
80、提問,以及自己的演示也出現(xiàn)了一些問題,比如:功能實現(xiàn)不全,以及結(jié)果顯示不清楚等等.</p><p> 出現(xiàn)的顯示不清楚如下: </p><p> 應(yīng)當(dāng)按照平常習(xí)慣建立表格形式的目錄,沒有必要每次的結(jié)果都要在前面附帶類型.</p><p> 這個不足在于2009年的統(tǒng)計處有問題.這些問題提醒了我以后做什么事情都要多方面考慮,設(shè)計這種程序關(guān)鍵在于它的實用性.<
81、;/p><p><b> 5.總結(jié)</b></p><p> 經(jīng)過上一個學(xué)期對《C程序設(shè)計》的學(xué)習(xí),我們學(xué)習(xí)了理論知識,了解了C語言程序設(shè)計的思想,這些知識都為我們的下一步學(xué)習(xí)打下了堅實的基礎(chǔ)。通過課程設(shè)計,一方面是為了檢查我們一個學(xué)期來我們學(xué)習(xí)的成果,另一方面也是為了讓我們進(jìn)一步的掌握和運用它,同時也讓我們認(rèn)清自己的不足之處和薄弱環(huán)節(jié),加以彌補和加強。</p&
82、gt;<p> 在個人消費系統(tǒng)程序編寫過程中也體會到了做事情一頂要細(xì)心、認(rèn)真。更加知道了要掌握好基礎(chǔ)知識。還有體會到了成功的感覺!更加體會到了團隊合作的重要性(很感謝我的隊友),“一個諸葛亮比不上三個臭皮匠。”知道了只有團隊合作才會更好的完成設(shè)計!也體會到以后在工作中團隊合作的必要性和重要性!</p><p> 通過本項課程設(shè)計培養(yǎng)了我獨立思考、 綜合運用所學(xué)有關(guān)相應(yīng)知識的能力,掌握 工程軟件設(shè)
83、計的基本方法,強化上機動手編程能力,闖過理論與實踐相結(jié)合的難關(guān)!也知道了自己的動手能力不強有待進(jìn)一步的提高!在設(shè)計過程中不能夠把書本上的知識與實踐相結(jié)合,這也就增加了設(shè)計不好該程序的想法!一次次設(shè)計錯誤增加了我放棄的想法!不過經(jīng)過大家的努力終于完成了課程設(shè)計!完成該程序后想起自己以前的每一次對自己失去信心,就覺得并不是在知識掌握上打敗了,而是自己對自己缺乏信心!只要自己對自己不失去信心相信就可以完成那些以前認(rèn)為完成不了的事情!懂得了自己
84、以后要在做任何事情時都要自信!當(dāng)自己都不相信自己能夠成功時還可能會獲得成功嗎?也知道了自己在以前的學(xué)習(xí)中有很大的不足導(dǎo)致在設(shè)計過程中出現(xiàn)了很多的問題,有些地方看不懂也不知道怎么去設(shè)計,但是在設(shè)計過程中也學(xué)習(xí)了很多,掌握了自己以前沒有學(xué)好的知識,雖然一時可以掌握完以前沒有學(xué)好的知識,不過也給自己敲響了警鐘,在學(xué)習(xí)中不可以伏于表面,要想學(xué)好每一門課程都要踏踏實實,做什么都不是給別人看的!都是要更好的掌握該門知識,提高自己的自身的修養(yǎng),提高自
85、己的能力!為以后的工作打下良好的知識</p><p><b> 參考文獻(xiàn)</b></p><p> ?、弊T浩強編著.C程序設(shè)計第二版〔M〕.北京:清華大學(xué)出版社,1999</p><p> ?、碴愃氟?陳英編著.C語言趣味程序百例精解〔M〕.北京:北京理工大學(xué)出版社,1994</p><p> ?、畴娔X知識與技術(shù)學(xué)術(shù)交
86、流版〔J〕2005.2 (備注:來自網(wǎng)絡(luò)資源)</p><p> ?、碒erbert Schildit著. 戴健鵬譯. C語言大全 (第二版)〔M〕.北京:電子工業(yè)出版社,1994</p><p> ?、底T浩強,張基溫,唐永炎編著. C語言程序設(shè)計教程.〔M〕北京: 高等教育出版社,1992</p><p> ⒍秦友淑,曹化工編著. C語言程序設(shè)計教程. 〔
87、M〕武漢:華中理工大學(xué)出版社,1996</p><p> 7.黃明等編著.21世紀(jì)進(jìn)階輔導(dǎo)C語言程序設(shè)計. 〔M〕大連理工大學(xué)出版</p><p><b> 附錄</b></p><p><b> 源程序:</b></p><p> // 個人消費系統(tǒng).cpp : 定義控制臺應(yīng)用程序的入口點
88、。</p><p> //#include "stdafx.h"</p><p> #include<stdio.h></p><p> #include<tchar.h></p><p> #include <stdlib.h></p><p> //
89、時間結(jié)構(gòu)體記錄消費時間</p><p> struct Time</p><p><b> {</b></p><p><b> int year;</b></p><p> int month;</p><p><b> int day;</b&g
90、t;</p><p><b> };</b></p><p> //消費條目結(jié)構(gòu)體,用以記錄完整的消費記錄</p><p> struct ConsumeRecord</p><p><b> {</b></p><p> int index;//消費索引</
91、p><p> Time time;//消費時間</p><p> int type;//消費類型</p><p> char name[256];//消費名稱</p><p> float price;//單價</p><p> int num;//數(shù)目</p><p> float
92、sum;//總價</p><p><b> };</b></p><p><b> //讀取文件。</b></p><p> //file文件指針,record消費條目數(shù)組指針,len為消費條目數(shù)組最大長度(用以判定越界),nCurrent消費條目數(shù)組已存條目個數(shù)</p><p> void
93、 ReadFile(FILE*& file,ConsumeRecord* record,int len,int& nCurrent)</p><p><b> {</b></p><p> //打開文件data.txt</p><p> file = fopen("data.txt","r&q
94、uot;);</p><p> //讀取文件直到結(jié)束</p><p> while(!feof(file))</p><p><b> {</b></p><p> //如果已存文件數(shù)小于最大文件數(shù),讀取文件</p><p> if (nCurrent<len)</p>
95、<p><b> {</b></p><p><b> //讀取一條記錄</b></p><p> fscanf(file,"index:%d time:%d-%d-%d type:%d name:%s price:%f num:%d sum:%f",\</p><p> &
96、;record->index,&record->time.year,&record->time.month,&record->time.day,\</p><p> &record->type,record->name,&record->price,&record->num,&record->sum);
97、</p><p> //數(shù)組指針指向下一個地方,以讀取下一條記錄</p><p><b> record++;</b></p><p><b> //已存記錄數(shù)加一</b></p><p> nCurrent++;</p><p><b> }</b
98、></p><p><b> }</b></p><p><b> //關(guān)閉文件</b></p><p> fclose(file);</p><p><b> }</b></p><p><b> //保存文件。</b&
99、gt;</p><p> //file為文件指針,record消費條目數(shù)組指針,nCurrent已存消費條目條目個數(shù)</p><p> void SaveFile(FILE*& file,ConsumeRecord* record,int nCurrent)</p><p><b> {</b></p><p&
100、gt; //打開文件data.txt</p><p> file = fopen("data.txt","w");</p><p> //遍歷每一個消費條目直到結(jié)束</p><p> for (int i=0;i<nCurrent;i++)</p><p><b> {<
101、/b></p><p> //將消費條目寫入文件</p><p> fprintf(file,"index:%d time:%d-%d-%d type:%d name:%s price:%f num:%d sum:%f",\</p><p> record->index,record->time.year,record-&
102、gt;time.month,record->time.day,\</p><p> record->type,record->name,record->price,record->num,record->sum);</p><p> //消費條目指針指向下一個消費條目,用以將下一個消費條目寫入文件</p><p><b&
103、gt; record++;</b></p><p><b> }</b></p><p><b> //關(guān)閉文件</b></p><p> fclose(file);</p><p><b> }</b></p><p><b
104、> //刪除消費記錄</b></p><p> //record消費條目數(shù)組指針,nCurrent已存消費條目的個數(shù),index即將刪除的記錄的索引號</p><p> void DeleteRecord(ConsumeRecord* record,int& nCurrent,int index)</p><p><b>
105、 {</b></p><p> //遍歷現(xiàn)在已存的所有條目</p><p> for (int i = 0;i<nCurrent;i++)</p><p><b> {</b></p><p> //如果消費條目的索引號等于要刪除的索引號</p><p> if (re
106、cord->index==index)</p><p><b> {</b></p><p> //刪除該索引號對應(yīng)的消費條目,并將其后面的消費條目依次往前移動</p><p> for (int j = i;j<nCurrent;j++)</p><p><b> {</b>&
107、lt;/p><p> record[j]=record[j+1];</p><p><b> }</b></p><p> //已存消費條目減一</p><p> nCurrent--;</p><p><b> }</b></p><p>&l
108、t;b> }</b></p><p><b> }</b></p><p><b> //查找消費條目</b></p><p> //record消費條目記錄數(shù)組,nCurrent已存條目數(shù),需要查找的條目的索引號</p><p> ConsumeRecord* Find
109、Record(ConsumeRecord* record,int& nCurrent,int index)</p><p><b> {</b></p><p> //遍歷所有已存的消費條目,直到查找完或者找到</p><p> for (int i = 0;i<nCurrent;i++,record++)</p>
110、;<p><b> {</b></p><p> //如果消費條目的索引號為需要查找的索引號才,找到了,返回</p><p> if (record->index==index)</p><p><b> {</b></p><p> return record;<
111、;/p><p><b> }</b></p><p><b> }</b></p><p> //遍歷完了沒有找到,輸出“not found!”</p><p> printf("not found!");</p><p><b> ret
112、urn 0;</b></p><p><b> }</b></p><p><b> //顯示條目。</b></p><p> //record需要顯示的條目的指針</p><p> void ShowRecord(ConsumeRecord* record)</p>
113、<p><b> {</b></p><p> //輸出要顯示的條目</p><p> printf("index:%d %d-%d-%d type:%d name:%s price:%f num:%d sum:%f\n",\</p><p> record->
114、index,record->time.year,record->time.month,record->time.day,record->type,record->name,record->price,record->num,record->sum);</p><p><b> }</b></p><p> //顯示從
115、record指針開始的number個條目</p><p> //record第一個要顯示的條目的指針,number需要顯示的條目的個數(shù)</p><p> void ShowRecords(ConsumeRecord* record,int number)</p><p><b> {</b></p><p> /
116、/遍歷需要查找的條目,依次顯示</p><p> for (int i=0;i<number;i++)</p><p><b> {</b></p><p><b> //顯示條目</b></p><p> ShowRecord(record+i);</p><p&
117、gt;<b> }</b></p><p><b> }</b></p><p> //交換兩個條目的內(nèi)容</p><p> void swap(ConsumeRecord *pR1,ConsumeRecord *pR2)</p><p><b> {</b><
118、/p><p> ConsumeRecord temp;</p><p> temp=*pR1;</p><p> *pR1=*pR2;</p><p> *pR2=temp;</p><p><b> }</b></p><p> //將record數(shù)組排序,選擇冒
119、泡排序</p><p> //record排序數(shù)組頭指針,nCurrent數(shù)組的個數(shù),排序類型</p><p> void SortRecord(ConsumeRecord* record,int nCurrent,char type)</p><p><b> {</b></p><p><b> i
120、nt i,j;</b></p><p><b> //判斷排序類型</b></p><p> switch(type)</p><p><b> {</b></p><p><b> //按時間排序</b></p><p><b
121、> case 't':</b></p><p><b> //遍歷數(shù)組</b></p><p> for(i=0;i<nCurrent-1;i++)</p><p><b> {</b></p><p> for(j=0;j<nCurrent-
122、1-i;j++)</p><p><b> { </b></p><p> //比較兩個條目的年份,前一個年份大則交換</p><p> if(record[j].time.year>record[j+1].time.year)</p><p><b> {</b></p>
123、<p> swap(&record[j],&record[j+1]);</p><p><b> }</b></p><p> //年份相同,比較月份</p><p> else if (record[j].time.year==record[j+1].time.year&&record[j
124、].time.month>record[j+1].time.month)</p><p><b> {</b></p><p> swap(&record[j],&record[j+1]);</p><p><b> }</b></p><p> //年份月份相同,比較
125、日期</p><p> else if (record[j].time.year==record[j+1].time.year&&record[j].time.month==record[j+1].time.month&&record[j].time.day>record[j+1].time.day)</p><p><b> {<
126、/b></p><p> swap(&record[j],&record[j+1]);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><
127、;b> break;</b></p><p><b> //按類型排序</b></p><p><b> case 'l':</b></p><p> for(i=0;i<nCurrent-1;i++)</p><p><b> {<
128、/b></p><p> for(j=0;j<nCurrent-1-i;j++)</p><p><b> { </b></p><p> //比較類型,前面的條目大就交換</p><p> if(record[j].type>record[j+1].type)</p><p
129、><b> {</b></p><p> swap(&record[j],&record[j+1]);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
130、/p><p><b> break;</b></p><p><b> //按價格排序</b></p><p><b> case 'p':</b></p><p> for(i=0;i<nCurrent-1;i++)</p><p
131、><b> {</b></p><p> for(j=0;j<nCurrent-1-i;j++)</p><p><b> { </b></p><p> //遍歷價格,前面的大就交換</p><p> if(record[j].price>record[j+1].pri
132、ce)</p><p><b> {</b></p><p> swap(&record[j],&record[j+1]);</p><p><b> }</b></p><p><b> }</b></p><p><b&
133、gt; }</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //統(tǒng)計</b></p><p> /
134、/已存條目指針,和已存?zhèn)€數(shù)</p><p> void Statistic(ConsumeRecord* record,int nCurrent)</p><p><b> {</b></p><p> //如果已存條目小于等于零,退出</p><p> if (nCurrent<=0)</p>
135、<p><b> {</b></p><p><b> return;</b></p><p><b> }</b></p><p> //將條目按時間排序</p><p> SortRecord(record,nCurrent,'t')
136、;</p><p> double sumYear = record->sum;//按年統(tǒng)計的總金額,將第一條記錄的金額付給他</p><p> double sumMonth = record->sum;//按月統(tǒng)計的總金額,將第一條記錄的金額付給他</p><p> double sumType = record->sum;//按類型統(tǒng)計
137、的總金額,將第一條記錄的金額付給他</p><p> //如果只有一條記錄直接輸出</p><p> if (nCurrent == 1)</p><p><b> {</b></p><p> //輸出按年統(tǒng)計的總金額</p><p> printf("year:%d
138、sum:%f\n",record[0].time.year,sumYear);</p><p> //輸出按月統(tǒng)計的總金額</p><p> printf("year:%d--month%d: sum:%f\n",record[0].time.year,record[0].time.month,sumMonth);</p><p&
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c語言課程設(shè)計報告---個人消費管理系統(tǒng)
- c語言課程設(shè)計-賓館管理系統(tǒng)
- c語言課程設(shè)計-成績管理系統(tǒng)
- c語言課程設(shè)計--宿舍管理系統(tǒng)
- c語言課程設(shè)計-學(xué)籍管理系統(tǒng)
- c語言課程設(shè)計車票管理系統(tǒng)
- c語言課程設(shè)計--車票管理系統(tǒng)
- c語言課程設(shè)計--銷售管理系統(tǒng)
- c語言課程設(shè)計——教材管理系統(tǒng)
- c語言課程設(shè)計-人員管理系統(tǒng)
- c語言課程設(shè)計----銷售管理系統(tǒng)
- 課程設(shè)計---用c++語言設(shè)計個人帳薄管理系統(tǒng)
- c語言課程設(shè)計-銷售管理系統(tǒng)
- c語言課程設(shè)計-學(xué)籍管理系統(tǒng)
- c語言課程設(shè)計-教材管理系統(tǒng)——課程論文
- c語言課程設(shè)計報告(宿舍管理系統(tǒng))
- c語言課程設(shè)計---班級成績管理系統(tǒng)
- c語言課程設(shè)計報告--車票管理系統(tǒng)
- c語言課程設(shè)計銷售管理系統(tǒng)
- c語言課程設(shè)計—班級成績管理系統(tǒng)
評論
0/150
提交評論