數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--個人賬簿管理系統(tǒng)_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  設(shè)計題目: 個人帳簿管理系統(tǒng)</p><p>  目 錄</p><p>  1、任務(wù)描述。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3</p><p>  2、問題分析。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3</p><p>

2、;  2.1 設(shè)計基礎(chǔ)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3</p><p>  2.2 分析設(shè)計課題的要求。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3</p><p>  課程設(shè)計目的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3</p&

3、gt;<p>  4、功能設(shè)計。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3</p><p>  4.1 算法思想描述。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3</p><p>  4.2程序流程圖。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4<

4、/p><p>  4.3程序模塊數(shù)據(jù)結(jié)構(gòu)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4</p><p>  4.3.1菜單函數(shù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5</p><p>  4.3.2錄入數(shù)據(jù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

5、。。。。。。。。。。。。。。。。。。。。。。。6</p><p>  4.3.3查詢數(shù)據(jù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。7</p><p>  4.3.4修改并查詢數(shù)據(jù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。9</p><p>  4.3.5刪

6、除并查詢數(shù)據(jù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11</p><p>  5、程序調(diào)試及簡要分析。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12</p><p>  6、心得體會及領(lǐng)悟。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。17</p><p>  參考文獻(xiàn)。。。。

7、。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。18</p><p><b>  1、任務(wù)描述</b></p><p>  個人帳簿管理系統(tǒng)記錄某人每月的全部收入及各項開支情況,包括食品消費,房租,子女教育費用,水電費,醫(yī)療費,儲蓄等。進(jìn)入系統(tǒng)后可以輸入和修改某月的收支情況,可以根據(jù)輸入的月份查詢每月的收支情況。</p>&l

8、t;p><b>  2、問題分析:</b></p><p><b>  2.1 設(shè)計基礎(chǔ):</b></p><p>  掌握對文件的插入、刪除、修改、排序等操作,建立一個文件,包括某人幾月內(nèi)的收支情況,能對文件中的信息進(jìn)行擴充(追加),修改和刪除,完成系統(tǒng)查詢功能.</p><p>  2.2分析設(shè)計課題的要求<

9、;/p><p>  ◆個人帳務(wù)數(shù)據(jù)由每月的收入及各項開支構(gòu)成,包括食品消費,房租,子女教育費用,水電 費,醫(yī)療費,儲蓄等;</p><p>  ◆可以輸入和修改某月的收支情況;</p><p>  ◆可以根據(jù)輸入的月份查詢每月的收支情況。</p><p><b>  3、課程設(shè)計目的</b></p><p

10、>  這個課題具體包含對文件的插入、刪除、修改、排序等操作,以及對數(shù)據(jù)元素的定義、調(diào)用等操作,在不斷地嘗試過程中,能夠熟練地進(jìn)行函數(shù)的編寫和調(diào)用。</p><p>  這一系列的操作,讓我們熟悉對文件的操作,以及對學(xué)過的知識的掌握與</p><p><b>  運用。</b></p><p><b>  4、功能設(shè)計</b

11、></p><p>  4.1算法思想描述:</p><p><b>  第一步——列出菜單</b></p><p>  函數(shù)功能劃分好,將對文件可進(jìn)行的操作列成菜單,便于用戶進(jìn)行選擇,讓界面更友好。</p><p><b>  第二步——輸入數(shù)據(jù)</b></p><p&g

12、t;  向文件內(nèi)寫入內(nèi)容,讓各元素都有初值。</p><p>  第三步——根據(jù)要實現(xiàn)的功能,調(diào)用相應(yīng)的函數(shù)</p><p>  初步完成總體設(shè)計,搭好框架,確定人機對話的界面,確定函數(shù)個數(shù);相應(yīng)的功能可調(diào)用相應(yīng)的函數(shù)來實現(xiàn)。</p><p>  第四步——建好主函數(shù)</p><p>  建立一個好的主函數(shù),將各功能都實現(xiàn)好。</p&g

13、t;<p><b>  4.2 程序流程圖</b></p><p><b>  圖1 流程圖</b></p><p>  4.3程序數(shù)據(jù)結(jié)構(gòu)模塊結(jié)構(gòu):</p><p>  由功能塊可將程序劃分為幾個模塊(即實現(xiàn)程序功能所需的函數(shù)):</p><p><b>  菜單函數(shù)<

14、;/b></p><p>  錄入數(shù)據(jù)函數(shù)(錄入數(shù)據(jù)主要通過鏈?zhǔn)?維數(shù)組直接錄入數(shù)據(jù))</p><p>  修改數(shù)據(jù)函數(shù)(修改數(shù)據(jù)主要通過鏈?zhǔn)?維數(shù)組直接錄入數(shù)據(jù))</p><p><b>  查詢數(shù)據(jù)函數(shù)</b></p><p><b>  刪除數(shù)據(jù)函數(shù)</b></p><

15、;p>  4.3.1 菜單函數(shù) </p><p>  菜單函數(shù)通過menu()通過一個do--while語句,過濾掉錯誤的數(shù)字輸入,即,當(dāng)輸入的數(shù)字大于4或者小于0的時候顯示輸入錯誤;再由一個swich語句,使菜單內(nèi)選項可被輸入的數(shù)字操控,即,可由輸入的數(shù)字的不同而進(jìn)行不同的操作。</p><p><b>  menu函數(shù) : </b></p>

16、<p>  void menu(void)</p><p><b>  {</b></p><p><b>  int item;</b></p><p><b>  int mon;</b></p><p><b>  Infor *a;</b&g

17、t;</p><p>  a=(Infor *)malloc(sizeof(Infor));</p><p><b>  do{</b></p><p>  printf("\n…………個人帳簿管理系統(tǒng)設(shè)計…………\n\n");</p><p>  printf("1.錄 入 數(shù) 據(jù)。\n&

18、quot;);</p><p>  printf("2.修 改 數(shù) 據(jù)。\n");</p><p>  printf("3.查 詢 數(shù) 據(jù)。\n");</p><p>  printf("4.刪 除 數(shù) 據(jù)。\n");</p><p>  printf("0.退 出 系 統(tǒng)

19、。\n");</p><p>  printf("請輸入要進(jìn)行的操作: " );</p><p>  scanf("%d",&item);</p><p>  }while(item>4 || item<0);</p><p>  swich() }

20、</p><p>  菜單界面顯示如圖2所示:</p><p>  圖2 菜單界面 </p><p>  4.3.2 錄入數(shù)據(jù)</p><p>  錄入數(shù)據(jù)模塊由兩個函數(shù)input和writeinfor實現(xiàn),input函數(shù)實現(xiàn)通過鍵盤輸入需要記錄的月份的具體花費和收入等信息的功能,writeinfor函數(shù)將從鍵盤上輸入的信息存儲在文件中,

21、以便數(shù)據(jù)的查詢、修改、刪除等操作的進(jìn)行。</p><p>  input函數(shù):錄入數(shù)據(jù)</p><p>  void input(Infor *newI)</p><p><b>  {</b></p><p>  printf("食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 收入費用\n&quo

22、t;);</p><p>  scanf("%d%d%d%d%d%d%d%d",&newI->month,&newI->spxf,&newI->fzfy,&newI->znjy,&newI->sdfy,&newI->ylfy,&newI->cxfy,&newI->srfy);<

23、/p><p>  fflush(stdin);</p><p><b>  }</b></p><p>  writeinfor函數(shù)中包含文件的打開、關(guān)閉以及文件的創(chuàng)建和文件的讀寫。通過一個if語句判斷是否滿足創(chuàng)建文件的條件,若無法創(chuàng)建文件,則跳出writeinfor函數(shù),若創(chuàng)建成功,則將上一步input函數(shù)中輸入的信息儲存在創(chuàng)建好的文件中,并在顯

24、示屏上顯示“數(shù)據(jù)錄入成功”;fwrite(newI,sizeof(Infor),1,fp)函數(shù)阻止同一個月份的信息輸入兩次,若錄入兩次,則查詢時打開的文件信息為第一次錄入的信息,即,只有進(jìn)行修改操作時才能更改錄入的月份中的信息,用戶不能妄想以重新輸入的方式改變已經(jīng)錄入的數(shù)據(jù)信息。</p><p>  writeinfor函數(shù) </p><p>  void writeinfor(Infor

25、 *newI)</p><p><b>  {</b></p><p><b>  FILE *fp;</b></p><p>  fp=fopen(FilePath1,"ab+");</p><p>  if(fp==NULL)</p><p><

26、b>  {</b></p><p>  printf("無法創(chuàng)建物件\n",FilePath1);</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  fwrite(newI,sizeof(Infor

27、),1,fp);</p><p>  fclose(fp);</p><p>  printf("錄入數(shù)據(jù)成功\n");</p><p><b>  }</b></p><p>  所用的數(shù)據(jù)結(jié)構(gòu):fwrite()函數(shù),new1相當(dāng)于一個指針而存儲的方式就如一個二維數(shù)組鏈?zhǔn)降拇娣艛?shù)據(jù)。</p&g

28、t;<p>  數(shù)據(jù)錄入成功界面如圖3所示:</p><p><b>  圖3 數(shù)據(jù)錄入成功</b></p><p>  4.3.3 查詢數(shù)據(jù)</p><p>  查詢數(shù)據(jù)模塊中包含一個search函數(shù),通過search函數(shù)查詢已經(jīng)錄入成功的月份包含的數(shù)據(jù)信息,若輸入的月份未經(jīng)錄入,則輸出提示語句---“無法找到文件”,反之,則輸

29、出已經(jīng)錄入好的數(shù)據(jù)信息。</p><p>  SStatus search(Infor *a)</p><p><b>  {</b></p><p>  FILE *fp1;</p><p><b>  int mon;</b></p><p>  int isfound=

30、0;</p><p>  printf("請輸入正確查詢的月份\n");</p><p>  scanf("%d",&mon);</p><p>  fflush(stdin); </p><p>  fp1=fopen(FilePath1,"rb+");</p>

31、<p>  if(fp1==NULL)</p><p><b>  {</b></p><p>  printf("無法找到文件\n",FilePath1);</p><p>  return Error; </p><p><b>  }</b></p>

32、;<p>  rewind(fp1);</p><p>  fread(a,sizeof(Infor),1,fp1);</p><p>  while(!feof(fp1)) {</p><p>  if(a->month==mon)</p><p><b>  {</b></p>

33、<p>  isfound=1; </p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b&

34、gt;</p><p>  isfound=0; </p><p><b>  }</b></p><p>  fread(a,sizeof(Infor),1,fp1);</p><p><b>  }</b></p><p>  fclose(fp1);</

35、p><p>  if(isfound)</p><p>  return OK;</p><p><b>  else</b></p><p>  return NotFound;</p><p><b>  }</b></p><p>  查詢數(shù)據(jù)界面如

36、圖4所示:</p><p><b>  圖4 查詢數(shù)據(jù)</b></p><p>  所用的數(shù)據(jù)結(jié)構(gòu):fread()函數(shù),a相當(dāng)于一個指針而存儲的方式就如一個二維數(shù)組鏈?zhǔn)降拇娣呕蜃x取數(shù)據(jù)。作用和fwrite()函數(shù)一樣</p><p>  4.3.4 修改并查詢數(shù)據(jù)</p><p>  修改并查詢數(shù)據(jù)模塊中其主要作用的mo

37、dify函數(shù),它的作用是先打開文件,將文件內(nèi)的與輸入月份相對應(yīng)的數(shù)據(jù)信息先顯示出來,然后再將其修改并重新存入文件中。修改之后再執(zhí)行查詢操作,顯示在顯示屏上的信息將變成修改后的信息。</p><p>  void modify(Infor *a,int mon){</p><p>  FILE *fp1,*fp2;</p><p><b>  Infor *

38、b;</b></p><p>  b=(Infor *)malloc(sizeof(Infor));</p><p>  fp1=fopen(FilePath1,"rt");</p><p>  fp2=fopen("temp.dat","wt+");</p><p> 

39、 rewind(fp1);</p><p>  fread(b,sizeof(Infor),1,fp1);</p><p>  while (!feof(fp1)) {</p><p>  if(b->month==mon)</p><p><b>  {</b></p><p>  

40、fwrite(a,sizeof(Infor),1,fp2);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  fwrite(b,sizeof(Infor),1,fp2); }&

41、lt;/p><p>  fread(b,sizeof(Infor),1,fp1);</p><p><b>  }</b></p><p>  fclose(fp1);</p><p>  fclose(fp2);</p><p>  remove(FilePath1); </p

42、><p>  rename("temp.dat",FilePath1);</p><p>  printf("修改成功\n" );</p><p>  changeFormat(); }</p><p>  修改數(shù)據(jù)界面如圖5所示:</p><p><

43、b>  圖5 修改后數(shù)據(jù)</b></p><p>  4.3.4 刪除并查詢數(shù)據(jù)</p><p>  刪除數(shù)據(jù)模塊通過 delRecord函數(shù)將錄入至文件中的信息刪除,刪除后若再查詢已刪除月份的數(shù)據(jù)信息,顯示屏上將顯示“沒有符合條件的記錄!”。</p><p>  void delRecord(int mon) {</p>

44、;<p>  FILE *fp1,*fp2;</p><p><b>  Infor *b;</b></p><p>  b=(Infor *)malloc(sizeof(Infor));</p><p>  fp1=fopen(FilePath1,"rt");</p><p>  fp

45、2=fopen("temp.dat","wt+");</p><p>  rewind(fp1);</p><p>  fread(b,sizeof(Infor),1,fp1);</p><p>  while (!feof(fp1)) {</p><p>  if(b->

46、month!=mon) </p><p>  fwrite(b,sizeof(Infor),1,fp2); </p><p>  fread(b,sizeof(Infor),1,fp1);</p><p><b>  }</b></p><p>  fclose(fp1);</p><p> 

47、 fclose(fp2);</p><p>  remove(FilePath1); </p><p>  rename("temp.dat",FilePath1);</p><p>  printf("刪除成功" );</p><p>  changeFormat();

48、 }</p><p>  刪除數(shù)據(jù)后查詢界面如圖8所示:</p><p>  圖8 刪除后查詢數(shù)據(jù)</p><p><b>  排序冒泡</b></p><p>  通過二維數(shù)組來存入數(shù)據(jù)并排序,運用冒泡排序算法進(jìn)行操作</p><p>  void paixu(Infor *a)</

49、p><p><b>  {</b></p><p>  int i=0,j=0,flag=0,t;</p><p>  pType px[8]={{0,0}};</p><p>  char str[8][12]={"記錄月份","食品消費","房租費用?",&q

50、uot;子女費用","水電費用","醫(yī)療費用","儲蓄費用","本月收入"};</p><p>  for(;i<8;i++)</p><p>  px[i].no=i;</p><p>  px[0].data=a->month;</p><p

51、>  px[1].data=a->spxf;</p><p>  px[2].data=a->fzfy;</p><p>  px[3].data=a->znjy;</p><p>  px[4].data=a->sdfy;</p><p>  px[5].data=a->ylfy;</p>

52、<p>  px[6].data=a->cxfy;</p><p>  px[7].data=a->srfy;</p><p>  for(i=1;i<8;i++)//冒泡排序</p><p><b>  {</b></p><p><b>  flag=0;</b>&l

53、t;/p><p>  for(j=0;j<8-i;j++)</p><p>  if(px[j].data>px[j+1].data)</p><p><b>  {</b></p><p>  t=px[j].data;</p><p>  px[j].data=px[j+1].data

54、;</p><p>  px[j+1].data=t;</p><p>  t=px[j].no;</p><p>  px[j].no=px[j+1].no;</p><p>  px[j+1].no=t;</p><p><b>  flag=1;</b></p><p&g

55、t;<b>  }</b></p><p>  所用的數(shù)據(jù)結(jié)構(gòu):定義一個鏈?zhǔn)降亩S數(shù)字組來存儲數(shù)據(jù),在通過for()語句來進(jìn)行排序。</p><p><b>  程序調(diào)試及簡要分析</b></p><p>  程序調(diào)試主要針對input函數(shù)</p><p>  程序原始input函數(shù):</p&

56、gt;<p>  void input(Infor *newI)</p><p><b>  {</b></p><p>  printf("食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 收入費用\n");</p><p>  scanf("%d%d%d%d%d%d%d%d",

57、&newI->month,&newI->spxf,&newI->fzfy,&newI->znjy,&newI->sdfy,&newI->ylfy,&newI->cxfy,&newI->srfy);</p><p>  fflush(stdin);</p><p><b>

58、;  }</b></p><p><b>  調(diào)試1.</b></p><p>  經(jīng)過長時間的程序分析,我和同組組員發(fā)現(xiàn)程序內(nèi)無判斷月份輸入是否合法的語句,所以我們進(jìn)行了第一次調(diào)試,在input函數(shù)中添加了一個while語句以判斷輸入月份的合法性。</p><p>  經(jīng)第一次調(diào)試后的input函數(shù):</p><

59、;p>  void input(Infor *newI)</p><p><b>  {</b></p><p>  printf("\n請依次輸入數(shù)據(jù):\n( 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 收入費用)\n");</p><p>  scanf("%d%d%d%d%d%d%d%d

60、",&newI->month,&newI->spxf,&newI->fzfy,&newI->znjy,&newI->sdfy,&newI->ylfy,&newI->cxfy,&newI->srfy);</p><p>  fflush(stdin);</p><p>&

61、lt;b>  }</b></p><p>  運行結(jié)果如圖10所示:</p><p>  圖10 第一次調(diào)試后的結(jié)果</p><p><b>  調(diào)試2:</b></p><p>  由圖我們可知,這次調(diào)試后的結(jié)果雖然避免的輸入不合法的月份信息,但是,卻帶來了新的問題,while語句進(jìn)入了死循環(huán),用戶

62、將無法進(jìn)行其他的操作。</p><p>  通過對程序的進(jìn)一步研究,我們發(fā)現(xiàn),while語句運行的條件是當(dāng)滿足while后面括號內(nèi)的信息時就進(jìn)入循環(huán),而我們輸入月份的語句在while語句之外,即,整個函數(shù)只可能執(zhí)行一次input函數(shù),即此次調(diào)試后,我們只能輸入一次月份值,而當(dāng)這個月份值滿足while語句的條件時,我們將無限循環(huán)while語句內(nèi)的操作,即,進(jìn)入了死循環(huán)。所以,我們進(jìn)行了第二次調(diào)試,將while語句替

63、換成if語句。</p><p>  經(jīng)第二次調(diào)試后的input函數(shù):</p><p>  void input(Infor *newI)</p><p><b>  {</b></p><p>  printf(" 食品消費 房租費用 子女費用 水電費用 醫(yī)療費用 儲蓄費用 收入費用\n");<

64、/p><p>  scanf("%d%d%d%d%d%d%d%d",&newI->month,&newI->spxf,&newI->fzfy,&newI->znjy,&newI->sdfy,&newI->ylfy,&newI->cxfy,&newI->srfy);</p>

65、<p>  fflush(stdin);</p><p><b>  }</b></p><p>  運行結(jié)果如圖11所示</p><p>  圖11 保存至文件中 </p><p><b>  心得體會及領(lǐng)悟</b></p><p>  這次課程設(shè)計也讓我懂得

66、了團(tuán)結(jié)合作的重要性,這次課程的完成依賴于我的同伴,以及我們之間的默契,這次課程設(shè)計讓我知道了我在C語言、C++方面的缺陷,以及我那粗心的態(tài)度。像這個個人賬簿管理的程序設(shè)計,包含我們這一年半時間學(xué)過的內(nèi)容,最主要的是第一學(xué)年所學(xué)的文件知識,文件的創(chuàng)建、修改、打開以及關(guān)閉等功能。</p><p>  這次課程設(shè)計,使得我將差不多已經(jīng)遺忘的知識點又從記憶邊緣拉了回來,可以說是起到了溫故而知新的效果,所以,我認(rèn)為,課程設(shè)

67、計是必須的,是有助于我們將知識點鞏固起來的一種方法。</p><p>  在課程設(shè)計過程中,我學(xué)到了很多人生的哲理,懂得怎么樣去制定計劃,怎么樣去實現(xiàn)這個計劃,并掌握了在執(zhí)行過程中怎么樣去克服心理上的不良情緒,黑夜過去了,我們收獲的是黎明。</p><p><b>  參考文獻(xiàn):</b></p><p>  數(shù)據(jù)結(jié)構(gòu)C語言版

溫馨提示

  • 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

提交評論