还剩40页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
编号B04900083学号201240420113课程设计教学院计算机学院课程名称数据结构课程设计题目个人帐簿管理系统专业网络工程班级1班姓名夏能同组人员罗四维、邱少雄、王欢指导教师冯珊2012年12月25日目录TOC\o\h\z一概述2二总体方案设计3三详细设计7四程序的调试与运行结果说明22五课程设计总结25参考文献27附录28一概述
1.课程设计的目的1.理解和掌握该课程中的有关基本概念,程序设计思想和方法2.培养综合运用所学知识独立完成课题的能力3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力
2.课程设计的要求个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等该系统采用了WindowsXP操作系统结合VisualC++
6.0TC
2.0等软件开发可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情况该课程设计中会频繁的使用到C语言里的文件操作的知识点,而文件操作又是我们平常的学习当中使用的比较少的地方,所以在课程设计之前我们组的成员专门花了一节课的时间重新阅读了《C程序设计教程》以及《Cprimerplus》里的文件操作的相关知识二总体方案设计
1.系统整体设计思路本课程序中主要通过C语言的文件操作实现文件的读写操作来存放管理数据,里面主要包含功能函数有接收键盘输入数据、将数据写入指定文件、将.dat文件文件转换.txt文件显示出来、找到对应月份、对一个月内各项支出进行排序、修改其中一项数据以及删除整月数据整个系统的界面以及对各功能函数的调用都放在了主函数之中整个程序中一个指针变量a贯穿始终,可以使各个函数共享指针变量a所指向的内存区域的数据整个程序涉及到的功能较多,代码普遍较长,根据课程设计教学大纲里的要求以及我们对程序的整体设计我们将整个程序分为了6个功能,7个功能函数以及主函数来调度各个函数以来实现功能
2.算法的整体思路数据类型设定为typedefstruct{intmonth;intshipin;intfangzu;intzinv;intshuidian;intyiliao;intchuxu;intshouru;}Infor;为了方便使用,所以每一个变量基本上都使用了拼音另外为了方便查询与排序,又另外定义了typedefstruct{intno;intdata;}pType;方便排序时候使用整个程序流程图如下整个程序在主函数中由switch调用各个功能函数来执行整个程序
3.主要特点本程序可以在控制台里录入数据后写入文件当中,即使退出了程序,只要不删除自己所写的文件都可以随时通过程序对文件里的任意数据进行增删改查,并且可以实现对多文件的管理,在修改数据的时候我们可以对指定文件里的指定月份的指定数据项进行修改体现了修改的灵活性,在查询的时候我们可以在控制台中查询一个文件中里的一个月的数据也可以在控制台中查询指定文件里的直径月份的数据,还可以对指定文件里的指定月份的数据整项删除最后该程序还可以对每个月中的各项开支进行从小到大的排序
4.具备功能该程序可以接收键盘输入数据、将数据写入指定文件、将.dat文件文件转换为txt文件显示出来方便查看、找到对应月份、对一个月内各项支出进行排序、修改其中一项数据以及删除整月数据最后在主函数中对小组成员的各个函数进行整体的调试调用详细情况见下表voidinputInfor*a该函数接受一个从主函数传过来的指针变量,将数据写入a所指向的内存区域voidwriteinforInfor*a该函数将a所指向的内存区域的数据写入到指定的.dat文件中voidchangeFormat该函数用于查询的时候将.dat文件里的数据写入到控制台中,并转化一个.txt文件显示出来,最后关闭这个文件函数执行完毕并删除该.txt文件intsearchInfor*a接受主函数中传来的指针变量,寻找该指针指向的内存区域中a-month与你所需要查找的month值相等的位置,使a指针刚好指向这个月的数据,若找到了标志位为1返回正确,如果没找到的话就显示为找到对应月份voidpaixuInfor*a对指定月份里的数据项里的数据从小到大进行排序voidmodifyInfor*aintmon对指定文件的指定月份的指定的数据项的数据进行修改voiddelRecordintmon对指定的文件的指定月份的数据整月进行删除我在本程序中承担的主要任务是查找对应月份,查询数据或修改该月份中的一项数该三项功能主要解决的问题是如何在指定的文件中找到对应的数据项并对该数据项进行相应的操作最后在主函数中通过switch对各个功能模块进行整体调用最终实现该系统我所主要要解决的问题是如何使用正确的文件读写操作模式字符串来打开文件以及对指定的.dat文件读取后转换为.txt文件并最终按照以定的格式显示在屏幕上另外在查询函数中我们要在相应的文件中找到对应的月份,并将指针移动到这里指向该数据区域,这样的话我们就可以利用该指针变量方便的查询、修改数据,这也正是体现出指针变量使用的灵活性其中文件操作中fopen函数模式字符串的功能如下模式字符串意义“r”打开已过文件,可以读取文件“w”打开已文件,可以写入文件,先将文件的长度截为0,如果该文件不存在则创建之“a”打开一个文本文件,可以写入文件,向已有文件的尾部追加内容,如果该文件不存在则先创建之“r+”打开一个文本文件,可以进行更新,也可以读取和写入文件“w+”打开已隔文本文件,可以进行更新(写入),如果该文件存在则首先将其长度截为0;如果不存在则先创建之“a+”打开一个文本文件,可以进行更新(读取和写入),向已有的文件的尾部追加内容,如果该文件不存在则先创建之;可以读取整个文件,但写入时只能追加内容“rb””wb+””ab””ab+””a+b””wb+””w+b”“ab+””a+b”与前面的模式相同,只是使用二进制模式而非文本模式打开文件三详细设计
1.changeFormat该函数功首先在控制台上打印一排语句提示用户输入想要查找的文件名,若该文件不存在的话该程序就会终止若该文件存在的话使用文件类型指针fp1指向该文件,以二进制文件读写方式打开该文件,接着我用相通的名字却用.txt后缀创建了另一个文件,并用文件类型指针fp2指向它,并在该文件中打印一些展示文字使输出结果更加好看,同时将这些文字也打印在了控制台上,最后将fp1文件指向的内容用格式化输出fprintf全部写入fp2中,最后分别关闭fp1fp2,并将刚刚的.txt文件显示出来,同时删除刚刚创建的.txt文件voidchangeFormat{FILE*fp1*fp2;Infor*a;charfilename
[100];inti;a=Infor*mallocsizeofInfor;printf请输入您要查询的数据所在的文件名(以.dat为后缀的文件名);scanf%sfilename;fp1=fopenfilenamerb+;//以读写方式打开一个二进制文件iffp1==NULL{printf无法找到文件\n;exit0;}fori=0;filename[i]!=.;i++{filename2[i]=filename[i];}iffilename2[i]!=.{strcatfilename
2.txt;//将filename的后缀改为.txt文件}fp2=fopenfilename2wb+;iffp2==NULL{printf无法创建文件\n;return;//返回主函数}fputs\n……………………………………个人帐簿管理系统……………………………………\r\nfp2;fputs记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\r\nfp2;fputs-----------------------------------------------------------------------\r\nfp2;printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;rewindfp1;//使fp1指向文件开头freadasizeofInfor1fp1;while!feoffp1//从原文件.dat中读数据写入显示文件.txt中{printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;fprintffp2%7d%8d%8d%8d%8d%8d%8d%8d\r\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;//格式化文件输出freadasizeofInfor1fp1;}fputs-----------------------------------------------------------------------\r\nfp2;fputs\r关闭本程序继续原程序!\nfp2;fclosefp1;fclosefp2;systemfilename2;//调用打开转换的文本文件removefilename2;}
2.searchinfor*a该函数功首先在控制台上打印一排语句提示用户输入想要查找的文件名,若该文件不存在的话该程序就会终止若该文件存在的话使用文件类型指针fp1指向该文件,以二进制文件读写方式打开该文件,接着我用相通的名字却用.txt后缀创建了另一个文件,并用文件类型指针fp2指向它,并在该文件中打印一些展示文字使输出结果更加好看,同时将这些文字也打印在了控制台上,最后将fp1文件指向的内容用格式化输出fprintf全部写入fp2中,最后分别关闭fp1fp2,并将刚刚的.txt文件显示出来,同时删除刚刚创建的.txt文件intsearchInfor*a{FILE*fp1;intmon;intisfound=0;//标志变量,初始为0代表为找到对应的月份,若找到对应的月份这设置为1charfilename
[100];printf请输入文件名字.dat文件:;scanf%sfilename;printf请正确输入月份:;scanf%dmon;fflushstdin;//清除缓冲区fp1=fopenfilenamerb+;iffp1==NULL{printf无法找到文件\n;exit0;}rewindfp1;//将fp1指向文件头,这样更加严谨freadasizeofInfor1fp1;while!feoffp1//查询操作{ifa-month==mon{isfound=1;break;}else{isfound=0;}freadasizeofInfor1fp1;}fclosefp1;ifisfound{returnOK;}else{printf未找到对应的月份\n;return1;}}
3.voidmodifyInfor*aintmon该函数主要功能在于修改指定文件下指定月份的指定数据项,首先用fp1指向指定的文件,同时用fp2打开一个temp.dat文件月份是通过前面的search函数找到后,通过指针变量a”传递”过来的首先选择修改哪一项数据,然后输入要修改的数据的内容将其写入a指向的内存区域里对应的数据项此时我们用printf在控制台打印出修改后的月份的数据然后用指针变量b来存储从fp1文件中读取的数据,当它不是对应的月份就直接写入fp2指向的temp.dat文件中,当它是对应的月份的时候就将a指向的内存区域的数据写入fp2指向的temp.dat文件中,该过程还是一个直到fp1指向文件结尾时才结束的函数最后关闭fp1fp2指向的文件,删除源文件,将temp.dat文件的名字命名为与先前文件相同的名字并在控制台上打印出修改成功的字样voidmodifyInfor*aintmon//修改数据{FILE*fp1*fp2;inti;intmoney;charfilename
[100];Infor*b;b=Infor*mallocsizeofInfor;printf修改后的数据所要插入的文件(注意与前面的文件名一定要是一致的!!);scanf%sfilename;fp1=fopenfilenamerb+;fp2=fopentemp.datwb+;//temp.dat作为临时文件printf你要修改哪一项数据?1代表食品,2代表房租,3代表子女费用,4代表水电费用,5代表医疗费用,6代表储蓄,7代表收入:;scanf%di;whilei1||i7{printf请重新输入;scanf%di;}printf请将修改后的数据输入进来:;scanf%dmoney;switchi{case1:a-shipin=money;break;case2:a-fangzu=money;break;case3:a-zinv=money;break;case4:a-shuidian=money;break;case5:a-yiliao=money;break;case6:a-chuxu=money;break;case7:a-shouru=money;break;default:break;}printf修改后的\n;printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;rewindfp1;freadbsizeofInfor1fp1;while!feoffp1//重写数据{ifb-month==mon{fwriteasizeofInfor1fp2;//修改数据}else{fwritebsizeofInfor1fp2;}freadbsizeofInfor1fp1;}fclosefp1;fclosefp2;removefilename;//删除源文件renametemp.datfilename;//重命名中间文件printf修改数据成功!\n;}4.主函数调试主函数部分通过switch语句来对实现整个程序功能的调度首先case1里通过input函数将变量写入a所指向的内存区域,然后调用writeinfor函数将指针变量a所指向区域的数据写入用户自己指定的文件中case2是对用户指定的文件的数据进行整个文件查询,结果最终会打印在控制台中并且还会显示一个.txt文件这样更加方便更加直观case3中调用了search函数,并且通过标志位变量flag来接收search函数所返回的值,若flag值不是OK的话就打印出没有符合条件的记录的语句,flag是OK的话就通过指针变量a将其所指向的内存区域的数据格式化的打印在屏幕上,然后调用modify函数对该该月份的数据指定的数据项进行修改case4中前面部分的流程与case3还是一样的,同样是调用search函数找到指定文件里的指定月份的数据并使a指向它,最后通过指针变量a打印在屏幕上case5中还是通过search函数来找到指定的月份然后通过paixu函数来对指定月份的数据进行从小到大的排序,最后还是打印到控制台上case6中同样是通过search函数找到指定的月份,并删除这个月份的所有数据case7中通过stdlib.h函数中的exit函数来退出整个程序主函数的整个流程图如算法整体思路里的函数流程图所示,在这里就省略掉了intmain{whileTRUE{intflag;//标志位,用来保存查询函数所返回的结果intitem;//功能项目号intmon;Infor*a;//信息指针a=Infor*mallocsizeofInfor;//动态分配内存空间do{printf\n\t******************欢迎进入个人帐簿管理系统****************\n;printf\t*\t*\n;printf\t*\t——————主菜单——————*\n;printf\t*\t*\n;printf\t*\t
1.录入数据*\n;printf\t*\t
2.查看数据*\n;printf\t*\t
3.修改数据*\n;printf\t*\t
4.查询数据*\n;printf\t*\t
5.排序数据*\n;printf\t*\t
6.删除数据*\n;printf\t*\t
0.退出系统*\n;printf\t*\t*\n;printf\t**********************************************************\n\n;printf请输入要进行的操作:;scanf%ditem;}whileitem7||item0;//选择功能switchitem{//录入数据case1:inputa;writeinfora;break;//查看数据case2:changeFormat;//将dat文件转换为txt文件来进行查询break;//修改数据case3:flag=searcha;mon=a-month;ifflag!=OKprintf\n没有符合条件的记录!\n;else{printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;modifyamon;}break;//查询数据case4:flag=searcha;ifflag!=OKprintf\n没有符合条件的记录!\n;else{printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;}break;//排序数据case5:flag=searcha;ifflag!=OK{printf\n没有找到符合排序条件的记录!\n;}else{paixua;}break;//删除数据case6:flag=searcha;mon=a-month;ifflag!=OKprintf\n没有符合条件的记录!\n;else{printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;delRecordmon;}break;//退出系统case0:printf\n指导老师冯珊\n;printf小组成员夏能,王欢,邱少雄,罗四维\n;exit0;break;}freea;//释放内存空间}return0;}四程序的调试与运行结果说明
1.查询函数首先是测试查询函数,数据已经先通过第一项功能提前写入到了test.dat文件中,我们在主函数界面中输入2选择查看数据这时在控制台中我们可以看到数据按照一定的格式输出了,同时也打开了一个名为test.txt文件显示出了同样的数据,这是我们看到目录结构中同时有test.dat文件和test.txt文件,test.txt文件中提示用户关闭本程序继续源程序,关闭程序后我们发现回到了主函数界面中,并且text.txt文件被删除掉了
2.查询数据其次测试第四项查询数据功能,该功能与前者的区别在于,前者是对整个文件的数据进行查询,而该项功能是对于指定文件的指定月份来进行查询我们首先在主函数界面下输入4来选择功能,然后控制台会提示我们输入要查询的文件名,还是输入刚刚的test.dat,然后控制台接着会提示用户输入查询的月份,我们输入了10,这时候会发现控制台将10月份的数据直接打印在了控制台上
3.修改数据接着测试修改数据的功能,这时我们在主界面中输入3,这里调用前面的search来指定文件与月份,所以控制台上还是谁提示我们输入相应的文件与响应的月份,我们输入好test.dat与10后,会发现控制台上提示我们选择要修改哪一项,这时我们选择修改的是第一项即食品消费这一项,将其数字从150改为380,最后在控制台中显示出来了,我们发现结果是完全正确的五课程设计总结该课程设计主要是通过C语言里的文件操作对文件进行读写操作,来实现一个账簿管理系统,从这一点上类似于一个小型的文件类型数据库基本的的对于文件里的增删改查的功能都在该程序里实现了,界面搭建的也很友好,提示性输出语句很多,操作起来也比较方便查询的文件可以通过一个.txt文件显示出来,也可以指定对应文件里的对应月份的数据打印在控制条中并且可以通过该程序实现对多文件的管理操作,在这一点上与一个文件型DBMS是一样的(当然功能没有那么强大)在整个程序的编写过程中遇到的最大困难就是关于文件的读写,以及如何以一种良好的格式输出让用户看的更加清晰直观最先我们对文件操作函数里的模式字符串的含义理解比较含糊,没有正确的使用以及文件操作了以后忘了重定向文件指针的位置导致文件指针指向异常往往在某些时候的测试下与我们所期待实现的功能大相径庭,所以我们在文件指针操作之前都会先将指针的位置定位好另外如我们在功能2中以一个.txt文件将整个文件的数据都输出出来了,在这里格式就看起来比较舒服,但最先的时候显示的效果并不是这样的我们当时忽略了windows里的换行与dos命令控制台里的换行的转义字符是不一样的,所以无论怎样使用’\n’最后结果都是所有的数据都挤在了一排显得特别难看,但是后来突然想起来在windows中的换行使用的是’\r’后来替换掉了’\n’后一经调试就达到了满意的输出效果另外在整个程序中是分模块来编写的,怎样使各个模块能共享数据又成了一大难题,后来经过讨论我们决定整个程序在主函数中创建一个Infor类型的指针变量,通过指针变量我们就可以方便的共享其所指向的内存区域以达到共享数据的效果整个程序的缺点在于该程序的某些步骤操作起来比较繁琐,比方说前面的修改数据项的功能,在前面已经指定好了一个文件名,在后面又要重新指定一遍文件名,这个问题主要是因为分模块编写所造成的缺陷,曾经想到用一个全局变量来弥补该缺陷,但是后来由于时间的问题一旦修改必然又会对整个程序大动干戈进行一番修改就此作罢另外整个程序设计的异常处理很不完善,但这个责任也不全然在于我们身上,因为C语言是面向过程的语言,它并不具备类似C++、JAVA里强大的异常处理机制(没有定义那么多的异常类),所以整个程序虽然可以正常的运行使用,但并不健壮,一旦遇到非法的操作程序就必然崩溃,如果采用C++或JAVA这样的面向对象语言来进行编程的话程序应该可以设计的更加完善一些毕竟是一个账簿管理系统,对于不同的用户我们应该限制不同的使用权限关于本程序的进一步设想就是我希望能够实现一个用户权限管理,可以通过不同的文件操作模式字符串来指定不同类型的用户有不同权限的操作比方说有的用户我们就在打开文件时给他指定“只读”类型,那么他在整个操作过程中就只能进行查询,而不能创建,增加,删除,修改数据,而有的级别比较高的用户我们就给他指定为“既可读既可写”类型,那么他在整个程序的操作过程中就拥有最高的权限可以对数据进行任意的操作如果这样修改成功了以后的话就该程序就真真正正的实现了一个小型的文件DBMS总的来说做完这一次课程设计题目以后使我原本比较薄弱的文件操作知识得到了加强并且也将数据库课当中学到的一些数据库的思想也能在该程序中得到了一定的体现,收获还是很大的参考文献
[1]谭浩强,C程序设计题解与上机指导(第二版),北京,清华大学出版社,2000年9月
[2]StephenPrata,Cprimerplus(第四版),北京,人民邮电出版社,2005年2月
[3]严蔚敏《数据结构(C语言版)》北京,清华大学出版社,2007年3月
[4]谭浩强《C程序设计(第四版)》,北京,清华大学出版社,附录#includestdio.h#includestdlib.h#includestring.h#defineOK1#defineERROR0#defineTRUE1//个人信息typedefstruct{intmonth;intshipin;intfangzu;intzinv;intshuidian;intyiliao;intchuxu;intshouru;}Infor;//各个变量的名称为了方便使用全部使用拼音charfilename1
[100]filename2
[100];typedefstruct{//查询用自定义数据类型intno;intdata;}pType;voidinputInfor*a//接收从键盘输入的数据{printf\n请依次输入数据数据之间用空格隔开:\n本月月份食品消费房租费用子女费用水电费用医疗费用储蓄费用收入费用\n;scanf%d%d%d%d%d%d%d%da-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;fflushstdin;//清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件}voidwriteinforInfor*a//向文件内写入内容{charch;FILE*fp;printf请输入要写入的文件名请以.dat做为文件名后缀:;scanf%sfilename1;ch=getchar;//回收换行键iffp=fopenfilename1ab+==NULL//第一次以读写方式建立一个新二进制文件,后面若该文件名存在则打开该文件在后面追加内容{printf无法创建文件\n;exit0;}fwriteasizeofInfor1fp;//向fp所指向的文件写入一个数据项fclosefp;printf数据写入成功\n;}voidchangeFormat{FILE*fp1*fp2;Infor*a;charfilename
[100];inti;a=Infor*mallocsizeofInfor;printf请输入您要查询的数据所在的文件名(以.dat为后缀的文件名);scanf%sfilename;fp1=fopenfilenamerb+;//以读写方式打开一个二进制文件iffp1==NULL{printf无法找到文件\n;exit0;}fori=0;filename[i]!=.;i++{filename2[i]=filename[i];}iffilename2[i]!=.{strcatfilename
2.txt;//将filename的后缀改为.txt文件}fp2=fopenfilename2wb+;iffp2==NULL{printf无法创建文件\n;return;//返回主函数}fputs\n……………………………………个人帐簿管理系统……………………………………\r\nfp2;fputs记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\r\nfp2;fputs-----------------------------------------------------------------------\r\nfp2;printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;rewindfp1;//使fp1指向文件开头freadasizeofInfor1fp1;while!feoffp1//从原文件.dat中读数据写入显示文件.txt中{printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;fprintffp2%7d%8d%8d%8d%8d%8d%8d%8d\r\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;//格式化文件输出freadasizeofInfor1fp1;}fputs-----------------------------------------------------------------------\r\nfp2;fputs\r关闭本程序继续原程序!\nfp2;fclosefp1;fclosefp2;systemfilename2;//调用打开转换的文本文件removefilename2;}intsearchInfor*a{FILE*fp1;intmon;intisfound=0;//标志变量,初始为0代表为找到对应的月份,若找到对应的月份这设置为1charfilename
[100];printf请输入文件名字.dat文件:;scanf%sfilename;printf请正确输入月份:;scanf%dmon;fflushstdin;//清除缓冲区fp1=fopenfilenamerb+;iffp1==NULL{printf无法找到文件\n;exit0;}rewindfp1;//将fp1指向文件头,这样更加严谨freadasizeofInfor1fp1;while!feoffp1//查询操作{ifa-month==mon{isfound=1;break;}else{isfound=0;}freadasizeofInfor1fp1;}fclosefp1;ifisfound{returnOK;}else{printf未找到对应的月份\n;return1;}}voidpaixuInfor*a{inti=0j=0;inttemp;pTypepx
[8]={{00}};charstr
[8]
[10]={记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入};//二维字符数组for;i8;i++{px[i].no=i;}//这里只能一一赋值px
[0].data=a-month;px
[1].data=a-shipin;px
[2].data=a-fangzu;px
[3].data=a-zinv;px
[4].data=a-shuidian;px
[5].data=a-yiliao;px
[6].data=a-chuxu;px
[7].data=a-shouru;fori=0;i8;i++{forj=0;j7;j++{ifpx[j].data=px[j+1].data{temp=px[j].no;px[j].no=px[j+1].no;px[j+1].no=temp;temp=px[j].data;px[j].data=px[j+1].data;px[j+1].data=temp;}else{continue;}}}fori=0;i8;i++{printf%s|str[px[i].no];}printf\n;fori=0;i8;i++{printf%dpx[i].data;}}voidmodifyInfor*aintmon//修改数据{FILE*fp1*fp2;inti;intmoney;charfilename
[100];Infor*b;b=Infor*mallocsizeofInfor;printf修改后的数据所要插入的文件(注意与前面的文件名一定要是一致的!!);scanf%sfilename;fp1=fopenfilenamerb+;fp2=fopentemp.datwb+;//temp.dat作为临时文件printf你要修改哪一项数据?1代表食品,2代表房租,3代表子女费用,4代表水电费用,5代表医疗费用,6代表储蓄,7代表收入:;scanf%di;whilei1||i7{printf请重新输入;scanf%di;}printf请将修改后的数据输入进来:;scanf%dmoney;switchi{case1:a-shipin=money;break;case2:a-fangzu=money;break;case3:a-zinv=money;break;case4:a-shuidian=money;break;case5:a-yiliao=money;break;case6:a-chuxu=money;break;case7:a-shouru=money;break;default:break;}printf修改后的\n;printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;rewindfp1;freadbsizeofInfor1fp1;while!feoffp1//重写数据{ifb-month==mon{fwriteasizeofInfor1fp2;//修改数据}else{fwritebsizeofInfor1fp2;}freadbsizeofInfor1fp1;}fclosefp1;fclosefp2;removefilename;//删除源文件renametemp.datfilename;//重命名中间文件printf修改数据成功!\n;}voiddelRecordintmon//删除数据{FILE*fp1*fp2;charfilename
[100];Infor*b;b=Infor*mallocsizeofInfor;printf删除的数据所在的文件名:\n;scanf%sfilename;fp1=fopenfilenamerb;fp2=fopentemp.datwb+;rewindfp1;freadbsizeofInfor1fp1;while!feoffp1//重写数据{ifb-month!=mon{fwritebsizeofInfor1fp2;}freadbsizeofInfor1fp1;}fclosefp1;fclosefp2;removefilename;//删除源文件renametemp.datfilename;//重命名中间文件printf删除数据成功!\n;}intmain{whileTRUE{intflag;//标志位,用来保存查询函数所返回的结果intitem;//功能项目号intmon;Infor*a;//信息指针a=Infor*mallocsizeofInfor;//动态分配内存空间do{printf\n\t******************欢迎进入个人帐簿管理系统****************\n;printf\t*\t*\n;printf\t*\t——————主菜单——————*\n;printf\t*\t*\n;printf\t*\t
1.录入数据*\n;printf\t*\t
2.查看数据*\n;printf\t*\t
3.修改数据*\n;printf\t*\t
4.查询数据*\n;printf\t*\t
5.排序数据*\n;printf\t*\t
6.删除数据*\n;printf\t*\t
0.退出系统*\n;printf\t*\t*\n;printf\t**********************************************************\n\n;printf请输入要进行的操作:;scanf%ditem;}whileitem7||item0;//选择功能switchitem{//录入数据case1:inputa;writeinfora;break;//查看数据case2:changeFormat;//将dat文件转换为txt文件来进行查询break;//修改数据case3:flag=searcha;mon=a-month;ifflag!=OK{printf\n没有符合条件的记录!\n;}else{printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;modifyamon;}break;//查询数据case4:flag=searcha;ifflag!=OK{printf\n没有符合条件的记录!\n;}else{printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;}break;//排序数据case5:flag=searcha;ifflag!=OK{printf\n没有找到符合排序条件的记录!\n;}else{paixua;}break;//删除数据case6:flag=searcha;mon=a-month;ifflag!=OKprintf\n没有符合条件的记录!\n;else{printf\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n;printf-----------------------------------------------------------------------\n;printf%7d%8d%8d%8d%8d%8d%8d%8d\na-montha-shipina-fangzua-zinva-shuidiana-yiliaoa-chuxua-shouru;delRecordmon;}break;//退出系统case0:printf\n指导老师冯珊\n;printf小组成员夏能,王欢,邱少雄,罗四维\n;exit0;break;}freea;//释放内存空间}return0;}。