ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:123.97KB ,
资源ID:4338555      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4338555.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(学生个人生活费管理系统2.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

学生个人生活费管理系统2.docx

1、学生个人生活费管理系统2学生个人生活费管理系统(2) 目录 1需求分析 1.1问题描述 5 1.2 输入数据要求 5 1.3 输出数据要求 6 1.4 开发环境和工具 6 2总体设计 7 2.1 总体设计思路 7 2.2 模块结构图 7 2.3 模块说明 8 3 详细设计 10 3.1 数据类型定义 10 3.2 打开模块实现 13 3.3 更新模块实现 16 3.4 统计模块实现 164测试与调试16 4.1测试18 4.2调试185.结论 19结束语 19参考文献附录附录2源程序 211 需求分析1.1问题描述随着社会经济的发展,大学生已经成为这个社会上一个很重要的团体,而他们的消费情况也

2、越来越多的被更多的人关注,大学生自己也应当管理好自己的消费内容,让自己的消费更加合理化,提高自己生活的质量。在这种情况下,就需要一个软消费表信息:编号,时间,类别,品名,单价,数量,金额对学生每天的消费情况作一个较为详细的统计,该系统可以实现由计算机代替人工执行一些复杂而且较为繁琐的操作,从而使大学生们能够更为便捷地管理自己的消费,也为其他的一些调查研究提供了方便。1.2 输入数据要求根据日常生活中,学生个人财务情况,实现一个个人生活费的财务管理软件。功能有:1登陆。只有在输入正确的用户名和密码之后才能使用软件。2修改已有信息。收支信息应该包括收支日期(年月日),收入或者支出,金额,收入来源或

3、者支出目的,账户余额等。可借用学生个人生活费管理系统(1)中的添加功能。3能够查询某天或者某月的收支情况。1.3 输出数据要求打开:显示文件中的所有消费记录,提供分页显示保存:将消费表的更新结果存入文件更新:可插入、删除、修改各消费记录查找:按时间,类别、品名查找消费记录排序:按时间,类别,金额统计:求各类别消费品的总金额,求各月的消费总金额,求各年消费总金额1.4 开发环境和工具开发环境:Windows 7开发工具:Visual C+ 6.02总体设计2.1 总体设计思路1. 设计思路个人消费系统管理包含的操作有:打开、保存、更新、查找、排序和统计。在程序开始运行的时候从文件加载已有数据,并

4、输出可以进行的操作提供给用户,1、打开:显示文件中的所有消费记录,通过取模运算提供分页显示功能2、保存:以wb模式打开文件,将修改的内容写入文件3、更新:可插入、删除、修改各消费记录4、查找:按时间,类别、品名查找消费记录5、排序:按时间,类别,金额6、统计:分别按类别、月、年统计消费品的总金额2. 数据存储为了操作的方便,用typedef自定义了一些数据类型,其中包含一个长度为MAX的数组,用来存放从文件中读取的数据。2.2 模块结构图根据需求将系统划分为六个功能模块,函数之间的调用关系如图2.1所示。图2.1 个人消费系统的模块结构图Calledit:在主函数的控制下,调用各个模块1)Sh

5、owRec: 输出已存在的记录。2)SaveRec:保存更新的内容。3)UpdateRec: 按一定的方式更新记录。 这个模块下包含三个子模块 插入:Insert 删除: DeleteByNum 修改:Modify 4)FindRec: 按一定的方式查找记录。 这个模块下也包含三个子模块 按日期查找:FindBytime 按类型查找:FindByType 按名称查找: FindByName 5)SortRec: 按一定的方式查找记录。 这个模块下也包含三个子模块 按日期查找:SortBytime 按类型查找:SortByType 按名称查找: SortBySum6)ShowTotal: 显示各

6、种统计的结果2.3 模块说明(以从上至下,从左至右的顺序说明)2.3.1:打开模块:自定义函数:ShowRec( )函数功能:输出已存在的历史记录 无参函数:无参数2.3.2:更新模块: 自定义函数:UpdateRec( ) 函数功能: 可对输入数据实现插入,删除,修改操作。 无参函数:void类型,无返回值。调用Insert()函数,Delete()函数和Modify() 2.3.2.1插入模块:自定义函数: Insert() 函数功能:实现插入新的信息并保存到记录中,其中插入的数据最后金额可以自己运算出来,插入的记录保存在尾部。 无参函数:返回值为int 类型 2.3.2.2删除模块:自定

