个人账簿管理系统说明书.docx
《个人账簿管理系统说明书.docx》由会员分享,可在线阅读,更多相关《个人账簿管理系统说明书.docx(27页珍藏版)》请在冰豆网上搜索。
个人账簿管理系统说明书
目录
摘要1
1.采用类c语言定义相关的数据类型2
2.各模块的伪码算法3
3.函数的调用关系图4
4.调试分析5
5.测试结果6
6.源程序(带注释)13
总结26
参考文献27
致谢28
附件Ⅰ任务一源程序代码29
摘要
该课程设计主要设计个人账簿管理系统以记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。
在课程设计中,用到了C语言以及数据结构中的相关知识,当然也有少数参考了其他人对某些问题的处理经验。
对于进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情况。
在程序设计中,添加了使用说明和帮助事项,并且采用了面向对象这种解决问题的方法。
程序通过调试运行,初步是想了设计目标,并且经过适当完善后,将可以应用在个人理财解决实际问题。
关键词:
账薄;管理系统;数据结构;输入输出
1.采用类c语言定义相关的数据类型
typedefstruct{
intmonth;//月份
intfood;//食品消费
inthouse;//房租费用
intedu;//子女教育费用
intelc;//水电费用
inthealth;//医疗费用
intstore;//储蓄费用
intincome;//收入费用
}Infor;
typedefstruct{//查询用自定义数据类型
intno;
intdata;
}pType;
2.各模块的伪码算法
1.用冒泡排序实现信息的从小到大排序。
voidpaixu(Infor*a)
{
inti=0,j=0,flag=0,t;
pTypepx[8]={{0,0}};
charstr[8][10]={"记录月份","食品消费","房租费用","子女费用","水电费用","医疗费用","储蓄费用","本月收入"};
for(;i<8;i++)
px[i].no=i;
px[0].data=a->month;
px[1].data=a->food;
px[2].data=a->house;
px[3].data=a->edu;
px[4].data=a->elc;
px[5].data=a->health;
px[6].data=a->store;
px[7].data=a->income;
for(i=1;i<8;i++)//冒泡排序
{
flag=0;
for(j=0;j<8-i;j++)
if(px[j].data>px[j+1].data)
{
t=px[j].data;
px[j].data=px[j+1].data;
px[j+1].data=t;
t=px[j].no;
px[j].no=px[j+1].no;
px[j+1].no=t;
flag=1;
}
//输出结果
3.函数的调用关系图
图3.0
4.调试分析
a、调试中遇到的问题及对问题的解决方法
(1)录入、查询、修改、删除数据。
建立一个文件,包括某人5个月的开支情况,对文件中的信息扩充,包括修改,删除等。
所以先确定文件保存路径,接受键盘输入,像文件内写入内容,将dat格式文件转换为txt文件,查询用声明,自定义数据类型,然后返回查询结果及查询状态,继而对查询结果排序。
删除数据时,先调用打开转换的文本文件。
修改数据时,要重写数据,删除源文件,重命名中间文件,显示新的数据。
(2)起泡排序
起泡排序是每趟把当先序列中最小的元素放在开始位置,是交换排序中最简单的排序方法,其基本思想是:
两两比较相邻记录的关键码,如果反序则交换,值到没有反序的记录为止,将整个待排序的记录序列分成为有序区和无序区,初始状态有序区为空,无序区包括所有待排序的记录。
对无序去从前向后依次将相邻记录的关键码进行比较,若反序则交换,从而使得关键码晓得记录向前移,关键码大的记录向后移(像水中的气泡,体积大的先浮上来)。
重复执行,之前无序区中没有反序的记录。
确定每趟范围。
b、算法的时间复杂度和空间复杂度
因为时间复杂度是程序语句调用频度。
故为O(
).
5.测试结果
5.1创建工程并建立文件
(1)启动CFREE
(2)新建工程名为“zj”的Win32控制台应用程序。
(3)建立头文件“Myinfor.h”,在其中定义图类myinfor。
(4)建立源文件“myinfor。
.cpp”,在其中定义图类myinfor。
的构造函数myinfor。
、开支情况输出输出函数PutOutVexInfo。
(5)建立源文件“myinforMain.cpp”,在其中输入开支情况及项目信息,通过主函数调用其它各函数,实现个人帐薄管理系统的设计
5.2个人帐薄管理系统的具体实现
(1)个人帐薄管理主界面如图5.1所示
图5.1
(2)如果输入1,进行录入数据,并且录入某人从1-5月的开支情况如图5.2所示
图5.2
(3)1月份开支情况信息录入如图5.3所示
图5.3
(4)2月份开支情况信息录入如图5.4所示
图5.4
(5)3月份开支情况信息录入如图5.5所示
图5.5
(6)4月份开支情况信息录入如图5.6所示
图5.6
(7)5月份开支情况信息录入如图5.7所示
图5.7
(8)查看数据,输入2.如图5.8所示
图5.8
(9)信息修改如图5.9所示
图5.9
(10)信息查询如图5.10所示
图5.10
(11)5月份开支情况费用排序如图5.11所示
图5.11
(12)开支情况记录删除如图5.12所示
图5.12
(13)个人帐簿管理系统退出如图5.13所示
图5.13
6.源程序(带注释)
#include
#include
#include
#include
//文件保存路径
#defineFilePath1"Myinfor.dat"
#defineFilePath2"Myinfor.txt"
//查询用声明
#defineStatusint
#defineOK1
#defineError0
#defineNotFound2
typedefstruct{
intmonth;//月份
intfood;//食品消费
inthouse;//房租费用
intedu;//子女教育费用
intelc;//水电费用
inthealth;//医疗费用
intstore;//储蓄费用
intincome;//收入费用
}Infor;
typedefstruct{//查询用自定义数据类型
intno;
intdata;
}pType;
voidmenu(void);//菜单
voidinput(Infor*newI);//接收键盘输入
voidwriteinfor(Infor*newI);//向文件内写入内容
voidchangeFormat(void);//将dat格式文件转换为txt文件
Statussearch(Infor*a);//查询函数[返回查询的结果及查询的状态]
voidpaixu(Infor*a);//对查询据结果排序
voidmodify(Infor*a,intmon);//修改数据
voiddelRecord(intmon);//删除数据
voidmain()
{
while
(1)
{
menu();
}
}
voidmenu(void)
{
intitem;
intmon;
Infor*a;
a=(Infor*)malloc(sizeof(Infor));
do{
printf("\n…………个人帐簿管理系统…………\n\n");
printf("\t\t1.录入数据。
\n");
printf("\t\t2.查看数据。
\n");
printf("\t\t3.修改数据。
\n");
printf("\t\t4.查询数据。
\n");
printf("\t\t5.排序数据。
\n");
printf("\t\t6.删除数据。
\n");
printf("\t\t0.退出系统。
\n\n");
printf("请输入要进行的操作:
");
scanf("%d",&item);
}while(item>6||item<-1);
switch(item)
{//退出程序
case0:
getchar();//保存界面
getchar();
exit(0);
break;
//录入数据
case1:
input(a);
writeinfor(a);
break;
//查看数据
case2:
changeFormat();
break;
//修改数据
case3:
item=search(a);
mon=a->month;
if(item!
=OK)printf("\n没有符合条件的记录!
\n");
else
{
printf("\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n");
printf("-----------------------------------------------------------------------\n");
printf("%7d%8d%8d%8d%8d%8d%8d%8d\n",a->month,a->food,a->house,a->edu,a->elc,a->health,a->store,a->income);
input(a);
modify(a,mon);
}
break;
//查询数据
case4:
item=search(a);
if(item!
=OK)printf("\n没有符合条件的记录!
\n");
else{
printf("\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n");
printf("-----------------------------------------------------------------------\n");
printf("%7d%8d%8d%8d%8d%8d%8d%8d\n",a->month,a->food,a->house,a->edu,a->elc,a->health,a->store,a->income);
}
break;
//排序数据
case5:
item=search(a);
if(item!
=OK)printf("\n没有符合条件的记录!
\n");
else
paixu(a);
break;
//删除数据
case6:
item=search(a);
mon=a->month;
if(item!
=OK)printf("\n没有符合条件的记录!
\n");
else
{
printf("\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n");
printf("-----------------------------------------------------------------------\n");
printf("%7d%8d%8d%8d%8d%8d%8d%8d\n",a->month,a->food,a->house,a->edu,a->elc,a->health,a->store,a->income);
delRecord(mon);
}
break;
}
free(a);//释放内存空间
}
voidinput(Infor*newI)
{
printf("\n请依次输入数据[说明:
中间以空格符隔开]:
\n(本月月份食品消费房租费用子女费用水电费用医疗费用储蓄费用收入费用)\n");
scanf("%d%d%d%d%d%d%d%d",&newI->month,&newI->food,&newI->house,&newI->edu,&newI->elc,&newI->health,&newI->store,&newI->income);
fflush(stdin);
}
voidwriteinfor(Infor*newI)
{
FILE*fp;
fp=fopen(FilePath1,"ab+");
if(fp==NULL)
{
printf("无法创建文件:
%s",FilePath1);
exit(0);
}
fwrite(newI,sizeof(Infor),1,fp);//这里可以做特别处理可防止存在同一月份有条以上的记录问题。
这里就不写了。
fclose(fp);
printf("数据录入成功!
\n");
}
voidchangeFormat(void)//暂时只能操作一行文件有待改进
{
FILE*fp1,*fp2;
Infor*a;
a=(Infor*)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rb+");
if(fp1==NULL)
{
printf("无法找到文件:
%s\n",FilePath1);
return;//返回主函数
}
fp2=fopen(FilePath2,"wt+");
if(fp2==NULL)
{
printf("无法创建文件:
%s\n",FilePath2);
return;//返回主函数
}
fputs("\n……………………………………个人帐簿管理系统……………………………………\n\n",fp2);
fputs("记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n",fp2);
fputs("-----------------------------------------------------------------------\n",fp2);
printf("\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n");
printf("-----------------------------------------------------------------------\n");
rewind(fp1);
fread(a,sizeof(Infor),1,fp1);
while(!
feof(fp1))//从原文件[.dat]中读数据写入显示文件[.txt]中
{
printf("%7d%8d%8d%8d%8d%8d%8d%8d\n",a->month,a->food,a->house,a->edu,a->elc,a->health,a->store,a->income);
fprintf(fp2,"%7d%8d%8d%8d%8d%8d%8d%8d\n",a->month,a->food,a->house,a->edu,a->elc,a->health,a->store,a->income);
fread(a,sizeof(Infor),1,fp1);
}
fputs("-----------------------------------------------------------------------\n",fp2);
fputs("关闭本程序继续原程序!
\n",fp2);
fclose(fp1);
fclose(fp2);
system(FilePath2);//调用打开转换的文本文件
remove(FilePath2);//删除文本文件文件
}
Statussearch(Infor*a)
{
FILE*fp1;
intmon;
intisfound=0;
printf("请正确输入要查询的月份:
");
scanf("%d",&mon);
fflush(stdin);//清除缓冲区
fp1=fopen(FilePath1,"rb+");
if(fp1==NULL)
{
printf("无法找到文件:
%s\n",FilePath1);
returnError;//返回主函数
}
rewind(fp1);
fread(a,sizeof(Infor),1,fp1);
while(!
feof(fp1))//查询操作
{
if(a->month==mon)
{
isfound=1;
break;
}
else
{
isfound=0;
}
fread(a,sizeof(Infor),1,fp1);
}
fclose(fp1);
if(isfound)
returnOK;
else
returnNotFound;
}
voidpaixu(Infor*a)
{
inti=0,j=0,flag=0,t;
pTypepx[8]={{0,0}};
charstr[8][10]={"记录月份","食品消费","房租费用","子女费用","水电费用","医疗费用","储蓄费用","本月收入"};
for(;i<8;i++)
px[i].no=i;
px[0].data=a->month;
px[1].data=a->food;
px[2].data=a->house;
px[3].data=a->edu;
px[4].data=a->elc;
px[5].data=a->health;
px[6].data=a->store;
px[7].data=a->income;
for(i=1;i<8;i++)//冒泡排序
{
flag=0;
for(j=0;j<8-i;j++)
if(px[j].data>px[j+1].data)
{
t=px[j].data;
px[j].data=px[j+1].data;
px[j+1].data=t;
t=px[j].no;
px[j].no=px[j+1].no;
px[j+1].no=t;
flag=1;
}
//输出结果
if(flag==0)break;
}
printf("\n");
for(i=0;i<8;i++)
{
printf("%s",str[px[i].no]);
}
printf("\n-----------------------------------------------------------------------\n");
for(i=0;i<8;i++)
{
printf("%8d",px[i].data);
}
printf("\n");
}
voidmodify(Infor*a,intmon)//修改数据
{
FILE*fp1,*fp2;
Infor*b;
b=(Infor*)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rt");
fp2=fopen("temp.dat","wt+");
rewind(fp1);
fread(b,sizeof(Infor),1,fp1);
while(!
feof(fp1))//重写数据
{
if(b->month==mon)
{
fwrite(a,sizeof(Infor),1,fp2);//修改数据
}
else
{
fwrite(b,sizeof(Infor),1,fp2);
}
fread(b,sizeof(Infor),1,fp1);
}
fclose(fp1);
fclose(fp2);
remove(FilePath1);//删除源文件
rename("temp.dat",FilePath1);//重命名中间文件
printf("修改数据成功!
\n");
changeFormat();//显示数据
}
voiddelRecord(intmon)//删除数据
{
FILE*fp1,*fp2;
Infor*b;
b=(Infor*)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rt");
fp2=fopen("temp.dat","wt+");
rewind(fp1);
fread(b,sizeof(Infor),1,fp1);
while(!
feof(fp1))//重写数据
{
if(b->month!
=mon)
fwrite(b,sizeof(Infor),1,fp2);
fread(b,sizeof(Infor),1,fp1);
}
fclose(fp1);
fclose(fp2);
remove(FilePath1);//删除源文件
rename("temp.dat",FilePath1);//重命名中间文件
printf("删除数据成功!
\n");
changeFormat();//显示数据
}
总结
本次设计给我们带来了很深的感触,C语言的精深以及程序的可爱都深深地吸引了我们,这次设计使我们自身的编程,读程能力得到了提升,也使我们更加深刻的认识到不断学习,努力探索的重要性,本次设计单凭自己的力量真的有些困难,幸亏有同学的帮助以及各种参考资料以供查询,以及自身不断努力和奋进,最终也得到一个令人还算满意的结果,总之,我在这次设计中体会到了自己的不足之处,我会在以后的学习和生活中将自身的水平完善,最终使自己拥有傲人的能力!
参考文献
1严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社.
2严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.
3《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版).
4谭浩强.《c语言程序设计》.清华大学出版社.