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

下載本文檔

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

文檔簡介

1、沈陽航空航天大學課課 程程 設設 計計 報報 告告課程設計名稱:數據結構課程設計數據結構課程設計課程設計題目:個人賬簿管理系統(tǒng)個人賬簿管理系統(tǒng)目目 錄錄沈陽航空航天大學沈陽航空航天大學.i1 1 課程設計介紹課程設計介紹.11.1 課程設計內容.11.2 課程設計要求.12 2 課程設計原理課程設計原理.22.1 課設題目粗略分析.22.2 原理圖介紹.22.2.1 功能模塊圖.22.2.2 流程圖分析.33 數據結構分析數據結構分析.73.1 存儲結構.73.2 算法描述.74.1 調試過程.164.2 程序執(zhí)行過程.16參考文獻參考文獻.19 1 1 課程設計介紹課程設計介紹1.11.1

2、課程設計內容課程設計內容 個人賬簿管理系統(tǒng)記錄某人每月的全部收入及各項開支情況,包括食品消費,房租,子女教育費,水電費,醫(yī)療費,儲蓄等。進入系統(tǒng)后可以輸入和修改某月的收支情況,可以對每月的開支從小到大進行排序,可以根據輸入的月份查詢每月的收支情況。1.21.2 課程設計要求課程設計要求1. 采用鏈表結構管理收支情況,并能夠保存到文件中;2. 完成對每月的開支排序,以及完成系統(tǒng)查詢功能;3. 獨立完成系統(tǒng)的設計,編碼和調試;4.系統(tǒng)利用 c 語言實現;5.按照課程設計規(guī)范書寫課程設計報告。2 2 課程設計原理課程設計原理2.12.1 課設題目粗略分析課設題目粗略分析根據課設題目要求,擬將整體程序

3、分為五大模塊。以下是五個模塊的大體分析:1. 賬簿信息輸入:該模塊中,以帶頭結點的鏈表為賬單信息的存儲結構,輸入各項開支的數據。2. 賬簿信息排序:該模塊中,將針對每月的消費總額進行從小到大的順序進行排序。3. 賬簿信息查詢:該模塊中,將輸入或已排序賬單進行按所輸入的日期進行查詢并將查詢結果打印至屏幕,供人閱讀。4. 賬單信息更改:進入該模塊,進行信息的更改或添加。5. 賬單信息保存:該模塊將賬單信息以文本文檔保存到磁盤中。2.2 原理圖介紹原理圖介紹2.2.12.2.1 功能模塊圖功能模塊圖個人賬簿管理系統(tǒng)賬簿信息查詢賬簿信息排序賬簿信息更改賬簿信息輸入賬簿信息保存圖圖 2.1 功能模塊圖功

4、能模塊圖2.2.2 流程圖分析流程圖分析1. 賬單建立時調用 jianli()函數,而在在 jianli()中調用 tianjia()函數;賬單的頭結點的申請工作已在主函數中完成,所以在整個建立賬單的過程中核心內容是:將新的賬單信息鏈接到已存在的賬單后面;tianjia()函數流程圖如圖 2.2所示。 開始并傳入頭指針p-next!=nullp=headp=p-next是是輸入賬單日期否否日期符合要求開辟新的結點空間是是輸入賬單的信息p-next=tailp=p-next返回否否圖圖 2.2 賬單信息添加函數流程圖賬單信息添加函數流程圖2. 在對賬單信息進行排序的過程中,采用的方法是:首先將賬

5、單中支出最大和最小的兩個結點尋找出來并按從小到大的順序連接到一個新申請的頭結點上;再將原函數的各結點插入到新的鏈表中,最終新的鏈表就成為了排序后的新賬單。paixu()函數流程圖如圖 2.3 所示。開始并傳入頭指針q=head-next指針q不為空用指針p標記支出最少的結點將p結點截取,鏈接到新申請的頭結點用指針p標記原鏈表支出最多的結點將p結點截取,連接到新生成鏈表尾q=head-next指針q不為空q=q-next將head-next截取,與新鏈表比較,插入到新鏈表是是否否是是否否提示用戶返回返回新的頭指針輸出賬單信息圖圖 2.3 排序函數流程圖排序函數流程圖3. 進入賬單信息查詢部分,程

