c語言課程設(shè)計報告---個人消費管理系統(tǒng)_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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問題描述1</b></p><p>  1.2 輸入數(shù)據(jù)要求1</p><p>  1.3 輸出數(shù)據(jù)要求1</p><

2、p>  1.4 開發(fā)環(huán)境和工具1</p><p>  1.5 成員分工1</p><p><b>  2總體設(shè)計2</b></p><p>  2.1 總體設(shè)計思路2</p><p>  2.2 模塊結(jié)構(gòu)圖2</p><p>  2.3 模塊說明3</p>&

3、lt;p><b>  3 詳細(xì)設(shè)計4</b></p><p>  3.1 數(shù)據(jù)類型定義5</p><p>  3.2 打開模塊實現(xiàn)6</p><p>  3.3 更新模塊實現(xiàn)6</p><p>  3.4 統(tǒng)計模塊實現(xiàn)7</p><p>  4測試結(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問題描述</b></p><p>  隨著社會經(jīng)濟(jì)的發(fā)展,大學(xué)生已經(jīng)成為這個社會上一個很重要的團(tuán)體,而他們的消費情況也越來越多的被更多的人關(guān)注,大學(xué)生自己也應(yīng)當(dāng)管理好自己的消費內(nèi)容,讓自己的消費更加合理化,提高自己生活的質(zhì)量。在這種情況下,就需要一個軟消費表信息:編號,時間,類別,品名,單價,數(shù)量,金額</p><p>  對學(xué)生每天的消費情況作一個較為詳細(xì)的統(tǒng)計,該系統(tǒng)

6、可以實現(xiàn)由計算機代替人工執(zhí)行一些復(fù)雜而且較為繁瑣的操作,從而使大學(xué)生們能夠更為便捷地管理自己的消費,也為其他的一些調(diào)查研究提供了方便。</p><p>  1.2 輸入數(shù)據(jù)要求</p><p>  可錄入消費者當(dāng)天的消費情況,消費表信息包括:編號,時間,類別,品名,單價,數(shù)量,金額</p><p>  消費信息存放在文件中,以編號的先后順序存放</p>

7、<p>  1.3 輸出數(shù)據(jù)要求</p><p>  打開:顯示文件中的所有消費記錄,提供分頁顯示</p><p>  保存:將消費表的更新結(jié)果存入文件</p><p>  更新:可插入、刪除、修改各消費記錄</p><p>  查找:按時間,類別、品名查找消費記錄</p><p>  排序:按時間,類別,

8、金額</p><p>  統(tǒng)計:求各類別消費品的總金額,求各月的消費總金額,求各年消費總金額</p><p>  1.4 開發(fā)環(huán)境和工具</p><p>  開發(fā)環(huán)境:Windows 2000</p><p>  開發(fā)工具:Visual C++ 6.0</p><p><b>  1.5 成員分工</b

9、></p><p>  劉倩鈺:主函數(shù)模塊,保存模塊,排序模塊</p><p>  劉冬梅:打開模塊,更新模塊,數(shù)據(jù)統(tǒng)計模塊</p><p><b>  2總體設(shè)計</b></p><p>  2.1 總體設(shè)計思路</p><p><b>  設(shè)計思路</b><

10、/p><p>  個人消費系統(tǒng)管理包含的操作有:打開、保存、更新、查找、排序和統(tǒng)計。在程序開始運行的時候從文件加載已有數(shù)據(jù),并輸出可以進(jìn)行的操作提供給用戶,</p><p>  1、打開:顯示文件中的所有消費記錄,通過取模運算提供分頁顯示功能</p><p>  2、保存:以wb模式打開文件,將修改的內(nèi)容寫入文件</p><p>  3、更新:可

11、插入、刪除、修改各消費記錄</p><p>  4、查找:按時間,類別、品名查找消費記錄</p><p>  5、排序:按時間,類別,金額</p><p>  6、統(tǒng)計:分別按類別、月、年統(tǒng)計消費品的總金額</p><p><b>  數(shù)據(jù)存儲</b></p><p>  為了操作的方便,用typ

12、edef自定義了一些數(shù)據(jù)類型,其中包含一個長度為MAX的數(shù)組,用來存放從文件中讀取的數(shù)據(jù)。</p><p>  2.2 模塊結(jié)構(gòu)圖</p><p>  根據(jù)需求將系統(tǒng)劃分為六個功能模塊,函數(shù)之間的調(diào)用關(guān)系如圖2.1所示。</p><p>  圖2.1 個人消費系統(tǒng)的模塊結(jié)構(gòu)圖</p><p>  Calledit:在主函數(shù)的控制下,調(diào)用各個

13、模塊</p><p>  1)ShowRec: 輸出已存在的記錄。</p><p>  2)SaveRec:保存更新的內(nèi)容。</p><p>  3)UpdateRec: 按一定的方式更新記錄。</p><p>  這個模塊下包含三個子模塊 插入:Insert </p><p>  刪除: DeleteByNu

