个人收支管理系统.docx
- 文档编号:4476729
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:26
- 大小:231.97KB
个人收支管理系统.docx
《个人收支管理系统.docx》由会员分享,可在线阅读,更多相关《个人收支管理系统.docx(26页珍藏版)》请在冰豆网上搜索。
个人收支管理系统
计算机科学与信息工程学院
课程设计报告
2011-2012第二学期
课程设计名称C语言课程设计
设计题目个人收支管理系统
学生姓名
学号
专业班级
指导教师
2012年7月4日
个人收支管理
一、设计目的
一些比较发达国家人的生活中对理财有着很严格的计划,因此国外的理财系统总体来说比较普遍,做的也比较完善.国内的理财系统主要偏重于办公财务软件,而个人理财和家庭理财方面的比较少,因此需要开发相关的系统软件,从而达到引导理性消费,合理安排收支。
进行账目的统计,如果是手动统计的话,首先,如果每天统计的话,用于统计的账本和记录会越来越多,不利于保管,容易造成丢失;其次,随着纪录的增多,如果要查找以前的记录,会变的越来越困难。
因此,需要一个功能比较完善的记账系统来代替传统的手工统计。
个人收支管理系统可以方便地记录您家庭的每日收支情况。
二、功能描述
如图1所示,本系统主要有8个板块构成:
1.个人收支管理系统显示界面。
个人收支管理系统必须在系统运行后第一时间显示出来。
此界面显示了一个收入模式、一个支出模式、一个明细表、一个查询与统计、一个记录数据写入文件、一个读取文件的功能。
2.收入模式。
用户可以在收入模式中输入以下数据:
顺序号、日期、摘要、金额、余额、币种,收入或支出标志。
默认币种为人民币,也可以是美圆、欧元、日币或英镑。
3.支出模式。
用户可以在支出模式中输入以下数据:
顺序号、日期、摘要、金额、余额、币种,收入或支出标志。
默认币种为人民币,也可以是美圆、欧元、日币或英镑。
4.明细表。
用户可以根据需要输入起止时间来查询一段时间内的收入支出情况,系统会通过列表的形式把内容展示出来。
5.查询与统计。
在此功能模式下,用户可以对一段时间的收入支出情况进行查询,可以得到总收入、总支出和余额。
此数据是按月或按年份统计计算的。
6.此板块属于拓展功能1---写入文件,记录数据。
在此模块下,用户可以根据需要爆当前输入的数据保存下来,以备后用。
7.此板块属于拓展功能2—读取文件,读取数据。
在此模块下,用户可以读取以前所记录的数据并进行查看。
8.退出系统。
图1简易系统功能模块图
三、总体设计
1.系统执行主程序
本系统执行主程序如图2所示。
首先,调用main函数,是系统进入主显示面。
然后由用户选择所需要的功能,并进入相应功能程序,按照用户需求进行相应操作后回到主显示界面,等待用户继续按键选择功能进行操作。
2.系统显示界面
此系统界面主要由可供选择的功能组成:
收入、支出、明细表、查询与统计、写入文件、读取文件。
用户在进行选择后可通过switch语句进行跳转进入相应分程序。
主显示界面
开始
退出系统
摘要
写入文件
查询与统计
币种
金额
日期
明细表
支出
收入
图2系统执行主流程图
四、数据结构设计
data结构体
structdata{
intn;//顺序
inty,m,d;
charzy[100];//摘要
floatmoney,rmoney;//金额,余额
charbiz[5];//币种
intx;//收支类型(标记,明细表或查询统计用)
}p[100];
本程序中主要数据都需要显示顺序、日期、摘要、金额、余额、币种和收支类型,所以需要定义data结构体。
Intn:
表示顺序。
Inty,m,d:
用来定义日期。
Charzy:
摘要。
Floatmoney、rmoney:
金额、余额。
Charbiz[5]:
币种。
Intx:
定义收支类型。
五、函数功能描述
1.check():
函数原型:
intcheck()
check函数主要用于检查输入日期的合法性、日期的先后顺序是否正确,并查找符合日期要求的数据。
2.fflush()
函数原型:
fflush(stdin)
主要用于清除缓存,方便用户接下来的操作。
3.gets()
函数原型:
gets()
函数主要用于把用户输入的数据保存到指定数据中。
4.strlen()
函数原型:
size_tstrlen(constchar*s)
该函数是用来计算字符串的长度,用于用户接下来的操作。
5.strcpy()
函数原型:
char*strcpy(char*s1,constchar*s2)
该函数用于把字符串s2复制给字符串s1。
6.file*()
函数原型:
file*fp1;
通过文件指针便于对流的访问。
7.Fopen()
函数原型:
fopen(FILE_NAME, ”r或w”)
该函数用于打开文件,进行读取或写入。
8.Fclose()
函数原型:
fclose()
该函数主要用来关闭用户打开的文件。
9.Main()
函数原型:
voidmain()
Main()为主函数。
四、程序实现
1.源码分析
(1)程序预处理
#include
#include
#include
intincome() //收入模式
intexpend() //支出模式
intlist() //明细表
intdestat() //查询与统计
voidwrite() //写入文件
voidread() //读取文件
(2)主函数main()
Main()函数主要实现了对整个程序的调用,以及相关功能模块的调用。
它主要的工作是初始化程序。
voidmain()
{
intn;//确定用户需要进入的功能模块
do
{
printf("++++++++++++++++++\n");
printf("个人收支管理\n");//用户可以进行的功能操作选项
printf("1.收入\n");
printf("2.支出\n");
printf("3.明细表\n");
printf("4.查询与统计\n");
printf("5.写入文件\n");
printf("6.读取文件\n");
printf("0.退出系统\n");
printf("++++++++++++++++++\n");
printf("请输入你要进行操作:
");
scanf("%d",&n);//捕获用户要进行的操作
switch(n){
case1:
income(p);system("cls");break;//进入收入模块,结束后返回
case2:
expend(p);system("cls");break;//进入指出模块,结束后返回
case3:
list(p);system("cls");break;//进入明细表,结束后返回
case4:
destat(p);system("cls");break;//进入查询与统计,结束后返回
case5:
write(p);system("cls");break;//进入写入文件,结束后返回
case6:
read(p);system("cls");break;//进入读取文件,结束后返回
}
}while(n!
=0);//退出系统
}
2.程序运行结果显示
(1)初始化界面
(2)进入收入模式
结束时按Enter返回主界面
(3)进入支出模式
结束时按Enter返回主界面
(4)明细表
结束时按Enter返回主界面
(5)查询与统计
按年查询
按月查询
(6)写入文件
(7)读取文件
在这我们主要显示退出系统后读取文件操作显示:
之后用户可以根据需要进行相应操作查看数据。
(8)退出系统
六、课程设计总结
经过2个星期的努力,终于完成了个人收支管理系统的设计。
本来,在开始上课之前,我们都以为这是很简单的东西,毕竟我们都学习了这么时间,并且也在课上进行了一次次的实战训练。
可是,没想到,别看平时比较容易,在这一刻,要把课上学到的知识融会贯通,要想设计出自己心满意足的东西是多么的困难。
不过,还好,总算完成了,也感受到了成功的喜悦。
努力奋斗,并不是没有回报的!
!
!
当然,在这2个星期的过程中,我们也发现了许多问题并克服了它们。
这些问题或许是上课时没注意到的细节问题,或是自己之前一直没能搞懂的知识点,但不论如何,它都让我们学会了好多新的东西,有了新的感悟。
在此,感谢老师们的辛勤工作,无私贡献,感谢老师们的指导。
七、源代码
#include
#include
#include
structdata{
intn;
inty,m,d;
charzy[100];//摘要
floatmoney,rmoney;//金额,余额
charbiz[5];//币种
intx;//收支类型(标记,明细表或查询统计用)
}p[100];
intk=1;
intcheck1(inty,intm,intd)//检测日期合法性
{
inta[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(y>0){
if(m>0&&m<13){
if(d>0&&d<=a[m-1])
return1;
if((((y%4==0)&&(y%100!
=0))||(y%400==0))&&(m==2)&&(d==29))
return1;
}
}
return0;
}
intcheck2(inty1,intm1,intd1,inty2,intm2,intd2)//检测日期的先后顺序是否正确
{
if(y2>y1)return1;
if(y2==y1&&m2>m1)return1;
if(y2==y1&&m2==m1&&d2>d1)return1;
if(y2==y1&&m2==m1&&d2==d1)return1;
else
return0;
}
intcheck3(inty1,intm1,intd1,inty2,intm2,intd2)//查找符合要求的日期
{
inti,k=0;
for(i=0;i<100;i++)
{
if((check2(y1,m1,d1,p[i].y,p[i].m,p[i].d))
&&(check2(p[i].y,p[i].m,p[i].d,y2,m2,d2)))
k=k+1;
}
if(k=1)
return1;
else
return0;
}
intincome(structdatap[])
{
inti;charq[100];
for(i=k-1;;i++){
do{
printf("请输入日期(例:
2012-7-1):
");
scanf("%d-%d-%d",&p[i].y,&p[i].m,&p[i].d);
}
while(!
check1(p[i].y,p[i].m,p[i].d));
fflush(stdin);
printf("请输入摘要(默认:
无):
");
gets(p[i].zy);
if(strlen(p[i].zy)==0)strcpy(p[i].zy,"无");
fflush(stdin);
printf("请输入金额:
");
scanf("%f",&p[i].money);
fflush(stdin);
printf("请输入币种(默认RMB):
");
gets(p[i].biz);
if(strlen(p[i].biz)==0)strcpy(p[i].biz,"RMB");
p[i].x=1;
p[i].rmoney=p[i-1].rmoney+p[i].money;
p[i].n=k;
k=k+1;;
printf("请输入Enter继续:
");
fflush(stdin);
gets(q);
return0;
}
}
intexpend(structdatap[])//支出
{
inti;charq[100];
for(i=k-1;;i++){
do{
printf("请输入日期(例:
2012-7-1):
");
scanf("%d-%d-%d",&p[i].y,&p[i].m,&p[i].d);
}
while(!
check1(p[i].y,p[i].m,p[i].d));
fflush(stdin);
printf("请输入摘要(默认:
无):
");
gets(p[i].zy);
if(strlen(p[i].zy)==0)strcpy(p[i].zy,"无");
fflush(stdin);
printf("请输入金额:
");
scanf("%f",&p[i].money);
fflush(stdin);
printf("请输入币种(默认RMB):
");
gets(p[i].biz);
if(strlen(p[i].biz)==0)strcpy(p[i].biz,"RMB");
p[i].x=0;
p[i].rmoney=p[i-1].rmoney+p[i].money;
p[i].n=k;
k=k+1;
printf("请输入Enter继续:
");
fflush(stdin);
gets(q);
return0;
}
}
intlist(structdatap[])
{
charq[100];
inti,y1,m1,d1,y2,m2,d2;
do{printf("输入时请注意日期的先后顺序!
!
!
\n");
do{
printf("请输入起始时间(例2000-1-1):
");
scanf("%d-%d-%d",&y1,&m1,&d1);
}
while(!
check1(y1,m1,d1));
do{
printf("请输入截至时间(例2000-1-1):
");
scanf("%d-%d-%d",&y2,&m2,&d2);
}
while(!
check1(y2,m2,d2));
}
while(!
check2(y1,m1,d1,y2,m2,d2));
if(check3(y1,m1,d1,y2,m2,d2)==0)
{printf("此时间段内没有收支记录!
\n");
}
else{
printf("顺序号\t日期\t\t摘要\t金额\t余额\t币种\t标志\n");
for(i=0;i printf("%d\t%d-%d-%d\t%s\t%g\t%g\t%s\t%d\n",p[i].n,p[i].y,p[i].m,p[i].d, p[i].zy,p[i].money,p[i].rmoney,p[i].biz,p[i].x); printf("注意: 标志1为收入,标志0为支出! "); } printf("请按Enter继续! "); fflush(stdin); gets(q); return0; } intdestat(structdatap[])//查询与统计 { inty,m,z,i;charq[100]; floatsum1=0,sum2=0,rmoney; printf("请选择查询方式: \n"); printf("1.查询年份: \n"); printf("2.查询月份: \n"); scanf("%d",&z); if(z==1) { printf("请输入要查询的年份: "); scanf("%d",&y); for(i=0;i<100;i++) { if((y==p[i].y)&&(p[i].x==1)) sum1=sum1+p[i].rmoney; if((y==p[i].y)&&(p[i].x==0)) sum2=sum2+p[i].rmoney; } } if(z==2) { printf("请输入年份: "); scanf("%d",&y); do{ printf("请输入月份: "); scanf("%d",&m); } while(m<1||m>12); for(i=0;i<100;i++) { if((p[i].y==y)&&(p[i].x==1)&&(p[i].m==m)) sum1=sum1+p[i].rmoney; if((p[i].y==y)&&(p[i].x==0)&&(p[i].m==m)) sum2=sum2+p[i].rmoney; } } rmoney=sum1-sum2; printf("总收入: %g\n",sum1); printf("总支出: %g\n",sum2); printf("余额: %g\n",rmoney); printf("请按Enter继续: "); fflush(stdin); gets(q); return0; } voidwrite(structdatap[])//写入文件 { inti; FILE*fp; charq[20],t[100]; if(k-1==0) printf("请先输入数据! ! "); else{ printf("请输入文件名: "); fflush(stdin); gets(q); if(strlen(q)==0){ strcpy(q,"record.dat"); printf("已保存为默认文件data.dat\n");} fp=fopen(q,"w"); for(i=0;i { fwrite(&p[i],sizeof(structdata),1,fp); } printf("记录已存储! \n"); } printf("\n请按Enter键继续: "); fflush(stdin); gets(t); } voidread(structdatap[])//读取文件 { FILE*fp; charq[20],t[100]; k=0; printf("输入文件名: "); fflush(stdin); gets(q); if(strlen(q)==0){ strcpy(q,"record.dat"); printf("已打开默认文件data.dat\n");} if((fp=fopen(q,"rb"))==NULL) printf("文件不存在! \n"); else { fp=fopen(q,"r"); while(! feof(fp)) { fread(&p[k++],sizeof(structdata),1,fp); } fclose(fp); k=k-1; printf("文件已读取! \n"); } printf("\n请按Enter键继续: "); fflush(stdin); gets(t); } voidmain() { intn; do { printf("++++++++++++++++++\n"); printf("个人收支管理\n"); printf("1.收入\n"); printf("2.支出\n"); printf("3.明细表\n"); printf("4.查询与统计\n"); printf("5.写入文件\n"); printf("6.读取文件\n"); printf("0.退出系统\n"); printf("++++++++++++++++++\n"); printf("请输入你要进行操作: "); scanf("%d",&n); switch(n){ case1: income(p);system("cls");break; case2: expend(p);system("cls");break; case3: list(p);system("cls");break; case4: destat(p);system("cls");break; case5: write(p);system("cls");break; case6: read(p);system("cls");break; } }while(n! =0); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 个人 收支 管理 系统