个人账单管理系统数据结构课程设计.doc

上传人:土8路 文档编号:10386838 上传时间:2021-05-13 格式:DOC 页数:22 大小:552KB
返回 下载 相关 举报
个人账单管理系统数据结构课程设计.doc_第1页
第1页 / 共22页
个人账单管理系统数据结构课程设计.doc_第2页
第2页 / 共22页
个人账单管理系统数据结构课程设计.doc_第3页
第3页 / 共22页
个人账单管理系统数据结构课程设计.doc_第4页
第4页 / 共22页
个人账单管理系统数据结构课程设计.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《个人账单管理系统数据结构课程设计.doc》由会员分享,可在线阅读,更多相关《个人账单管理系统数据结构课程设计.doc(22页珍藏版)》请在三一文库上搜索。

1、沈阳航空航天大学 课课 程程 设设 计计 报报 告告 课程设计名称:数据结构课程设计数据结构课程设计 课程设计题目:个人账簿管理系统个人账簿管理系统 目目 录录 沈阳航空航天大学沈阳航空航天大学.I 1 1 课程设计介绍课程设计介绍.1 1.1 课程设计内容.1 1.2 课程设计要求.1 2 2 课程设计原理课程设计原理.2 2.1 课设题目粗略分析.2 2.2 原理图介绍.2 2.2.1 功能模块图.2 2.2.2 流程图分析.3 3 数据结构分析数据结构分析.7 3.1 存储结构.7 3.2 算法描述.7 4.1 调试过程.16 4.2 程序执行过程.16 参考文献参考文献.19 1 1

2、课程设计介绍课程设计介绍 1.11.1 课程设计内容课程设计内容 个人账簿管理系统记录某人每月的全部收入及各项开支情况,包括食品 消费,房租,子女教育费,水电费,医疗费,储蓄等。进入系统后可以输入 和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输 入的月份查询每月的收支情况。 1.21.2 课程设计要求课程设计要求 1. 采用链表结构管理收支情况,并能够保存到文件中; 2. 完成对每月的开支排序,以及完成系统查询功能; 3. 独立完成系统的设计,编码和调试; 4.系统利用 C 语言实现; 5.按照课程设计规范书写课程设计报告。 2 2 课程设计原理课程设计原理 2.12.1

3、课设题目粗略分析课设题目粗略分析 根据课设题目要求,拟将整体程序分为五大模块。以下是五个模块的大体分 析: 1. 账簿信息输入:该模块中,以带头结点的链表为账单信息的存储结构, 输入各项开支的数据。 2. 账簿信息排序:该模块中,将针对每月的消费总额进行从小到大的顺序 进行排序。 3. 账簿信息查询:该模块中,将输入或已排序账单进行按所输入的日期进 行查询并将查询结果打印至屏幕,供人阅读。 4. 账单信息更改:进入该模块,进行信息的更改或添加。 5. 账单信息保存:该模块将账单信息以文本文档保存到磁盘中。 2.2 原理图介绍原理图介绍 2.2.12.2.1 功能模块图功能模块图 个人账簿管理系

4、统 账 簿 信 息 查 询 账 簿 信 息 排 序 账 簿 信 息 更 改 账 簿 信 息 输 入 账 簿 信 息 保 存 图图 2.1 功能模块图功能模块图 2.2.2 流程图分析流程图分析 1. 账单建立时调用 jianli()函数,而在在 jianli()中调用 tianjia()函数; 账单的头结点的申请工作已在主函数中完成,所以在整个建立账单的过程中核心 内容是:将新的账单信息链接到已存在的账单后面;tianjia()函数流程图如图 2.2 所示。 开始并传入头指针 p-next!=NULL p=head p=p-next 是是 输入账单日期 否否 日期符合要求 开辟新的结点空间 是

5、是 输入账单的信息 p-next=tail p=p-next 返回 否否 图图 2.2 账单信息添加函数流程图账单信息添加函数流程图 2. 在对账单信息进行排序的过程中,采用的方法是:首先将账单中支出最 大和最小的两个结点寻找出来并按从小到大的顺序连接到一个新申请的头结点上; 再将原函数的各结点插入到新的链表中,最终新的链表就成为了排序后的新账单。 paixu()函数流程图如图 2.3 所示。 开始并传入头指针 q=head-next 指针q不为空 用指针p标记支出最少的结点 将p结点截取,链接到新申请的头结点 用指针p标记原链表支出最多的结点 将p结点截取,连接到新生成链表尾 q=head-

