个人账单管理系统数据结构课程设计.doc
《个人账单管理系统数据结构课程设计.doc》由会员分享,可在线阅读,更多相关《个人账单管理系统数据结构课程设计.doc(22页珍藏版)》请在三一办公上搜索。
1、沈阳航空航天大学课 程 设 计 报 告课程设计名称:数据结构课程设计课程设计题目:个人账簿管理系统目 录沈阳航空航天大学I1 课程设计介绍11.1 课程设计内容11.2 课程设计要求12 课程设计原理22.1 课设题目粗略分析22.2 原理图介绍22.2.1 功能模块图22.2.2 流程图分析33 数据结构分析73.1 存储结构73.2 算法描述74.1 调试过程164.2程序执行过程16参考文献19 1 课程设计介绍1.1 课程设计内容 个人账簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费,水电费,医疗费,储蓄等。进入系统后可以输入和修改某月的收支情况,可以对
2、每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情况。1.2 课程设计要求1. 采用链表结构管理收支情况,并能够保存到文件中;2. 完成对每月的开支排序,以及完成系统查询功能;3. 独立完成系统的设计,编码和调试;4. 系统利用C语言实现;5. 按照课程设计规范书写课程设计报告。2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为五大模块。以下是五个模块的大体分析:1. 账簿信息输入:该模块中,以带头结点的链表为账单信息的存储结构,输入各项开支的数据。2. 账簿信息排序:该模块中,将针对每月的消费总额进行从小到大的顺序进行排序。3. 账簿信息查询:该模块中,将
3、输入或已排序账单进行按所输入的日期进行查询并将查询结果打印至屏幕,供人阅读。4. 账单信息更改:进入该模块,进行信息的更改或添加。5. 账单信息保存:该模块将账单信息以文本文档保存到磁盘中。2.2 原理图介绍2.2.1 功能模块图图2.1功能模块图2.2.2 流程图分析1. 账单建立时调用jianli()函数,而在在jianli()中调用tianjia()函数;账单的头结点的申请工作已在主函数中完成,所以在整个建立账单的过程中核心内容是:将新的账单信息链接到已存在的账单后面;tianjia()函数流程图如图2.2所示。 图2.2账单信息添加函数流程图2. 在对账单信息进行排序的过程中,采用的方
4、法是:首先将账单中支出最大和最小的两个结点寻找出来并按从小到大的顺序连接到一个新申请的头结点上;再将原函数的各结点插入到新的链表中,最终新的链表就成为了排序后的新账单。paixu()函数流程图如图2.3所示。图2.3 排序函数流程图3. 进入账单信息查询部分,程序根据输入的日期进行逐一比较,若存在该日期的账单信息,程序输出相应的账单信息,若不存在该日期的账单信息,系统提示用户还未录入该日期的账单信息。账单查询函数流程图如图2.4所示。 图2.4 查询函数流程图4. 进入账单更改部分,程序将用户输入的需更改的账单日期与已存在的账单日期进行逐步比对,对日期完全相同的账单信息进行更改,若不存在该日期
5、的账单信息,程序提示用户是否马上进行添加。流程图如图2.5所示。 图2.5 账单信息更改流程图5. 进入账单保存部分,用户对建立的账单以文本文档的形式保存到磁盘中,账单信息保存函数流程图如图2.6所示。 图2.6 保存账单信息函数流程图3 数据结构分析3.1 存储结构主要存储结构:带头结点的单向链表存储结构。typedef struct MYBILL /链表结点结构long date; /日期信息long food; /食品消费long fangzu; /房租费用 long jiaoyu; /子女教育费long shuidian; /水电费 long yiliao; /医疗费 long chu
6、xu; /储蓄long pay; /总支出long income; /总收入struct MYBILL*next; /指向下一结点的指针MYBILL,bill;3.2 算法描述1. 建立单向链表,用来存储账单信息:首先分别输入将要建立账单的年份及月份,年份的合理范围定为所有正整数,当年份输入为非合理数字时结束对账单的录入;月份的合理范围为1至12,当输入不属于该范围的月份数据时,程序会重新进行年份和月份的录入;录入日期数据后,进行其余信息的录入。void *tianjia(MYBILL *head) /向原链表添加新的链表结点int i,j; /定义年份和月份变量MYBILL *p,*tail
7、; /定义结构体类型指针p=head; /将指针p初始化为headwhile(p-next!=NULL) /判断账单链表是否为仅含空头结点的链表p=p-next; /将指针p向后移动一个单位printf(nt输入您要建立账单的年份,当输入非正数时结束输入!nt);scanf(%ld,&i); /输入年份数据while(i0) /判断输入的年份是否为合理数据printf(nt输入您要建立账单的月份nt);scanf(%d,&j); /输入月份数据if(j0&jdate=100*i+j; /将年份和月份为转为一长整数字存储tail-next=NULL; /新结点的指针域指向空printf(nt输入
8、 食品费用:t);scanf(%ld,&tail-food); /输入食品费用printf(nt输入 房租:t);scanf(%ld,&tail-fangzu); /输入房租费用printf(nt输入 子女教育费:);scanf(%ld,&tail-jiaoyu); / 输入子女教育费printf(nt输入 水电费:t); scanf(%ld,&tail-shuidian); /输入水电费printf(nt输入 医疗费:t);scanf(%ld,&tail-yiliao); /输入医疗费printf(nt输入 储蓄:t);scanf(%ld,&tail-chuxu); /输入存储printf(
9、nt输入 总收入:t);scanf(%ld,&tail-income); /输入总收入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,&i); /输入年份信息MYBILL *jianli(MYBILL *head) /建立
10、账单链表函数MYBILL *head; /定义结构体类型指针tianjia(head); /调用子函数tianjia()if (head-next!=NULL) /判断账单链表是否为仅含空头结点的链表printf(nttt=账单录入成功!=nn);elseprintf(nttt=没有账单录入!=nn);return head; /返回头指针 2. 账单排序,排序方法采用将所有数据中最小和最大值挑选出来,再将处于这两个数据中间位置的其他数据进行插入。MYBILL *paixu(MYBILL *head) /账单信息排序函数long min,max; /定义两个变量对两个最值数据进行标记int i
11、,j; /年份月份定义MYBILL *q,*t,*p,*head1; /定义结构体类型指针q=head-next; /将q初始化为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标记支出最少的
12、结点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=q-pay; /月支出最大结点为新排序账单的第二个结点t=head; /初始化指针t的值p=q;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 个人 账单 管理 系统 数据结构 课程设计
链接地址:https://www.31ppt.com/p-2396495.html