资源描述
屯g 4元空女肆课程设计说明书课程设计名称:软件课程设计课程设计题目:个人账簿管理系统学院名称:信息工程学院专业:电子信息科学与技术班级:090431学号:09043125姓名:召B林评分:教师:廖远2012 年 6 月 29 日软件课程设计任务书2011 20鱼学年第二学期分散1周第18周一20周集中题目个人帐簿管理系统设计功能:个人帐簿管理系统记录某人每月的全部收入及各项开支情况 ,包 括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。进入系统后 可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序 ,可 以根据输入的月份查询每月的收支情况。进度安排1. 分散1周:布置任务、查阅资料、选择方案注意:学生的设计方案需经指导老师检查通过后方可进实验室进行制作。2. 第18周:软件设计3. 第19周-第20周:软件编码、调试、验收及测试并上交报告学生姓名:邵林、刘舒林指导时间 分散1周,集中指导:2011611-6.29指导地点E505任务下达2012年6月4日任务完成2012 年 6 月29日考核方式1.评阅2.答辩3.实际操作口4.其它指导教师廖远系(部)主任万在红注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带 份备查。2、课程设计结束后与 课程设计小结”、学生成绩单”一并交院教务存档摘要针对一些人对需要对自己的收入支出有一个详细的记录和了解,个人账簿管理系统孕育而生。本系统主要是用C语言编写,运用结构体数组,子函数,同时通过函数指 针数组实现函数的调用,本系统的功能包括按输入、输出、修改、查询、删除 及按收入排序及按月份大小排序,通过文件操作保存数据和加载数据等。本系统设计人性化,适合于大部分家庭用户对个人收支的管理,是生活更 加便捷。关键词:C语言,数据结构,个人账簿管理.1.2.2.2.2.3.4.4.4.4.4.5.5.7.7.9.9.9.1.01.1.121.212.1.21.3.1.31.313.13.1.4.1.41.415.16.1.7.1.8.19.刖言第一章系统功能分析1.1个人账簿管理1.2解决个人账簿管理概要分析流程图第二章系统总体设计2.1系统总体设计思路2.2各个功能模块简介2.2. 1结构体数组2.2. 2各种收支信息输入函数的创建2.2. 3收支排序函数的创建2.2. 4增删改函数的创建2.2. 5数据信息保存文件和加载文件数据函数的创建数据信息打印函数的创建第三章 文件函数、打印函数和主函数详细设计 3.1程序代码实现程序主界面3.2文件函数的实现3.2打印数据第四章测试数据与结果4.1主函数界面测试4.2输入函数测试4.3查找指定月份数据测试4.4查看所有月份数据测试4.5添加数据信息测试4.6修改原有信息测试4.7删除指定的信息测试 4.8按月份大小排序测试4.9按总收入排序测试4.10将数据信息保存到文件测试 4.11加载文件中的数据信息测试 结论结束语参考文献程序分工附录你是否还在回忆你上个月的收入是多少,支出是多少,都用到哪里去了 ?很多吧?是的,我们生活中有太多的收入支出,如子女消费、水电费、房租、收 入等等。我们需要用东西把他们都一一记录下来 。个人账簿管理系统则可以满 足我们对这些方面的要求。本系统使用GCC( GNU Compiler Collection,GNU编译器套装)开发工具 来开发该应用程序。采C语言为开发语言,通过一个结构体数组记录各种收入支 出信息,运用一些数据结构和算法达到个人账簿管理的各种功能。本设计报告详细讨论了该系统的开发、设计环境、实现算法及其具体的实现。个人账簿管理系统是结合了文件、结构体、函数等操作,运用了数据结构 中最基本的一些算法,使程序简单明了,本程序也采用了函数指针数组来实现 函数的调用,从而达到了不浪费内存的目的,同时也加快了程序的运行速度。 同时本系统界面人性化,易操作,能够满足大部分家庭的要求。第一章系统功能分析本程序可以实现个人账簿的按月份插入 、输出、修改、查询、删除、按收 入排序、按月份大小排序、将数据保存到文件和加载文件数据等功能 ,其中每 一个功能,都分别使用了一个函数,其中程序的主界面简洁明了 。可以按主界 面的提示完成每一块功能。1.1个人账簿管理在程序中定义了一个结构体主要包括(月份,全部的收入,食品开支,房租,水电费,医疗费,储蓄,子女教育费和总体的支出费用)其次定义了 10个 函数,分别是输入信息,查看指定月份信息,查看全部月份信息,插入信息, 修改信息,删除指定月份信息,按月份大小排序,按总收入排序,保存数据到 文件和加载文件数据。其中每一个程序都能实现相应部分的功能,并且使用了结构体数组的操作,通过对结构体数组的操作和文件的操作完成各自对应的功 能。1.2解决个人账簿管理概要分析个人账簿管理通过以下函数实现:Input(PEL *a);II输入个人收支信息函数Myprintf(PEL *a);Allprintf(PEL *a);Add(PEL *a);/打印指定月份收支信息函数II打印所以月份收支信息函数II添加指定月份收支信息函数Modify(PEL *a);Delrecord(PEL *a);II修改指定月份收支信息函数II删除指定月份收支信息函数Yuepaixu(PEL *a);Zon gpaixu(PEL *a);Save(PEL *a);II按月份大小排序函数II按总收入排序函数II将所以收支信息保存到文件函数Load(PEL *a);II加载文件的信息到结构体数组函数这十个函数分别完成每一部分功能,其中都是与主函数调用相对应的函数,完成相应的功能122流程图退塑统J加姜龙据操作提示Y保亜芻文件丄倦蒙据添藝据丄显示全部月份数显一番脣敷据输入函数第二章系统总体设计2.1系统总体设计思路个人账簿管理系统可以通过创建一个结构体数组,通过输入信息函数,查看指定月份信息函数,查看全部月份信函数息,插入信息函数,修改信息函 数,删除指定月份信息函数,按月份大小排序函数,按总收入排序函数,保存 数据到文件函数和加载文件数据函数对结构体数组操作来完成系统的主要功 能,其中每一个功能都为对应的一个函数,增加程序的可读性,以实现程序的 整体功能。2.2各个功能模块简介22 1结构体数组首先创建一个结构体数组,以便将各种收支信息存入到结构体数组。typedef struct pers on alint mon th;/月份float foodxiaofei;/食品消费float fan gzu;/房租float zinv xiaofei;/子女教育消费float shuidia nfei;/水电费float yiliaofei;/医疗费float moneyin;/储蓄float yueshouru;/月收入PEL;PEL aN;2.2. 2各种收支信息输入函数的创建输入函数的主要功能是将个人收支信息写入到结构体数组。函数通过修改结构体数组指针来完成数据的写入。函数首先选择需要写入几个月的收支信息,通过for循环按照提示一次将数据写入,for循环的结束条件是月份个数。主要代码如下:for(i=0;i n;i+)scan f(%d%f%f%f%f%f%f%f,&ai.mo nth,&ai.foodxiaofei,&ai.fa ngzu,& ai.zi nvxxiaofei,&ai.shuidia nfei,&ai.yiliaofei,&ai.m on eyi n,&ai.yueshouru); n为需要写入的月份个数2.2. 3收支排序函数的创建收支排序函数的主要功能是将收支信息按照一定的顺序排列。为使设计更加人性化,排序可以分为按月份大小排序和按总收入排序 。对结构体数组成员 的排序可以使用冒泡排序快速实现 。冒泡排序的基本思想是:两两比较待排序 记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录 为止。按月份大小排序可以比较每个结构体数组成员 ai.m on th的大小,通过for 循环将整个结构体数组进行交换。按总收入排序则是比较ai.yueshouru的大小. 通过判断可以取得有效月份的个数k,在通过循环的两次嵌套,外层循环控制下一次比较的次数,内循环循环次数受外循环控制次数影响。冒泡排序详细设计 如下:for(i=0;ik;i+)for(j=0;j=aj+1.m on th) tmp=aj;aj=aj+1; aj+1=tmp;2.2. 4增删改函数的创建增删改函数的功能是实现对指定收支信息修改,通过增删改函数我们可以更 加灵活的处理个人收支信息。增删改函数函数可以通过修改结构体数组指针来实现添加指定月份收支信息,我们可以在原有收支信息后面添加,即在已经创建 的结构体数组里面添加数据。先通过判断语句找到函数有效的月份个数 k,再在 结构体数组ak+1处依次添加所需要的信息。主要设计如下:for(i=0;iN;i+)if(ai.mo nth!=0)k+;for(i=k;i n+k;i+)scan f(%d%f%f%f%f%f%f%f,&ai.mo nth,&ai.foodxiaofei,&ai.fa ngzu,& ai.zi nvxxiaofei,&ai.shuidia nfei,&ai.yiliaofei,&ai.m on eyi n,&ai.yueshouru);/n为所需要添加月份的个数删除收支数据信息函数的创建可以对结构体数组元素进行移位来实现 。通 过判断语句找到指定月份的位置 k,将指定月份后的数据全部往前移动一位,即 ak=ak+i。依次移动直到结束。注意移动时不能超出数组的下标。主要设计代 码如下:for(i=0;iN;i+)if(ai.m on th=mon)k=i;for(i=k;iN-1;i+)ai=ai+1;修改收支信息函数的创建比较简单。只需要通过一个判断语句找到指定月 份的位置。重新输入数据替换原有数据即可。主要设计代码如下:for(i=0;iN;i+)if(ai.m on th=mon)scan f(%d%f%f%f%f%f%f%f,&ai.mo nth,&ai.foodxiaofei,&ai.fa ngzu,& ai.zi nvxiaofei,&ai.shuidia nfei,&ai.yiliaofei,&ai.m on eyi n,&ai.yueshouru);22 5数据信息保存文件和加载文件数据函数的创建通过文件的操作能实现将个人收支信息保存到文件备份,以防系统出现问 题后无法找到这些信息。同时也可以快速的加载文件的数据实现系统设置的各 种操作。收支数据信息写入函数的创建,先创建一个文件类型指针。以Wb”方式创 建一个名为mybill.txt ”的文件。通过fprintf函数将结构体数组中的数据信息依次 写入数据流中指定的文件中。主要设计代码如下:for(i=0;iN;i+) /N初始化为 12 个月fprin tf(fp,%dt%.3ft%.3ft%.3ft%.3ft%.3ft%.3ft%.3f,ai.mo nth,a i.foodxiaofei,ai.fa ngzu,ai.zi nvxxiaofei,ai.shuidia nfei,ai.yiliaofei,ai.m on eyi n, ai.yueshouru);fprin tf(fp,rn);收支信息读取函数是写函数的逆过程。以rb”的方式打开名为mybill.txt ”的 文件。通过fscanf函数依次将数据从数据流指向的文件中读取到结构体数组中 去。主要设计代码如下:for(i=0;iN;i+)fscan f(fp,%d%f%f%f%f%f%f%f,&ai.mo nth,&ai.foodxiaofei,&ai.fa ngzu,&ai.zi nvxxiaofei,&ai.shuidia nfei,&ai.yiliaofei,&ai.m on eyi n,&ai.yueshour u);数据信息打印函数的创建收支数据信息打印函数的主要功能是将结构体中的数据按要求显示给用 户。为了使设计更加人性化,显示信息分为显示指定月份的收支数据信息和全 部月份的收支数据信息。显示指定月份的收支数据信息函数可以通过一条判断语句找到指定月份所 处的位置,将此处结构体数组的信息打印出来即可。主要设计代码如下:for(i=0;iN;i+)/mon为需要打印的月份if(ai.m on th=mon)prin tf(%4dt%8.2f%8.2f%8.2f%9.2f%10.2f%9.2f%8.2fn,ai.mo nth,ai.f oodxiaofei,ai.fa ngzu,ai.zi nvxxiaofei,ai.shuidia nfei,ai.yiliaofei,ai.m on eyi n,ai .yueshouru);显示全部月份的收支数据信息函数只需通过for循环将数组遍历一边即可 主要设计代码如下:for(i=0;iN;i+)初始化函数为0,以0为标志显示有效月份的收支信息if(ai.mo nth!=0)prin tf(%4dt%8.2f%8.2f%8.2f%9.2f%10.2f%9.2f%8.2fn,ai.mo nth,ai.f oodxiaofei,ai.fa ngzu,ai.zi nvxxiaofei,ai.shuidia nfei,ai.yiliaofei,ai.m on eyi n,ai .yueshouru);第三章 文件函数、打印函数和主函数详细设计3.1程序代码实现程序主界面各个子函数的调用可以使用函数指针数组来实现,通过指定的下标可以调 用指定函数。函数指针数组的每个元素是每个子函数名。主函数的界面可以通过printf函数来显示。主要设计代码如下:printf(tttt个人帐簿管理系统n);printf(ttn);printf(tt0:-退出系统-n);printf(tt1:输入数据-n);printf(tt2:-查找指定月份数据-n);printf(tt3:-查看全部数据-n);printf(tt4:-添加数据-n);printf(tt5:修改数据-n);printf(tt6:-删除数据-n);printf(tt7:-按月份大小排序-n);printf(tt8:-按总收入排序-n);printf(tt9:保存文件-n);printf(tt10 加载文件-n);printf(ttn);按主函数的提示我们进行选择需要的操作。选择我们可以定义一个int类型 chose,chose是多少我们就选择了那个操作。定义一个函数指针数组,将我们的每个函数的首地址(即函数名)存放到 数组中,chose对应数组的下标,这样我们即可实现函数的调用。主要设计代码 如下:void(*fu n11)(PEL*a)=out,i nput,mypri ntf,allpri ntf,add,modify,delrecord,yu epaixu,z on gpaixu,save,load;fun chose(a);3.2文件函数的实现文件函数包括数据保存到文件函数和加载文件中的数据函数。保存到文件函数可以通过for循环按照一定的格式将结构体数组中的数据保存到文件。而加 载文件数据函数则相反,通过for循环将数据加载到结构体数组。收支数据信息保存到文件函数可以将结构体数组中的数据保存到文件。此子函数的形参为结构体类型数组,通过指针我们可以将收支数据信息依次写入 到文件。文件操作必须先创建一个文件指针,我们可定义它为FILE *p,运用fopen函数以wb”的格式创建我们需要的文件 mybill.txt ”通过fprintf函数将结构 体数组中的数据依次写入到数据流指向的fp中。控制fprintf中的格式可以使数据在文件中有序的显示出来。主要设计代码如下:for(i=0;iN;i+)fprin tf(fp,%dt%.3ft%.3ft%.3ft%.3ft%.3ft%.3ft%.3f,ai.mo nth,ai.foodxiaofei,ai.fa ngzu,ai.zi nvxxiaofei,ai.shuidia nfei,ai.yiliaofei,ai.m on eyin, ai.yueshouru);fprin tf(fp,rn);fclose(fp);读取收支信息函数实际上是写函数的逆过程。同样定义一个FILE *fp,以 rb” 的方式打开我们已经创建的文件mybill.txt ”,运用fscanf读取数据流指向的文件fp中的数据。这样我们就可以将文件中的数据写入到结构体数组中。主要设 计代码如下:for(i=0;iN;i+)fscan f(fp,%d%f%f%f%f%f%f%f,&ai.mo nth,&ai.foodxiaofei,&ai.fa ngzu,&ai.zi nvxxiaofei,&ai.shuidia nfei,&ai.yiliaofei,&ai.m on eyi n,&ai.yueshouru);3.2打印数据打印函数数据可以分为打印指定月份的数据和打印所以月份的数据。打印指定月份数据函数可以通过对结构体数组的遍历,查看是否有与之对应 的月份数据,如果找到这打印数据,没找到显示提示信息。主要设计代码如 下:for(i=0;iN;i+)/mon为需要打印的月份if(ai.m on th=mon)prin tf(%4dt%8.2f%8.2f%8.2f%9.2f%10.2f%9.2f%8.2fn,ai.mo nth,ai.foodxiaofei,ai.fa ngzu,ai.zi nvxxiaofei,ai.shuidia nfei,ai.yiliaofei,ai.m on eyi n,ai .yueshouru);打印全部月份数据可以通过for循环遍历结构体数组知道遇到0(初始化结构 体数组为0)结束,这样可以加快运行速率。具体设计代码如下:for(i=0;iN;i+)if(ai.m on th!=0)prin tf(%4dt%8.2f%8.2f%8.2f%9.2f%10.2f%9.2f%8.2fn,ai.mo nth,ai.foodxiaofei,ai.fa ngzu,ai.zi nvxxiaofei,ai.shuidia nfei,ai.yiliaofei,ai.m on eyi n,ai .yueshouru);第四章 测试数据与结果4.1主函数界面测试函数操作分为十个部分,按照提示可实现对应的功能个人帐簿管理系统0:出系统1 :入数据2:查找指定月份数据3:查看全部数据4:添加数据5:修改数据6,删除数据7:按月份大/卜排序8:总收入排序9:保存文件10加载文件选择操作:1确定要输入几个月的账单:24.2输入函数测试依照提示数几个月的消费信息选择操作:】備定要输入几亍月妁账单丘 请依次输入数据说明:中间以空格符隔开I:本月月份食品消荒房租费用子女费用水电费用医疗荒用储蒂费用收入荒用2100200200200100100030001 40020020030010010004000信息录入成功!4.3查找指定月份数据测试按操作提示可以查找指定月份的数据。选择操作它请输入要查看的月份1本月月份食品消费房租费用子女费用水电费用医疗费用 储蓄费用收费用入I 400.00200.00200.00300.00100.001000.00 4000.004.4查看所有月份数据测试按提示可以查看所有月份的收支信息:选择操作泊本月月份食品消费房租费用子女费用水电费用医疗费用 储蓄费用收费用入2 100.00200-00200.00200.00100*001000.00 3000.00I400.00200,00200.00300.00100.001000.00 4000.00* 44* 44 * 4*4*4* *en4 * 4 *4*4* * *4.5添加数据信息测试按提示可以添加指定月份的收支信息。选择操作:4确定要输入増加几个个月的账单:1请依次输入数据说明:中间以空格符隔开i本月月份食品消费房租费用子女裁用水电费用医疗费用储蓄费用收入费用)3100100100010010001000020000信息添加成功!个人帐簿管埋系统4.6修改原有信息测试按提示可以修改指定月份的收支信息。选择撫作:5请输入要修改的月份本月月份食品消费畀租费用子女费用水电费用医疗费用储臂费用收入费用130010050010001010005000修改指定月份数据成功!4.7删除指定的信息测试按提示操作可以删除指定月份的收支信息选择操作:6请输入要修改的月份:1删除指定月份数据成功!4.8按月份大小排序测试按操作提示可以对所以月份收支信息按月份从小到大排序章it章存*审卓躍审HiHi审巾审中审审*申申申申申*申审申审噸审噸申审审点点点点点点点点点呦点审祸点褂审噸申末申审审审申褂审祸車审all本月月份食品消费房租费用子女费用水电费用医疗费用 储蓄费用收费用入2 100.00200.00 200.00200.00100.001000.00 3000.003 100.00100,00 1000.00#*:*#*#*# 本本本魂本本本本 *丰:!|:|:#*3|:本# 本:|#本# 本 #本本# 本 *# 本* *end4.9按总收入排序测试按操作提示可以对所以月份收支信息按月份从小到大排序。本月月份食品消费房租费用子女费用水电费用医疗费用 储蓄费用收费用入2 100.00200.00 200.00200.00100.001000.00 3000.003 100,00100.00 1000.00100.001000.0010000,0020000,00:* * * * *yf:*a#H= *#*#*:# *#*:*:#*#:*3|=*1|=*end4.10将数据信息保存到文件测试按操作提示可以对所以月份收支信息保存到文件1 1|400.000 200.000 200.000 300.000 100.000 1000.0004000.0002 2100.000 200.000 200k000 200.000 100-000 1000.0003000.0004.11加载文件中的数据信息测试按操作提示可以对所以月份收支信息加载到结构体数组4000.0003000.000400.000 200.000 200.000 300.000 100,000 1000.000 100.000 200.000 200.000 200.000 100.000 1000.000个人账簿管理系统主要实现了对个人收支信息的增删改和保存,使我们的生活更加便捷。同时通过这次软件课程设计使我了解到了:1. 写一个程序首先要有算法,而算法有很多种,使用最优的算法,能节约 很多时间和加快系统的速度。2. 在这个程序中,主要还是利用了 C语言中数组和文件的操作,其中最主 要的就是结构体数组的读写,还有查找、修改及删除数组中的数据。删 除数据记得一定不能越界。文件操作还是比较复杂的,首先要创建一个 文件指针,通过函数按一定的格式将数据信息读取或者写入。3. 在结构体的操作用,不能直接给结构体变量赋值。4. 这个程序的界面编的虽然不怎么好看,但基本账簿管理的功能都达到 了 0但是还有许多地方需要改进。结束语在这次课程设计中,我学习到了,不管做什么事情还是团队协作,才可以 使一件事情办得最后,一个人的力量永远是有限的,不管一个人的能力有多 大,总会有一些地方的不足,尤其是我们编程这一行,最主要的还是要团队合 作。其次就是写程序时要用到注释,因为一个程序是由几个人写出来的,假如 不写注释的话,就相互都看不懂,也不能实现程序的结合,所以说写程序时注 释很重要。最后,我觉得不管做什么事情必须认认真真的做,要沉得下心来,尤其是 写程序,假如沉不下心来做的话,也决对写不出一个好的程序或者实用的程序 来。参考文献1 谭浩强著.C语言程序设计(第三版)M.清华大学出版社.2008.2 Kenneth A. Reek .C 与指针(第二版)M.北京:人民邮电出版社,2008.3 郑阿奇.Visual C+实用教程(第三版)M.电子工业出版社.2007.程序分工姓名任务分配邵林打印函数,文件函数,主函数刘舒林数据输入函数,增删改函数附录程序代码:/*个人帐簿管理系统记录某人每月 的全部收入及各项开支情况,包括 食品消费,房租,子女教育费用, 水电费,医疗费,储蓄等。进入系 统后可以输入和修改某月的收支情 况,可以对每月的开支从小到大进 行排序,可以根据输入的月份查询 每月的收支情况。*/*要求:根据以上任务说明,设计 数据结构,并设计程序完成功能。*/#i nclude#i ncludevstri ng.h#in clude#i nclude#in clude#defi ne N 12typedef struct pers on alint mon th;/月份float foodxiaofei;/食品消费float fan gzu;/房租float zinv xiaofei;/子女教育消费float shuidia nfei;/ 水电费float yiliaofei; / 医疗费float moneyin;/ 储蓄float yueshouru; / 月收入PEL;void input(PEL *a)/ 输入月消费int n,i;printf(确定要输入几个月的账单:);scan f(%d,&n);if(n0&* 13)prin tf(n请依次输入数据说明:中间以空格符隔开:n);printf(本月月份食品消费房租费用子女费用水电费用医疗 费用储蓄费用收入费用n);for(i=0;i n;i+)scan f(%d%f%f%f%f%f%f%f, &ai.m on th,&ai.foodxiaofei,&ai.fan gzu,&ai.z inv xiaofei,&ai.shuidian fei,&ai.yiliaofei,&ai.m on eyi n,& ai.yueshouru);printf(信息录入成功!n);elseprintf(输入有误!n);exit(0);void yuepaixu(PEL *a) 月排序int i,j,k=0;PEL tmp;for(i=0;iN;i+)if(ai.mo nth!=0)k+;for(i=0;ik;i+)for(j=0;j=aj+1.m on th)tmp=aj;aj=aj+1;aj+1=tmp;printf(按月份排序成功! n);void zongpaixu(PEL *a) 总收入排序PEL tmp;int i,j,k=O,t;for(i=0;iN;i+)if(ai.mo nth!=0)k+;prin tf(n);for(i=0;ik;i+)for(j=0;j=aj+1.yueshouru)tmp=aj;aj=aj+1; aj+1=tmp;printf(按每月总收入排序成功! n);void modify(PEL *a)修改指定月份的数据int mon;printf(请输入要修改的月份:);scan f(%d,&mon);int i=0;printf(本月月份 食品消费 房 租费用子女费用水电费用医疗费 用储蓄费用收入费用n);for(i=0;iN;i+)if(ai.m on th=mon)scan f(%d%f%f%f%f%f%f%f, &ai.m on th,&ai.foodxiaofei,&ai.fan gzu,&ai.z inv xiaofei,&ai.shuidian fei,&ai.yiliaofei,&ai.m on eyi n,&ai.yueshouru);printf(修改指定月份数据成功! n);void delrecord(PEL *a) 删除指定月份数据函数int mon;printf(请输入要修改的月份:);scan f(%d,&mon);int i,k;for(i=O;iN;i+)if(ai.m on th=mon)k=i;for(i=k;iN-1;i+)ai=ai+1;printf(删除指定月份数据成功! n);void add(PEL *a) 添加数据int n ,i,k=0;printf(确定要输入增加几个个月的账单:);scan f(%d,&n);printf(n请依次输入数据说明:中间以空格符隔开:n);for(i=O;iN;i+)if(ai.mo nth!=O)k+;int i=0;for(i=k;i n+k;i+)printf(本月月份 食品消费 房 租费用子女费用水电费用医疗费 用储蓄费用收入费用)n);scan f(%d%f%f%f%f%f%f%f, & ai.m on th,&ai.foodxiaofei,&ai.fa n gzu,&ai.z inv xiaofei,&ai.shuidia n fei,&ai.yiliaofei,&ai.m on eyi n,& ai.yueshouru);printf(信息添加成功!);void myprintf(PEL *a) 打印指定月份数据函数int mon;printf(请输入要查看的月份n);scan f(%d,&mon);prin tf(n*n);prin tf(n 本月月份 食品消费 房租费用子女费用水电费用医疗 费用储蓄费用收费用入n);for(i=0;iN;i+)if(ai.m on th=mon)prin tf(%4dt%8.2f%8.2f%8.2f%9.2f%10.2f%9.2f%8.2fn,ai.mon th,ai.foodxiaofei,ai.fa ngzu,ai. zi nv xiaofei,ai.shuidia nfei,ai.yiliao fei,ai.m oneyin, ai.yueshouru);printf(*end*n);fei,ai.m on eyi n,ai.yueshouru);void allprintf(PEL *a) 打印所有月份数据int i=0;printf(*end*n);*prin tf(n*all*n);prin tf(n 本月月份 食品消费 房租费用子女费用水电费用医疗 费用储蓄费用收费用入n);for(i=0;iN;i+)if(ai.m on th!=0)void save(PEL *a) 写入文件int i;FILE *fp;if(fp=fope n( mybill.txt,wb) =NULL)printf(文件不能打开!n);prin tf(%4dt%8.2f%8.2f%8.2f %9.2f%10.2f%9.2f%8.2fn,ai.mon th,ai.foodxiaofei,ai.fa ngzu,ai. zi nvxxiaofei,ai.shuidia nfei,ai.yiliaoexit(1);for(i=0;iN;i+)fprin tf(fp,%dt%.3ft%.3ft %.3ft%.3ft%.3ft%.3ft%.3f,ai .m on th,ai.foodxiaofei,ai.fa ngzu, ai.zi nvxxiaofei,ai.shuidia nfei,ai.yi liaofei,ai.m on eyi n,ai.yueshouru);fprin tf(fp,rn);fclose(fp);printf(写入文件成功!);void load(PEL *a) / 读取文件int i;FILE *fp;if(fp=fope n( mybill.txt,rb)= =NULL)只读取文件printf(对不起,不能打开文件! n);exit(1);for(i=O;iN;i+)fscan f(fp,%d%f%f%f%f%f%f%f,&ai.mo nth,&ai.foodxiaofei,&ai.fa ngzu,&ai.z inv xiaofei,&ai.shui dia nfei,&ai.yiliaofei,&ai.m on eyi n ,&ai.yueshouru);fclose(fp);printf(加载文件成功n);void out(PEL *a)exit(O);int mai n()PEL aN=0;int mon th,chose;dodoprin tf(tttt个人帐簿管理系统n);printf(tt出系统n);printf(tt1:输入数据n);printf(tt2:查找指定月份数据n);printf(tt3:n);查看全部数据n);printf(tt0: 退printf(tt4:添加数据n);printf(tt5:-修改数据n);printf(tt6:-删除数据n);printf(tt7:-按月份大小排序-n);printf(tt8:-按总收入排序-n);printf(tt9:保存文件n);printf(tt10加载文件-n);n);prin tf(tt printf(选择操作:);sea nf(%d,&chose);while(chose10);void(*fu n11)(PEL*a)=out,i nput,mypri ntf,allpri ntf,add,modify,delrecord,y uepaixu,z on gpaixu,save,load;fun chose(a);while(chose!=*);
展开阅读全文