南邮通达--家庭支出管理系统

发布时间:2016-04-06 23:12:26

通达学院程序设计报告

2015 / 2016 学年 学期)

目: 家庭支出管理系统

计算机科学与技术

计算机学院计算机科学与技术系

2015.10.12-2015.10.23

家庭支出管理系统

一、课题内容和要求

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()函数来获得输入的密码值,再用来与定义的密码值作比较利用if else语句,来显示输入密码的正确性。
3 显示主菜单,采用switch()case语句,根据用户的选择则进入相应的模块。
4 Menu菜单包括输入函数inputitems(),求和函数Summoney(),输出函数showitems (),类别排序函数paixu(),消费价格排序函数shunxu(),分析函数analyseitems (),保存函数save (),并在最后添加一个退出选项exit
5 设置密码函数void password (),我是采用逐字比较法,用for循环一次进行从前到后的对比,假如完全正确用break跳出循环进入系统,如果错误就要重新输入。
6 输入函数int inoutitems(expense sxp[]int n),在第1步中定义了exp[],其中的typeplacemoneytime都是成员变量,逐项进行输入。输入完毕的话则回到了第3步重新开始。
7 求和函数Summoney(expense sxp[]int n),利用循环和自加来求一个总和。相加的只是各项成员的成员变量money
8 输出函数Display(expense sxp[]int n),仍然用循环采用逐项输出。
9 分析函数analyseitems(expense sxp[]int n),需要统计百分比,定义一个求和变量,计算所有输出的总和s,再用每类支出除以s再乘以100%,用来求取百分比。

10.消费类别排序函数paixuexpense sxp[]int n),用字符串比较法找出相同的类别,把同类别的值加到第一个相同的值上,后面的赋值为0,输出时判断不为0的值才输出。

11.保存函数saveexpense sxp[]int n),将数据保存到学号命名的文档里。

4、源程序代码

#include

#include

#include

#include

#include

#include

#include

typedef struct //定义结构体

{

char leixing[50],didian[50];

double jine;

int shijian;

}

zhichu;

zhichu geti[200];

void keys() //密码验证或密码修改

{

int m;

printf("\t*******************************\n");

printf("\t* *\n");

printf("\t* 1.密码修改 *\n");

printf("\t* 2.登陆 *\n");

printf("\t* *\n");

printf("\t*******************************\n");

printf("\t请输入选项(1,2)");

scanf("%d",&m);

getchar();

switch(m)

{

case 1: //密码修改

{

int i,j,k;

char a[7],b[7],c[7],d[7];

FILE *fp1; FILE *fp2;

fp1=fopen("d:\\密码.dat","r");

if(!fp1)

{

printf("缺少密码数据文件!");

printf("是否创建,创建扣1,关闭扣0");

scanf("%d",&k);

if(k=1)

{

if((fp1=fopen("d:\\密码.dat","wb"))==NULL)

{

printf("\nopen file error");

exit(1);

}

printf("默认密码:123456");

fputs("123456",fp1);

fclose(fp1);

keys();

}

exit(1);

}

for(i=0;!feof(fp1);i++)

{

a[i]=fgetc(fp1);

}

fclose(fp1);

printf("\t请输入原密码:");

for(j=0;j<7;j++)

{

b[j]=getch();

if(((b[j]>='0')&&(b[j]<='9'))||((b[j]>='a')&&(b[j]<='z'))||((b[j]>='A')&&(b[j]<='Z')))

putchar('*');

}

printf("\n");

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请设置您的新密码: ");

for(j=0;j<7;j++)

{

c[j]=getch();

if(((b[j]>='0')&&(b[j]<='9'))||((b[j]>='a')&&(b[j]<='z'))||((b[j]>='A')&&(b[j]<='Z')))

putchar('*');

}

printf("\n");

printf("\t请确认您的新密码: ");

for(j=0;j<7;j++)

{

d[j]=getch();

if(((b[j]>='0')&&(b[j]<='9'))||((b[j]>='a')&&(b[j]<='z'))||((b[j]>='A')&&(b[j]<='Z')))

putchar('*');

}

printf("\n");

}

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:\\密码.dat","w+");

if(!fp2)

{

printf("缺少密码数据文件!");

exit(1);

}

i=0;

while (i<6)

{

fprintf(fp2,"%c",c[i]);

i++;

}

fclose(fp2);

printf("\t密码修改成功!\n");

}

else

{

printf("\t密码错误\n");

exit(0);

}

}

case 2://密码验证