6、next 指针q不为空 q=q-next 将head-next 截取,与新链 表比较,插入 到新链表 是是 否否 是是 否否 提示用户 返回 返回新的头指针 输出账单信息 图图 2.3 排序函数流程图排序函数流程图 3. 进入账单信息查询部分,程序根据输入的日期进行逐一比较,若存在该日 期的账单信息,程序输出相应的账单信息,若不存在该日期的账单信息,系统提示 用户还未录入该日期的账单信息。账单查询函数流程图如图 2.4 所示。 开始并传入头指针 p=head-next p不为空 查询日期符合要求 提示用户还未录入账单 返回 输出账单信息 p=p-next 日期匹配 是是 否否 是是 否否 是

7、否否 图图 2.4 查询函数流程图查询函数流程图 4. 进入账单更改部分,程序将用户输入的需更改的账单日期与已存在的账 单日期进行逐步比对,对日期完全相同的账单信息进行更改,若不存在该日期的 账单信息,程序提示用户是否马上进行添加。流程图如图 2.5 所示。 开始并传入头指针 要更改的日期符合要求 结点p不空 该结点与要更改结点匹配 将p结点信息用新 输入的信息替换 是 否 p指向p下一结点 结束 是 调用tianjia() 进行添加否 图图 2.5 账单信息更改流程图账单信息更改流程图 5. 进入账单保存部分,用户对建立的账单以文本文档的形式保存到磁盘中, 账单信息保存函数流程图如图 2.6

8、 所示。 开始并传入头指针 指针p是否为空 将指针p指向头 结点的下一结点 提示用户账单未 建立,无法保存 结束 是 输入保存文件名 否 指针p是否为空 是 使用fprintf语句 将信息写入文件 p指向p的下一结点 否 图图 2.6 保存账单信息函数流程图保存账单信息函数流程图 3 数据结构分析数据结构分析 3.13.1 存储结构存储结构 主要存储结构:带头结点的单向链表存储结构。 typedef struct MYBILL /链表结点结构 long date; /日期信息 long food; /食品消费 long fangzu; /房租费用 long jiaoyu; /子女教育费 lon

9、g shuidian; /水电费 long yiliao; /医疗费 long chuxu; /储蓄 long pay; /总支出 long income; /总收入 struct MYBILL*next; /指向下一结点的指针 MYBILL,bill; 3.23.2 算法描述算法描述 1. 建立单向链表,用来存储账单信息:首先分别输入将要建立账单的年份及 月份,年份的合理范围定为所有正整数,当年份输入为非合理数字时结束对账单 的录入;月份的合理范围为 1 至 12,当输入不属于该范围的月份数据时,程序会 重新进行年份和月份的录入;录入日期数据后,进行其余信息的录入。 void *tianji

