个人财务管理软件报告
![个人财务管理软件报告](https://img.360docs.net/imgc8/1nd2xa8ra2do1ftg7ydsqkzk7mavbgya-81.webp)
![个人财务管理软件报告](https://img.360docs.net/imgc8/1nd2xa8ra2do1ftg7ydsqkzk7mavbgya-02.webp)
个人财务管理软件报告
目录
一、需求分析 (2)
二、概要设计2
三、详细设计3
四、调试分析8
五、用户手册8
六、测试数据9
七、附录11
一、需求分析
1.首先个人的财务信息里包括收支日期,收入金额、支出金额还有收入和支出的目的,还有账户余额。因为是包括多个信息所以考虑到用结构体数组来储存这些信息,然后再把这些信息一起储存到文件中。
2.该软件需要有六个功能,首先是登录功能,必须输入正确的用户名和密码才能使用软件。第二是收支记录的管理,该部分包括添加功能,删除功能和修改功能。第三是查询某天或某月的收支情况。第四是统计一段时间的信息。
3.后面的收支功能,查询功能和统计功能都是从文件中读取,读取后存到结构体数组中,然后再进行操作,操作完后关闭文件,以免信息丢失。
4.当用户名和密码输入错误,会提示你输入错误,请重新输入。
5.如果是操作过程中输入错误,会回到最菜单重新操作。
6.运行时用户可以根据提示进行操作,每进行一步操作,就会有相应的提示。二.概要分析
1.程序中存储个人每天的财务信息用的是结构体数组,其中结构体中包括:日期(年月日),收入金额,支出金额,收入目的。
struct people{
int year; //年份
int month; //月份
int day; //日期
float get; //收入金额
float out; //支出金额
char motive[100]; //支出目的
char source[100]; //收入来源
float leave; //余额
}
2.本程序各函数的结构
main函数{
将三天的账户信息存储到文件中;
提示用户输入用户名和密码,输入正确;
进入f7();//菜单选择函数
switch(){
1.修改信息; //f2()函数
2.添加信息;//f3()函数
3.删除信息;//f4()函数
4.查询信息;//f5()函数
5.统计信息;//f6()函数
}
3.各模块的调用关系
第一层:main 函数
第二层:f7();
第三层:f2() , f3(), f4(), f5(), f6();
调用时这些函数都可以通过f7()函数来互相调用。比如运行完f2()函数后,可以
调用f7(),然后再调用f3()函数。
4.主函数:添加信息到文件中和执行登录功能。
其他调用函数分别执行其他五大功能。
三.详细设计
1、基本数据类型操作
a)存储每天账户信息的数组结构体
struct people{
int year;
int month;
int day;
float get;
float out;
char motive[100];
char source[100];
float leave;
}
b)控制结构体数目的extern N
刚开始运行该程序时,N的初始值为3,后来如果进行添加操作,则N的值就会加1,反之如果进行删除操作,则N的值就会减1。
2
main
3、基本操作的算法描述
a)登录功能:用户只有在输入正确的用户名和密码后才能进入系统进行操作。
for(;;)
{
printf("============请输入用户名和密码:==============\n");
printf("用户名:");
scanf("%d",&a); //a表示用户名
printf("\n");
printf("密码:"); //b表示密码
scanf("%d",&b);
printf("\n");
if(a==10201306&&b==1) //输入和条件一致的情况下进入if语句中
{
printf("=============恭喜输入正确,登录成功!=====\n");
printf("该软件中已存有2010年1月1号到3号的信息!\n");
}
else //输入和条件不一致就进入else语句
{
printf("输入错误,请重新输入!\n");
}
}
b)主菜单功能:用户可以自行选择要进行的操作
printf("======================1:修改信息==================\n");
printf("======================2:删除信息==================\n");
printf("======================3:添加信息==================\n");
printf("======================4:查询信息==================\n");
printf("======================5:统计信息==================\n");
printf("请选择:"); //在屏幕上输出,指示用户操作
scanf("%d",&flag); //输入用户的选项并存在flag中
while( flag != 0)
{
switch(flag)
{
default: printf("此选项不存在,请重新输入:\n");break;
case 1:
f2(x,y,z); //进入修改函数
break;
case 2:
f3(x,y,z); //进入删除函数
break;
case 3:
f4(); //进入添加函数
break;
case 4:
f5(x,y,z); //进入查询函数
break;
case 5:
f6(x,y,z,x1,y1,z1); //进入统计函数
break;
}
}
c)修改功能:用户如果觉得存储的信息有问题,可以在此进行修改
fp=fopen("f:\\pan.txt","w+");
for(i=0;i { fread(&peo[i],sizeof(struct people),1,fp); if(x==peo[i].year&&y==peo[i].month&&z==peo[i].day) { n=i; //查看是否有该天的信息存在 break; } } if(i==N) { printf("没有该天信息!\n"); printf("请重新选择!\n"); f7(); } fread(&peo[i],sizeof(struct people),1,fp);//先从文件中读出 printf("请输入新的收入来源\n"); scanf("%s",peo[n].source); printf("请输入新的收入金额\n"); scanf("%f",&peo[n].get); printf("请输入新的支出目的\n"); scanf("%s",peo[n].motive); printf("请输入新的支出金额\n"); scanf("%f",&peo[n].out); peo[n].leave=peo[n].get-peo[n].out;//输入新的信息 for(i=0;i { if(fwrite(&peo[i],sizeof(struct people),1,fp)!=1) { printf("无法打开!\n"); exit(0); } } fclose(fp);//把新的信息存储到文件当中,并关闭文件 d) 删除功能:用户可以在此删除不需要的信息 fp=fopen("f:\\pan.txt","w+");//打开文件 for(i=0;i { fread(&peo[i],sizeof(struct people),1,fp); if(x==peo[i].year&&y==peo[i].month&&z==peo[i].day) { n=i; //查看是否有该天的信息存在 break; } } if(i==N) { printf("没有该天信息!\n"); printf("请重新选择!\n"); } for(i=n;i { fscanf(fp,"%s",&peo[i]);//将文件中的信息存到数组结构体里 strcpy(peo[i].source,peo[i+1].source); peo[i].year=peo[i+1].year; peo[i].month=peo[i+1].month; peo[i].day=peo[i+1].day; peo[i].get=peo[i+1].get; peo[i].out=peo[i+1].out; strcpy(peo[i].motive,peo[i+1].motive); peo[i].leave=peo[i+1].leave;//用后面的信息覆盖前面的信息} N=N-1;//删除后信息减少一组,所以N要减1 for(i=0;i { if(fwrite(&peo[i],sizeof(struct people),1,fp)!=1) { printf("无法打开!\n"); exit(0); } } fclose(fp);//将现有信息重新存回到文件中 e)添加功能:用户可以在此添加新的账户信息 fp=fopen("f:\\pan.txt","rb");//先打开文件 fread(&peo[i],sizeof(struct people),1,fp);//将文件信息存到结构体数组里 n=N; //添加到结构体数组的末尾 printf("请输入新的信息日期:\n"); scanf("%d %d %d",&peo[n].year,&peo[n].month,&peo[n].day); printf("请输入新的信息收入金额和收入来源:\n"); scanf("%f %s",&peo[n].get,peo[n].source); printf("请输入新的信息支出金额和支出目的:\n"); scanf("%f %s",&peo[n].out,peo[n].motive); peo[n].leave=peo[n].get-peo[n].out; //输入新的信息到结构体中 N=N+1; //添加了新的数据所以N的值加1 fp=fopen("f:\\pan.txt","wb"); for(i=0;i { fwite(&peo[i],sizeof(struct people),1,fp); } fclose(fp);//将新的一组结构体信息写到文件里 f) 查询功能:用户可以在此查询以前存有的账户信息 fopen("f:\\pan.txt","r"); for(i=0;i { fread(&peo[i],sizeof(struct people),1,fp); if(x==peo[i].year&&y==peo[i].month&&z==peo[i].day) { n=i; //查看是否有该天的信息存在 break; } } if(i==N) { printf("没有该天信息!\n"); printf("请重新选择!\n"); f7(); } fread(&peo[n],sizeof(struct people),1,fp);//将数据存到结构体数组中 printf("收入来源收入金额支出目的支出金额余额\n"); printf("%5s ",peo[n].source); printf("%3f ",peo[n].get); printf("%5s ",peo[n].motive); printf("%5f ",peo[n].out); printf("%3f ",peo[n].leave);//输出您要查询的该天信息 fclose(fp); //关闭文件防止信息丢失 g)统计功能:用户可以在此统计一段时间的收入金额和支出金额 for(i=0;i { fread(&peo[i],sizeof(struct people),1,fp); if(x==peo[i].year&&y==peo[i].month&&z==peo[i].day) { n=i; //查看是否有该天的信息存在 break; } } if(i==N) { printf("没有该天信息!\n"); printf("请重新选择!\n"); } for(i=0;i { fread(&peo[i],sizeof(struct people),1,fp); if(x1==peo[i].year&&y1==peo[i].month&&z1==peo[i].day) { m=i; //查看是否有该天的信息存在 break; } } if(i==N) { printf("没有该天信息!\n"); printf("请重新选择!\n"); } 如果存在该段时间信息,那么统计收入金额: if(n { for(i=n,sum=0;i<=m;i++) { sum+=peo[i].get; } printf("%f",sum); fclose(fp); break; } else { for(i=m,sum=0;i<=n;i++) { sum+=peo[i].get; } printf("%f",sum); fclose(fp); break; } 如果统计支出金额,只需将peo[i].get改为peo[i].out就行。 3、各函数的调用关系图 main函数 ↓ f7()函数 ↓↓↓↓↓ f2()函数 f3()函数 f4()函数 f5()函数 f6()函数 ↓ f7()函数 ………… 四.调试分析 1.开始时没有将N定义为全局变量,导致在添加函数中N+1后,其他函数中的N却没有改变,导致最后查询的信息不完整。 2.开始时没有将主菜单单独存到一个函数里面,这样就无法一次运行多个功能,最后将主菜单单独存到一个函数里以后,就可以在运行完一个功能之后,重新选择,这样就可以在一次调试中,运行所有的功能模块,减少了很多麻烦。 3.第一次调试运行时,文件中没有存储任何的信息,所以每次进入都必须先要输入一定量的数据,然后才能进行下面的操作,后来加以改善,先在文件中存储几天的账户信息,这样在运行时就可以直接进行查询,修改,删除等操作了。 4.第一次检查时,由于对文件的操作不是很熟练,发现了添加的数据并没有存储到文件之中,最后经过修正,加入了一个fwrite将信息写到了文件里。 五.用户手册 1、本程序的运行环境为DOS操作系统,执行文件为f1.dsw; 2、进入演示程序后,即显示对话形式的提示操作过程, 如:请输入用户名和密码,输入正确后便进入菜单选择 请输入你的选项, 输入选项后,如果选项不存在,会提示你选项不存在,请重新选择。 输入正确选项后,便会提示你输入日期。如果进入的是修改函数,就会继续提示你输入新的信息;如果进入的时添加函数,会让你输入新的账户信息;如果进入的是删除函数,再删除完后会提示你删除成功;如果进入的时查询函数,会输出你要查询的当天账户信息;如果进入的统计函数,会提示你选择将要统计的信息。 3、如果用户不小心进错了功能,可以输入0来返回主菜单,重新选择。 4、进行完上面的操作之后,会提示用户是否继续运行该程序来进行其他的功能 操作按‘n或N’键stop或其它键继续 六.测试数据 =====请输入用户名和密码:======= 用户名:10201306 密码:1 恭喜输入正确,登录成功! 1:修改信息 2:删除信息3:添加信息 4:查询信息 5:统计信息 a)请选择:1 请输入您要修改得日期:2010 1 1 0.返回主菜单 1.修改该天信息 请选择 1 旧的信息为:2010 1 1 1000.000000 收入1 100.000000 支出1 请输入新的信息:收入金额 1100 收入来源 aaa 支出金额 200 支出目的 bbb。 修改成功! 新的信息为 2010 1 1 1100.000000 aaa 200.0000000 bbb b)请选择:2 请输入您要删除的日期:2010 1 1 0.返回主菜单 1.删除该天信息 请选择:1 旧的信息为: 2010 1 1 1000.000000 收入1 100.000000 支出1 2010 1 2 2000.000000 收入2 200.000000 支出2 2010 1 3 3000.000000 收入3 300.000000 支出3 删除成功! 新的信息为: 2010 1 2 2000.000000 收入2 200.000000 支出2 2010 1 3 3000.000000 收入3 300.000000 支出3 是否继续 y/n n press any key to continue c)请选择:3 0.返回主菜单 1.添加一天的账户信息 请选择:1 旧的信息为: 2010 1 1 1000.000000 收入1 100.000000 支出1 2010 1 2 2000.000000 收入2 200.000000 支出2 2010 1 3 3000.000000 收入3 300.000000 支出3 请输入新的信息:2010 1 4 4000 收入4 400 支出4 添加成功! 新的信息为:2010 1 1 1000.000000 收入1 100.000000 支出1 2010 1 2 2000.000000 收入2 200.000000 支出2 2010 1 3 3000.000000 收入3 300.000000 支出3 2010 1 4 4000.000000 收入4 400.000000 支出4 是否继续 y/n n press any key to continue d)请选择:4 请输入您要查询得日期:2010 1 1 0.返回主菜单 1.查询该天信息 请选择 1 2010 1 1 1000.000000 收入1 100.000000 支出1 是否继续 y/n n press any key tocontinue e)请选择: 5 请输入你要统计的两个日期:2010 1 1 2010 1 3 0.返回主菜单 1.统计该段时间的收入金额 2.统计该段时间的支出金额 3.统计该段时间的余额 请选择 1. 6000.000000 2. 600.000000 3. 5400.000000 是否继续 y/n n press any key to continue 七.附录 1、源程序函数清单 主函数:f1() 修改函数:f2() 删除函数:f3() 添加函数:f4() 查询函数:f5() 统计函数:f6() 主菜单函数:f7() 2、源程序代码 f1.cpp: #include"stdio.h" #include"stdlib.h" #include"string.h" #include"f2.h" #include"f3.h" #include"f4.h" #include"f5.h" #include"f6.h" #include"f7.h" struct people peo[SIZE]; int N=3; void main() { int i,a,b; char d1[10]="收入1",d2[10]="收入2",d3[10]="收入3",e1[10]="支出1",e2[10]="支出2",e3[10]="支出3"; FILE *fp; /*输入三天的账户信息*/ peo[0].year=2010;peo[0].month=1;peo[0].day=1; strcpy(peo[0].source,d1);;peo[0].get=1000; strcpy(peo[0].motive,e1);peo[0].out=100; peo[0].leave=peo[0].get-peo[0].out; peo[1].year=2010;peo[1].month=1;peo[1].day=2; strcpy(peo[1].source,d2);peo[1].get=2000; strcpy(peo[1].motive,e2);peo[1].out=200; peo[1].leave=peo[1].get-peo[1].out; peo[2].year=2010;peo[2].month=1;peo[2].day=3; strcpy(peo[2].source,d3);peo[2].get=3000; strcpy(peo[2].motive,e3);peo[2].out=300; peo[2].leave=peo[2].get-peo[2].out; /*把数据写入文件*/ fp=fopen("f:\\pan.txt","w"); for(i=0;i { if(fwrite(&peo[i],sizeof(struct people),1,fp)!=1) { printf("无法打开!\n"); exit(0); } } fclose(fp); /*菜单选择功能*/ printf("===============个人账户管理软件================\n"); printf("===============设计人:君宇==================\n"); printf("\n"); printf("\n"); printf("请登录:\n"); for(;;) { printf("============请输入用户名和密码:==============\n"); printf("用户名:"); scanf("%d",&a); printf("\n"); printf("密码:"); scanf("%d",&b); printf("\n"); if(a==10201306&&b==1) { printf("=============恭喜输入正确,登录成功!=========\n"); printf("======该软件中已存有2010年1月1号到3号的信息!==\n"); f7(); } else { printf("输入错误,请重新输入!\n"); } } } f2.cpp: #include"stdio.h" #include"stdlib.h" #include"string.h" #include"f2.h" #include"f3.h" #include"f4.h" #include"f5.h" #include"f6.h" #include"f7.h" extern struct people peo[SIZE]; extern N; void f2(int x,int y,int z) { int b,i,n,flag=1; char c; FILE *fp; /*检查信息*/ if((fp=fopen("f:\\pan.txt","r"))==NULL) { printf("无法找到该文件!\n"); exit(0); } /*检查是否有该信息*/ for(i=0;i { fread(&peo[i],sizeof(struct people),1,fp); if(x==peo[i].year&&y==peo[i].month&&z==peo[i].day) {n=i;break;} } if(i==N) { printf("没有该天信息!\n"); printf("请重新选择!\n"); f7(); } /*进入修改程序*/ for(;;) { printf("=====================请选择:=================\n"); printf("==============0.返回主菜单======================\n"); printf("==============1.修改该天信息====================\n"); printf("============================================= \n"); scanf("%d",&b); switch(b) { default:printf("无此选项,请重新输入:\n"); break; case 0: f7(); case 1: //修改收入来源 fp=fopen("f:\\pan.txt","w+"); fread(&peo[i],sizeof(struct people),1,fp); printf("旧的信息为:\n"); printf("收入来源收入金额支出目的支出金额余额\n"); printf("%5s ",peo[n].source); printf("%3f ",peo[n].get); printf("%5s ",peo[n].motive); printf("%5f ",peo[n].out); printf("%3f \n",peo[n].leave); fscanf(fp,"%s",&peo[n]); printf("请输入新的收入来源\n"); scanf("%s",peo[n].source); printf("\n"); //修改收入金额 printf("请输入新的收入金额\n"); scanf("%f",&peo[n].get); printf("\n"); //修改支出目的 printf("请输入新的支出目的\n"); scanf("%s",peo[n].motive); printf("\n"); //修改支出金额 printf("请输入新的支出金额\n"); scanf("%f",&peo[n].out); printf("\n"); peo[n].leave=peo[n].get-peo[n].out; printf("新的的信息为:\n"); printf("收入来源收入金额支出目的支出金额余额\n"); printf("%5s ",peo[n].source); printf("%3f ",peo[n].get); printf("%5s ",peo[n].motive); printf("%5f ",peo[n].out); printf("%3f \n",peo[n].leave); for(i=0;i { if(fwrite(&peo[i],sizeof(struct people),1,fp)!=1) { printf("无法打开!\n"); exit(0); } } fclose(fp); break; } printf("是否继续?y/n\n"); scanf("%s",&c); if(c=='n'||c=='N') { exit(0); } } } F3.cpp: #include"stdio.h" #include"stdlib.h" #include"string.h" #include"f2.h" #include"f3.h" #include"f4.h" #include"f5.h" #include"f6.h" #include"f7.h" extern struct people peo[SIZE]; void f3(int x,int y,int z) { int b,i,n,flag=1; extern N; char c; FILE *fp; if((fp=fopen("f:\\pan.txt","r"))=NULL) { printf("无法找到该文件!\n"); exit(0); } /*检查是否有该信息*/ for(i=0;i { if(x==peo[i].year&&y==peo[i].month&&z==peo[i].day) { n=i; break; } } if(i==N) { printf("没有该天信息!\n"); printf("请重新选择!\n"); f7(); } /*进入删除程序*/ for(;;) { printf("=====================请选择:==================\n"); printf("==================0.返回主菜单=================\n"); printf("==================1.删除该天信息===============\n"); printf("===============================================\n"); scanf("%d",&b); switch(b) { default:printf("无此选项,请重新输入:\n");break; case 0: f7(); case 1: fp=fopen("f:\\pan.txt","w+"); printf("旧的信息为:\n"); for(i=0;i { printf("日期收入来源收入金额支出目的支出金额余额\n"); printf("%d %d %d ",peo[i].year,peo[i].month,peo[i].day); printf("%5s ",peo[i].source); printf("%3f ",peo[i].get); printf("%5s ",peo[i].motive); printf("%5f ",peo[i].out); printf("%3f \n",peo[i].leave); } for(i=n;i { fscanf(fp,"%s",&peo[i]); strcpy(peo[i].source,peo[i+1].source); peo[i].year=peo[i+1].year; peo[i].month=peo[i+1].month; peo[i].day=peo[i+1].day; peo[i].get=peo[i+1].get; peo[i].out=peo[i+1].out; strcpy(peo[i].motive,peo[i+1].motive); peo[i].leave=peo[i+1].leave; } printf("删除成功!\n"); N=N-1; for(i=0;i { printf("日期收入来源收入金额支出目的支出金额余额\n" printf("%2d %2d %2d ",peo[i].year,peo[i].month,peo[i].day); printf("%5s ",peo[i].source); printf("%3f ",peo[i].get); printf("%5s ",peo[i].motive); printf("%5f ",peo[i].out); printf("%3f \n",peo[i].leave); } for(i=0;i { if(fwrite(&peo[i],sizeof(struct people),1,fp)!=1) { printf("无法打开!\n"); exit(0); } } fclose(fp); break; } printf("是否继续?y/n\n"); scanf("%s",&c); if(c=='n'||c=='N') exit(0); } } f4.cpp: #include"stdio.h" #include"stdlib.h" #include"string.h" #include"f2.h" #include"f3.h" #include"f4.h" #include"f5.h" #include"f6.h" #include"f7.h" extern struct people peo[SIZE]; extern N; void f4() { int i,b,n; char c; FILE *fp; if((fp=fopen("f:\\pan.txt","a"))=NULL) { printf("无法找到该文件!\n"); exit(0); } for(;;) { printf("=============================================\n"); printf("=================0.返回主菜单================\n"); printf("=================1.添加信息==================\n"); printf("=============================================\n"); scanf("%d",&b); switch(b) { default:printf("无此选项,请重新输入:\n"); break; case 0: f7(); case 1: /*进入添加程序*/ fp=fopen("f:\\pan.txt","rb"); printf("旧的信息为:\n"); for(i=0;i { fread(&peo[i],sizeof(struct people),1,fp); printf("日期收入来源收入金额支出目的支出金额余额\n"); printf("%2d %2d %2d ",peo[i].year,peo[i].month,peo[i].day); printf("%5s ",peo[i].source); printf("%3f ",peo[i].get); printf("%5s ",peo[i].motive); printf("%5f ",peo[i].out); printf("%3f \n",peo[i].leave); } n=N; printf("请输入新的信息日期:\n"); scanf("%d %d %d",&peo[n].year,&peo[n].month,&peo[n].day); printf("请输入新的信息收入金额和收入来源:\n"); scanf("%f %s",&peo[n].get,peo[n].source); printf("请输入新的信息支出金额和支出目的:\n"); scanf("%f %s",&peo[n].out,peo[n].motive); peo[n].leave=peo[n].get-peo[n].out; N=N+1; printf("=============现在的信息:=============\n"); for(i=0;i { printf("日期收入来源收入金额支出目的支出金额余额\n"); printf("%2d %2d %2d ",peo[i].year,peo[i].month,peo[i].day); printf("%5s ",peo[i].source); printf("%3f ",peo[i].get); printf("%5s ",peo[i].motive); printf("%5f ",peo[i].out); printf("%3f \n",peo[i].leave); } fp=fopen("f:\\pan.txt","wb"); for(i=0;i { fwrite(&peo[i],sizeof(struct people),1,fp); } fclose(fp); break; } printf("是否继续?y/n\n"); scanf("%s",&c); if(c=='n'||c=='N') { exit(0); } } } f5.cpp: #include"stdlib.h" #include"string.h" #include"f2.h" #include"f3.h" #include"f4.h" #include"f5.h"