14、m </p><p>  修改:Modify </p><p>  4)FindRec: 按一定的方式查找記錄。</p><p>  這個模塊下也包含三個子模塊 按日期查找:FindBytime</p><p>  按類型查找:FindByType </p><p>  按名稱查找: FindByName

15、 </p><p>  5)SortRec: 按一定的方式查找記錄。</p><p>  這個模塊下也包含三個子模塊 按日期查找:SortBytime</p><p>  按類型查找:SortByType </p><p>  按名稱查找: SortBySum</p><p>  6)ShowTotal:

16、 顯示各種統(tǒng)計的結(jié)果</p><p><b>  2.3 模塊說明</b></p><p>  (以從上至下,從左至右的順序說明)</p><p>  2.3.1:打開模塊:</p><p>  自定義函數(shù):ShowRec( )</p><p>  函數(shù)功能:輸出已存在的歷史記錄</p&

17、gt;<p><b>  無參函數(shù):無參數(shù)</b></p><p>  2.3.2:更新模塊:</p><p>  自定義函數(shù):UpdateRec( )</p><p>  函數(shù)功能: 可對輸入數(shù)據(jù)實現(xiàn)插入,刪除,修改操作。</p><p>  無參函數(shù):void類型,無返回值。調(diào)用Insert()函數(shù),D

18、elete()函數(shù)和Modify()</p><p>  2.3.2.1插入模塊:自定義函數(shù): Insert()</p><p>  函數(shù)功能:實現(xiàn)插入新的信息并保存到記錄中,其中插入的數(shù)據(jù)最后金額可以自己運算出來,插入的記錄保存在尾部。</p><p>  無參函數(shù):返回值為int 類型</p><p>  2.3.2.2刪除模塊:自定義函

19、數(shù); RemoveByNum(int num)</p><p>  函數(shù)功能:對所選信息按編號刪除,刪除過后,后面記錄到編號將全部減1,記錄的編號即下標(biāo)。</p><p>  輸入?yún)?shù):int類型,返回值是int類型。num--int類型,表示define.h文件中定義的類型Rec_Con中數(shù)組record[]的下標(biāo),刪除過后,后面記錄到編號將全部減1,記錄的編號即下標(biāo)。后面的記錄全部向前

20、移動一個距離。</p><p>  2.3.2.3修改模塊:自定義修改函數(shù):Modify()</p><p>  函數(shù)功能:按名稱修改記錄,先判斷要查找的名稱所對應(yīng)的記錄是否存在,不存在則直接返回。</p><p>  無參函數(shù):返回值為int型</p><p>  2.3.3:統(tǒng)計模塊:</p><p>  函數(shù)原型

21、:ShowTotal( ) </p><p>  函數(shù)功能:顯示統(tǒng)計結(jié)果</p><p>  無參函數(shù):void 類型,無返回值。</p><p>  2.3.3.1 按類型統(tǒng)計:ShowType( )</p><p>  函數(shù)功能:按類型顯示統(tǒng)計結(jié)果</p><p>  無參函數(shù); void 類型,無返回值。

22、</p><p>  2.3.3.2按月顯示統(tǒng)計結(jié)果:</p><p>  函數(shù)原型:ShowMonth() </p><p>  函數(shù)功能:忽略了年,按月顯示統(tǒng)計結(jié)果</p><p>  無參函數(shù):void 類型,無返回值。</p><p>  2.3.3.3按年顯示統(tǒng)計結(jié)果:</p><p&g

