程序设计家庭支出管理系统.docx
《程序设计家庭支出管理系统.docx》由会员分享,可在线阅读,更多相关《程序设计家庭支出管理系统.docx(24页珍藏版)》请在冰豆网上搜索。
程序设计家庭支出管理系统
程序设计报告
(2010/2011学年第一学期)
题目:
家庭支出管理系统
专业生物医学工程
学生姓名韩文勋
班级学号B11090425
指导教师胡素军
指导单位计算机软件教学中心
日期2012.11.01
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
年月日
评分等级
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
家庭支出管理系统
一、课题内容和要求
1、该系统要求对一个家庭某月的支出情况进行统计和分析。
通过此课题,熟练掌握数组、指针的各种操作,以及一些算法思想的使用。
2、功能要求:
(1)支出信息包括:
支出类型(主要可以分为饮食,服饰装扮,礼金,教育培训,电器,健身,通讯,子女培养,旅游,文化娱乐,医疗,交通,聚会,居住等小项),金额,消费地点,消费时间等。
(2)需要实现的功能
1)用户根据口令进入系统
2)输入某一月份,完成该月份的支出管理
3)输入并统计该月的支出情况
4)显示该月支出信息表,内容应包括日期,金额等
5)按支出类型进行分类统计和排序
6)进行本月消费分析,即分析每项支出所占总支出的百分比,并显示分析结果
7)显示按支出类型排序后的支出信息
8)将排序后的内容存为文件。
(3)界面友好,输入信息符合逻辑如存款金额不为负数、不可能有非数字的字符等。
2、需求分析
这个程序利用输入,输出,排序和百分比等功能对家庭的各项支出管理进行操作,以次来方便操作管理。
1,菜单函数,此函数是为了让用户根据菜单选择功能并根据提示来进行操作。
2,密码函数,因为家庭支出管理系统涉及到私人财务,所以需要利用密码函数对程序进行保密。
因此只有在输入正确的口令后才能进入该系统。
3,输入函数,为了实现将各个指出项目的烈性,支出的金额以及消费的时间,地点等存入需要的文件里,所以必须先要存在存储器里。
4,求和函数,实现简单的求和功能,就是利用求和功能求出每月的各项金额的总和。
一次来统计出该月的支出情况。
5,输出函数,即通过行列表来直观对应所输入的项目的金额,消费时间及地点。
6,分析函数,对本月的消费进行分析,分析出每项支出所占总支出的百分比,通过他们各自的项目金额所占的百分比来直观显示那个指出比较重要。
7,类别排序函数,对本月相同的类别进行合并统计,并排序。
8,保存函数,就是将输入的信息保存下来并存入文档或者其他形式的文件。
3、概要设计
首先,编写一个现实的菜单函数以方便用户将支出中的内容(钱,时间,地点等)定义成结构体。
然后根据需求可以完成需求的函数,输入信息的Put函数,计算总支出的Money函数,显示所有的Display函数。
最后,编写主程序,这一步可以调用功能函数,并利用相应的函数将其和菜单联系起来,方便用户使用。
1,定义机构体,声明各成员的变量含义。
2,定义密码函数,通过对指针的运用,利用getch()函数来获得输入的密码值,再用来和定义的密码值作比较利用ifelse语句,来显示输入密码的正确性。
3,显示主菜单,采用switch()和case语句,根据用户的选择则进入相应的模块。
4,Menu菜单包括输入函数inputitems(),求和函数Summoney(),输出函数showitems(),类别排序函数paixu(),消费价格排序函数shunxu(),分析函数analyseitems(),保存函数save(),并在最后添加一个退出选项exit。
5,设置密码函数voidpassword(),我是采用逐字比较法,用for循环一次进行从前到后的对比,假如完全正确用break跳出循环进入系统,如果错误就要重新输入。
6,输入函数intinoutitems(expensesxp[],intn),在第1步中定义了exp[],其中的type,place,money,time都是成员变量,逐项进行输入。
输入完毕的话则回到了第3步重新开始。
7,求和函数Summoney(expensesxp[],intn),利用循环和自加来求一个总和。
相加的只是各项成员的成员变量money。
8,输出函数Display(expensesxp[],intn),仍然用循环采用逐项输出。
9,分析函数analyseitems(expensesxp[],intn),需要统计百分比,定义一个求和变量,计算所有输出的总和s,再用每类支出除以s再乘以100%,用来求取百分比。
10.消费类别排序函数paixu(expensesxp[],intn),用字符串比较法找出相同的类别,把同类别的值加到第一个相同的值上,后面的赋值为0,输出时判断不为0的值才输出。
11.保存函数save(expensesxp[],intn),将数据保存到学号命名的文档里。
四、源程序代码
#include"stdio.h"
#include"stdlib.h"
#include"ctype.h"
#include"string.h"
#include"conio.h"
#include"malloc.h"
#include"windows.h"
typedefstruct//定义结构体
{
chartype[20];
intGetsum;
charplace[20];
inttime;
}family;
familyfam[100];
intm,n=0;
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||8.保存数据及结果||\n");
printf("\t\t||9.退出系统||\n");
printf("\t\t***************************\n");
printf("\t\t***************************\n");
printf("\t\t\t请对应选择所需选项(0-9):
");
c=getchar();
}while(c<'1'||c>'9');
return(c-'0');
}
voidpassword()
{
chard[6];
charm[6];
m[0]='1',m[1]='2',m[2]='3',m[3]='4',m[4]='5',m[5]='6';//数组比较
printf("请输入六位数密码:
");//输入密码
for(intn=0;;)
{
for(inti=0;i<6;i++)
{
d[i]=getch();
if(d[i]>='0'||d[i]<='9'||d[i]>='a'||d[i]<='z'||d[i]>='A'||d[i]<='Z')
putchar('*');
}
if(d[0]==m[0]&&d[1]==m[1]&&d[2]==m[2]&&d[3]==m[3]&&d[4]==m[4]&&d[5]==m[5])
{
printf("\n欢迎使用!
\n");break;
}
if(d[0]!
=m[0]||d[1]!
=m[1]||d[2]!
=m[2]||d[3]!
=m[3]||d[4]!
=m[4]||d[5]!
=m[5])//当密码错误时如下
printf("\n密码错误!
请重新输入:
");
if(n>3)
{
printf("error\n");
exit(0);
}
n++;
}
}
voidyuefen()
{
scanf("%d\n",&m);
}
intInputitems(familysum[],intn)
{
inti=0;
charsign='y';
while(sign!
='n'&&sign!
='N')
{
printf("\t\t\t种类:
");//输入变量
scanf("\t\t\t%s",sum[n+i].type);
printf("\t\t\t支出:
");
scanf("\t\t\t%d",&sum[n+i].Getsum);
printf("\t\t\t地点:
");
scanf("\t\t\t%s",sum[n+i].place);
printf("\t\t\t时间:
");
scanf("\t\t\t%d",&sum[n+i].time);
if(sum[n+i].time<1||sum[n+i].time>31)
returnfalse;
printf("\t\t\t需要再次输入吗?
(y/n)");
scanf("\t\t\t%c",&sign);
i++;
}
return(n+i);
}
voidGetsum(familysum[],intn)//求出总数
{
intgetsum=0;
inti=0;
for(i=0;i{
getsum+=sum[i].Getsum;
}
printf("\t\t\t%d\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{
if(sum[i-1].Getsum!
=0)
{
printf("\t\t\t%-8s%-8d%-8s%-10-d%d\n",sum[i-1].type,sum[i-1].Getsum,sum[i-1].place,m,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");
}
voidAnalyseitems(familysum[],intn)//分析函数
{
floata=0;
floats=0;
inti=0;
for(i=0;i{
s+=sum[i].Getsum;
}
for(i=0;i{
if(sum[i].Getsum!
=0)
{
floata=(sum[i].Getsum/s)*100;
printf("\t\t\t%s",&sum[i].type);
printf("\t\t\t%f%%\n",a);
}
}
}
voidshunxu(familysum[],intn)//按消费价格排序
{
inti,j,y,temp1,temp2;
chara[30],b[30];
for(j=0;j{
if(sum[j].Getsum!
=0)
{
y=j;
for(i=j+1;i{
if(sum[i].Getsumy=i;
if(y!
=j)
{
temp1=sum[y].Getsum;
sum[y].Getsum=sum[j].Getsum;
sum[j].Getsum=temp1;
temp2=sum[y].time;
sum[y].time=sum[j].time;
sum[j].time=temp2;
strcpy(a,sum[y].place);
strcpy(sum[y].place,sum[j].place);
strcpy(sum[j].place,a);
strcpy(b,sum[y].type);
strcpy(sum[y].type,sum[j].type);
strcpy(sum[j].type,b);
}
}
}
}
printf("\t\t\t-----------------\n");
printf("\t\t\t种类支出\n");
printf("\t\t\t-----------------\n");
for(i=0;i{
if(sum[i].Getsum!
=0)
printf("\t\t\t%-8s%-8d\n",sum[i].type,sum[i].Getsum);
}
}
voidpaixu(familysum[],intn)//消费类别排序函数
{
inti,j,y;
for(j=0;j{
y=j;
for(i=j+1;i{
if(strcmp(sum[i].type,sum[j].type))
{}
else
{sum[i].Getsum=sum[i].Getsum+sum[j].Getsum;
sum[j].Getsum=0;
}
}
}
printf("\t\t\t-----------------\n");
printf("\t\t\t种类支出\n");
printf("\t\t\t-----------------\n");
for(i=0;i{
if(sum[i].Getsum!
=0)
printf("\t\t\t%-8s%-8d\n",sum[i].type,sum[i].Getsum);
}
}
voidleibie(familysum[],intn)//类别显示函数
{
inti;
printf("\t\t\t-----------------\n");
printf("\t\t\t种类支出\n");
printf("\t\t\t-----------------\n");
for(i=1;i{
if(sum[i-1].Getsum!
=0)
{
printf("\t\t\t%-8s%-8d\n",sum[i-1].type,sum[i-1].Getsum);
}
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");
}
voidsave(familysum[],intn)//保存文件
{
inti=0;
FILE*fp;
printf("\t\t\t保存结果或数据\n");
if((fp=fopen("d:
//B09010111.txt","w"))==NULL)
{
printf("\t\t\t无法打开该文件\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n);
while(i{
if(sum[i].Getsum!
=0)
fprintf(fp,"%-16s%d\n",sum[i].type,sum[i].Getsum);
i++;
}
fclose(fp);
printf("保存成功!
\n");
}
voidmain()
{
password();
getch();
for(;;)
{
switch(menu_select())//菜单函数
{
case1:
intm;
printf("\t\t\t请输入相应月份\n");
printf("\t\t\t月份:
");
yuefen();
printf("\t\t\t");
system("pause");
break;
case2:
printf("\t\t\t请输入相应支出\n");
n=Inputitems(fam,n);
break;
case3:
printf("\t\t\t支出总和\n");
Getsum(fam,n);
printf("\t\t\t");
system("pause");
break;
case4:
printf("\t\t\t支出情况\n");
Showitems(fam,n);
break;
case5:
printf("\t\t\t消费分析\n");
Analyseitems(fam,n);
printf("\t\t\t");
system("pause");
break;
case6:
printf("\t\t\t按消费价格排序\n");
shunxu(fam,n);
printf("\t\t\t");
system("pause");
break;
case7:
printf("\t\t\t按消费类别排序\n");
paixu(fam,n);
printf("\t\t\t");
system("pause");
break;
case8:
printf("\t\t\t保存项目\n");
save(fam,n);
printf("\t\t\t");
system("pause");
break;
case9:
printf("\t\t\t谢谢使用!
\n");
printf("\t\t\t");
system("pause");
exit(0);
}
}
}
五、测试数据及其结果分析
1.按提示输入密码,密码错误时重新输入。
请输入密码:
******(123456)
欢迎使用!
2.根据菜单提示选择1,输入月份。
3.根据菜单提示选择2,输入消费金额。
4.根据菜单提示选择3,计算消费总和。
5.根据菜单提示选择4,显示支出情况。
6.根据菜单提示选择5,进行消费分析,计算出各项支出占总支出的百分比。
7.根据菜单提示选择6,按照消费价格进行排序。
8.根据菜单提示选择7,按照消费类别进行排序。
9.根据菜单提示选择8,保存数据及结果在"d:
//B09010111.txt"中。
10.根据菜单提示选择9,退出系统。
六、调试过程中的问题
1.价格排序函数:
chara[];
实现代码:
strcpy(a,sum[y].time);
strcpy(sum[y].time,sum[j].time);
strcpy(sum[j].time,a);
输出价格并没有按规定排序
改后:
inta;
a=sum[y].time;
sum[y].time=sum[j].time;
sum[j].time=a;
成功实现了价格的排序
2.月份显示:
main函数中用scanf(“%d\n”,m);
月份无法在显示函数中成功显示;
后发现是月份函数没有被调用;
修改为:
yuefen();
月份在显示函数中显示
3.菜单函数中开始进入死循环:
do
{
printf("\t\t\t***************************\n");
printf("\t\t\t**********菜单系统*********\n");
printf("\t\t\t||1.输入月份||\n");
printf("\t\t\t||2.输入消费金额||\n");
printf("\t\t\t||3.计算消费总和||\n");
printf("\t\t\t||4.支出情况||\n");
printf("\t\t\t||5.消费分析||\n");
printf("\t\t\t||6.按消费价格排序||\n");
printf("\t\t\t||7.按消费类别排序||\n");
printf("\t\t\t||8.保存数据及结果||\n");
printf("\t\t\t||9.退出系统||\n");
printf("\t\t\t***************************\n");
printf("\t\t\t***************************\n");
printf("\t\t\t请对应选择所需选项(1-9):
");
scanf("%d",&c);
}
while(c<1||c>9)
修改后为:
printf("\t\t\t***************************\n");
printf("\t\t\t**********菜单系统*********\n");
printf("\t\t\t||1.输入月份||\n");
printf("\t\t\t||2.输入消费金额||\n");
printf("\t\t\t||3.计算消费总和||\n");
printf("\t\t\t||4.支出情况||\n");
printf("\t\t\t||5.消费分析||\n");
printf("\t\t\t||6.按消费价格排序||\n");
printf("\t\t\t||7.按消费类别排序||\n");
printf("\t\t\t||8.保存数据及结果||\n");
printf("\t\t\t||9.退出系统||\n");
printf("\t\t\t*************