个人账簿管理系统Word格式.docx
《个人账簿管理系统Word格式.docx》由会员分享,可在线阅读,更多相关《个人账簿管理系统Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
验收及测试并上交报告
学生姓名:
邵林、刘舒林
指导时间分散1周,集中指导:
2011.6.11-6.29
指导地点E505
任务下达
2012年6月4日
任务完成
2012年6月29日
考核方式
1.评阅□ 2.答辩□3.实际操作□4.其它□
指导教师
廖远
系(部)主任
万在红
注:
1、此表一组一表二份,课程设计小组组长一份;
任课教师授课时自带一份备查。
2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档
摘要
针对一些人对需要对自己的收入支出有一个详细的记录和了解,个人账簿管理系统孕育而生。
本系统主要是用C语言编写,运用结构体数组,子函数,同时通过函数指针数组实现函数的调用,本系统的功能包括按输入、输出、修改、查询、删除及按收入排序及按月份大小排序,通过文件操作保存数据和加载数据等。
本系统设计人性化,适合于大部分家庭用户对个人收支的管理,是生活更加便捷。
关键词:
C语言,数据结构,个人账簿管理
目录
前言1
第一章系统功能分析2
1.1个人账簿管理2
1.2解决个人账簿管理2
1.2.1概要分析2
1.2.2流程图3
第二章系统总体设计4
2.1系统总体设计思路4
2.2各个功能模块简介4
2.2.1结构体数组4
2.2.2各种收支信息输入函数的创建4
2.2.3收支排序函数的创建5
2.2.4增删改函数的创建5
2.2.5数据信息保存文件和加载文件数据函数的创建7
2.2.6数据信息打印函数的创建7
第三章文件函数、打印函数和主函数详细设计9
3.1程序代码实现9
3.1.1程序主界面9
3.2文件函数的实现10
3.2打印数据11
第四章测试数据与结果12
4.1主函数界面测试12
4.2输入函数测试12
4.3查找指定月份数据测试12
4.4查看所有月份数据测试13
4.5添加数据信息测试13
4.6修改原有信息测试13
4.7删除指定的信息测试13
4.8按月份大小排序测试13
4.9按总收入排序测试14
4.10将数据信息保存到文件测试14
4.11加载文件中的数据信息测试14
结论15
结束语16
参考文献17
程序分工18
附录19
前言
你是否还在回忆你上个月的收入是多少,支出是多少,都用到哪里去了?
很多吧?
是的,我们生活中有太多的收入支出,如子女消费、水电费、房租、收入等等。
我们需要用东西把他们都一一记录下来。
个人账簿管理系统则可以满足我们对这些方面的要求。
本系统使用GCC(GNUCompilerCollection,GNU编译器套装)开发工具来开发该应用程序。
采C语言为开发语言,通过一个结构体数组记录各种收入支出信息,运用一些数据结构和算法达到个人账簿管理的各种功能。
本设计报告详细讨论了该系统的开发、设计环境、实现算法及其具体的实现。
个人账簿管理系统是结合了文件、结构体、函数等操作,运用了数据结构中最基本的一些算法,使程序简单明了,本程序也采用了函数指针数组来实现函数的调用,从而达到了不浪费内存的目的,同时也加快了程序的运行速度。
同时本系统界面人性化,易操作,能够满足大部分家庭的要求。
第一章系统功能分析
本程序可以实现个人账簿的按月份插入、输出、修改、查询、删除、按收入排序、按月份大小排序、将数据保存到文件和加载文件数据等功能,其中每一个功能,都分别使用了一个函数,其中程序的主界面简洁明了。
可以按主界面的提示完成每一块功能。
1.1个人账簿管理
在程序中定义了一个结构体主要包括(月份,全部的收入,食品开支,房租,水电费,医疗费,储蓄,子女教育费和总体的支出费用)其次定义了10个函数,分别是输入信息,查看指定月份信息,查看全部月份信息,插入信息,修改信息,删除指定月份信息,按月份大小排序,按总收入排序,保存数据到文件和加载文件数据。
其中每一个程序都能实现相应部分的功能,并且使用了结构体数组的操作,通过对结构体数组的操作和文件的操作完成各自对应的功能。
1.2解决个人账簿管理
1.2.1概要分析
个人账簿管理通过以下函数实现:
Input(PEL*a);
//输入个人收支信息函数
Myprintf(PEL*a);
//打印指定月份收支信息函数
Allprintf(PEL*a);
//打印所以月份收支信息函数
Add(PEL*a);
//添加指定月份收支信息函数
Modify(PEL*a);
//修改指定月份收支信息函数
Delrecord(PEL*a);
//删除指定月份收支信息函数
Yuepaixu(PEL*a);
//按月份大小排序函数
Zongpaixu(PEL*a);
//按总收入排序函数
Save(PEL*a);
//将所以收支信息保存到文件函数
Load(PEL*a);
//加载文件的信息到结构体数组函数
这十个函数分别完成每一部分功能,其中都是与主函数调用相对应的函数,完成相应的功能。
1.2.2流程图
第二章系统总体设计
2.1系统总体设计思路
个人账簿管理系统可以通过创建一个结构体数组,通过输入信息函数,查看指定月份信息函数,查看全部月份信函数息,插入信息函数,修改信息函数,删除指定月份信息函数,按月份大小排序函数,按总收入排序函数,保存数据到文件函数和加载文件数据函数对结构体数组操作来完成系统的主要功能,其中每一个功能都为对应的一个函数,增加程序的可读性,以实现程序的整体功能。
2.2各个功能模块简介
2.2.1结构体数组
首先创建一个结构体数组,以便将各种收支信息存入到结构体数组。
typedefstructpersonal{
intmonth;
//月份
floatfoodxiaofei;
//食品消费
floatfangzu;
//房租
floatzinvxiaofei;
//子女教育消费
floatshuidianfei;
//水电费
floatyiliaofei;
//医疗费
floatmoneyin;
//储蓄
floatyueshouru;
//月收入
}PEL;
PELa[N];
2.2.2各种收支信息输入函数的创建
输入函数的主要功能是将个人收支信息写入到结构体数组。
函数通过修改结构体数组指针来完成数据的写入。
函数首先选择需要写入几个月的收支信息,通过for循环按照提示一次将数据写入,for循环的结束条件是月份个数。
主要代码如下:
for(i=0;
i<
n;
i++){
scanf("
%d%f%f%f%f%f%f%f"
&
a[i].month,&
a[i].foodxiaofei,&
a[i].fangzu,&
a[i].zinvxiaofei,&
a[i].shuidianfei,&
a[i].yiliaofei,&
a[i].moneyin,&
a[i].yueshouru);
}
//n为需要写入的月份个数
2.2.3收支排序函数的创建
收支排序函数的主要功能是将收支信息按照一定的顺序排列。
为使设计更加人性化,排序可以分为按月份大小排序和按总收入排序。
对结构体数组成员的排序可以使用冒泡排序快速实现。
冒泡排序的基本思想是:
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
按月份大小排序可以比较每个结构体数组成员a[i].month的大小,通过for循环将整个结构体数组进行交换。
按总收入排序则是比较a[i].yueshouru的大小.通过判断可以取得有效月份的个数k,在通过循环的两次嵌套,外层循环控制下一次比较的次数,内循环循环次数受外循环控制次数影响。
冒泡排序详细设计如下:
k;
for(j=0;
j<
k-i;
j++){
if(a[j].month>
=a[j+1].month){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
2.2.4增删改函数的创建
增删改函数的功能是实现对指定收支信息修改,通过增删改函数我们可以更加灵活的处理个人收支信息。
增删改函数函数可以通过修改结构体数组指针来实现。
添加指定月份收支信息,我们可以在原有收支信息后面添加,即在已经创建的结构体数组里面添加数据。
先通过判断语句找到函数有效的月份个数k,再在结构体数组a[k+1]处依次添加所需要的信息。
主要设计如下:
N;
if(a[i].month!
=0)
k++;
for(i=k;
n+k;
}//n为所需要添加月份的个数
删除收支数据信息函数的创建可以对结构体数组元素进行移位来实现。
通过判断语句找到指定月份的位置k,将指定月份后的数据全部往前移动一位,即a[k]=a[k+i]。
依次移动直到结束。
注意移动时不能超出数组的下标。
主要设计代码如下:
if(a[i].month==mon)
k=i;
N-1;
i++)
a[i]=a[i+1];
修改收支信息函数的创建比较简单。
只需要通过一个判断语句找到指定月份的位置。
重新输入数据替换原有数据即可。
if(a[i].month==mon)scanf("
2.2.5数据信息保存文件和加载文件数据函数的创建
通过文件的操作能实现将个人收支信息保存到文件备份,以防系统出现问题后无法找到这些信息。
同时也可以快速的加载文件的数据实现系统设置的各种操作。
收支数据信息写入函数的创建,先创建一个文件类型指针。
以“wb”方式创建一个名为“mybill.txt”的文件。
通过fprintf函数将结构体数组中的数据信息依次写入数据流中指定的文件中。
i++){//N初始化为12个月
fprintf(fp,"
%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f"
a[i].month,a[i].foodxiaofei,a[i].fangzu,a[i].zinvxiaofei,a[i].shuidianfei,a[i].yiliaofei,a[i].moneyin,a[i].yueshouru);
\r\n"
);
收支信息读取函数是写函数的逆过程。
以“rb”的方式打开名为“mybill.txt”的文件。
通过fscanf函数依次将数据从数据流指向的文件中读取到结构体数组中去。
fscanf(fp,"
2.2.6数据信息打印函数的创建
收支数据信息打印函数的主要功能是将结构体中的数据按要求显示给用户。
为了使设计更加人性化,显示信息分为显示指定月份的收支数据信息和全部月份的收支数据信息。
显示指定月份的收支数据信息函数可以通过一条判断语句找到指定月份所处的位置,将此处结构体数组的信息打印出来即可。
for(i=0;
i++){//mon为需要打印的月份
if(a[i].month==mon)printf("
%4d\t%8.2f%8.2f%8.2f%9.2f%10.2f%9.2f%8.2f\n"
显示全部月份的收支数据信息函数只需通过for循环将数组遍历一边即可。
i++){//初始化函数为0,以0为标志显示有效月份的收支信息
if(a[i].month!
=0)printf("
第三章文件函数、打印函数和主函数详细设计
3.1程序代码实现
3.1.1程序主界面
各个子函数的调用可以使用函数指针数组来实现,通过指定的下标可以调用指定函数。
函数指针数组的每个元素是每个子函数名。
主函数的界面可以通过printf函数来显示。
主要设计代码如下:
printf("
\t\t\t\t个人帐簿管理系统\n"
printf("
\t\t-----------------------------------------\n"
\t\t0:
----------------退出系统--------------\n"
\t\t1:
-----------------输入数据--------------\n"
\t\t2:
-------------查找指定月份数据----------\n"
\t\t3:
--------------查看全部数据-------------\n"
\t\t4:
-----------------添加数据--------------\n"
\t\t5:
-----------------修改数据--------------\n"
\t\t6:
-----------------删除数据--------------\n"
\t\t7:
--------------按月份大小排序-----------\n"
\t\t8:
---------------按总收入排序------------\n"
\t\t9:
-----------------保存文件--------------\n"
\t\t10-----------------加载文件--------------\n"
按主函数的提示我们进行选择需要的操作。
选择我们可以定义一个int类型chose,chose是多少我们就选择了那个操作。
定义一个函数指针数组,将我们的每个函数的首地址(即函数名)存放到数组中,chose对应数组的下标,这样我们即可实现函数的调用。
void(*fun[11])(PEL*a)={out,input,myprintf,allprintf,add,modify,delrecord,yuepaixu,zongpaixu,save,load};
fun[chose](a);
3.2文件函数的实现
文件函数包括数据保存到文件函数和加载文件中的数据函数。
保存到文件函数可以通过for循环按照一定的格式将结构体数组中的数据保存到文件。
而加载文件数据函数则相反,通过for循环将数据加载到结构体数组。
收支数据信息保存到文件函数可以将结构体数组中的数据保存到文件。
此子函数的形参为结构体类型数组,通过指针我们可以将收支数据信息依次写入到文件。
文件操作必须先创建一个文件指针,我们可定义它为FILE*p,运用fopen函数以“wb”的格式创建我们需要的文件“mybill.txt”,通过fprintf函数将结构体数组中的数据依次写入到数据流指向的fp中。
控制fprintf中的格式可以使数据在文件中有序的显示出来。
fprintf(fp,"
fclose(fp);
读取收支信息函数实际上是写函数的逆过程。
同样定义一个FILE*fp,以“rb”的方式打开我们已经创建的文件“mybill.txt”,运用fscanf读取数据流指向的文件fp中的数据。
这样我们就可以将文件中的数据写入到结构体数组中。
3.2打印数据
打印函数数据可以分为打印指定月份的数据和打印所以月份的数据。
打印指定月份数据函数可以通过对结构体数组的遍历,查看是否有与之对应的月份数据,如果找到这打印数据,没找到显示提示信息。
printf("
%4d\t%8.2f%8.2f%8.2f%9.2f%10.2f%9.2f%8.2f\n"
打印全部月份数据可以通过for循环遍历结构体数组知道遇到0(初始化结构体数组为0)结束,这样可以加快运行速率。
具体设计代码如下:
=0){
第四章测试数据与结果
4.1主函数界面测试
函数操作分为十个部分,按照提示可实现对应的功能。
4.2输入函数测试
依照提示数几个月的消费信息。
4.3查找指定月份数据测试
按操作提示可以查找指定月份的数据。
4.4查看所有月份数据测试
按提示可以查看所有月份的收支信息:
4.5添加数据信息测试
按提示可以添加指定月份的收支信息。
4.6修改原有信息测试
按提示可以修改指定月份的收支信息。
4.7删除指定的信息测试
按提示操作可以删除指定月份的收支信息。
4.8按月份大小排序测试
按操作提示可以对所以月份收支信息按月份从小到大排序。
4.9按总收入排序测试
4.10将数据信息保存到文件测试
按操作提示可以对所以月份收支信息保存到文件。
4.11加载文件中的数据信息测试
按操作提示可以对所以月份收支信息加载到结构体数组。
结论
个人账簿管理系统主要实现了对个人收支信息的增删改和保存,使我们的生活更加便捷。
同时通过这次软件课程设计使我了解到了:
1.写一个程序首先要有算法,而算法有很多种,使用最优的算法,能节约很多时间和加快系统的速度。
2.在这个程序中,主要还是利用了C语言中数组和文件的操作,其中最主要的就是结构体数组的读写,还有查找、修改及删除数组中的数据。
删除数据记得一定不能越界。
文件操作还是比较复杂的,首先要创建一个文件指针,通过函数按一定的格式将数据信息读取或者写入。
3.在结构体的操作用,不能直接给结构体变量赋值。
4.这个程序的界面编的虽然不怎么好看,但基本账簿管理的功能都达到了。
但是还有许多地方需要改进。
结束语
在这次课程设计中,我学习到了,不管做什么事情还是团队协作,才可以使一件事情办得最后,一个人的力量永远是有限的,不管一个人的能力有多大,总会有一些地方的不足,尤其是我们编程这一行,最主要的还是要团队合作。
其次就是写程序时要用到注释,因为一个程序是由几个人写出来的,假如不写注释的话,就相互都看不懂,也不能实现程序的结合,所以说写程序时注释很重要。
最后,我觉得不管做什么事情必须认认真真的做,要沉得下心来,尤其是写程序,假如沉不下心来做的话,也决对写不出一个好的程序或者实用的程序来。
参考文献
[1]谭浩强著.C语言程序设计(第三版)[M].清华大学出版社.20