C语言课程设计报告个人消费管理系统.doc
《C语言课程设计报告个人消费管理系统.doc》由会员分享,可在线阅读,更多相关《C语言课程设计报告个人消费管理系统.doc(34页珍藏版)》请在三一办公上搜索。
1、目 录 1 需求分析1 1.1问题描述1 1.2 输入数据要求1 1.3 输出数据要求1 1.4 开发环境和工具1 1.5 成员分工1 2总体设计2 2.1 总体设计思路2 2.2 模块结构图2 2.3 模块说明3 3 详细设计4 3.1 数据类型定义5 3.2 打开模块实现6 3.3 更新模块实现6 3.4 统计模块实现74测试结果及分析125 总结17参考文献18附录191 需求分析1.1问题描述随着社会经济的发展,大学生已经成为这个社会上一个很重要的团体,而他们的消费情况也越来越多的被更多的人关注,大学生自己也应当管理好自己的消费内容,让自己的消费更加合理化,提高自己生活的质量。在这种情
2、况下,就需要一个软消费表信息:编号,时间,类别,品名,单价,数量,金额对学生每天的消费情况作一个较为详细的统计,该系统可以实现由计算机代替人工执行一些复杂而且较为繁琐的操作,从而使大学生们能够更为便捷地管理自己的消费,也为其他的一些调查研究提供了方便。1.2 输入数据要求可录入消费者当天的消费情况,消费表信息包括:编号,时间,类别,品名,单价,数量,金额消费信息存放在文件中,以编号的先后顺序存放1.3 输出数据要求打开:显示文件中的所有消费记录,提供分页显示保存:将消费表的更新结果存入文件更新:可插入、删除、修改各消费记录查找:按时间,类别、品名查找消费记录排序:按时间,类别,金额统计:求各类
3、别消费品的总金额,求各月的消费总金额,求各年消费总金额1.4 开发环境和工具开发环境:Windows 2000开发工具:Visual C+ 6.01.5 成员分工刘倩钰:主函数模块,保存模块,排序模块刘冬梅:打开模块,更新模块,数据统计模块2总体设计2.1 总体设计思路1. 设计思路个人消费系统管理包含的操作有:打开、保存、更新、查找、排序和统计。在程序开始运行的时候从文件加载已有数据,并输出可以进行的操作提供给用户,1、打开:显示文件中的所有消费记录,通过取模运算提供分页显示功能2、保存:以wb模式打开文件,将修改的内容写入文件3、更新:可插入、删除、修改各消费记录4、查找:按时间,类别、品
4、名查找消费记录5、排序:按时间,类别,金额6、统计:分别按类别、月、年统计消费品的总金额2. 数据存储为了操作的方便,用typedef自定义了一些数据类型,其中包含一个长度为MAX的数组,用来存放从文件中读取的数据。2.2 模块结构图根据需求将系统划分为六个功能模块,函数之间的调用关系如图2.1所示。 Main主函数 SaveRec保存 ShowRec打开ShowTotal统计 CalleditUpdateRec更新 SortRec排序 FindRec查找图2.1 个人消费系统的模块结构图Calledit:在主函数的控制下,调用各个模块1)ShowRec: 输出已存在的记录。2)SaveRec
5、:保存更新的内容。3)UpdateRec: 按一定的方式更新记录。这个模块下包含三个子模块 插入:Insert 删除: DeleteByNum 修改:Modify 4)FindRec: 按一定的方式查找记录。 这个模块下也包含三个子模块 按日期查找:FindBytime 按类型查找:FindByType 按名称查找: FindByName 5)SortRec: 按一定的方式查找记录。 这个模块下也包含三个子模块 按日期查找:SortBytime 按类型查找:SortByType 按名称查找: SortBySum6)ShowTotal: 显示各种统计的结果2.3 模块说明(以从上至下,从左至右的
6、顺序说明)2.3.1:打开模块:自定义函数:ShowRec( )函数功能:输出已存在的历史记录 无参函数:无参数2.3.2:更新模块:自定义函数:UpdateRec( ) 函数功能: 可对输入数据实现插入,删除,修改操作。无参函数:void类型,无返回值。调用Insert()函数,Delete()函数和Modify()2.3.2.1插入模块:自定义函数: Insert() 函数功能:实现插入新的信息并保存到记录中,其中插入的数据最后金额可以自己运算出来,插入的记录保存在尾部。 无参函数:返回值为int 类型2.3.2.2删除模块:自定义函数; RemoveByNum(int num) 函数功能
7、:对所选信息按编号删除,删除过后,后面记录到编号将全部减1,记录的编号即下标。 输入参数:int类型,返回值是int类型。num-int类型,表示define.h文件中定义的类型Rec_Con中数组record的下标,删除过后,后面记录到编号将全部减1,记录的编号即下标。后面的记录全部向前移动一个距离。2.3.2.3修改模块:自定义修改函数:Modify() 函数功能:按名称修改记录,先判断要查找的名称所对应的记录是否存在,不存在则直接返回。 无参函数:返回值为int型2.3.3:统计模块:函数原型:ShowTotal( ) 函数功能:显示统计结果无参函数:void 类型,无返回值。2.3.3
8、.1 按类型统计:ShowType( )函数功能:按类型显示统计结果无参函数; void 类型,无返回值。2.3.3.2按月显示统计结果:函数原型:ShowMonth() 函数功能:忽略了年,按月显示统计结果无参函数:void 类型,无返回值。2.3.3.3按年显示统计结果:函数原型:ShowYear() 函数功能:按年显示统计结果无参函数:void 类型,无返回值。3 详细设计3.1 数据类型定义关键数据都定义在define.h里#define MAX 100 /人为定义的一个上限typedef struct / 定义记录结构体,并重新命名类型名int num; /编号char times1
9、1; /时间char types20; /类别char name20; /品名double price; /单价int quantity; /数量double sum; /金额Rec;typedef struct / 定义操作结构体,并重新命名类型名Rec recordMAX+1; /定义结构体变量,可操作的记录总数,下标为0和MAX不存放记录int total_count; /整型变量,记录总数Rec_Con,*PRec_Con;union /定义一个查找时使用的共用体char times11; /存放按时间查找时输入的时间char types20; /存放按类型查找时输入的类型char n
10、ame20; /存放按名称查找时输入的名称found;/下面三个变量都是全局变量FILE *fp; /定义文件指针Rec_Con rs; /用来定义变量,避免了动态分配中的安全问题PRec_Con records=&rs; /定义操作指针变量int type_count=0; /记录里相关的类型数目int year_count=0; /记录里相关的年数目char *ptypeMAX+1; /字符型变量,记录里相关的类型char pyearMAX+15; /字符型变量,记录里相关的年char tmp5; /字符型变量,取年份所用char tmp015,tmp025; /存放Get4的返回值,在比
11、较时使用char c; /字符型变量,临时使用变量,没有固定的限制3.2 ShowRec模块实现1.算法思想:按编号, 时间,类别,品名,单价,数量,金额的顺序打开文件,并显示结果。其中提供分页显示功能。2.具体实现:void OpenFile() /打开文件函数,以二进制append形式操作if(fp=fopen(consum,ab+)=NULL)printf(File open fail!n);return ;void ShowI(int i) /根据i值输出记录printf(记录:nn); printf(n编号 时间 类别 品名 单价 数量 金额 n);printf(%-5d% -10s
12、%15s%15s %8.2f%5d%8.2fn,records-recordi.num,records-recordi.times,records-recordi.types,records-recordi.name,records-recordi.price,records-recordi.quantity,records-recordi.sum);int ShowRec() /显示所有记录int i;for(i=1;itotal_count;i+)printf(%-5d%-10s%15s%15s%8.2f%5d%8.2fn,records-recordi.num,records-recor
13、di.times,records-recordi.types,records-recordi.name,records-recordi.price,records-recordi.quantity,records-recordi.sum);if(i%10)=0) /实现分页功能printf(Press any key show next pagen);getchar();/cls();return 1;3.3更新模三个块:更新包括内容;插入,删除,查找1.算法思想:利用三个自定义函数:int Insert() /插入函数,int DeleteByNum() /按编号删除,int Modify(
14、) /按名称修改记录。插入过程用MAX控制插入信息的范围;删除时按编号删除,删除过后,后面记录到编号将全部减1,记录的编号即下标。修改时先利用int FindByName(char *name);按名称查找记录函数,找到相关信息,若无此信息直接跳转,否则修改。2.具体实现:int Insert() /插入函数if(records-total_count=(MAX-1)printf(数据已达可控范围,不能再插入!n); return 0;int i=(+records-total_count);records-recordi.num=i; /编号是连续的, printf(n 时间 类别 品名 单
15、价 数量 金额 n);scanf(%s%s%s%lf%d,records-recordi.times,records-recordi.types,records-recordi.name,&records-recordi.price,&records-recordi.quantity);if(strlen(records-recordi.times)!=10|records-recordi.times4!=-|records-recordi.times7!=-) /简单的判断一下日期是否符合格式要求printf(时间格式错误,请重试!n);records-total_count-;return
16、 0;records-recordi.sum = records-recordi.price * records-recordi.quantity; /金额是计算所得#ifdef DEBUGShowI(i);#endifreturn 1;int RemoveByNum(int num) /删除过后,后面记录到编号将全部减1,记录的编号即下标int i;if(numrecords-total_count)printf(位置错误!n);return 0;for(i=num;itotal_count;i+) /i后面的记录全部向前移动一个距离records-recordi.num=records-r
17、ecordi+1.num-1;strcpy(records-recordi.times,records-recordi+1.times);strcpy(records-recordi.types,records-recordi+1.types);strcpy(records-recordi.name,records-recordi+1.name);records-recordi.price=records-recordi+1.price;records-recordi.quantity=records-recordi+1.quantity;records-recordi.sum=records
18、-recordi+1.sum;return 1;int DeleteByNum() /按编号删除int num;printf(请输入要删除记录的编号:);scanf(%d,&num);if(!(RemoveByNum(num)printf(程序执行错误,删除失败!n);return 0;elsereturn 1;int FindByName(char *name); /声明按名称查找记录函数,下面就要使用到int Modify() /按名称修改记录 int i;char names20;printf(请输入要修改的记录名称:);scanf(%s,names);i=FindByName(name
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 报告 个人消费 管理 系统

链接地址:https://www.31ppt.com/p-2384900.html