个人收支管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学与信息工程学院课程设计报告
2011-2012第二学期
课程设计名称C语言课程设计
设计题目个人收支管理系统
学生姓名
学号
专业班级
指导教师
2012年7月4日
个人收支管理
一、设计目的
一些比较发达国家人的生活中对理财有着很严格的计划,因此国外的理财系统总体来说比较普遍,做的也比较完善.国内的理财系统
主要偏重于办公财务软件,而个人理财和家庭理财方面的比较少,因
此需要开发相关的系统软件,从而达到引导理性消费,合理安排收支。

进行账目的统计,如果是手动统计的话,首先,如果每天统计的话,用于统计的账本和记录会越来越多,不利于保管,容易造成丢失;其次,随着纪录的增多,如果要查找以前的记录,会变的越来越困难。

因此,需要一个功能比较完善的记账系统来代替传统的手工统计。

个人收支管理系统可以方便地记录您家庭的每日收支情况。

二、功能描述
如图1所示,本系统主要有8个板块构成:
1.个人收支管理系统显示界面。

个人收支管理系统必须在系统运行后第一时间显示出来。

此界面显示了一个收入模式、一个支出模式、一个明细表、一个查询与统计、一个记录数据写入文件、一个读取文件的功能。

2.收入模式。

用户可以在收入模式中输入以下数据:顺序号、日期、摘要、金额、余额、币种,收入或支出标志。

默认币种为人民币,也可以是美圆、欧元、日币或英镑。

3.支出模式。

用户可以在支出模式中输入以下数据:顺序号、日期、摘要、金额、余额、币种,收入或支出标志。

默认币种为人民币,也可以是美圆、欧元、日币或英镑。

4.明细表。

用户可以根据需要输入起止时间来查询一段时间内的收入支出情况,系统会通过列表的形式把内容展示出来。

5.查询与统计。

在此功能模式下,用户可以对一段时间的收入支出情况进行查询,可以得到总收入、总支出和余额。

此数据是按月或按年份统计计算的。

6.此板块属于拓展功能1---写入文件,记录数据。

在此模块下,用户可以根据需要爆当前输入的数据保存下来,以备后用。

7.此板块属于拓展功能2—读取文件,读取数据。

在此模块下,用户可以读取以前所记录的数据并进行查看。

8.退出系统。

三、总体设计
1.系统执行主程序
本系统执行主程序如图2所示。

首先,调用main函数,是系统进入主显示面。

然后由用户选择所需要的功能,并进入相应功能程序,按照用户需求进行相应操作后回到主显示界面,等待用户继续按键选择功能进行操作。

2.系统显示界面
此系统界面主要由可供选择的功能组成:收入、支出、明细表、查询与统计、写入文件、读取文件。

用户在进行选择后可通过switch 语句进行跳转进入相应分程序。

四、数据结构设计
data 结构体
struct data{
int n;//顺序
int y,m,d;
char zy[100]; //摘要
float money,rmoney;//金额,余额
char biz[5]; //币种
int x; //收支类型(标记,明细表或查询统计用)
}p[100];
本程序中主要数据都需要显示顺序、日期、摘要、金额、余额、币种和收支类型,所以需要定义data 结构体。

Int n:表示顺序。

Int y,m,d:用来定义日期。

Char zy:摘要。

Float money、rmoney:金额、余额。

Char biz[5]:币种。

Int x:定义收支类型。

五、函数功能描述
1.check():
函数原型:int check()
check函数主要用于检查输入日期的合法性、日期的先后顺序是否正确,并查找符合日期要求的数据。

2.fflush()
函数原型:fflush(stdin)
主要用于清除缓存,方便用户接下来的操作。

3.gets()
函数原型:gets()
函数主要用于把用户输入的数据保存到指定数据中。

4. strlen()
函数原型:size_t strlen(const char *s)
该函数是用来计算字符串的长度,用于用户接下来的操作。

5. strcpy()
函数原型:char *strcpy(char *s1,const char *s2)
该函数用于把字符串s2复制给字符串s1。

6.file *()
函数原型:file *fp1;
通过文件指针便于对流的访问。

7.Fopen()
函数原型:fopen (FILE_NAME,”r或w”)
该函数用于打开文件,进行读取或写入。

8.Fclose ()
函数原型:fclose()
该函数主要用来关闭用户打开的文件。

9.Main()
函数原型:void main()
Main()为主函数。