7、义函数; RemoveByNum(int num) 函数功能:对所选信息按编号删除,删除过后,后面记录到编号将全部减1,记录的编号即下标。 输入参数:int类型,返回值是int类型。num-int类型,表示define.h文件中定义的类型Rec_Con中数组record的下标,删除过后,后面记录到编号将全部减1,记录的编号即下标。后面的记录全部向前移动一个距离。 2.3.2.3修改模块:自定义修改函数:Modify() 函数功能:按名称修改记录,先判断要查找的名称所对应的记录是否存在,不存在则直接返回。 无参函数:返回值为int型2.3.3:统计模块:函数原型:ShowTotal( ) 函数功

8、能:显示统计结果 无参函数:void 类型,无返回值。 2.3.3.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 /

9、定义记录结构体,并重新命名类型名 int num; /编号 char times11; /时间 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;

10、 /存放按时间查找时输入的时间 char types20; /存放按类型查找时输入的类型 char name20; /存放按名称查找时输入的名称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 t

11、mp5; /字符型变量,取年份所用char tmp015,tmp025; /存放Get4的返回值,在比较时使用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(记

12、录:nn); printf(n编号 时间 类别 品名 单价 数量 金额 n); printf(%-5d% -10s%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%

13、-10s%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); if(i%10)=0) /实现分页功能 printf(Press any key show next pagen); getchar(); /cls(); return 1;3.3更新模三个块:更新包括内容;插入,删除,查找1.算法思想:

