家庭支出管理系统的程序设计.docx
《家庭支出管理系统的程序设计.docx》由会员分享,可在线阅读,更多相关《家庭支出管理系统的程序设计.docx(27页珍藏版)》请在冰点文库上搜索。
家庭支出管理系统的程序设计
家庭支出管理系统
一、课程内容和要求
内容:
该系统要求对一个家庭某月的支出情况进行统计和分析。
通过此课题,熟练掌握数组、指针的各种操作,以及一些算法思想的应用。
要求:
(1)支出信息包括:
支出类型(主要可以分为饮食,服饰装扮,礼金,教育培训,电器,健身,通讯,子女培养,旅游,文化娱乐,医疗,交通,聚会,居住等小项),金额,消费地点,消费时间等。
(2)需要实现的功能
1)用户根据口令进入系统
2)输入某一月份,完成该月份的支出管理
3)输入并统计该月的支出情况
4)显示该月支出信息表,内容应包括日期,金额等
5)按支出类型进行分类统计和排序
6)进行本月消费分析,即分析每项支出所占总支出的百分比,并显示分析结果
7)显示按支出类型排序后的支出信息
8)将排序后的内容存为文件。
(3)界面友好,输入信息符合逻辑如存款金额不为负数、不可能有非数字的字符等。
(4)数据结构和函数自行定义,要求清晰明确。
二、需求分析
结构体定义:
用结构体来定义所要的消费信息的种类(消费类型,消费金额,消费地点,消费时间)。
菜单函数intmenu_select():
显示该系统所拥有的功能,并利于用户选择自己所需要实现的功能。
密码函数voidpassword():
验证用户所输入的密码是否正确,并且根据用户意愿修改密码,从而进入系统。
输入密码时密码要用’*’表示。
输入函数intInputitems(familysum[],intn):
输入用户所要的消费情况。
求总金额函数voidGetsum(familysum[],intn):
实现简单的求和功能,计算出用户所输入的消费的总金额。
输出函数voidShowitems(familysum[],intn):
输出用户所输入的信息。
排序函数voidpaixu(familysum[],intn):
对用户所输入的消费情况进行归类,并对同种类型的金额进行从小到大排序。
分析函数voidAnalyseitems(familysum[],intn):
对用户所输入的消费情况中的同种类型进行叠加,计算各类型金额占总金额的百分比,通过它们各类型金额所占的百分比来直观显示哪种类型比较重要。
保存函数voidsave(familysum[],intn):
保存用户所要保存的消费信息进入文件。
主函数voidmain():
通过该函数调用上述各函数,从而实现该系统的管理功能。
三、概要设计
程序框架:
开始先编写一菜单函数来显示该系统所能实现的功能,让用户了解并使用该系统所拥有的管理功能,并且编辑密码函数来实现根据用户指令进入管理系统;之后通过主函数来调用菜单函数menu_select,密码函数password,求总金额函数Getsum,输入函数Inputitems,输出函数Showitems,排序函数paixu,分析函数Analyseitems,保存函数save,从而来实现该系统的管理功能。
而添加数据的功能是采用调用输入函数Inputitems来实现的。
定义结构体:
定义消费的类型,声明各结构成员的变量含义
typedefstruct//定义结构体
{
chartype[20];//消费类型
floatGetsum;//消费金额
charplace[20];//消费地点
inttime;//消费时间
}family;
菜单函数:
通过getchar语句来读入所要实现的功能序号,从而进入相应的函数模块。
密码函数:
通过文件指针应用,用scanf语句来读取用户所输入的密码,并与文件中所保存的密码相比较,看是否能够进入管理系统,并通过指针的应用来修改密码。
输入函数:
通过scanf语句逐项输入消费的信息(类型,金额,地点,时间),输入完毕后,跳回管理菜单重新选择。
求总函数:
通过for循环来实现消费金额Getsum的叠加,从而求出所输入的消费情况的总金额getsum。
输出函数:
应用for循环来逐项输出消费情况。
排序函数:
用for双循环来对消费情况进行归类以及对同种类型的金额运用选择排序法从小到大排序,并对文件指针*fp的应用来使排序之后的消费信息存入文件。
分析函数:
通过对排序函数的调用,来使消费信息进行归类,通过for双循环来计算出各类型的金额sum1,并求出各类型的花费占总金额的百分比a。
保存函数:
应用文件指针*fp来将消费信息存入文件。
主函数:
通过switch语句和case语句来调用各函数,从而实现各函数的功能。
四、源程序代码
#include
#include
#include
#include
#include
#include
#include
typedefstruct//定义结构体
{
chartype[20];//消费类型
floatGetsum;//消费金额
charplace[20];//消费地点
inttime;//消费时间
}family;
familyfam[80];
intmenu_select()//显示该系统所具备的功能
{
charc;
do{
system("cls");//清屏
printf("\t\t***************************\n");
printf("\t\t**********菜单系统*********\n");
printf("\t\t|1.输入消费信息|\n");
printf("\t\t|2.计算消费总和|\n");
printf("\t\t|3.显示消费情况|\n");
printf("\t\t|4.对同种类型消费进行排序并显示|\n");
printf("\t\t|5.消费情况分析|\n");
printf("\t\t|6.添加消费信息|\n");
printf("\t\t|7.保存数据|\n");
printf("\t\t|0.退出系统|\n");
printf("\t\t***************************\n");
printf("\t\t***************************\n");
printf("\t\t\t请对应选择所需选项(0-7):
");
c=getchar();
}while(c<'0'||c>'7');
return(c-'0');
}
voidpassword()//密码验证或密码修改
{
intm;
printf("\t\t****************************************\n");
printf("\t\t****************************************\n");
printf("\t\t**\t\t1.密码修改**\n");
printf("\t\t**\t\t2.登陆**\n");
printf("\t\t****************************************\n");
printf("\t\t****************************************\n");
printf("\t\t\t请输入您所要的选项(1,2):
");
scanf("%d",&m);
getchar();
switch(m)
{
case1:
//密码修改
{
inti,j;
chara[7],b[7],c[7],d[7];
FILE*fp1;FILE*fp2;
fp1=fopen("D:
\\密码.txt","r");
if(!
fp1)
{
printf("filecannotbeopened");
exit
(1);
}
for(i=0;!
feof(fp1);i++)
{
a[i]=fgetc(fp1);
}
fclose(fp1);
printf("\t\t\t请输入原密码:
");
for(j=0;j<7;j++)
{
scanf("%c",b+j);
if(b[j]>='0'&&b[j]<='9'||b[j]>='a'&&b[j]<='z'||b[j]>='A'&&b[j]<='Z')
putchar('*');}
if(a[0]==b[0]&&a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3]&&a[4]==b[4]&&a[5]==b[5])
{
do{
printf("\t\t\t请设置您的新密码:
");
for(j=0;j<7;j++)
{
scanf("%c",c+j);
if(c[j]>='0'&&c[j]<='9'||c[j]>='a'&&c[j]<='z'||c[j]>='A'&&c[j]<='Z')
putchar('*');}
printf("\t\t\t请确认您的新密码:
");
for(j=0;j<7;j++)
{
scanf("%c",d+j);
if(d[j]>='0'&&d[j]<='9'||d[j]>='a'&&d[j]<='z'||d[j]>='A'&&d[j]<='Z')
putchar('*');}
}while(!
(c[0]==d[0]&&c[1]==d[1]&&c[2]==d[2]&&c[3]==d[3]&&c[4]==d[4]&&c[5]==d[5]));
fp2=fopen("D:
\\密码.txt","w+");
if(!
fp2)
{
printf("thefilecannotbeopened!
");
exit
(1);
}
i=0;
while(i<6)
{
fprintf(fp2,"%c",c[i]);
i++;
}
fclose(fp2);
printf("\t\t\t密码修改成功!
\n");
}
else
{
printf("\t\t\t密码错误\n");
exit(0);
}
}
case2:
//密码验证
{
chare[7],f[7];
intn=0;
inti,j;
FILE*fp1;
fp1=fopen("D:
\\密码.txt","r");
if(!
fp1)
{
printf("thefilecannotbeopened!
");
exit
(1);
}
for(i=0;!
feof(fp1);i++)
{e[i]=fgetc(fp1);}
fclose(fp1);
do{
printf("\t\t\t请输入六位数密码:
");
for(j=0;j<7;j++)
{scanf("%c",f+j);
if(f[j]>='0'&&f[j]<='9'||f[j]>='a'&&f[j]<='z'||f[j]>='A'&&f[j]<='Z')
putchar('*');}
if(!
(e[0]==f[0]&&e[1]==f[1]&&e[2]==f[2]&&e[3]==f[3]&&e[4]==f[4]&&e[5]==f[5]))
{
printf("\n密码错误!
请重新输入:
\n");
n++;
}
if(n>3)
{
printf("error\n");
exit(0);
}
}while(!
(e[0]==f[0]&&e[1]==f[1]&&e[2]==f[2]&&e[3]==f[3]&&e[4]==f[4]&&e[5]==f[5]));
printf("\n\t\t\t欢迎使用!
\n");
}
}
}
intInputitems(familysum[],intn)//输入消费信息
{
inti=0;
charsign='y',x[10];
while(sign!
='n'&&sign!
='N')
{
printf("\t\t\t种类:
");
scanf("\t\t\t%s",sum[n+i].type);
printf("\t\t\t支出(大于0):
");
scanf("\t\t\t%f",&sum[n+i].Getsum);
printf("\t\t\t地点:
");
scanf("\t\t\t%s",sum[n+i].place);
printf("\t\t\t时间(0-31):
");
scanf("\t\t\t%d",&sum[n+i].time);
if(sum[n+i].time<1||sum[n+i].time>31)
returnfalse;
gets(x);
printf("\t\t\t需要再次输入吗?
(y/n)");
scanf("\t\t\t%c",&sign);
i++;
}
return(n+i);
}
voidGetsum(familysum[],intn)//计算消费总金额
{
floatgetsum=0;
inti=0;
for(i=0;i{
getsum+=sum[i].Getsum;
}
printf("\t\t\t%f\n",getsum);
}
voidShowitems(familysum[],intn)//输出所输入的消费信息
{
inti;
printf("\t\t\t--------------------------------------\n");
printf("\t\t\t种类支出地点时间\n");
printf("\t\t\t--------------------------------------\n");
for(i=1;i{
printf("\t\t\t%-8s%-12f%-8s%-10d\n",sum[i-1].type,sum[i-1].Getsum,sum[i-1].place,sum[i-1].time);
if(i>1&&i%10==0)
{
printf("\t\t\t----------------\n");
printf("\t\t\t");
system("pause");
printf("\t\t\t----------------\n");
}
}
printf("\t\t\t");
system("pause");
}
voidpaixu(familysum[],intn)//对消费信息进行归类和选择法排序
{
inti,j;
familytemp;
FILE*fp;
fp=fopen("D:
\\支出信息.txt","a+");
if(fp==NULL)
{
printf("\t\t\tthefilecannotbeopened!
\n");
exit
(1);
}
for(i=0;i{
for(j=i+1;j{
if(strcmp(sum[i].type,sum[j].type)==1)
{temp=sum[j];
sum[i]=temp;sum[j]=sum[i];}
else
if(strcmp(sum[j].type,sum[i].type)==0)
{
if(sum[i].Getsum>sum[j].Getsum)
{
temp=sum[j];
sum[j]=sum[i];
sum[i]=temp;
}
}
}
}
fprintf(fp,"排序后:
\n");
for(i=0;ifprintf(fp,"%-8s%-12f%-8s%-10d\n",sum[i].type,sum[i].Getsum,sum[i].place,sum[i].time);
fclose(fp);
printf("\t\t\t保存成功!
\n");
}
voidAnalyseitems(familysum[],intn)//求各种消费类型的金额占总金额的百分比
{
paixu(sum,n);
floattotal=0,a=0,sum1;
inti,j;
for(i=0;i{
total+=sum[i].Getsum;
}
for(i=0;i{
sum1=sum[i].Getsum;
for(j=i+1;j{
if(strcmp(sum[i].type,sum[j].type)==0)
{
sum1+=sum[j].Getsum;
i++;
}
}
a=(sum1/total)*100;
printf("\t\t\t%-8s%-10f%%\n",sum[i].type,a);
}
}
voidsave(familysum[],intn)//保存消费信息
{
inti;
FILE*fp;
fp=fopen("D:
\\支出信息.txt","a+");
if(fp==NULL)
{
printf("\t\t\tthefilecannotbeopened!
\n");
exit
(1);
}
fseek(fp,-1,SEEK_END);
fputc('\n',fp);
for(i=0;ifprintf(fp,"%-8s%-12f%-8s%-10d\n",sum[i].type,sum[i].Getsum,sum[i].place,sum[i].time);
fclose(fp);
printf("\t\t\t保存成功!
\n");
}
voidmain()//主函数
{
password();
getch();
intn=0,m;
charc;
do
{printf("\t\t\t请输入您所要管理的月份(1-12):
");
scanf("%d",&m);
}while(m<1||m>12);
for(;;)
{
switch(menu_select())//选择菜单序号
{
case1:
printf("\t\t\t请输入相应消费情况\n");
n=Inputitems(fam,n);
printf("\t\t\t想保存数据请输入y/Y!
!
\n");
getchar();
scanf("%c",&c);
if(c=='y'||c=='Y')
save(fam,n);
printf("\t\t\t");
system("pause");
break;
case2:
printf("\t\t\t消费总和\n");
Getsum(fam,n);
printf("\t\t\t");
system("pause");
break;
case3:
printf("\t\t\t消费情况\n");
Showitems(fam,n);
break;
case4:
printf("\t\t\t消费排序\n");
paixu(fam,n);
Showitems(fam,n);
printf("\t\t\t");
system("pause");
break;
case5:
printf("\t\t\t消费金额分析\n");
Analyseitems(fam,n);
printf("\t\t\t想保存数据请输入y/Y!
!
\n");
getchar();
scanf("%c",&c);
if(c=='y'||c=='Y')
save(fam,n);
printf("\t\t\t");
system("pause");
break;
case6:
printf("\t\t\t添加消费情况\n");
n=Inputitems(fam,n);
getchar();
scanf("%c",&c);
if(c=='y'||c=='Y')
save(fam,n);
break;
case7:
printf("\t\t\t保存消费数据\n");
save(fam,n);
printf("\t\t\t");
system("pause");
case0:
printf("\t\t\t谢谢使用!
\n");
system("pause");
exit(0);
}
}
}
五、测试数据及其结果分析
第一步,根据用户指令看是否先进入系统还是修改密码:
1)若进行密码修改:
选择1
****************************************
****************************************
**1.密码修改**
**2.登陆**
****************************************
****************************************
请输入您所要的选项(1,2):
1
请输入原密码:
123456
******请设置您的新密码:
000000
******请确认您的新密码:
000000
******密码修改成功!
请输入六位数密码:
000000
******
欢迎使用!
2)若进行密码验证:
选择2
****************************************
****************************************
**1.密码修改**
**2.登陆**
****************************************
****************************************
请输入您所要的选项(1,2):
2
请输入六位数密码:
000000
******
欢迎使用!
第二步,选择所要管理的月份
请输入您所要管理的月份(1-12):
3
第三步,根据菜单系统选择所要运行的功能
1)选择1,输入消费情况,如果不想继续输入就选择n,否则选择y
***************************
**********菜单系统*********
|1.输入消费信息|
|2.计算消费总和|
|3.显示消费情况|
|4.对同种类型消费进行排序并显示|
|5.消费情况分析|
|6.添加消费信息|
|7.保存数据|
|0.退出系统|
***************************
***************************
请对应选择所需选项(0-7):
1
请输入相应消费情况
种类:
yi
支出(大于0):
2
地点:
nan
时间(0-31):
9
需要