




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、沈陽航空航天大學課課 程程 設(shè)設(shè) 計計 報報 告告課程設(shè)計名稱:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計數(shù)據(jù)結(jié)構(gòu)課程設(shè)計課程設(shè)計題目:個人賬簿管理系統(tǒng)個人賬簿管理系統(tǒng)目目 錄錄沈陽航空航天大學沈陽航空航天大學.i1 1 課程設(shè)計介紹課程設(shè)計介紹.11.1 課程設(shè)計內(nèi)容.11.2 課程設(shè)計要求.12 2 課程設(shè)計原理課程設(shè)計原理.22.1 課設(shè)題目粗略分析.22.2 原理圖介紹.22.2.1 功能模塊圖.22.2.2 流程圖分析.33 數(shù)據(jù)結(jié)構(gòu)分析數(shù)據(jù)結(jié)構(gòu)分析.73.1 存儲結(jié)構(gòu).73.2 算法描述.74.1 調(diào)試過程.164.2 程序執(zhí)行過程.16參考文獻參考文獻.19 1 1 課程設(shè)計介紹課程設(shè)計介紹1.11.1
2、課程設(shè)計內(nèi)容課程設(shè)計內(nèi)容 個人賬簿管理系統(tǒng)記錄某人每月的全部收入及各項開支情況,包括食品消費,房租,子女教育費,水電費,醫(yī)療費,儲蓄等。進入系統(tǒng)后可以輸入和修改某月的收支情況,可以對每月的開支從小到大進行排序,可以根據(jù)輸入的月份查詢每月的收支情況。1.21.2 課程設(shè)計要求課程設(shè)計要求1. 采用鏈表結(jié)構(gòu)管理收支情況,并能夠保存到文件中;2. 完成對每月的開支排序,以及完成系統(tǒng)查詢功能;3. 獨立完成系統(tǒng)的設(shè)計,編碼和調(diào)試;4.系統(tǒng)利用 c 語言實現(xiàn);5.按照課程設(shè)計規(guī)范書寫課程設(shè)計報告。2 2 課程設(shè)計原理課程設(shè)計原理2.12.1 課設(shè)題目粗略分析課設(shè)題目粗略分析根據(jù)課設(shè)題目要求,擬將整體程序
3、分為五大模塊。以下是五個模塊的大體分析:1. 賬簿信息輸入:該模塊中,以帶頭結(jié)點的鏈表為賬單信息的存儲結(jié)構(gòu),輸入各項開支的數(shù)據(jù)。2. 賬簿信息排序:該模塊中,將針對每月的消費總額進行從小到大的順序進行排序。3. 賬簿信息查詢:該模塊中,將輸入或已排序賬單進行按所輸入的日期進行查詢并將查詢結(jié)果打印至屏幕,供人閱讀。4. 賬單信息更改:進入該模塊,進行信息的更改或添加。5. 賬單信息保存:該模塊將賬單信息以文本文檔保存到磁盤中。2.2 原理圖介紹原理圖介紹2.2.12.2.1 功能模塊圖功能模塊圖個人賬簿管理系統(tǒng)賬簿信息查詢賬簿信息排序賬簿信息更改賬簿信息輸入賬簿信息保存圖圖 2.1 功能模塊圖功
4、能模塊圖2.2.2 流程圖分析流程圖分析1. 賬單建立時調(diào)用 jianli()函數(shù),而在在 jianli()中調(diào)用 tianjia()函數(shù);賬單的頭結(jié)點的申請工作已在主函數(shù)中完成,所以在整個建立賬單的過程中核心內(nèi)容是:將新的賬單信息鏈接到已存在的賬單后面;tianjia()函數(shù)流程圖如圖 2.2所示。 開始并傳入頭指針p-next!=nullp=headp=p-next是是輸入賬單日期否否日期符合要求開辟新的結(jié)點空間是是輸入賬單的信息p-next=tailp=p-next返回否否圖圖 2.2 賬單信息添加函數(shù)流程圖賬單信息添加函數(shù)流程圖2. 在對賬單信息進行排序的過程中,采用的方法是:首先將賬
5、單中支出最大和最小的兩個結(jié)點尋找出來并按從小到大的順序連接到一個新申請的頭結(jié)點上;再將原函數(shù)的各結(jié)點插入到新的鏈表中,最終新的鏈表就成為了排序后的新賬單。paixu()函數(shù)流程圖如圖 2.3 所示。開始并傳入頭指針q=head-next指針q不為空用指針p標記支出最少的結(jié)點將p結(jié)點截取,鏈接到新申請的頭結(jié)點用指針p標記原鏈表支出最多的結(jié)點將p結(jié)點截取,連接到新生成鏈表尾q=head-next指針q不為空q=q-next將head-next截取,與新鏈表比較,插入到新鏈表是是否否是是否否提示用戶返回返回新的頭指針輸出賬單信息圖圖 2.3 排序函數(shù)流程圖排序函數(shù)流程圖3. 進入賬單信息查詢部分,程
6、序根據(jù)輸入的日期進行逐一比較,若存在該日期的賬單信息,程序輸出相應(yīng)的賬單信息,若不存在該日期的賬單信息,系統(tǒng)提示用戶還未錄入該日期的賬單信息。賬單查詢函數(shù)流程圖如圖 2.4 所示。開始并傳入頭指針p=head-nextp不為空查詢?nèi)掌诜弦筇崾居脩暨€未錄入賬單返回輸出賬單信息p=p-next日期匹配是是否否是是否否是否否 圖圖 2.4 查詢函數(shù)流程圖查詢函數(shù)流程圖4. 進入賬單更改部分,程序?qū)⒂脩糨斎氲男韪牡馁~單日期與已存在的賬單日期進行逐步比對,對日期完全相同的賬單信息進行更改,若不存在該日期的賬單信息,程序提示用戶是否馬上進行添加。流程圖如圖 2.5 所示。 開始并傳入頭指針要更改的日
7、期符合要求結(jié)點p不空該結(jié)點與要更改結(jié)點匹配將p結(jié)點信息用新輸入的信息替換是否p指向p下一結(jié)點結(jié)束是調(diào)用tianjia()進行添加否圖圖 2.5 賬單信息更改流程圖賬單信息更改流程圖5. 進入賬單保存部分,用戶對建立的賬單以文本文檔的形式保存到磁盤中,賬單信息保存函數(shù)流程圖如圖 2.6 所示。 開始并傳入頭指針指針p是否為空將指針p指向頭結(jié)點的下一結(jié)點提示用戶賬單未建立,無法保存結(jié)束是輸入保存文件名否指針p是否為空是使用fprintf語句將信息寫入文件p指向p的下一結(jié)點否 圖圖 2.6 保存賬單信息函數(shù)流程圖保存賬單信息函數(shù)流程圖3 數(shù)據(jù)結(jié)構(gòu)分析數(shù)據(jù)結(jié)構(gòu)分析3.13.1 存儲結(jié)構(gòu)存儲結(jié)構(gòu)主要存儲
8、結(jié)構(gòu):帶頭結(jié)點的單向鏈表存儲結(jié)構(gòu)。typedef struct mybill /鏈表結(jié)點結(jié)構(gòu)long date; /日期信息long food; /食品消費long fangzu; /房租費用 long jiaoyu; /子女教育費long shuidian; /水電費 long yiliao; /醫(yī)療費 long chuxu; /儲蓄long pay; /總支出long income; /總收入struct mybill*next; /指向下一結(jié)點的指針mybill,bill;3.23.2 算法描述算法描述1. 建立單向鏈表,用來存儲賬單信息:首先分別輸入將要建立賬單的年份及月份,年份的合理
9、范圍定為所有正整數(shù),當年份輸入為非合理數(shù)字時結(jié)束對賬單的錄入;月份的合理范圍為 1 至 12,當輸入不屬于該范圍的月份數(shù)據(jù)時,程序會重新進行年份和月份的錄入;錄入日期數(shù)據(jù)后,進行其余信息的錄入。void *tianjia(mybill *head) /向原鏈表添加新的鏈表結(jié)點int i,j; /定義年份和月份變量mybill *p,*tail; /定義結(jié)構(gòu)體類型指針p=head; /將指針 p 初始化為 headwhile(p-next!=null) /判斷賬單鏈表是否為僅含空頭結(jié)點的鏈表p=p-next; /將指針 p 向后移動一個單位printf(nt 輸入您要建立賬單的年份,當輸入非正數(shù)
10、時結(jié)束輸入!nt);scanf(%ld,&i); /輸入年份數(shù)據(jù)while(i0) /判斷輸入的年份是否為合理數(shù)據(jù)printf(nt 輸入您要建立賬單的月份nt);scanf(%d,&j); /輸入月份數(shù)據(jù)if(j0&jdate=100*i+j; /將年份和月份為轉(zhuǎn)為一長整數(shù)字存儲tail-next=null; /新結(jié)點的指針域指向空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; /將新申請的結(jié)點鏈接到原鏈表的最尾端p=p-next; /指針 p 向后移動一個單位elseprintf(nt 輸入月份不合理,請重新輸入!nt);printf(nt 輸入您要建立賬單的年份,當輸入非正數(shù)時結(jié)束輸入!nt);scanf(%ld,&i); /輸入年份信息mybill *jianli(mybill *head) /建立賬單鏈表函數(shù)mybill *head; /定義結(jié)構(gòu)體類型指針tianjia(head); /調(diào)用子函數(shù) tianjia()if (h
13、ead-next!=null) /判斷賬單鏈表是否為僅含空頭結(jié)點的鏈表printf(nttt=賬單錄入成功!=nn);elseprintf(nttt=沒有賬單錄入!=nn);return head; /返回頭指針 2. 賬單排序,排序方法采用將所有數(shù)據(jù)中最小和最大值挑選出來,再將處于這兩個數(shù)據(jù)中間位置的其他數(shù)據(jù)進行插入。mybill *paixu(mybill *head) /賬單信息排序函數(shù)long min,max; /定義兩個變量對兩個最值數(shù)據(jù)進行標記int i,j; /年份月份定義mybill *q,*t,*p,*head1; /定義結(jié)構(gòu)體類型指針q=head-next; /將 q 初始
14、化為 head-nextif(head-next!=null) /判斷鏈表是否為只含頭結(jié)點的空鏈表min=q-pay; /第一結(jié)鏈表支出最少t=head; /初始化指針 t 的值p=q; /初始化 p 的值while (q-next!=null) /月支出最小結(jié)點為新排序賬單的第一個結(jié)點if (minq-next-pay) /比較 q 的 pay 和 q-next 的 pay 大小min=q-next-pay; /如果 p-next 的 pay 小將其值賦給 minp=q-next; /用 p 標記支出最少的結(jié)點t=q; /用 t 標記支出最少的結(jié)點的上一結(jié)點 以便摘除支出最少的結(jié)點q=q-n
15、ext; /將指針 q 向后移動一個單位t-next=p-next; /將支出最少的結(jié)點摘下head1=(bill *)malloc(sizeof(bill); /申請排序后鏈表頭結(jié)點head1-next=p; /將最小支出連接到新鏈表后作為第一個結(jié)點p-next=null; /將新鏈表尾端指向空q=head-next; /再次將 q 指向原鏈表頭指針的后一結(jié)點if(q!=null) /判斷鏈表是否為只含頭結(jié)點的空鏈表max=q-pay; /月支出最大結(jié)點為新排序賬單的第二個結(jié)點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 標記支出最多的結(jié)點t=q; /用指針 t 標記支出最大的結(jié)點 以便摘除支出最多的結(jié)點q=q-next;/將指針 q 向后移動一個單位長度t-next=p-next; /摘掉支出最大的結(jié)點head1-next-next=p; /將最大支出連接到新鏈表后p-next=null; /將新鏈表尾指向空 q=head-next; /第三次初始化指針 qwhile (q!=null) /依
17、次從原表中摘取結(jié)點插入到新表,使其有序 head-next=q-next; /將 q 結(jié)點摘除p=head1-next; /初始化 p 指向新鏈表頭結(jié)點的下一結(jié)點while (q-payp-next-pay)/比較原鏈表與新鏈表支出p=p-next; /將新鏈表的 p 結(jié)點向后移動 q-next=p-next;/將 q 結(jié)點鏈接到 p 后p-next=q;q=head-next;/將 q 重新置于 head 后結(jié)點上head=head1; /將新鏈表頭指針賦給原鏈表頭指針p=head-next; /初始化 pwhile (p!=null) /輸出排序后的結(jié)果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.輸入將要查詢的日期,程序?qū)⑤斎氲臄?shù)據(jù)轉(zhuǎn)化與賬單信息比較,將符合的賬單信息輸出。void chaxun
19、(mybill *head) /查詢單月賬單函數(shù)long k;int i,j,m=0;mybill *p;if(head-next!=null) /判斷賬單是否為空賬單printf(nt 輸入 0 退出查詢,請輸入您要查詢的年份:);scanf(%d,&i); /輸入查詢的年份while(i0) /判斷輸入年份為合理數(shù)據(jù)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) /依據(jù) m 值判斷是否查詢成功printf(nt 您查詢的日期無記錄!n);elseprintf(nnt 您輸入的月份不合理!n);printf(nt 輸入 0 退出查詢,請輸入
21、您要查詢的年份:);scanf(%ld,&i);elseprintf(nt 您還沒建立賬單!n);4.輸入需更改的賬單日期,進行更改,若不存在記錄,程序設(shè)有添加功能。 mybill *genggai(mybill *head) /更改賬單函數(shù)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); /調(diào)用子函數(shù)技進行賬單信息添加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); /關(guān)閉文件elseprintf(nt 您未建立新賬單,無法保存!n);4.14.1 調(diào)試過程調(diào)試過程在調(diào)試程序是主要遇到的問題是:在程序最開始運行時,如果還沒有建立賬單信息,則此時查詢、查看、更改和保存時由于沒有頭指針傳入子函數(shù)
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 模塊化舞臺設(shè)計服務(wù)行業(yè)跨境出海戰(zhàn)略研究報告
- 模塊化建筑現(xiàn)場管理系統(tǒng)企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 硫化鋁企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 米醋企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 鉆石項鏈企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 2025年建筑涂料色漿項目發(fā)展計劃
- 平車整車鐵路貨運企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略研究報告
- 紙企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 倉儲籠企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略研究報告
- 2025年化學材料:灌漿料合作協(xié)議書
- 《西方經(jīng)濟學》(上冊)課程教案
- 移動政企部年終總結(jié)
- 施工合同協(xié)議書樣本
- 醫(yī)學綜合題庫(含答案)
- 工會一函兩書模板
- 四年級語文下冊第六單元【集體備課】(教材解讀+教學設(shè)計)
- 2024版義務(wù)教育小學科學課程標準
- 當代青年心態(tài)問題研究報告
- 《籃球防守戰(zhàn)術(shù)基礎(chǔ)配合》教案(三篇)
- 專利申請文件-審查意見的答復(fù)
- 衛(wèi)生院醫(yī)院管理提升年活動方案例文
評論
0/150
提交評論