10、a(MYBILL *head) /向原链表添加新的链表结点 int i,j; /定义年份和月份变量 MYBILL *p,*tail; /定义结构体类型指针 p=head; /将指针 p 初始化为 head while(p-next!=NULL) /判断账单链表是否为仅含空头结点的链表 p=p-next; /将指针 p 向后移动一个单位 printf(nt 输入您要建立账单的年份,当输入非正数时结束输入!nt); scanf(%ld, /输入年份数据 while(i0) /判断输入的年份是否为合理数据 printf(nt 输入您要建立账单的月份nt); scanf(%d, /输入月份数据 if(

11、j0 /将年份和月份为转为一长整数字存储 tail-next=NULL; /新结点的指针域指向空 printf(nt 输入 食品费用:t); scanf(%ld, /输入食品费用 printf(nt 输入 房租:t); scanf(%ld, /输入房租费用 printf(nt 输入 子女教育费:); scanf(%ld, / 输入子女教育费 printf(nt 输入 水电费:t); scanf(%ld, /输入水电费 printf(nt 输入 医疗费:t); scanf(%ld, /输入医疗费 printf(nt 输入 储蓄:t); scanf(%ld, /输入存储 printf(nt 输入

12、总收入:t); scanf(%ld, /输入总收入tail- pay=tail-food+tail-fangzu+tail-jiaoyu+tail-shuidian+tail-yiliao; /将所有支出相加作为总支出 p-next=tail; /将新申请的结点链接到原链表的最尾端 p=p-next; /指针 p 向后移动一个单位 elseprintf(nt 输入月份不合理,请重新输入!nt); printf(nt 输入您要建立账单的年份,当输入非正数时结束输入!nt); scanf(%ld, /输入年份信息 MYBILL *jianli(MYBILL *head) /建立账单链表函数 MYB

13、ILL *head; /定义结构体类型指针 tianjia(head); /调用子函数 tianjia() if (head-next!=NULL) /判断账单链表是否为仅含空头结点的链表 printf(nttt=账单录入成功!=nn); else printf(nttt=没有账单录入!=nn); return head; /返回头指针 2. 账单排序,排序方法采用将所有数据中最小和最大值挑选出来,再将处于 这两个数据中间位置的其他数据进行插入。 MYBILL *paixu(MYBILL *head) /账单信息排序函数 long min,max; /定义两个变量对两个最值数据进行标记 int

14、 i,j; /年份月份定义 MYBILL *q,*t,*p,*head1; /定义结构体类型指针 q=head-next; /将 q 初始化为 head-next if(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

15、 小将其值赋给 min p=q-next; /用 p 标记支出最少的结点 t=q; /用 t 标记支出最少的结点的上一结点 以便摘除支出最少的结点 q=q-next; /将指针 q 向后移动一个单位 t-next=p-next; /将支出最少的结点摘下 head1=(bill *)malloc(sizeof(bill); /申请排序后链表头结点 head1-next=p; /将最小支出连接到新链表后作为第一个结点 p-next=NULL; /将新链表尾端指向空 q=head-next; /再次将 q 指向原链表头指针的后一结点 if(q!=NULL) /判断链表是否为只含头结点的空链表 max

16、=q-pay; /月支出最大结点为新排序账单的第二个结点 t=head; /初始化指针 t 的值 p=q; /初始化 p 的值 while (q-next!=NULL) /判断是否只存在最大最小支出外 if (maxnext-pay)/比较 max 与 q-next-pay 的大小 max=q-next-pay;/如果 p-next 的 pay 小将其值赋给 max p=q-next; /用指针 p 标记支出最多的结点 t=q; /用指针 t 标记支出最大的结点 以便摘除支出最多的结点 q=q-next;/将指针 q 向后移动一个单位长度 t-next=p-next; /摘掉支出最大的结点 h

17、ead1-next-next=p; /将最大支出连接到新链表后 p-next=NULL; /将新链表尾指向空 q=head-next; /第三次初始化指针 q while (q!=NULL) /依次从原表中摘取结点插入到新表,使其有序 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 重

18、新置于 head 后结点上 head=head1; /将新链表头指针赋给原链表头指针 p=head-next; /初始化 p while (p!=NULL) /输出排序后的结果 i=p-date/100; j=p-date%100; printf(ntt 日期:%d 年%d 月ntt 食品费用:%ldnt房租:%ldntt 子 女教育费:%ldntt 水电费:%ldntt 医疗费:%ldntt 储蓄:%ldntt 总支:%ldntt 收 入:%ldn,i,j,p-food,p-fangzu,p-jiaoyu,p-shuidian,p-yiliao,p-chuxu,p-pay,p- income

19、); p=p-next; else printf(nt 您还未建立账单,无法执行排序及查看操作!n); return head; 3.输入将要查询的日期,程序将输入的数据转化与账单信息比较,将符合的 账单信息输出。 void chaxun(MYBILL *head) /查询单月账单函数 long k; int i,j,m=0; MYBILL *p; if(head-next!=NULL) /判断账单是否为空账单 printf(nt 输入 0 退出查询,请输入您要查询的年份:); scanf(%d, /输入查询的年份 while(i0) /判断输入年份为合理数据 m=0; /使用 m 标记查询的

20、日期是否存在 p=head-next; printf(nt 请输入您要查询的月份:); scanf(%d, /输入查询的月份 if (j0 /变化 m 值,以表示存在记录 printf(ntt 日期:%d 年%d 月ntt 食品费用 :%ldntt 房租:%ldntt 子女教 育费:%ldntt 水电费:%ldntt 医疗费 :%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

21、) /依据 m 值判断是否查询成功 printf(nt 您查询的日期无记录!n); else printf(nnt 您输入的月份不合理!n); printf(nt 输入 0 退出查询,请输入您要查询的年份:); scanf(%ld, else printf(nt 您还没建立账单!n); 4.输入需更改的账单日期,进行更改,若不存在记录,程序设有添加功能。 MYBILL *genggai(MYBILL *head) /更改账单函数 long i,j,k; int m,s; MYBILL *p; p=head-next; printf(nt 输入 0 退出更改,请输入您要更改的年份:); scan

22、f(%ld, /输入更改账单的年份 while(i0) /判断年份合理与否 m=0; /使用 m 标记是否存在该日期账单记录 printf(nt 请输入您要更改的月份:); scanf(%ld, /输入更改账单的 if (j0 /输入更改后的账单信息 scanf(%ld, printf(nt 输入 房租:t); scanf(%ld, printf(nt 输入 子女教育费:); scanf(%ld, printf(nt 输入 水电费:t); scanf(%ld, printf(nt 输入 医疗费:t); scanf(%ld, printf(nt 输入 储蓄:t); scanf(%ld, prin

23、tf(nt 输入 总收入:t); scanf(%ld, 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, /输入提示的操作,选择是否添加账单信息 if (s=1)tianjia(head); /调用子函数技进行账单信息添加 else printf(nnt 您输入的月份不合理!n); printf(nt 输入 0 退出更改,

24、请输入您要更改的年份:); scanf(%ld, 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); exit(0); ch=getchar(); /接受文件名输

25、入后的回车符 while (p!=NULL) /判断账单是否为空 fprintf(fp,日期:%ld,食品费用:%ld ,房租:%d,子女教育费:%ld,水电费: %ld,医疗费:%ld,储蓄:%ld,总收入:%ld,p-date,p-food,p-fangzu,p-jiaoyu,p- shuidian,p-yiliao,p-chuxu,p-income); p=p-next; fclose(fp); /关闭文件 else printf(nt 您未建立新账单,无法保存!n); 4.14.1 调试过程调试过程 在调试程序是主要遇到的问题是:在程序最开始运行时,如果还没有建立账单 信息,则此时查询

26、、查看、更改和保存时由于没有头指针传入子函数,程序会出 现错误而停止运行。 解决方法:采用使用带有头结点的链表存储账单信息,在程序运行时即刻申 请头结点,在进入子函数后,对头结点后是否为空进行判断来判断是否已经录入 账单信息,从而避免了问题的再次发生。 4.24.2 程序执行过程程序执行过程 运行程序,运行结果如下图 输入 1,选择账单录入功能,结果如下图 输入账单的日期为 2012 年 1 月,分别输入各项开支,如下图 录入账单完成后,选择查询功能,如下图 输入查询日期 2012 年 1 月,运行结果如下图 返回主菜单后,选择账单存储,如下图 输入保存的文本文件名为 201201,如下图 文

27、本文件保存结果如下图 参考文献参考文献 1 严蔚敏,吴伟民. .数据结构M.北京:清华大学出版社,2007. 2 张长海,陈娟. .C 程序设计M.北京:高等教育出版社,2004. 3 谭浩强. .C 程序设计M .北京:清华大学出版社,2005. . 4 朱国进。程序设计与问题求解.北京:东华大学出版社,2004. 5陈国良。.并行计算结构算法.北京:高等教育出版社,1999 6石峰。. 程序设计基础. 北京:清华大学出版社,2003 7郝玉洁等. C 语言程序设计. 北京:机械工业出版社,2000 8高克宁等。.C 语言程序设计.北京:科学出版社,2003 课程设计总结:课程设计总结: 通过这次课程设计,使我对数据结构有了更加深入的认识,尤其在链表的 建立和使用方面又有了显著的巩固和提高,同时巩固了大一年学习的知识,尽 管在设计过程中遇到了一些困难,但通过查阅资料、请教老师、请教学长和同 学的方法,把一个又一个问题解决,成功地完成了课设题目。 这次课程设计练习了我的动手能力,让我意识到平时的上机练习是多么的 重要,同时,我更加的相信,只要努力就一定会有收获,只有掌握扎实的知识, 获得成功才会更加容易,因此,在进后的学习中我会加倍努力,从而令我的编 程努力得到更大的提升,让我编出的程序更加的完美。 指导教师评语: 指导教师(签字): 年 月 日 课程设计成绩

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1