23、t;  函數(shù)原型:ShowYear() </p><p>  函數(shù)功能:按年顯示統(tǒng)計結(jié)果</p><p>  無參函數(shù):void 類型,無返回值。</p><p><b>  3 詳細(xì)設(shè)計</b></p><p>  3.1 數(shù)據(jù)類型定義</p><p>  關(guān)鍵數(shù)據(jù)都定義在defin

24、e.h里</p><p>  #define MAX 100 //人為定義的一個上限</p><p>  typedef struct // 定義記錄結(jié)構(gòu)體,并重新命名類型名</p><p><b>  {</b></p><p>  int num; //編號&l

25、t;/p><p>  char times[11]; //時間</p><p>  char types[20]; //類別</p><p>  char name[20]; //品名</p><p>  double price; //單價</p><p> 

26、 int quantity; //數(shù)量</p><p>  double sum; //金額</p><p><b>  }Rec;</b></p><p>  typedef struct // 定義操作結(jié)構(gòu)體,并重新命名類型名</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、 {//定義一個查找時使用的共用體</p><p>  char times[11]; //存放按時間查找時輸入的時間</p><p>  char types[20]; //存放按類型查找時輸入的類型</p><p>  char name[20]; //存放按名稱查找時輸入的名稱</p>&

29、lt;p><b>  }found;</b></p><p>  //下面三個變量都是全局變量</p><p>  FILE *fp; //定義文件指針</p><p>  Rec_Con rs; //用來定義變量,避免了動態(tài)分配中的安全問題</p><p>  PRec_Con records=

30、&rs; //定義操作指針變量</p><p>  int type_count=0; //記錄里相關(guān)的類型數(shù)目</p><p>  int year_count=0; //記錄里相關(guān)的年數(shù)目</p><p>  char *ptype[MAX+1]; //字符型變量,記錄里相關(guān)的類型</p><p>  c

31、har pyear[MAX+1][5]; //字符型變量,記錄里相關(guān)的年</p><p>  char tmp[5]; //字符型變量,取年份所用</p><p>  char tmp01[5],tmp02[5]; //存放Get4的返回值,在比較時使用</p><p>  char c; //字符型變量,臨時使用變量,沒

32、有固定的限制</p><p>  3.2 ShowRec模塊實現(xiàn)</p><p>  1.算法思想:按編號, 時間,類別,品名,單價,數(shù)量,金額的順序打開文件,并顯示結(jié)果。其中提供分頁顯示功能。</p><p><b>  2.具體實現(xiàn):</b></p><p>  void OpenFile() //打開文件函數(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編號 時間 類別 品名 單價 數(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) //實現(xiàn)分頁功能</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更新模三個塊:</p><p>  更新包括內(nèi)容;插入,刪除,查找</p

42、><p>  1.算法思想:利用三個自定義函數(shù):int Insert() //插入函數(shù),int DeleteByNum() //按編號刪除,int Modify() //按名稱修改記錄。插入過程用MAX控制插入信息的范圍;刪除時按編號刪除,刪除過后,后面記錄到編號將全部減1,記錄的編號即下標(biāo)。修改時先利用int FindByName(char *name);按名稱查找記錄函數(shù),找到相關(guān)信息,若無此信息

43、直接跳轉(zhuǎn),否則修改。</p><p><b>  2.具體實現(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; //編號是連續(xù)的,</p><p>  printf("\n 時間 類別 品名 單價 數(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]!='-') //簡單的判斷一下日期是否符合格式要求</p><p><b>  {</b></p><p>  printf("時間格式錯誤,請重試!

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; //金額是計算所得</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) //刪除過后,后面記錄到編號將全部減1,記錄的編號即下標(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("位置錯誤!\n");</p><p><b>  return 0;<

52、;/b></p><p><b>  }</b></p><p>  for(i=num;i<records->total_count;i++) //i后面的記錄全部向前移動一個距離</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() //按編號刪除</p><p><b>  {</b></p><p><b>  int num;</b></p><p>  printf("請輸入要刪除記錄的

57、編號:");</p><p>  scanf("%d",&num);</p><p>  if(!(RemoveByNum(num)))</p><p><b>  {</b></p><p>  printf("程序執(zhí)行錯誤,刪除失?。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); //聲明按名稱查找記錄函數(shù),下面就要使用到</p><p>  int Modify() //按名稱修改記錄</p><p><b>  {</b></p><p><b>  int i;</b>