{

char e[7],f[7];

int n=0;

int i,j;

FILE *fp1;

fp1=fopen("D:\\密码.dat","r");

if(!fp1)

{

printf("缺少密码数据文件!");

exit(1);

}

for(i=0;!feof(fp1);i++)

{

e[i]=fgetc(fp1); }

fclose(fp1);

do

{

printf("\t请输入六位数密码:");

for(j=0;j<7;j++)

{

f[j]=getch();

if(((f[j]>='0')&&(f[j]<='9'))||((f[j]>='a')&&(f[j]<='z'))||((f[j]>='A')&&(f[j]<='Z')))

putchar('*');

}

printf("\n");

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("\t*******************************\n");

printf("\t* 密码错误!请重新输入: *\n");

printf("\t*******************************\n");

n++;

}

if (n>3)

{

printf("\t*******************************\n");

printf("\t* 密码错误超过3!!! *\n");

printf("\t* 自动退出管理系统 *\n");

printf("\t*******************************\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("\t*******************************\n");

printf("\t* *\n");

printf("\t* 您好! *\n");

printf("\t* *\n");

printf("\t* 欢迎使用家庭支出管理系统! *\n");

printf("\t* *\n");

printf("\t*******************************\n");

printf("\t请输入任意键继续......");

break;

}

}

}

int caidan()

{

char c;

do{

system("cls");

printf("\t*******************************\n");

printf("\t* *\n");

printf("\t* 1.请输入当前月份 *\n");

printf("\t* 2.请输入消费明细 *\n");

printf("\t* 3.计算当月消费总和 *\n");

printf("\t* 4.支出明细情况 *\n");

printf("\t* 5.当月消费分析 *\n");

printf("\t* 6.按消费价格排序 *\n");

printf("\t* 7.按消费类别排序 *\n");

printf("\t* 8.保存数据及结果 *\n");

printf("\t* 9.退出系统 *\n");

printf("\t* *\n");

printf("\t*******************************\n");

printf("\n\t请输入选项:");

c=getchar();

}

while(c<'1'||c>'9');

return(c-'0');

}

五、测试数据及其结果分析

1.按提示输入密码或是修改密码,当密码错误时重新输入。

请输入六位数密码:******

密码错误超过三次 退出系统

修改密码

输入正确密码 登陆成功

2.根据菜单提示选择 输入当前月份

3. 根据菜单提示选择 输入消费明细

4. 根据菜单提示选择 计算消费总和

5. 根据菜单提示选择 查看明细情况

6. 根据菜单提示选择 当月消费分析

7. 根据菜单提示选择 按消费价格排序

8. 根据菜单提示选择 按类别排序

9. 根据菜单提示选择 保存数据

10. 根据菜单提示选择 退出程序

6、调试过程中的问题

1.一开始是函数调用就有问题,包括函数定义有错,还有就是定义的时候有重复了,然后不得不重新弄了。

2.再有就是消费类别排序中的价格排序有问题,就是支出顺序变了,但类型顺序没变,导致类别的支出有时会改变,后来想到在调换支出时把类别的字符串也调换一下就解决了。这其中出现了多达19个错误,然后细心的根据运行的错误提示,一个一个的进行修改,直到没有errors,然后还有些不懂得错误是由同学帮我改过来的。

3.三是按类别分类时总有一行多出来,这点我想了很久,最后想到把其中的有几行都该一下,再把后面的对应的弄好了。

4.还有就是编译没错,也能运行,可是就是不能动,最后才想到原来先要在D盘中建个密码的txt文件,其中的密码是有用的。只有这样程序才能正常运行,以便进行下一步。

4.保存文件时无法保存,这点看了很久也没法自己解决,最后发现是自己忘记在D盘新建文件,建了后,问题就解决了。

七、课程设计总结

程序设计是用来锻炼学生对所学知识的实际运用能力,面对科学迅速发展的当今社会,程序设计无疑是考验我们的一个好机会,我通过这次设计对C语言又有了更加深刻的理解和体会。

我们小组的这次设计课程题目是:家庭支出管理系统。虽然在平时的学习中我是不能比较清晰的了解C语言,但是进入设计程序之后,发现到自己还是有些了解的,首先本来就对以往的知识掌握不够透彻,很多程序还要经过翻书和询问同学才能知道答案,再次就是自己的实践能力也有所缺乏。

不过再次回顾整个编程的过程,无论是理论还是实践,无论是自己动手还是同学的帮助,我都受益匪浅,把原来的掌握的知识更加深刻的体会,把原来不熟悉的知识渐渐变得有点熟悉,更是在设计过程中学习到了以前在书中不曾看到的知识点。

同时,有好多次我在机房里都觉得十分难受和烦躁了,但是我还是坚持了下来,就为了把那份程序搞好。最终就是凭着这份信念。我做到了最后。

这次程序设计基本上涵盖了大学一年级上学期学习到的C 语言知识点,课程题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订。编程的风格也很重要,我一开始只关心程序运行的结果,而对程序代码的结构的良好丝毫不在意。这是非常不可取的,如果我们希望将来从事编程工作,在这一点上该引起足够的重视。这是严谨的态度,很重要!做程序设计不仅让我修补了以前学习的漏洞,也让我知道一个道理:编程需要兴趣和实际动手。这应该可以借鉴在老师的教学工作上。创新思维至关重要,这不仅让我们写出精简的代码,也有助于开发出高效的程序。

南邮通达--家庭支出管理系统

相关推荐