四、程序实现
1.源码分析
(1)程序预处理
#include <stdio.h> //标准输入输出函数库
#include <stdlib.h> //标准函数库
#include <string.h> //字符串操作函数库
int income()//收入模式
int expend() //支出模式
int list()//明细表
int destat () //查询与统计
void write() //写入文件
void read () //读取文件
(2)主函数main()
Main()函数主要实现了对整个程序的调用,以及相关功能模块的调用。

它主要的工作是初始化程序。

void main()
{
int n; //确定用户需要进入的功能模块
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){
case 1:income(p); system("cls");break; //进入收入模块,结束后返回case 2:expend(p); system("cls");break; //进入指出模块,结束后返回case 3:list(p); system("cls");break; //进入明细表,结束后返回
case 4:destat(p); system("cls");break; //进入查询与统计,结束后返回case 5:write(p); system("cls");break; //进入写入文件,结束后返回case 6:read(p); system("cls");break; //进入读取文件,结束后返回
}
}while(n!=0); //退出系统
}
2.程序运行结果显示
(1)初始化界面
(2)进入收入模式
结束时按Enter返回主界面(3)进入支出模式
结束时按Enter返回主界面(4)明细表
结束时按Enter返回主界面(5)查询与统计
按年查询按月查询
(6)写入文件
(7)读取文件
在这我们主要显示退出系统后读取文件操作显示:
之后用户可以根据需要进行相应操作查看数据。

(8)退出系统
六、课程设计总结
经过2个星期的努力,终于完成了个人收支管理系统的设计。

本来,在开始上课之前,我们都以为这是很简单的东西,毕竟我们都学习了这么时间,并且也在课上进行了一次次的实战训练。

可是,没想到,别看平时比较容易,在这一刻,要把课上学到的知识融会贯通,要想设计出自己心满意足的东西是多么的困难。

不过,还好,总算完成了,也感受到了成功的喜悦。

努力奋斗,并不是没有回报的当然,在这2个星期的过程中,我们也发现了许多问题并克服了它们。

这些问题或许是上课时没注意到的细节问题,或是自己之前一直没能搞懂的知识点,但不论如何,它都让我们学会了好多新的东西,有了新的感悟。

在此,感谢老师们的辛勤工作,无私贡献,感谢老师们的指导。

七、源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data{
int n;
int y,m,d;
char zy[100]; //摘要
float money,rmoney;//金额,余额
char biz[5]; //币种
int x; //收支类型(标记,明细表或查询统计用)
}p[100];
int k=1;
int check1(int y, int m, int d)//检测日期合法性
{
int a[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])
return 1;
if((((y%4==0)&&(y%100!=0))||(y%400==0))&&(m==2)&&(d==29))
return 1;
}
}
return 0;
}
int check2(int y1,int m1,int d1,int y2,int m2,int d2)//检测日期的先后顺序是否正确
{
if(y2>y1) return 1;
if(y2==y1&&m2>m1) return 1;
if(y2==y1&&m2==m1&&d2>d1) return 1;
if(y2==y1&&m2==m1&&d2==d1) return 1;
else
return 0;
}
int check3(int y1,int m1,int d1,int y2,int m2,int d2) //查找符合要求的日期
{
int i,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)
return 1;
else
return 0;
}
int income(struct data p[])
{
int i;char q[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);
return 0;
}
}
int expend(struct data p[])//支出
{
int i;char q[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);
return 0;
}
}
int list(struct data p[])
{
char q[100];
int i,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<k;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);
return 0;
}
int destat (struct data p[]) //查询与统计
{
int y,m,z,i; char q[100];
float sum1=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);
return 0;
}
void write(struct data p[])//写入文件
{
int i;
FILE *fp;
char q[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<k;i++)
{
fwrite(&p[i],sizeof(struct data),1,fp);
}
printf ("记录已存储!\n");
}
printf ("\n请按Enter键继续:");
fflush(stdin);
gets(t);
}
void read (struct data p[])//读取文件
{
FILE *fp;
char q[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(struct data),1,fp);
}
fclose(fp);
k=k-1;
printf ("文件已读取!\n");
}
printf ("\n请按Enter键继续:");
fflush(stdin);
gets(t);
}
void main()
{
int n;
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){
case 1:income(p); system("cls");break; case 2:expend(p); system("cls");break; case 3:list(p); system("cls");break; case 4:destat(p); system("cls");break; case 5:write(p); system("cls");break; case 6:read(p); system("cls");break; }
}while(n!=0);
}。

相关文档
最新文档