60、</p><p>  char names[20];</p><p>  printf("請輸入要修改的記錄名稱:");</p><p>  scanf("%s",names);</p><p>  i=FindByName(names);</p><p>  if(!i)

61、 //判斷要查找的名稱所對應(yīng)的記錄是否存在,不存在則直接跳轉(zhuǎn)</p><p><b>  return 0;</b></p><p>  printf("請輸入所需信息:\n");</p><p>  printf("\n 時間 類別 品名

62、 單價 數(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模塊實現(xiàn)</p><p>  ShowTotal包括三種方式:類型、月、年,以類型為例說明</p><p><b>  1、算法思想</b></p><p>  為確保不會溢出,保存統(tǒng)計結(jié)果的total數(shù)組定義長度為MAX,接下來對記錄集進(jìn)行遍歷,并與ptype[]

65、數(shù)組中統(tǒng)計的類型進(jìn)行比對,按照對應(yīng)的下標(biāo)將統(tǒng)計結(jié)果加到total[]數(shù)組中,這樣做便于輸出時一一對應(yīng)。</p><p> ?。◤?fù)雜算法用流程圖輔助說明)</p><p><b>  2、具體實現(xiàn)</b></p><p>  (給出實現(xiàn)算法的關(guān)鍵代碼)</p><p><b>  按類型顯示統(tǒng)計結(jié)果</b&

66、gt;</p><p>  void ShowType() {</p><p>  int i=1,j=0;</p><p>  double total[MAX]={0.0}; //定義保存統(tǒng)計結(jié)果的數(shù)組</p><p>  while(i<=records->total_count&&j<typ

67、e_count){ //遍歷并記錄統(tǒng)計結(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)計結(jié)果</b></p><p>  printf("按類型統(tǒng)計結(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測試結(jié)果及分析</b></p><p>  打開程序,進(jìn)入主界面</p><p>  輸入“1”,打開歷史消費記錄:</p><p>  輸入“1”,測試更新模塊:</p>&l

71、t;p>  輸入“1”,插入信息數(shù)據(jù):</p><p>  輸入“2”,按編號刪除數(shù)據(jù):</p><p>  輸入“3”,修改歷史信息;</p><p>  輸入“0”,返回主菜單:</p><p>  輸入“6”,測試統(tǒng)計結(jié)果;</p><p>  輸入“1”,按類別統(tǒng)計結(jié)果:</p><p

72、>  10,輸入“2”,按月顯示統(tǒng)計結(jié)果:</p><p>  輸入“3”,按年顯示統(tǒng)計結(jié)果:</p><p><b>  5.總結(jié)</b></p><p>  為期四天的課程設(shè)計結(jié)束了,其中的酸甜苦辣恐怕只有經(jīng)歷過的人才會懂得。其實課程設(shè)計的題目老師很早就發(fā)下來了,但由于自己時間觀念不強,沒有提前準(zhǔn)備,所以搞得開始做的時候發(fā)現(xiàn)很多東西都

73、不會,又臨時學(xué)占用了很多時間。下次一定要吸取教訓(xùn),不能臨時抱佛腳啊!此次課程設(shè)計雖然很難,但也讓我學(xué)到了很多東西。它讓我學(xué)會的不僅僅是怎么去編一個大的程序,更讓我學(xué)會了怎樣去開始做一件事,怎樣規(guī)劃自己的時間做好一件事。剛開始看到提示真的是一片茫然,不知如何下手,然后經(jīng)過自己上網(wǎng)查閱和看了一些課程設(shè)計的書之后漸漸有了一點眉目。這些對我的自學(xué)能力鍛煉很大。另外,在編程過程中也遇到了很多很多的問題,比如統(tǒng)計模塊的數(shù)組元素定義錯誤導(dǎo)致結(jié)果不能運

74、行,等等、、、我知道自己在C這條路上還有很長的路要走,但這次得課程設(shè)計無疑給了我更加堅定走下去的信心,他讓我體會了迷茫,煩躁,痛苦、、、但它也讓我學(xué)會了淡定,從容,堅持、、、它帶給我四個晚上熬夜到兩點半的記錄,它也帶給了我看到程序運行出結(jié)果的喜悅、、、程序中的各種各樣的錯誤曾經(jīng)讓我失望甚至絕望,想放棄,但同組的我們相互鼓勵視乎又看到了希望、、、在這次設(shè)計中還請教了幾個學(xué)計算機的高</p><p>  我認(rèn)為這次課

75、程設(shè)計對我們的鍛煉很大,它處在離考試只有三四天的時候,這么緊迫的時刻有這么短的時間,這大大的鍛煉了我們的時間安排能力和不急不躁心態(tài)。另外程序中還有很多不完善的地方,希望以后加強學(xué)習(xí)能夠?qū)⑵涓恼琳橥晟瓢?。非常感謝這次設(shè)計中給我們幫助的同學(xué),學(xué)長和老師!</p><p><b>  6.參考文獻(xiàn):</b></p><p>  參考文獻(xiàn):[1]譚浩強等.C語言程序設(shè)計