6、序根據輸入的日期進行逐一比較,若存在該日期的賬單信息,程序輸出相應的賬單信息,若不存在該日期的賬單信息,系統(tǒng)提示用戶還未錄入該日期的賬單信息。賬單查詢函數流程圖如圖 2.4 所示。開始并傳入頭指針p=head-nextp不為空查詢日期符合要求提示用戶還未錄入賬單返回輸出賬單信息p=p-next日期匹配是是否否是是否否是否否 圖圖 2.4 查詢函數流程圖查詢函數流程圖4. 進入賬單更改部分,程序將用戶輸入的需更改的賬單日期與已存在的賬單日期進行逐步比對,對日期完全相同的賬單信息進行更改,若不存在該日期的賬單信息,程序提示用戶是否馬上進行添加。流程圖如圖 2.5 所示。 開始并傳入頭指針要更改的日

7、期符合要求結點p不空該結點與要更改結點匹配將p結點信息用新輸入的信息替換是否p指向p下一結點結束是調用tianjia()進行添加否圖圖 2.5 賬單信息更改流程圖賬單信息更改流程圖5. 進入賬單保存部分,用戶對建立的賬單以文本文檔的形式保存到磁盤中,賬單信息保存函數流程圖如圖 2.6 所示。 開始并傳入頭指針指針p是否為空將指針p指向頭結點的下一結點提示用戶賬單未建立,無法保存結束是輸入保存文件名否指針p是否為空是使用fprintf語句將信息寫入文件p指向p的下一結點否 圖圖 2.6 保存賬單信息函數流程圖保存賬單信息函數流程圖3 數據結構分析數據結構分析3.13.1 存儲結構存儲結構主要存儲

8、結構:帶頭結點的單向鏈表存儲結構。typedef struct mybill /鏈表結點結構long date; /日期信息long food; /食品消費long fangzu; /房租費用 long jiaoyu; /子女教育費long shuidian; /水電費 long yiliao; /醫(yī)療費 long chuxu; /儲蓄long pay; /總支出long income; /總收入struct mybill*next; /指向下一結點的指針mybill,bill;3.23.2 算法描述算法描述1. 建立單向鏈表,用來存儲賬單信息:首先分別輸入將要建立賬單的年份及月份,年份的合理

