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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、/p><p>  4.3程序模塊數據結構。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4</p><p>  4.3.1菜單函數。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5</p><p>  4.3.2錄入數據。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

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

6、除并查詢數據。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11</p><p>  5、程序調試及簡要分析。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12</p><p>  6、心得體會及領悟。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。17</p><p>  參考文獻。。。。

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

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

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

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

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

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

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

14、;/b></p><p>  錄入數據函數(錄入數據主要通過鏈式2維數組直接錄入數據)</p><p>  修改數據函數(修改數據主要通過鏈式2維數組直接錄入數據)</p><p><b>  查詢數據函數</b></p><p><b>  刪除數據函數</b></p><

15、;p>  4.3.1 菜單函數 </p><p>  菜單函數通過menu()通過一個do--while語句,過濾掉錯誤的數字輸入,即,當輸入的數字大于4或者小于0的時候顯示輸入錯誤;再由一個swich語句,使菜單內選項可被輸入的數字操控,即,可由輸入的數字的不同而進行不同的操作。</p><p><b>  menu函數 : </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)設計…………\n\n");</p><p>  printf("1.錄 入 數 據。\n&

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

19、。\n");</p><p>  printf("請輸入要進行的操作: " );</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 錄入數據</p><p>  錄入數據模塊由兩個函數input和writeinfor實現,input函數實現通過鍵盤輸入需要記錄的月份的具體花費和收入等信息的功能,writeinfor函數將從鍵盤上輸入的信息存儲在文件中,

21、以便數據的查詢、修改、刪除等操作的進行。</p><p>  input函數:錄入數據</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函數中包含文件的打開、關閉以及文件的創(chuàng)建和文件的讀寫。通過一個if語句判斷是否滿足創(chuàng)建文件的條件,若無法創(chuàng)建文件,則跳出writeinfor函數,若創(chuàng)建成功,則將上一步input函數中輸入的信息儲存在創(chuàng)建好的文件中,并在顯

24、示屏上顯示“數據錄入成功”;fwrite(newI,sizeof(Infor),1,fp)函數阻止同一個月份的信息輸入兩次,若錄入兩次,則查詢時打開的文件信息為第一次錄入的信息,即,只有進行修改操作時才能更改錄入的月份中的信息,用戶不能妄想以重新輸入的方式改變已經錄入的數據信息。</p><p>  writeinfor函數 </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("錄入數據成功\n");</p><p><b>  }</b></p><p>  所用的數據結構:fwrite()函數,new1相當于一個指針而存儲的方式就如一個二維數組鏈式的存放數據。</p&g

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

29、出已經錄入好的數據信息。</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>  查詢數據界面如

36、圖4所示:</p><p><b>  圖4 查詢數據</b></p><p>  所用的數據結構:fread()函數,a相當于一個指針而存儲的方式就如一個二維數組鏈式的存放或讀取數據。作用和fwrite()函數一樣</p><p>  4.3.4 修改并查詢數據</p><p>  修改并查詢數據模塊中其主要作用的mo

37、dify函數,它的作用是先打開文件,將文件內的與輸入月份相對應的數據信息先顯示出來,然后再將其修改并重新存入文件中。修改之后再執(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>  修改數據界面如圖5所示:</p><p><

43、b>  圖5 修改后數據</b></p><p>  4.3.4 刪除并查詢數據</p><p>  刪除數據模塊通過 delRecord函數將錄入至文件中的信息刪除,刪除后若再查詢已刪除月份的數據信息,顯示屏上將顯示“沒有符合條件的記錄!”。</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>  刪除數據后查詢界面如圖8所示:</p><p>  圖8 刪除后查詢數據</p><p><b>  排序冒泡</b></p><p>  通過二維數組來存入數據并排序,運用冒泡排序算法進行操作</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>  所用的數據結構:定義一個鏈式的二維數字組來存儲數據,在通過for()語句來進行排序。</p><p><b>  程序調試及簡要分析</b></p><p>  程序調試主要針對input函數</p><p>  程序原始input函數:</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>  調試1.</b></p><p>  經過長時間的程序分析,我和同組組員發(fā)現程序內無判斷月份輸入是否合法的語句,所以我們進行了第一次調試,在input函數中添加了一個while語句以判斷輸入月份的合法性。</p><p>  經第一次調試后的input函數:</p><

59、;p>  void input(Infor *newI)</p><p><b>  {</b></p><p>  printf("\n請依次輸入數據:\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>  運行結果如圖10所示:</p><p>  圖10 第一次調試后的結果</p><p><b>  調試2:</b></p><p>  由圖我們可知,這次調試后的結果雖然避免的輸入不合法的月份信息,但是,卻帶來了新的問題,while語句進入了死循環(huán),用戶

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

63、換成if語句。</p><p>  經第二次調試后的input函數:</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>  運行結果如圖11所示</p><p>  圖11 保存至文件中 </p><p><b>  心得體會及領悟</b></p><p>  這次課程設計也讓我懂得

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論