14、利用三个自定义函数:int Insert() /插入函数,int DeleteByNum() /按编号删除,int Modify() /按名称修改记录。插入过程用MAX控制插入信息的范围;删除时按编号删除,删除过后,后面记录到编号将全部减1,记录的编号即下标。修改时先利用int FindByName(char *name);按名称查找记录函数,找到相关信息,若无此信息直接跳转,否则修改。2.具体实现:int Insert() /插入函数 if(records-total_count=(MAX-1) printf(数据已达可控范围,不能再插入!n); return 0; int i=(+reco

15、rds-total_count); records-recordi.num=i; /编号是连续的, printf(n 时间 类别 品名 单价 数量 金额 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

16、!=-) /简单的判断一下日期是否符合格式要求 printf(时间格式错误,请重试!n); records-total_count-; return 0; records-recordi.sum = records-recordi.price * records-recordi.quantity; /金额是计算所得#ifdef DEBUG ShowI(i);#endif return 1;int RemoveByNum(int num) /删除过后,后面记录到编号将全部减1,记录的编号即下标 int i; if(numrecords-total_count) printf(位置错误!n); r

17、eturn 0; for(i=num;itotal_count;i+) /i后面的记录全部向前移动一个距离 records-recordi.num=records-recordi+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+

18、1.price; records-recordi.quantity=records-recordi+1.quantity; records-recordi.sum=records-recordi+1.sum; return 1;int DeleteByNum() /按编号删除 int num; printf(请输入要删除记录的编号:); scanf(%d,&num); if(!(RemoveByNum(num) printf(程序执行错误,删除失败!n); return 0; else return 1;int FindByName(char *name); /声明按名称查找记录函数,下面就要

19、使用到int Modify() /按名称修改记录 int i; char names20; printf(请输入要修改的记录名称:); scanf(%s,names); i=FindByName(names); if(!i) /判断要查找的名称所对应的记录是否存在,不存在则直接跳转 return 0; printf(请输入所需信息:n); printf(n 时间 类别 品名 单价 数量 金额 n); scanf(%s%s%s%lf%d,records-recordi.times,records-recordi.types,records-recordi.name,&records-record

20、i.price,&records-recordi.quantity); records-recordi.sum = records-recordi.price * records-recordi.quantity; return 1;3.4 ShowTotal模块实现 ShowTotal包括三种方式:类型、月、年,以类型为例说明1、算法思想为确保不会溢出,保存统计结果的total数组定义长度为MAX,接下来对记录集进行遍历,并与ptype数组中统计的类型进行比对,按照对应的下标将统计结果加到total数组中,这样做便于输出时一一对应。(复杂算法用流程图辅助说明)2、具体实现(给出实现算法的关键

21、代码)按类型显示统计结果void ShowType() int i=1,j=0; double totalMAX=0.0; /定义保存统计结果的数组 while(itotal_count&jrecordi.types)=0) totalj += records-recordi.sum; i+; else j+; /输出统计结果 printf(按类型统计结果如下:n); for(i=0;itype_count;i+) printf(%s:t%8.2fn,ptypei,totali); printf(n);4. 调试与测试4.1 调试说是最艰巨的任务。调试的任务是及时改正测试过程中发现的软件错误。

22、具体地也调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。然后仔细研究推断代码以确定问题的原因,并设法改正。调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。本系统调试过程中遇到问题、原因和解决方法如下面介绍。(1) 程序不能运行定义的指针,很多次引用,过个函数里面,定义的不明确,造成错误连连发生。 (2) 不能正确输出信息,有乱码现象原因是键入信息的时候,没有一一对应,逗号的位置不正确,后来,用的是信息逐一输入,保证了信

23、息的一一对应和高度的准确性,使程序可以正常运行。(3) 程序运行途中,出现错误,被迫中止其中定义字符数组,却没有定义长度,导致定义类型变成了字符型,而不能接受字符串,因此出现了错误。4.2 测试软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。过度测试则会浪费许多宝贵的资源。到测试后期,即使找到了

24、错误,然而付出了过高的代价。5. 结论课程设计顺利完成,题目所要求的功能也都一一实现,可以对职工信息进行添加,修改,删除,查询,模糊查询,按条件查询,存储至文本文件等,在通常情况下,可以良好的运作。不过这个程序还有些不够完善,例如有时候,输出的结果会因为字符的长短,与上面的提示栏对不上。而且,由于自己英语的不够特别好,后几个功能不知道该怎么翻译,就直接写的汉字,显得程序主菜单有点乱,以后会加强英语,好好规划编程。结束语为期七天的的软件综合课程设计实习终于顺利完成,在这期间,我学到了很多课堂上学不到的东西,而且,将所学付之于实践,理论联系实际,是令我很兴奋的,但同时也感觉到了难度。对C语言,有了

25、更深一步的了解,并且培养出了良好的思考方式,对于编程。虽然困难很多,问题出现的也很多,但好在,顺利完成任务了,很有成就感。. 1 参考文献谭浩强. C语言程序设计(第三版).北京:清华大学出版社,2005.7附录1,附录二源程序#include #define N 10struct student char num10; char name20; float score3; float sum; float aver; stuN;void main() printf(* made by B14140104 *nn); printf(* 学生个人生活费管理系统(2) *nnn); void co

26、unt(struct student stu); void sort(struct student stu); void find(struct student stu); int i; float temp; for(i=0;iN;i+) printf(请输入第%d位同学的支出信息:n,i+1); printf(学号: ); gets(stui.num); printf(名字: ); gets(stui.name); printf(支出1: ); scanf(%f,&temp); stui.score0=temp; printf(支出2: ); scanf(%f,&temp); stui.s

27、core1=temp; printf(支出3: ); scanf(%f,&temp); getchar(); stui.score2=temp; count(stu); printf(n); sort(stu); printf(n); find(stu);void count(struct student stu) float sum,aver; int i,j; for(i=0;iN;i+) sum=0; for(j=0;j3;j+) sum+=stui.scorej; aver=sum/3.0; stui.sum=sum; stui.aver=aver; printf(学号 姓名 总支出 平均支出 n); for(i=0;iN;i+) printf(%-8s%-10s%-9.2f%-9.2fn,stui.num,stui.name,stui.sum,stui.aver);void sort(struct student stu) int i,j,k; struct student temp; for(i=0;iN;i+)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1