个人收支管理系统文档格式.docx
《个人收支管理系统文档格式.docx》由会员分享,可在线阅读,更多相关《个人收支管理系统文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
三、总体设计
1.系统执行主程序
本系统执行主程序如图2所示。
首先,调用main函数,是系统进入主显示面。
然后由用户选择所需要的功能,并进入相应功能程序,按照用户需求进行相应操作后回到主显示界面,等待用户继续按键选择功能进行操作。
2.系统显示界面
此系统界面主要由可供选择的功能组成:
收入、支出、明细表、查询与统计、写入文件、读取文件。
用户在进行选择后可通过switch语句进行跳转进入相应分程序。
主显示界面
开始
退出系统
摘要
写入文件
查询与统计
币种
金额
日期
明细表
支出
收入
图2系统执行主流程图
四、数据结构设计
data结构体
structdata{
intn;
//顺序
inty,m,d;
charzy[100];
//摘要
floatmoney,rmoney;
//金额,余额
charbiz[5];
//币种
intx;
//收支类型(标记,明细表或查询统计用)
}p[100];
本程序中主要数据都需要显示顺序、日期、摘要、金额、余额、币种和收支类型,所以需要定义data结构体。
Intn:
表示顺序。
Inty,m,d:
用来定义日期。
Charzy:
摘要。
Floatmoney、rmoney:
金额、余额。
Charbiz[5]:
币种。
Intx:
定义收支类型。
五、函数功能描述
1.check():
函数原型:
intcheck()
check函数主要用于检查输入日期的合法性、日期的先后顺序是否正确,并查找符合日期要求的数据。
2.fflush()
fflush(stdin)
主要用于清除缓存,方便用户接下来的操作。
3.gets()
gets()
函数主要用于把用户输入的数据保存到指定数据中。
4.strlen()
size_tstrlen(constchar*s)
该函数是用来计算字符串的长度,用于用户接下来的操作。
5.strcpy()
char*strcpy(char*s1,constchar*s2)
该函数用于把字符串s2复制给字符串s1。
6.file*()
file*fp1;
通过文件指针便于对流的访问。
7.Fopen()
fopen(FILE_NAME, ”r或w”)
该函数用于打开文件,进行读取或写入。
8.Fclose()
fclose()
该函数主要用来关闭用户打开的文件。
9.Main()
voidmain()
Main()为主函数。
四、程序实现
1.源码分析
(1)程序预处理
#include<
stdio.h>
//标准输入输出函数库
stdlib.h>
//标准函数库
string.h>
//字符串操作函数库
intincome() //收入模式
intexpend() //支出模式
intlist() //明细表
intdestat() //查询与统计
voidwrite() //写入文件
voidread() //读取文件
(2)主函数main()
Main()函数主要实现了对整个程序的调用,以及相关功能模块的调用。
它主要的工作是初始化程序。
{
//确定用户需要进入的功能模块
do
{
printf("
++++++++++++++++++\n"
);
个人收支管理\n"
//用户可以进行的功能操作选项
1.收入\n"
2.支出\n"
3.明细表\n"
4.查询与统计\n"
5.写入文件\n"
6.读取文件\n"
0.退出系统\n"
请输入你要进行操作:
"
scanf("
%d"
&
n);
//捕获用户要进行的操作
switch(n){
case1:
income(p);
system("
cls"
break;
//进入收入模块,结束后返回
case2:
expend(p);
//进入指出模块,结束后返回
case3:
list(p);
//进入明细表,结束后返回
case4:
destat(p);
//进入查询与统计,结束后返回
case5:
write(p);
//进入写入文件,结束后返回
case6:
read(p);
//进入读取文件,结束后返回
}
}while(n!
=0);
//退出系统
}
2.程序运行结果显示
(1)初始化界面
(2)进入收入模式
结束时按Enter返回主界面
(3)进入支出模式
(4)明细表
(5)查询与统计
按年查询
按月查询
(6)写入文件
(7)读取文件
在这我们主要显示退出系统后读取文件操作显示:
之后用户可以根据需要进行相应操作查看数据。
(8)退出系统
六、课程设计总结
经过2个星期的努力,终于完成了个人收支管理系统的设计。
本来,在开始上课之前,我们都以为这是很简单的东西,毕竟我们都学习了这么时间,并且也在课上进行了一次次的实战训练。
可是,没想到,别看平时比较容易,在这一刻,要把课上学到的知识融会贯通,要想设计出自己心满意足的东西是多么的困难。
不过,还好,总算完成了,也感受到了成功的喜悦。
努力奋斗,并不是没有回报的!
!
当然,在这2个星期的过程中,我们也发现了许多问题并克服了它们。
这些问题或许是上课时没注意到的细节问题,或是自己之前一直没能搞懂的知识点,但不论如何,它都让我们学会了好多新的东西,有了新的感悟。
在此,感谢老师们的辛勤工作,无私贡献,感谢老师们的指导。
七、源代码
structdata{
}p[100];
intk=1;
intcheck1(inty,intm,intd)//检测日期合法性
inta[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(y>
0){
if(m>
0&
&
m<
13){
if(d>
d<
=a[m-1])
return1;
if((((y%4==0)&
(y%100!
=0))||(y%400==0))&
(m==2)&
(d==29))
}
}
return0;
intcheck2(inty1,intm1,intd1,inty2,intm2,intd2)//检测日期的先后顺序是否正确
if(y2>
y1)return1;
if(y2==y1&
m2>
m1)return1;
m2==m1&
d2>
d1)return1;
d2==d1)return1;
else
intcheck3(inty1,intm1,intd1,inty2,intm2,intd2)//查找符合要求的日期
inti,k=0;
for(i=0;
i<
100;
i++)
if((check2(y1,m1,d1,p[i].y,p[i].m,p[i].d))
&
(check2(p[i].y,p[i].m,p[i].d,y2,m2,d2)))
k=k+1;
if(k=1)
return1;
intincome(structdatap[])
inti;
charq[100];
for(i=k-1;
;
i++){
do{
请输入日期(例:
2012-7-1):
%d-%d-%d"
p[i].y,&
p[i].m,&
p[i].d);
while(!
check1(p[i].y,p[i].m,p[i].d));
fflush(stdin);
请输入摘要(默认:
无):
gets(p[i].zy);
if(strlen(p[i].zy)==0)strcpy(p[i].zy,"
无"
请输入金额:
%f"
p[i].money);
printf("
请输入币种(默认RMB):
gets(p[i].biz);
if(strlen(p[i].biz)==0)strcpy(p[i].biz,"
RMB"
p[i].x=1;
p[i].rmoney=p[i-1].rmoney+p[i].money;
p[i].n=k;
请输入Enter继续:
gets(q);
intexpend(structdatap[])//支出
for(i=k-1;
请输入日期(例:
p[i].x=0;
intlist(structdatap[])
charq[100];
inti,y1,m1,d1,y2,m2,d2;
do{printf("
输入时请注意日期的先后顺序!
\n"
请输入起始时间(例2000-1-1):
y1,&
m1,&
d1);
check1(y1,m1,d1));
请输入截至时间(例2000-1-1):
y2,&
m2,&
d2);
check1(y2,m2,d2));
check2(y1,m1,d1,y2,m2,d2));
if(check3(y1,m1,d1,y2,m2,d2)==0)
{printf("
此时间段内没有收支记录!
else{
顺序号\t日期\t\t摘要\t金额\t余额\t币种\t标志\n"
k;
%d\t%d-%d-%d\t%s\t%g\t%g\t%s\t%d\n"
p[i].n,p[i].y,p[i].m,p[i].d,
p[i].zy,p[i].money,p[i].rmoney,p[i].biz,p[i].x);
注意:
标志1为收入,标志0为支出!
请按Enter继续!
intdestat(structdatap[])//查询与统计
inty,m,z,i;
charq[100];
floatsum1=0,sum2=0,rmoney;
printf("
请选择查询方式:
1.查询年份:
2.查询月份:
z);
if(z==1)
{
请输入要查询的年份:
y);
if((y==p[i].y)&
(p[i].x==1))
sum1=sum1+p[i].rmoney;
(p[i].x==0))
sum2=sum2+p[i].rmoney;
if(z==2)
请输入年份:
scanf("
do{
请输入月份:
m);
while(m<
1||m>
12);
if((p[i].y==y)&
(p[i].x==1)&
(p[i].m==m))
(p[i].x==0)&
rmoney=sum1-sum2;
总收入:
%g\n"
sum1);
总支出:
sum2);
余额:
rmoney);
请按Enter继续:
"
voidwrite(structdatap[])//写入文件
inti;
FILE*fp;
charq[20],t[100];
if(k-1==0)
printf("
请先输入数据!
!
else{
请输入文件名:
fflush(stdin);
gets(q);
if(strlen(q)==0){
strcpy(q,"
record.dat"
已保存为默认文件data.dat\n"
);
fp=fopen(q,"
w"
for(i=0;
fwrite(&
p[i],sizeof(structdata),1,fp);
记录已存储!
\n请按Enter键继续:
gets(t);
voidread(structdatap[])//读取文件
FILE*fp;
charq[20],t[100];
k=0;
输入文件名:
gets(q);
if(strlen(q)==0){
strcpy(q,"
已打开默认文件data.dat\n"
if((fp=fopen(q,"
rb"
))==NULL)
文件不存在!
fp=fopen(q,"
r"
feof(fp))
fread(&
p[k++],sizeof(structdata),1,fp);
fclose(fp);
k=k-1;
文件已读取!
case1:
case2:
case3:
case4:
case5:
case6: