




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、吉 首 大 学 JISHOU UNIVERSITY 程序设计基础课程设计报 告 书题 目 个人收支管理系统 小组名单 所属学院 软件服务外包学院 专业年级 软件工程2012级 指导老师 写作时间 2012年12 月 至 2013 年 1 月 吉首大学教务处制目录一 、项目概述- 2 -1 问题的要求分析与描述- 2 -2 问题的要求与限制- 2 -3. 任务安排- 2 -二、项目设计- 3 -1系统程序流程图如下- 3 -2 详细设计- 4 -(1).main()函数- 4 -(2).inputidentity函数- 4 -(3).函数原型: read();- 5 -(4).add()函数-
2、6 -(5).search()函数- 7 -(6).del()函数- 8 -(7).modify函数- 9 -(8) .sort()函数- 10 -(9). save()函数- 11 -三、调试与结果- 12 -四、工作总结- 13 -五、特殊问题的解决方法- 14 -1对于系统主菜单的处理。- 14 -2.对于文件的操作。- 14 -附录A:- 15 -以下是源代码:- 26 - 个人收支信息管理系统 一 、项目概述1 问题的要求分析与描述 我们组设计了一个对个人日常的收入和消费帐目进行管理及查询统计计算的管理程序。个人收支信息包括收入(工资、奖金、津贴、酬金、中奖等)和支出(水电费、通讯费
3、、服装、伙食费、交际费、旅游、房租等)。 这个管理系统需要实现以下功能:1 系统能进行用户是否合法验证;2 实现以菜单的方式进行工作;3 实现个人收入支出信息录入功能,用户的信息保存在文件中;4 实现个人收入支出信息的输出功能,输出功能应该包括如下算法: 4.1:单个用户按时间查询功能; 4.2:单个用户全部信息按单月总收入从大到小排序浏览功能; 4.3:单个用户全部信息按单月总支出从大到小排序浏览功能;5 实现个人收支信息的删除与修改界面; 2 问题的要求与限制1:在进行用户验证时有一定的容错能力,比如姓名输入有误,则系统提示要求重新输入;2:在进行查询浏览和删除修改等功能时在一定程度上按照
4、用户的意见进行;3. 任务安排组长: *:用户验证、提供菜单、个人收支信息的录入、删除个人收支信息、小组程序最后的修改、word文档的制作;成员 : *:追加个人收支信息、修改个人收支信息、个人收支信息的排序、word文档的制作; *:查询个人收支信息、统计并输出个人收支信息、PPT的制作;*:个人收支及余额的计算、浏览全部信息、PPT的制作二、项目设计1系统程序流程图如下先输入月份,系统查询,如果没有此月份信息则按任意键返回主菜单。如果有,给用户选择要修改的月份的具体信息,并修改只有在个人收支信息录入后才能进行查询功能。1.可以按收入多少来浏览。2.可以按时间先后来浏览。3.可以按支出多少来
5、浏览查看。4.以表格形式浏览全部信息。输入个人工资,奖金,津贴,中奖等收入信息和水电费,房租,生活费等支出信息并保存到名为的文件中先输入月份(时间)系统查询,如果没有此月份信息,则按任意键返回主菜单,如果有,则提示用户是否确定删除。输入用户姓名与密码,若输入错误则重新输入一次欢迎界面0:退出系统 1:用户验证2:个人收支信息录入 3:个人收支信息查询4:个人收支信息删除 5:个人收支信息修改结束 2 详细设计 编译预处理命令: 在开头就调用了“stdio.h”,“strilng.h”,“stdlib.h”和“stdlib.h”,并且宏定义了N为5,同时定义了一个有N个组员组成的结构体数组。每个
6、结构体中有字符型,浮点型。且定义了一个整型全局变量n,用来判断有多少信息记录,还有两个浮点型全局变量sum和sum1,便于计算余额。(1).main()函数 所有函数都写在main函数中,并给他调用。Main函数中首先定义了一些整型数据k,i,j,choice,接着由“printf”进入欢迎界面。然后进行用户验证,在输入个人姓名与密码时有容错能力,若输入错误,系统提示输入有误,请重新输入,接着由“printf”函数打印出一个选择菜单,用户输入选项来运行系统。用“scanf”函数来给choice赋值,然后程序进入“switch”函数,通过选项,程序运行进入相应功能区。Case 1,函数进行个人收
7、入支出信息录入功能。用户输入个人收入支出信息。case 4函数进行个人收入支出信息删除功能,调用del函数,此功能内同样有选项供用户进行选择,1按时间删除已有信息,2按项目进行删除已有信息。如果n=-1,则代表无记录,按任意键返回主菜单。Case 7,函数进行个人收入支出信息查询功能,此功能区内也有选项供用户选择。1按时间查询,2按规定时间内的总收入和总支出,3按项目查询。如果n=-1,则代表无记录,则按任意键返回主菜单。Csae 8,调用sort函数,函数进入对个人收入支出信息从多到少的排序。此功能内还有浏览功能,以表格的形式呈现。Case 10,调用函数change,函数进入对个人收入支出
8、信息修改的功能。先输入要改的月份,然后重新输入此月份各项目的收支信息即可。如果n=-1,则代表无记录,那么按任意键返回主菜单。Case 0,退出系统。 (2).inputidentity函数 函数原型:int inputidentity();返回为1,进入下一步 主要功能:验证用户输入的用户名和密码是否正确,如果输入错误,则提示从新输入,若输入正确,则进入下一个函数YN 开始判断是否合法? 若合法,返回1,进入下一步输入用户名和密码 (3).函数原型: read(); 主要功能:从文件中读取用户已经保存了的信息,然后保存到结构体数组之中。进行初始化。流程如下: 开始N判断文件是否打开提示错误-
9、判断文件指针是否指向末尾?YYN读取信息存于结构体数组中结束(4).add()函数 函数原型:void add();参数:无。返回值:无。主要功能:添加用户新信息,对用户新的信息进行录入,存于结构体数组中,最后保存到文件末尾。开始根据提示,输入当月的基本信息结束操作(5).search()函数 函数原型:void search();返回值:无。要求:用户根据提示信息,选择自己想要查询的方式,1:表示按时间查找; 2:表示按余额查询;3:表示按项目查询。主要功能:根据用户想要查询的方式,显示相应的信息。 流程图如下: 输出该月信息NNYYY开始结束提示查询方式输入变量aa=1??a=2a=3输入
10、要查询的时间输入要查询的项目序号输出余额和支出输出该项目信息N (6).del()函数 函数原型 void del();要求:用户根据提示,1:表示按时间删除,2:表示按项目删除。功能:根据用户的选择,删除相应的信息。 删除该时间信息出该月信息NYY开始结束提示删除方式输入变量aa=1??a=2输人要删除的时间输出可删除的项目N输入选择,进行删除 (7).modify函数 函数原型 void modify();要求;用户需要输入要修改的时间,从新输入项目信息,达到修改的目的;功能:对用户所输入的时间内的项目进行修改流程图如下: 输入要修改的时间结束操作根据提示,从新输入当月的信息开始 (8)
11、.sort()函数 函数原型:void sort(struct node *p)要求:用户根据具体的需要,输入1表示按总收入排序,2 表示按总支出排序,函数功能:根据用户的需求,对相关项目进行排序。 输出排序结果出该月信息NYY开始结束提示排序方式输入变量aa=1??a=2按收入排序按支出排序N输出排序结果 (9). save()函数 函数原型 void save();函数功能:对结构体中的所有信息进行保存到文件之中。流程图如下: 提示错误YN判断文件是否打开开始结束把结构体中的数据包存到文件中 三、调试与结果1调试方法:利用调试系统,当代码完全写好后,就用他运行,程序会把所有的错误与警告显示
12、出来,找到程序有错的地方,参考错误的原因,仔细检查程序然后改写代码。在认为改好后再运行一次,若还有错误则再根据其提示再进行改正,一次次直到没有任何错误与警告为止。调试结果分析与讨论:由于这个小系统的代码是由各个组员共同完成的,每个人都写了几个函数,所以轻松许多。但大家都在不同程度上犯错。像排序函数开始的时候老是排不好,排序只排前面几个,最后一个似乎不加入排序。但是反复检查都发现那个代码丝毫没有错误。于是尝试改变排序方法,但还是不行。最后才发现个人收入支出信息“inform”这个结构体数组的第一个元素的下标是从1开始的,与一般的不同,于是对原有代码稍作修改后终于能够顺利排序。主要问题及解决办法:
13、1.在书写长代码时要注意“”,有时候会漏掉,导致错误。2.有时会不经意在“”后面加上“;”,导致许多程序不能正常运行,出现混乱,需要仔细。3.在“scanf”函数中,有时候会忘记加上“&”,导致程序不能运行,所以要记得加上“&”。2、测试结果:输入个人收入支出信息后能按照意愿浏览查询,有时候输入数据不能正常运行是因为“”后面多加了“;”,把“;”去掉即可。有时文件读入功能不正确,是某个环节出了小错误。所有的程序运行数据和结果都在附录A中。四、工作总结这次的课程设计是由四人组成的小组完成的。每个人都有明确的分工,我们密切合作,一起讨论,写代码,改代码。刚开始,我们一筹莫展,不知道从何下手,因为对
14、于文件,链表等的使用,我们都不是很了解。我们有点觉得太难。但我们一想到别人都能做,就相信我们也可以,于是就各自开始行动,不懂我们就猛看书,问同学,问老师,看别人写的代码,然后再一步步写代码。在我们写了一些代码后,就明显感觉没有那么难写了。但在这个过程中确实遇到了很多令人头疼的问题。有时候一个函数写了几天还是不正确。像排序、删除函数都曾因为粗心而写了好几天,测试了很多次,最后是通过组员内部讨论检查才成功的。特别是文件的读入与输出,我们怎么也想不出,改了又改,还是只能录入一组信息,且读不出信息,令我们头疼欲裂,于是我们就去请教老师和同学,再努力调试找错改错,最后终于顺利完成。那个时候大家都开心的舒
15、了一口气,这也许就是编程带来的踏实的快乐。这个小系统牵涉到了大家都才刚接触到的一些内容,由于课时有限,老师也没有详细的讲解,以至于我们都要埋头自己学习那些方面的知识,特别是文件部分。对于我来讲,那是天书,连其中出现的单词什么意思都不知到,甚至不知道为什么要用文件,有什么好处都不知道。还有关于链表,只是知道很多地方都需要用到,而且他很好用,跟本连创建链表都不怎么清楚。我们与是大量看书,做小题,敲一些代码,这样我们竟然发现自己掌握了原本看都看不懂的知识,这让我们很高兴,也越发的相信自己了,在接下来的写代码的过程中起了很重要的作用。有时候为了得到一种算法,我们有的组员翻看大量参考书上他人的代码,有时
16、候代码很长,看久了令人头昏脑胀,但因为不想拖累我们组编程的进程,熬夜在那里苦看,反复推敲,努力想引用其中比较好的代码,终于搞清了算法后又马上投身于写自己代码任务中。我们组员之间都有保持着紧密的联系,有时候不方便见面,就在电话中讲自己的进程或者遇到的困难,大家紧密合作,讨论。在编程的过程中,我们也曾有过消极的思想。因为有时候真的前进太难。编程太麻烦,枯燥而累人,搞了半天有时候还是错,搞得自己心情不好。但我们最终在相互鼓励中坚持了下来,深深地体会到团结在我们这个学习过程中的重要性,也意识到编程确实烦闷枯燥,但在我们完成任务的那一刻真的会格外开心,那样踏实的快乐是非常宝贵的,而且我们要相信自己一定能
17、做出来,那样思路才会清晰,才会少犯低级错误,从而更容易编程!五、特殊问题的解决方法 1对于系统主菜单的处理。因为文件主菜单就像是一个项目的心脏,因此,文件主菜单的建立的好坏直接影响整个系统的运行,因此,我们在系统主菜单的建造上花费很多的时间,在主菜单里,我们用了一个do-while循环,单满足条件不为零的时候,就继续循环,当在输入为一得时候,就会跳出循环。就这样,我们建好了我们的主菜单。2.对于文件的操作。由于我们对函数的文件了解的比较少,因此在这一环节上我们花费了大量的时间,首先我们想到的是用模块化读取,也就是用fwrite()和fread()函数,但是在实际的操作过程之中,相应的问题也暴露
18、出来了,出现了无法读取文件的情况,这令我们十分的头疼。我们查阅资料,问同学,上网看视频,但是最后也没有找出问题所在。迫不得已,我们就必须找另外的一种方法。于是我们运用另外的一种方法,格式化读取文件,也就是说用fscanf()函数和fprintf()来对文件进行操作,在其中也遇到了很多的问题,但是,我们不懈的努力最后总是会得到回报的。我们都相信,在这次做项目的过程会是我们在大学时光中美好的回忆之一。附录A:欢迎与开始界面:用户验证时的容错能力:开始菜单界面:录入时间时的容错能力:个人收支信息的录入功能:按时间查询个人收支信息功能:按项目查询各个月的收支信息:查询用户各个月的总收入与总支出信息功能
19、:浏览用户全部收支信息功能:对个人收入支出信息按总收入多少排序并输出功能:对个人收入支出信息按总支出多少排序并输出:按时间删除个人收支信息功能:查询是否删除成功:按项目删除个人收支信息功能:查询是否删除成功:修改个人收支信息功能:查询是否修改成功:以下是源代码:#include#include#include#include#define N 5struct node char time10; int inandex12; int totalex; int totalin; int totalleft;informN;void copy(struct node *p);int inputide
20、ntity();/用户验证函数void add();/新建增加函数void del();/删除函数void read();/把文件读入数组函数void write();/把数组中的值写入文件void output(struct node *p);/输出函数void sort();/排序void search();/查询函数void modify();/修改个人信息函数int n=-1;char program1220=工资,奖金,津贴,酬金,中奖,水电费,通讯费,服装费,伙食费,交际费,旅游费,房租费; int sum=0,sum1=0;/全局变量,便于计算余额void main() int
21、k,i,j,choice; printf(nnnn); printf( 尊敬的用户,欢迎使用个人收支管理系统!n); read(); do k=inputidentity(); if(k!=1) printf(n); printf( 输入有误,请从新输入n); while(k!=1); do system(cls); system(color 30); printf(nnn); printf(n); printf( 个人收支管理选项: n); printf( 1:新建; n); printf( 2:查询收入支出余额; n); printf( 3:追加个人收入支出信息; n); printf(
22、4:删除个人收入支出信息; n); printf( 5:查询个人收入支出; n); printf( 6:浏览全部信息; n); printf( 7查询个人收入支出信息; n); printf( 8:对个人收入支出进行排序并输出; n); printf( 9保存 n); printf( 10修改个人信息 n); printf( 0:退出 n); printf( 请输入你的选择! n); printf(n); scanf(%d,&choice); getchar(); switch(choice) case 1: add(); break; case 2: search(); break; cas
23、e 3: add(); break; case 4: del(); break; case 5: search(); break; case 6: output(inform);/输出函数 break; case 7: search(); break; case 8: sort(inform); break; case 9: write(); break; case 10: modify(); break; default: break; while(choice!=0);int inputidentity() char a220=xiao ming,li hua; char b210=123
24、45,13579; char p20,v20; int k,k1,i,leap=0; printf(n); printf( 请输入用户名用回车结束!n); printf( ); gets(p); printf(n); printf( 请输入用户密码用回车结束!n); printf( ); gets(v); for(i=0;i2;i+) k=strcmp(p,ai); if(k=0) k1=strcmp(v,bi); if(k1=0) leap=1; break; return(leap);/新建增加函数void add() system(cls); sum=0;sum1=0; int i,l;
25、 char str20; printf(请输入日期以月为单位,必须为六位,例如表示五月的收支n); gets(str);/得到时间 l=strlen(str); if(l!=6) printf(输入有误,按任意键结束n); getch(); return; strcpy(inform+n.time,str); for(i=0;i12;i+) printf(请输入%sn,programi); scanf(%d,&informn.inandexi); if(i5) sum=sum+informn.inandexi; else sum1=sum1+informn.inandexi; informn.
26、totalin=sum; informn.totalex=sum1; informn.totalleft=sum-sum1; printf(%d %d %dn,sum,sum1,sum-sum1); printf(按任意键返回主菜单n); getch(); return;/删除函数void del() system(cls); if(n=-1) printf(无记录,请输入任意键结束n); getch(); return; int a,i,j,k; char ss20,ch; printf(按1表示以时间删除,2表示以项目删除n); scanf(%d,&a); getchar(); if(a=
27、1) printf(请输入日期以月为单位,必须为六位,例如表示五月的收支); gets(ss); puts(ss);/检查是否有误 for(i=0;i=n;i+) if(!strcmp(ss,informi.time)/找到数据 if(i=n)/表示最后一个 n-; printf(删除完毕,按任意键返回n); getch(); return; printf(确定要删除吗(Y/N)n); ch=getchar(); printf(%dn,i); putchar(ch);/检查是否有误 if(ch=Y|ch=y) for(j=i;j=n;j+) for(k=0;k12;k+) informj.in
28、andexk=informj+1.inandexk; strcpy(informj.time,informj+1.time); informj.totalin=informj+1.totalin; informj.totalex=informj+1.totalex; informj.totalleft=informj+1.totalleft; printf(%s %sn,informj.time,informj+1.time); n-; /output(inform); printf(%dn,n); printf(删除成功。按任意键返回n); getch(); return; else pri
29、ntf(你选择的是不删除。按任意键返回n); getch(); return; if(i=n+1) printf(没有找到,按任意键返回n); getch(); return; else if(a=2) printf(删除的项目有n); for(i=0;i11|s0) printf(输入错误,请按任意键返回主菜单!n); getch(); return; for(i=0;i=n;i+) informi.inandexs=0; printf(删除完毕,按任意键返回n); getch; return; void output(struct node *p)/输出函数 system(cls); in
30、t i,j,c=0; for(i=0;itime); for(j=0;jinandexj); if(c=3) printf(n); c=0; printf(总收入: ); printf(%-8dn,p-totalin); printf(总支出: ); printf(%-8dn,p-totalex); printf(该月余额: ); printf(%-8d n,p-totalleft); printf(n); printf(按任意键返回n); getch(); return;/读取信息void read() FILE *fp; if(fp=fopen(./goods1.txt,r)=NULL)
31、printf(nn); printf(t 请首先进行用户验证!n); printf(nn); printf(t 按任意键开始!n); getch(); return; else int i,k,leap=0; fscanf(fp,%d ,n); printf(%dn,n); for(i=0;i=n;i+) printf(djdjdjdjn); fscanf(fp,%s %d %d %d,informi.time,&informi.totalex,&informi.totalin,&informi.totalleft); printf(%s %d %d %d ,informi.time,info
32、rmi.totalex,informi.totalin,informi.totalleft); for(k=0;k12;k+) fscanf(fp,%d,&informi.inandexk); fclose(fp); printf(nnt职工工资收入完毕!n); printf(按任意键返回主菜单!n); getch(); return; /保存信息函数void write() system(cls); FILE *fp; int i,k; if(n=-1) printf(没有数据可存!按任意键返回主菜单!n); getch(); return; if(!(fp=fopen(./goods.tx
33、t,w) printf(tt无法打开收支文件!n); fclose(fp); return; fprintf(fp,%d ,n); for(i=0;i0) fprintf(fp,n); fprintf(fp,%s %d %d %d ,informi.time,informi.totalex,informi.totalin,informi.totalleft); for(k=0;k12;k+) fprintf(fp,%d ,informi.inandexk); / printf(%d ,i); fclose(fp); printf(tt%d个月的收入存储完毕n,n+1); printf(按任意键
34、返回主菜单!n); getch(); return;/*修改项目信息*/void modify() system(cls); sum=sum1=0; char ss20; int i,k; if(n=-1) printf(当前无记录,按任意键结束n); getch(); return; printf(请输入日期以月为单位,必须为六位,例如表示2012年五月的收支n); gets(ss); for(i=0;i=n;i+) printf(%sn,informi.time); for(i=0;i=n;i+) if(!strcmp(ss,informi.time)/找到数据 printf(%d,i);
35、 for(k=0;k12;k+) printf(请从新输入%sn,programk); scanf(%d,&informi.inandexk); if(k5) sum=sum+informi.inandexk; else sum1=sum1+informi.inandexk; informi.totalin=sum; informi.totalex=sum1; informi.totalleft=sum-sum1; printf(%d %d %dn,sum,sum1,sum-sum1); printf(按任意键返回主菜单n); getch(); return; if(i=n+1) printf
36、(当前无记录,按任意键结束n); getch(); return; /排序函数void sort(struct node *p) system(cls); if(n=-1) printf(无记录,请输入任意键结束n); getch(); return; int t,f,k,g,t1; int i,j,a; char c100; char b420=时间,总收入,总支出,该月余额; printf(按1表示以总收入排序,2表示以总支出排序n); scanf(%d,&a); getchar(); if(a=1) for(i=0;i=n;i+) for(j=1+i;j=n;j+) if(informi
37、.totalininformj.totalin) t=informi.totalin; informi.totalin=informj.totalin; informj.totalin=t; f=informi.totalleft; informi.totalleft=informj.totalleft; informj.totalleft=f; strcpy(c,informi.time); strcpy(informi.time,informj.time); strcpy(informj.time,c); g=informi.totalex; informi.totalex=informj
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车间内部承包经营与设备维护一体化合同范本
- 采石场安全生产责任承包管理协议
- 高标准厂房木结构建造与施工一体化服务合同
- 老人照料及护理课件
- 石场安全生产三年行动方案
- 安全管理三违指的是什么
- 突发事件应急处置机制和预案
- 赣州市安全生产电视电话会议
- 美术信息化技术课件
- 生产制造安全事故案例
- 2025年数字内容创作师资格考试试卷及答案
- 胖东来投诉管理制度
- 2024-2025新入职员工安全培训考试试题及完整答案【一套】
- 2025年内蒙古鄂尔多斯机场管理集团鄂尔多斯市空港实业有限公司招聘笔试参考题库含答案解析
- 沥青路面施工质量控制要点课件
- 2025年郑州市公安机关招聘警务辅助人员题库带答案分析
- CJ/T 340-2016绿化种植土壤
- 庐山市国有投资控股集团有限公司招聘笔试题库2025
- T/CADBM 63-2022建筑室内窗饰产品百叶帘
- 2025年贵州省公务员录用考试《行测》真题及答案解析
- 第一单元:三视图的判断、确认与绘制专项练习-2023-2024学年五年级数学下册典型例题系列(原卷版)人教版
评论
0/150
提交评论