76、教程.北京:高等教育出版社,1997.[2]譚浩強.C程序設(shè)計.第2版.北京:清華大學(xué)出版社,1999.[3]徐士良.C程序設(shè)計教程附錄</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; //開始的時候使用char試了一下,有些功能不能實現(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); //聲明中間過程函數(shù)</p><p>  OpenFile("ab+");

80、 //打開文件并初始化數(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) //用一個死循環(huán)實現(xiàn)循環(huán)操作,只有選擇退出的時候才退出</p><p><b>  {</b></p><p>  system("cls");</p>

83、<p>  printf("--------消費記錄系統(tǒng)-------\n");</p><p>  printf("1--打開\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)計\n");</p><p>  printf("Other--退出\n");</p><p> 

85、 printf("請輸入操作序號:");</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)用中間過程函數(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--離開

95、\n");</p><p>  printf("請選擇:");</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("輸入有誤,請重試!\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--按時間查找\n");</p><p>  printf("2--按類型查找\n");</p><p>  printf("3--按名稱查找\n");</p><p>  printf("0--離開\n");

101、</p><p>  printf("請選擇:");</p><p>  scanf("%d",&mc);</p><p><b>  if(mc==1)</b></p><p><b>  {</b></p><p>  pr

102、intf("請輸入時間(format:2011-12-31):");</p><p>  scanf("%s",found.times);</p><p>  if(strlen(found.times)!=10||found.times[4]!='-'||found.times[7]!='-') //簡單的判斷

103、一下日期是否符合格式要求</p><p><b>  {</b></p><p>  printf("時間格式錯誤,請重試!\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("請輸入類型:");</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("請輸入名稱:");</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("輸入有誤,請重試!\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--按時間排序\n");</p>

113、;<p>  printf("2--按類型排序\n");</p><p>  printf("3--按金額排序\n");</p><p>  printf("0--離開\n");</p><p>  printf("請選擇:");</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("輸入有誤,請重試!\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 //人為定義的一個上限</p><p>  //#define DEBUG //控制調(diào)試信息的輸出</p

118、><p>  typedef struct</p><p><b>  {</b></p><p>  int num; //編號</p><p>  char times[11]; //時間</p><p>  char types[20];

119、//類別</p><p>  char name[20]; //品名</p><p>  double price; //單價</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>  //下面三個變量都是全局變量</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)的類型數(shù)目</p><p>  int year_count=0; //記錄里相關(guān)的年數(shù)目</p><p>  char *ptype[MAX+1]; //記錄里相關(guān)的類型</p><p>  char pyear[MAX+1][

124、5]; //記錄里相關(guān)的年</p><p>  char tmp[5]; //取年份所用</p><p>  char c; //使用頻率很高的一個變量,后來好像又沒聲明用了,先放著吧</p><p>  arc.h文件代碼:</p><p>  #include<string.h></

125、p><p>  void OpenFile(char * mode) //打開文件函數(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("編號\t

130、 日期\t\t 類型\t 名稱\t 單價 數(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) //實現(xiàn)分頁功能</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("編號\t 日期\t\t 類型\t 名稱\t 單價 數(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; //編號是連續(xù)的,1~n</p><p>  printf("請輸入所需信息(順序為

140、:時間,類別,品名,單價,數(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]!='-') //簡單的判斷一下日期是否符合格式要求</p><p><b>

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論