9、范圍定為所有正整數,當年份輸入為非合理數字時結束對賬單的錄入;月份的合理范圍為 1 至 12,當輸入不屬于該范圍的月份數據時,程序會重新進行年份和月份的錄入;錄入日期數據后,進行其余信息的錄入。void *tianjia(mybill *head) /向原鏈表添加新的鏈表結點int i,j; /定義年份和月份變量mybill *p,*tail; /定義結構體類型指針p=head; /將指針 p 初始化為 headwhile(p-next!=null) /判斷賬單鏈表是否為僅含空頭結點的鏈表p=p-next; /將指針 p 向后移動一個單位printf(nt 輸入您要建立賬單的年份,當輸入非正數

10、時結束輸入!nt);scanf(%ld,&i); /輸入年份數據while(i0) /判斷輸入的年份是否為合理數據printf(nt 輸入您要建立賬單的月份nt);scanf(%d,&j); /輸入月份數據if(j0&jdate=100*i+j; /將年份和月份為轉為一長整數字存儲tail-next=null; /新結點的指針域指向空printf(nt 輸入 食品費用:t);scanf(%ld,&tail-food); /輸入食品費用printf(nt 輸入 房租:t);scanf(%ld,&tail-fangzu); /輸入房租費用printf(nt

11、輸入 子女教育費:);scanf(%ld,&tail-jiaoyu); / 輸入子女教育費printf(nt 輸入 水電費:t); scanf(%ld,&tail-shuidian); /輸入水電費printf(nt 輸入 醫(yī)療費:t);scanf(%ld,&tail-yiliao); /輸入醫(yī)療費printf(nt 輸入 儲蓄:t);scanf(%ld,&tail-chuxu); /輸入存儲printf(nt 輸入 總收入:t);scanf(%ld,&tail-income); /輸入總收入tail-pay=tail-food+tail-fangzu+

12、tail-jiaoyu+tail-shuidian+tail-yiliao;/將所有支出相加作為總支出p-next=tail; /將新申請的結點鏈接到原鏈表的最尾端p=p-next; /指針 p 向后移動一個單位elseprintf(nt 輸入月份不合理,請重新輸入!nt);printf(nt 輸入您要建立賬單的年份,當輸入非正數時結束輸入!nt);scanf(%ld,&i); /輸入年份信息mybill *jianli(mybill *head) /建立賬單鏈表函數mybill *head; /定義結構體類型指針tianjia(head); /調用子函數 tianjia()if (h

13、ead-next!=null) /判斷賬單鏈表是否為僅含空頭結點的鏈表printf(nttt=賬單錄入成功!=nn);elseprintf(nttt=沒有賬單錄入!=nn);return head; /返回頭指針 2. 賬單排序,排序方法采用將所有數據中最小和最大值挑選出來,再將處于這兩個數據中間位置的其他數據進行插入。mybill *paixu(mybill *head) /賬單信息排序函數long min,max; /定義兩個變量對兩個最值數據進行標記int i,j; /年份月份定義mybill *q,*t,*p,*head1; /定義結構體類型指針q=head-next; /將 q 初始

14、化為 head-nextif(head-next!=null) /判斷鏈表是否為只含頭結點的空鏈表min=q-pay; /第一結鏈表支出最少t=head; /初始化指針 t 的值p=q; /初始化 p 的值while (q-next!=null) /月支出最小結點為新排序賬單的第一個結點if (minq-next-pay) /比較 q 的 pay 和 q-next 的 pay 大小min=q-next-pay; /如果 p-next 的 pay 小將其值賦給 minp=q-next; /用 p 標記支出最少的結點t=q; /用 t 標記支出最少的結點的上一結點 以便摘除支出最少的結點q=q-n

15、ext; /將指針 q 向后移動一個單位t-next=p-next; /將支出最少的結點摘下head1=(bill *)malloc(sizeof(bill); /申請排序后鏈表頭結點head1-next=p; /將最小支出連接到新鏈表后作為第一個結點p-next=null; /將新鏈表尾端指向空q=head-next; /再次將 q 指向原鏈表頭指針的后一結點if(q!=null) /判斷鏈表是否為只含頭結點的空鏈表max=q-pay; /月支出最大結點為新排序賬單的第二個結點t=head; /初始化指針 t 的值p=q; /初始化 p 的值while (q-next!=null) /判斷是

16、否只存在最大最小支出外if (maxnext-pay)/比較 max 與 q-next-pay 的大小max=q-next-pay;/如果 p-next 的 pay 小將其值賦給 maxp=q-next; /用指針 p 標記支出最多的結點t=q; /用指針 t 標記支出最大的結點 以便摘除支出最多的結點q=q-next;/將指針 q 向后移動一個單位長度t-next=p-next; /摘掉支出最大的結點head1-next-next=p; /將最大支出連接到新鏈表后p-next=null; /將新鏈表尾指向空 q=head-next; /第三次初始化指針 qwhile (q!=null) /依

17、次從原表中摘取結點插入到新表,使其有序 head-next=q-next; /將 q 結點摘除p=head1-next; /初始化 p 指向新鏈表頭結點的下一結點while (q-payp-next-pay)/比較原鏈表與新鏈表支出p=p-next; /將新鏈表的 p 結點向后移動 q-next=p-next;/將 q 結點鏈接到 p 后p-next=q;q=head-next;/將 q 重新置于 head 后結點上head=head1; /將新鏈表頭指針賦給原鏈表頭指針p=head-next; /初始化 pwhile (p!=null) /輸出排序后的結果i=p-date/100;j=p-d

18、ate%100;printf(ntt 日期:%d 年%d 月ntt 食品費用:%ldnt房租:%ldntt 子女教育費:%ldntt 水電費:%ldntt 醫(yī)療費:%ldntt 儲蓄:%ldntt 總支:%ldntt 收入:%ldn,i,j,p-food,p-fangzu,p-jiaoyu,p-shuidian,p-yiliao,p-chuxu,p-pay,p-income);p=p-next;elseprintf(nt 您還未建立賬單,無法執(zhí)行排序及查看操作!n);return head;3.輸入將要查詢的日期,程序將輸入的數據轉化與賬單信息比較,將符合的賬單信息輸出。void chaxun

19、(mybill *head) /查詢單月賬單函數long k;int i,j,m=0;mybill *p;if(head-next!=null) /判斷賬單是否為空賬單printf(nt 輸入 0 退出查詢,請輸入您要查詢的年份:);scanf(%d,&i); /輸入查詢的年份while(i0) /判斷輸入年份為合理數據m=0; /使用 m 標記查詢的日期是否存在p=head-next; printf(nt 請輸入您要查詢的月份:);scanf(%d,&j); /輸入查詢的月份if (j0&jdate) /判斷是否存在輸入的日期信息 m+; /變化 m 值,以表示存在記

20、錄printf(ntt 日期:%d 年%d 月ntt 食品費用 :%ldntt 房租:%ldntt 子女教育費:%ldntt 水電費:%ldntt 醫(yī)療費 :%ldntt 儲蓄:%ldntt 總支出:%ldntt 收入:%ldn,i,j,p-food,p-fangzu,p-jiaoyu,p-shuidian,p-yiliao,p-chuxu,p-pay,p-income);break;p=p-next;if(m=0) /依據 m 值判斷是否查詢成功printf(nt 您查詢的日期無記錄!n);elseprintf(nnt 您輸入的月份不合理!n);printf(nt 輸入 0 退出查詢,請輸入

21、您要查詢的年份:);scanf(%ld,&i);elseprintf(nt 您還沒建立賬單!n);4.輸入需更改的賬單日期,進行更改,若不存在記錄,程序設有添加功能。 mybill *genggai(mybill *head) /更改賬單函數long i,j,k;int m,s;mybill *p;p=head-next;printf(nt 輸入 0 退出更改,請輸入您要更改的年份:);scanf(%ld,&i); /輸入更改賬單的年份while(i0) /判斷年份合理與否m=0; /使用 m 標記是否存在該日期賬單記錄printf(nt 請輸入您要更改的月份:);scanf(

22、%ld,&j); /輸入更改賬單的if (j0&jdate)printf(nt 輸入 食品費用:t); /輸入更改后的賬單信息scanf(%ld,&p-food);printf(nt 輸入 房租:t);scanf(%ld,&p-fangzu);printf(nt 輸入 子女教育費:);scanf(%ld,&p-jiaoyu);printf(nt 輸入 水電費:t);scanf(%ld,&p-shuidian);printf(nt 輸入 醫(yī)療費:t);scanf(%ld,&p-yiliao);printf(nt 輸入 儲蓄:t);scanf

23、(%ld,&p-chuxu);printf(nt 輸入 總收入:t);scanf(%ld,&p-income);p-pay=p-food+p-fangzu+p-jiaoyu+p-shuidian+p-yiliao;m+; /改變 m 值,標記已更改賬單信息break;p=p-next;if(m=0) /判斷是否更改成功printf(nt 您要更改的日期無記錄!是否立即添加?(1-是,其余鍵-否) );scanf(%d,&s); /輸入提示的操作,選擇是否添加賬單信息if (s=1)tianjia(head); /調用子函數技進行賬單信息添加else printf(nnt

24、 您輸入的月份不合理!n);printf(nt 輸入 0 退出更改,請輸入您要更改的年份:);scanf(%ld,&i);return head;6.以文本文檔形式保存賬單信息,保存路徑為程序所在位置。void xieru(mybill *head)file * fp;mybill *p;p=head-next;char ch,filename10;if(head-next!=null)printf(nt 輸入將要保存的文件名:); scanf(%s,filename); /輸入保存的文件名if (fp=fopen(filename,w)=null)printf(n 不能打開!n);e

25、xit(0);ch=getchar(); /接受文件名輸入后的回車符while (p!=null) /判斷賬單是否為空fprintf(fp,日期:%ld,食品費用:%ld ,房租:%d,子女教育費:%ld,水電費:%ld,醫(yī)療費:%ld,儲蓄:%ld,總收入:%ld,p-date,p-food,p-fangzu,p-jiaoyu,p-shuidian,p-yiliao,p-chuxu,p-income);p=p-next;fclose(fp); /關閉文件elseprintf(nt 您未建立新賬單,無法保存!n);4.14.1 調試過程調試過程在調試程序是主要遇到的問題是:在程序最開始運行時,如果還沒有建立賬單信息,則此時查詢、查看、更改和保存時由于沒有頭指針傳入子函數

溫馨提示

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

評論

0/150

提交評論