个人财务管理软件报告

个人财务管理软件报告
个人财务管理软件报告

个人财务管理软件报告

目录

一、需求分析 (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"

相关主题
相关文档
最新文档