学生个人收支管理系统.docx
《学生个人收支管理系统.docx》由会员分享,可在线阅读,更多相关《学生个人收支管理系统.docx(25页珍藏版)》请在冰点文库上搜索。
学生个人收支管理系统
前言
你是否还在回忆你上个月的收入是多少,支出是多少,都用到哪里去了?
很多吧?
是的,我们生活中有太多的收入支出,,包括收入,伙食消费,日常用品费用,水电费,医疗费,娱乐等。
我们需要用东西把他们都一一记录下来.学生个人收支管理系统则可以满足我们对这些方面的要求.
个人账簿管理系统是结合了文件、结构体、函数等操作,运用了数据结构中最基本的一些算法,使程序简单明了,本程序也采用了函数指针数组来实现函数的调用,从而达到了不浪费内存的目的,同时也加快了程序的运行速度。
同时本系统界面人性化,易操作,能够满足大部分同学的要求.
第一章系统功能分析
本程序可以实现个人账簿的按月份插入、输出、修改、查询、删除、按收入排序、按月份大小排序、计算某个月消费总支出、按消费总支出排序,其中每一个功能,都分别使用了一个函数,其中程序的主界面简洁明了。
可以按主界面的提示完成每一块功能.
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);//按总收入排序函数
voidzongzhichu(PEL*a)//消费总支出
voidzongzhichupaixu(PEL*a)//消费总排序
这十个函数分别完成每一部分功能,其中都是与主函数调用相对应的函数,完成相应的功能.
1.2。
2流程图
N
Y
N
Y
第二章系统总体设计
2。
1系统总体设计思路
个人收支管理系统可以通过创建一个结构体数组,通过输入信息函数,查看指定月份信息函数,查看全部月份信函数息,插入信息函数,修改信息函数,删除指定月份信息函数,按月份大小排序函数,按总收入排序函数,计算总支出和按总支出排序函数对结构体数组操作来完成系统的主要功能,其中每一个功能都为对应的一个函数,增加程序的可读性,以实现程序的整体功能。
2。
2各个功能模块简介
2.2.1结构体数组
首先创建一个结构体数组,以便将各种收支信息存入到结构体数组。
typedefstructpersonal{
intmonth;//月份
floatfoodxiaofei;//伙食消费
floatfangzu;//住宿费
floatrichangxiaofei;//日常用品费用
floatshuidianfei;//水电费
floatyiliaofei;//医疗费
floatmoneyin;//储蓄
floatyueshouru;//月收入
floatzongzhichu;//总支出
}PEL;
PELa[N];
2.2。
2各种收支信息输入函数的创建
输入函数的主要功能是将个人收支信息写入到结构体数组。
函数通过修改结构体数组指针来完成数据的写入.函数首先选择需要写入几个月的收支信息,通过for循环按照提示一次将数据写入,for循环的结束条件是月份个数。
主要代码如下:
for(i=0;iscanf("%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,在通过循环的两次嵌套,外层循环控制下一次比较的次数,内循环循环次数受外循环控制次数影响。
冒泡排序详细设计如下:
for(i=0;ifor(j=0;jif(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]处依次添加所需要的信息.主要设计如下:
for(i=0;iif(a[i].month!
=0)
k++;
}
for(i=k;i〈n+k;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为所需要添加月份的个数
删除收支数据信息函数的创建可以对结构体数组元素进行移位来实现。
通过判断语句找到指定月份的位置k,将指定月份后的数据全部往前移动一位,即a[k]=a[k+i]。
依次移动直到结束.注意移动时不能超出数组的下标.主要设计代码如下:
for(i=0;iif(a[i].month==mon)
k=i;
}
for(i=k;ia[i]=a[i+1];
修改收支信息函数的创建比较简单.只需要通过一个判断语句找到指定月份的位置。
重新输入数据替换原有数据即可.主要设计代码如下:
for(i=0;i〈N;i++){
if(a[i].month==mon)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);
2。
2.5计算某月总支出函数的创建
计算总支出函数的主要功能是将结构体中某个月的消费总和计算出来,显示给用户。
主要代码如下:
intmon;
floatsum=0;
a[i].zongzhichu=0。
0;
printf("请输入要计算总支出的月份:
");
scanf("%d”,&mon);for(i=0;i〈N;i++)
{
if(a[i].month==mon)
sum=a[i].foodxiaofei+a[i].fangzu+a[i].richangxiaofei+a[i]。
shuidianfei+a[i]。
yiliaofei+a[i].moneyin;
}
printf(”%f”,sum);
a[i]。
zongzhichu=sum;
2.2.6显示指定月份和全部月份函数的创建
收支数据信息打印函数的主要功能是将结构体中的数据按要求显示给用户。
为了使设计更加人性化,显示信息分为显示指定月份的收支数据信息和全部月份的收支数据信息。
显示指定月份的收支数据信息函数可以通过一条判断语句找到指定月份所处的位置,将此处结构体数组的信息打印出来即可。
主要设计代码如下:
for(i=0;i〈N;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",a[i].month,a[i].foodxiaofei,a[i]。
fangzu,a[i]。
zinvxiaofei,a[i]。
shuidianfei,a[i].yiliaofei,a[i].moneyin,a[i].yueshouru);
}
显示全部月份的收支数据信息函数只需通过for循环将数组遍历一边即可。
主要设计代码如下:
for(i=0;i〈N;i++){//初始化函数为0,以0为标志显示有效月份的收支信息
if(a[i]。
month!
=0)printf(”%4d\t%8。
2f%8。
2f%8。
2f%9。
2f%10。
2f%9.2f%8.2f\n”,a[i]。
month,a[i].foodxiaofei,a[i].fangzu,a[i]。
zinvxiaofei,a[i].shuidianfei,a[i].yiliaofei,a[i]。
moneyin,a[i].yueshouru);
}
2。
2.7按总支出排序函数的创建
按总支出排序则是比较a[i]。
zongzhichu的大小。
通过判断可以取得有效月份的个数k,在通过循环的两次嵌套,外层循环控制下一次比较的次数,内循环循环次数受外循环控制次数影响。
冒泡排序详细设计如下:
inti,j,k=0;
for(i=0;iif(a[i]。
month!
=0)
k++;
}
printf(”\n”);
for(i=0;ifor(j=0;j〈k;j++){
if(a[j]。
zongzhichu>=a[j+1].zongzhichu)
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
printf("按每月总消费排序成功!
\n”);
}
第三章显示全月函数和主函数详细设计
3。
1程序代码实现
3。
1。
1程序主界面
各个子函数的调用可以使用函数指针数组来实现,通过指定的下标可以调用指定函数。
函数指针数组的每个元素是每个子函数名。
主函数的界面可以通过printf函数来显示。
主要设计代码如下:
printf(”\t\t\t\t学生收支管理系统\n”);
printf("\t\t——-—---—————--—-————--——--—-——-——-————-——\n");
printf("\t\t0:
—--—--————--—---退出系统-—---——-—-—--—\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\t7:
-------—--—---按月份大小排序-—-—-----——\n");
printf("\t\t8:
—-——-—--—--———-按总收入排序-----————-——\n”);
printf(”\t\t9:
-—------———--—计算某月总支出—-—--—-—-—-\n”);
printf(”\t\t10——--—-—-—-————按总支出排序---——--——-—-\n”);
printf(”\t\t—--———-—--—--——--—-—-———-—-——--————-—--—-\n”);
按主函数的提示我们进行选择需要的操作。
选择我们可以定义一个int类型chose,chose是多少我们就选择了那个操作.
定义一个函数指针数组,将我们的每个函数的首地址(即函数名)存放到数组中,chose对应数组的下标,这样我们即可实现函数的调用.主要设计代码如下:
void(*fun[11])(PEL*a)={out,input,myprintf,allprintf,add,modify,delrecord,yuepaixu,zongpaixu,zongzhichu,zongzhichupaixu};
fun[chose](a);
3.2显示全月函数
显示函数数据可以分为打印指定月份的数据和打印所以月份的数据。
显示指定月份数据函数可以通过对结构体数组的遍历,查看是否有与之对应的月份数据,如果找到这打印数据,没找到显示提示信息。
主要设计代码如下:
for(i=0;i〈N;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",a[i]。
month,a[i]。
foodxiaofei,a[i]。
fangzu,a[i].zinvxiaofei,a[i].shuidianfei,a[i].yiliaofei,a[i].moneyin,a[i].yueshouru);
}
输出全部月份数据可以通过for循环遍历结构体数组知道遇到0(初始化结构体数组为0)结束,这样可以加快运行速率。
具体设计代码如下:
for(i=0;iif(a[i].month!
=0){
printf(”%4d\t%8。
2f%8。
2f%8.2f%9。
2f%10.2f%9.2f%8.2f\n",a[i]。
month,a[i]。
foodxiaofei,a[i].fangzu,a[i].zinvxiaofei,a[i]。
shuidianfei,a[i].yiliaofei,a[i].moneyin,a[i].yueshouru);
}
}
第四章测试数据与结果
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.这个程序的界面编的虽然不怎么好看,但基本个人收支管理的功能都达到了.但是还有许多地方改进。
附录
#includeh〉
#include〈string。
h〉
#include〈math.h>
#include〈malloc.h〉
#includeh>
#defineN12
inti;
typedefstructpersonal{
intmonth;//月份
floatfoodxiaofei;//伙食消费
floatfangzu;//住宿费
floatrichangxiaofei;//日常用品费用
floatshuidianfei;//水电费
floatyiliaofei;//医疗费
floatmoneyin;//储蓄
floatyueshouru;//月收入
floatzongzhichu;//总支出
}PEL;
voidinput(PEL*a)//输入月消费
{
intn,i;
printf(”确定要输入几个月的账单:
”);
scanf("%d”,&n);
if(n〉0&&n<13)
{
printf("\n请依次输入数据[说明:
中间以空格符隔开]:
\n”);
printf(”本月月份伙食消费日常用品费用住宿费水电费用医疗费用储蓄费用收入费用\n");
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].richangxiaofei,&a[i]。
shuidianfei,&a[i].yiliaofei,&a[i]。
moneyin,&a[i]。
yueshouru);
}
printf("信息录入成功!
\n");
}
else{
printf(”输入有误!
\n");
exit(0);
}
}
voidyuepaixu(PEL*a)//月排序
{
inti,j,k=0;
PELtmp;
for(i=0;i{
if(a[i].month!
=0)
k++;
}
for(i=0;i{
for(j=0;j{
if(a[j].month>=a[j+1]。
month)
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
printf("按月份排序成功!
\n”);
}
voidzongpaixu(PEL*a)//总收入排序
{
PELtmp;
inti,j,k=0;
for(i=0;i〈N;i++){
if(a[i]。
month!
=0)
k++;
}
printf("\n”);
for(i=0;ifor(j=0;j〈k;j++){
if(a[j]。
yueshouru〉=a[j+1]。
yueshouru){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
printf("按每月总收入排序成功!
\n”);
}
voidmodify(PEL*a)//修改指定月份的数据
{
intmon;
printf("请输入要修改的月份:
");
scanf("%d",&mon);
inti=0;
printf("本月月份伙食消费日常用品费用住宿费水电费用医疗费用储蓄费用收入费用\n”);
for(i=0;i〈N;i++){
if(a[i]。
month==mon)scanf(”%d%f%f%f%f%f%f%f”,&a[i].month,&a[i]。
foodxiaofei,&a[i]。
fangzu,&a[i]。
richangxiaofei,&a[i]。
shuidianfei,&a[i].yiliaofei,&a[i].moneyin,&a[i]。
yueshouru);
}
printf(”修改指定月份数据成功!
\n");
}
voiddelrecord(PEL*a)//删除指定月份数据函数
{
intmon;
printf("请输入要修改的月份:
");
scanf(”%d”,&mon);
inti,k;
for(i=0;iif(a[i].month==mon)
k=i;
}
for(i=k;i〈N—1;i++)
a[i]=a[i+1];
printf("删除指定月份数据成功!
\n");
}
voidadd(PEL*a)//添加数据
{
intn,i,k=0;
printf(”确定要输入增加几个个月的账单:
");
scanf("%d”,&n);
printf(”\n请依次输入数据[说明:
中间以空格符隔开]:
\n”);
for(i=0;i〈N;i++){
if(a[i]。
month!
=0)
k++;
}
for(i=k;i〈n+k;i++){
printf("本月月份伙食消费日常用品费用住宿费水电费用医疗费用储蓄费用收入费用)\n”);
scanf("%d%f%f%f%f%f%f%f",&a[i].month,&a[i]。
foodxiaofei,&a[i]。
fangzu,&a[i]。
richangxiaofei,&a[i]。
shuidianfei,&a[i].yiliaofei,&a[i].moneyin,&a[i].yueshouru);
}
printf("信息添加成功!
”);
}
voidmyprintf(PEL*a)//打印指定月份数据函数
{
intmon;
printf("请输入要查看的月份\n");
scanf("%d",&mon);
inti=0;
printf(”\n***********************************************************************************\n