1、个人收集整理 勿做商业用途 程序设计报告 ( 2010 / 2011 学年 第 一 学期) 题 目: 家庭支出管理系统 专 业 生物医学工程 学 生 姓 名 韩文勋 班 级 学 号 B11090425 指 导 教 师 胡素军 指 导 单 位 计算机软件教学中心 日 期 2012.11。01 评 分
2、 细 则 评分项 优秀 良好 中等 差 遵守机房规章制度 上机时的表现 学习态度 程序准备情况 程序设计能力 团队合作精神 课题功能实现情况 算法设计合理性 用户界面设计 报告书写认真程度 内容详实程度 文字表达熟练程度 回答问题准确度 简 短 评 语 教师签名:
3、 年 月 日 评分等级 备注 评分等级有五种:优秀、良好、中等、及格、不及格 家庭支出管理系统 一、 课题内容和要求 1、该系统要求对一个家庭某月的支出情况进行统计和分析。通过此课题,熟练掌握数组、指针的各种操作,以及一些算法思想的应用. 2、功能要求: (1)支出信息包括: 支出类型(主要可以分为饮食,服饰装扮,礼金,教育培训,电器,健身,通讯,子女培养,旅游,文化娱乐,医疗,交通,聚会,居住等小项),金额,消费地点,消费时间等。 (2)需要实现的功能 1) 用户根据口令进入系统 2) 输入某一
4、月份,完成该月份的支出管理 3) 输入并统计该月的支出情况 4) 显示该月支出信息表,内容应包括日期,金额等 5) 按支出类型进行分类统计和排序 6) 进行本月消费分析,即分析每项支出所占总支出的百分比,并显示分析结果 7) 显示按支出类型排序后的支出信息 8) 将排序后的内容存为文件。 (3)界面友好,输入信息符合逻辑如存款金额不为负数、不可能有非数字的字符等。 二、 需求分析 这个程序利用输入,输出,排序和百分比等功能对家庭的各项支出管理进行操作,以次来方便操作管理。 1, 菜单函数,此函数是为了让用户根据菜单选择功能并根据提示来进行操作。 2,密码函数,因为家庭支出
5、管理系统涉及到私人财务,所以需要利用密码函数对程序进行保密.因此只有在输入正确的口令后才能进入该系统. 3, 输入函数,为了实现将各个指出项目的烈性,支出的金额以及消费的时间,地点等存入需要的文件里,所以必须先要存在存储器里。 4, 求和函数,实现简单的求和功能,就是利用求和功能求出每月的各项金额的总和。一次来统计出该月的支出情况. 5, 输出函数,即通过行列表来直观对应所输入的项目的金额,消费时间及地点。 6,分析函数,对本月的消费进行分析,分析出每项支出所占总支出的百分比,通过他们各自的项目金额所占的百分比来直观显示那个指出比较重要。 7, 类别排序函数,对本月相同的类别进行合并
6、统计,并排序。 8, 保存函数,就是将输入的信息保存下来并存入文档或者其他形式的文件。 三、 概要设计 按消费价格排序 支出情况 计算消费总和 主函数 退出系统 输入消费金额 消费分析 按消费类别排序 保存数据及结果 输入月份 首先,编写一个现实的菜单函数以方便用户将支出中的内容(钱,时间,地点等)定义成结构体。然后根据需求可以完成需求的函数,输入信息的Put函数,计算总支出的Money函数,显示所有的Display函数。最后,编写主程序,这一步可以调用功能函数,并利用相应的函数将其与菜单联系起来,方便用户使用。 1, 定义机构体,声明各成员的变量含
7、义。 2, 定义密码函数,通过对指针的运用,利用getch()函数来获得输入的密码值,再用来与定义的密码值作比较利用if else语句,来显示输入密码的正确性. 3, 显示主菜单,采用switch()和case语句,根据用户的选择则进入相应的模块。 4, Menu菜单包括输入函数inputitems(),求和函数Summoney(),输出函数showitems (),类别排序函数paixu(),消费价格排序函数shunxu(),分析函数analyseitems (),保存函数save (),并在最后添加一个退出选项exit。 5, 设置密码函数void password (),我是采用
8、逐字比较法,用for循环一次进行从前到后的对比,假如完全正确用break跳出循环进入系统,如果错误就要重新输入。 6, 输入函数int inoutitems(expense sxp[],int n),在第1步中定义了exp[],其中的type,place,money,time都是成员变量,逐项进行输入。输入完毕的话则回到了第3步重新开始。 7, 求和函数Summoney(expense sxp[],int n),利用循环和自加来求一个总和。相加的只是各项成员的成员变量money. 8, 输出函数Display(expense sxp[],int n),仍然用循环采用逐项输出。 9, 分
9、析函数analyseitems(expense sxp[],int n),需要统计百分比,定义一个求和变量,计算所有输出的总和s,再用每类支出除以s再乘以100%,用来求取百分比。个人收集整理,勿做商业用途个人收集整理,勿做商业用途 10.消费类别排序函数paixu(expense sxp[],int n),用字符串比较法找出相同的类别,把同类别的值加到第一个相同的值上,后面的赋值为0,输出时判断不为0的值才输出。 11.保存函数save(expense sxp[],int n),将数据保存到学号命名的文档里。 四、源程序代码 #include "stdio。h” #include
10、"stdlib.h” #include ”ctype.h” #include "string.h" #include ”conio.h” #include ”malloc。h" #include "windows.h" typedef struct //定义结构体 { char type[20]; int Getsum; char place[20]; int time; }family; family fam[100]; int m,n=0; int menu_select() { char c; do{ system(
11、"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
12、\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’); } void password() { char d[
13、6]; char m[6]; m[0]='1',m[1]='2',m[2]='3’,m[3]='4',m[4]='5’,m[5]=’6'; //数组比较 printf("请输入六位数密码:”); //输入密码 for (int n=0;;) { for(int i=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('*’);
14、 } 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++; } } void yuefen(
15、 { scanf("%d\n",&m); } int Inputitems(family sum[],int n) { int i=0; char sign=’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\
16、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) return false; printf(”\t\t\t需要再次输入吗?(y/n)”); scanf("\t\t\t%c”,&sign); i++; } return(n+i); } void Getsum(family sum[], int n) //求出总数 { int getsum=0; int i=0; for(i=
17、0;i〈n;i++) { getsum+=sum[i]。Getsum; } printf("\t\t\t%d\n",getsum); } void Showitems(family sum[],int n) //显示函数 { int i; printf(”\t\t\t-—-—-—---—-—--———\n"); printf(”\t\t\t 种类 支出 地点 时间\n”); printf("\t\t\t————-——---—-—-———\n”); for(i=1;i〈n+1;i++) { if(sum[i—1].Getsum!=0)
18、 { 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”); } void A
19、nalyseitems(family sum[],int n) //分析函数 { float a=0; float s=0; int i=0; for(i=0;i〈n;i++) { s+=sum[i]。Getsum; } for(i=0;i〈n;i++) { if(sum[i].Getsum!=0) { float a=(sum[i]。Getsum/s)*100; printf(”\t\t\t%s”,&sum[i].type); printf("\t\t\t%f%%\n",a); } } } void shunxu(
20、family sum[],int n) //按消费价格排序
{
int i,j,y,temp1,temp2;
char a[30],b[30];
for(j=0;j 21、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(su 22、m[j]。type,b);
}
}
}
}
printf("\t\t\t—--——-——--——-—-—-\n”);
printf("\t\t\t 种类 支出 \n”);
printf(”\t\t\t—-—————-—-—-————-\n");
for(i=0;i〈n;i++)
{
if(sum[i]。Getsum!=0)
printf(”\t\t\t% —8s%-8d\n”,sum[i]。type,sum[i].Getsum);
}
}
void paixu(family sum[],int 23、n) //消费类别排序函数
{
int i,j,y;
for(j=0;j〈n;j++)
{
y=j;
for(i=j+1;i〈n;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(" 24、\t\t\t 种类 支出 \n”);
printf(”\t\t\t-—-------———-———-\n");
for(i=0;i 25、
printf(”\t\t\t—-——-—-----—---—-\n”);
for(i=1;i 26、rintf("\t\t\t”);
system("pause”);
}
void save(family sum[],int n) //保存文件
{
int i=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〈n)
{
if(sum[i]。Getsum 27、0)
fprintf(fp,”%-16s%d \n”,sum[i]。type,sum[i].Getsum);
i++;
}
fclose(fp);
printf("保存成功!\n”);
}
void main()
{
password();
getch();
for(;;)
{
switch(menu_select()) //菜单函数
{
case 1:
int m;
printf(”\t\t\t请输入相应月份\n”);
printf(”\t\t\t月份:”);
yuefen();
printf( 28、"\t\t\t");
system("pause");
break;
case 2:
printf(”\t\t\t请输入相应支出\n”);
n=Inputitems(fam,n);
break;
case 3:
printf(”\t\t\t支出总和\n”);
Getsum(fam,n);
printf("\t\t\t");
system(”pause");
break;
case 4:
printf("\t\t\t支出情况\n");
Showitems(fam,n);
break;
case 5:
printf("\t\t\t消费分析\n");
Ana 29、lyseitems(fam,n);
printf("\t\t\t");
system(”pause");
break;
case 6:
printf(”\t\t\t按消费价格排序\n");
shunxu(fam,n);
printf("\t\t\t");
system(”pause");
break;
case 7:
printf(”\t\t\t按消费类别排序\n”);
paixu(fam,n);
printf(”\t\t\t");
system(”pause”);
break;
case 8:
printf("\t\t\t保存 30、项目\n");
save(fam,n);
printf(”\t\t\t”);
system("pause”);
break;
case 9:
printf("\t\t\t谢谢使用!\n”);
printf("\t\t\t");
system(”pause”);
exit(0);
}
}
}
五、测试数据及其结果分析
1.按提示输入密码,密码错误时重新输入。
请输入密码:******(123456)
欢迎使用!
2. 根据菜单提示选择1,输入月份。
3.根据菜单提示选择2,输入消费金额。
4. 根据菜单提示选择3,计算消费总和.
5 31、. 根据菜单提示选择4,显示支出情况。
6. 根据菜单提示选择5,进行消费分析,计算出各项支出占总支出的百分比。
7. 根据菜单提示选择6,按照消费价格进行排序。
8. 根据菜单提示选择7,按照消费类别进行排序。
9. 根据菜单提示选择8,保存数据及结果在"d://B09010111.txt”中。
10.根据菜单提示选择9,退出系统。
六、调试过程中的问题
1.价格排序函数:char a[];
实现代码:strcpy(a,sum[y].time);
strcpy(sum[y].time,sum[j]。ti 32、me);
strcpy(sum[j].time,a);
输出价格并没有按规定排序
改后:int a;
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”); 33、
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");
prin 34、tf("\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 35、\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\ 36、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);
if(c〈1||c>9)
printf("\t\t\t重新输入”);
成功的从死循环跳出来
七、课程设计总结
程序设计是用来锻炼学生对所学知识的实际运用能力,面对科学迅 37、速发展的当今社会,程序设计无疑是考验我们的一个好机会,我通过这次设计对C语言又有了更加深刻的理解和体会。
我们小组的这次设计课程题目是:家庭支出管理系统.虽然在平时的学习中我能够较为清晰的了解C语言,但是进入设计程序之后,发现到自己还是有很多的不足,首先就是对以往的知识掌握不够透彻,很多程序还要经过翻书和询问同学才能知道答案,再次就是自己的实践能力也有所缺乏。
不过再次回顾整个编程的过程,无论是理论还是实践,无论是自己动手还是同学的帮助,我都受益匪浅,把原来的掌握的知识更加深刻的体会,把原来不熟悉的知识熟悉了,更是在设计过程中学习到了以前在书中不曾看到的知识点。
这次程序设计基本上涵盖了 38、大学一年级学习到的C 语言知识点,课程题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力.使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订。编程的风格也很重要,我一开始只关心程序运行的结果,而对程序代码的结构的良好丝毫不在意。这是非常不可取的,如果我们希望将来从事编程工作,在这一点上该引起足够的重视.这是严谨的态度,很重要!做程序设计不仅让我修补了以前学习的漏洞,也让我知道一个道理:编程需要兴趣和实际动手。这应该可以借鉴在老师的教学工作上。创新思维至关重要,这不仅让我们写出精简的代码,也有助于开发出高效的程序。
19
-






