1、个人账簿管理系统说明书目 录摘 要 11. 采用类c语言定义相关的数据类型 22. 各模块的伪码算法 33. 函数的调用关系图 44. 调试分析 55. 测试结果 66. 源程序(带注释) 13总 结 26参考文献 27致 谢 28附件 任务一源程序代码 29摘 要该课程设计主要设计个人账簿管理系统以记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。在课程设计中,用到了C语言以及数据结构中的相关知识,当然也有少数参考了其他人对某些问题的处理经验。对于进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月
2、的收支情况。在程序设计中,添加了使用说明和帮助事项,并且采用了面向对象这种解决问题的方法。程序通过调试运行,初步是想了设计目标,并且经过适当完善后,将可以应用在个人理财解决实际问题。关键词: 账薄;管理系统;数据结构;输入输出1. 采用类c语言定义相关的数据类型typedef struct int month;/月份 int food;/食品消费 int house;/房租费用 int edu;/子女教育费用 int elc;/水电费用 int health;/医疗费用 int store;/储蓄费用 int income;/收入费用 Infor;typedef struct / 查询用自定义
3、数据类型 int no; int data; pType;2. 各模块的伪码算法1.用冒泡排序实现信息的从小到大排序。void paixu(Infor *a) int i=0,j=0,flag=0,t; pType px8=0,0; char str810=记录月份,食品消费,房租费用,子女费用,水电费用,医疗费用,储蓄费用,本月收入; for(;imonth; px1.data=a-food; px2.data=a-house; px3.data=a-edu; px4.data=a-elc; px5.data=a-health; px6.data=a-store; px7.data=a-in
4、come; for(i=1;i8;i+)/冒泡排序 flag=0; for(j=0;jpxj+1.data) t=pxj.data; pxj.data=pxj+1.data; pxj+1.data=t; t=pxj.no; pxj.no=pxj+1.no; pxj+1.no=t; flag=1; /输出结果3. 函数的调用关系图 图 3.04. 调试分析a、 调试中遇到的问题及对问题的解决方法(1)录入、查询、修改、删除数据。建立一个文件,包括某人5个月的开支情况,对文件中的信息扩充,包括修改,删除等。所以先确定文件保存路径,接受键盘输入,像文件内写入内容,将dat格式文件转换为txt文件,查
5、询用声明,自定义数据类型,然后返回查询结果及查询状态,继而对查询结果排序。删除数据时,先调用打开转换的文本文件。修改数据时,要重写数据,删除源文件,重命名中间文件,显示新的数据。 (2)起泡排序 起泡排序是每趟把当先序列中最小的元素放在开始位置,是交换排序中最简单的排序方法,其基本思想是:两两比较相邻记录的关键码,如果反序则交换,值到没有反序的记录为止,将整个待排序的记录序列分成为有序区和无序区,初始状态有序区为空,无序区包括所有待排序的记录。对无序去从前向后依次将相邻记录的关键码进行比较,若反序则交换,从而使得关键码晓得记录向前移,关键码大的记录向后移(像水中的气泡,体积大的先浮上来)。重复
6、执行,之前无序区中没有反序的记录。确定每趟范围。b、算法的时间复杂度和空间复杂度 因为时间复杂度是程序语句调用频度。故为O(). 5. 测试结果 5.1 创建工程并建立文件(1)启动C FREE(2)新建工程名为“zj” 的Win32控制台应用程序。(3)建立头文件“Myinfor.h”,在其中定义图类myinfor。(4)建立源文件“myinfor。.cpp”,在其中定义图类myinfor。的构造函数 myinfor。、开支情况输出输出函数PutOutVexInfo。(5)建立源文件“myinfor Main.cpp”,在其中输入开支情况及项目信息, 通过主函数调用其它各函数,实现个人帐薄管
7、理系统的设计 5.2 个人帐薄管理系统的具体实现 (1)个人帐薄管理主界面如图5.1所示 图5.1 (2) 如果输入1,进行录入数据,并且录入某人从1-5月的开支情况如图5.2所示 图5.2(3)1月份开支情况信息录入如图5.3所示图5.3 (4)2月份开支情况信息录入如图5.4所示图5.4 (5)3月份开支情况信息录入如图5.5所示 图5.5(6)4月份开支情况信息录入如图5.6所示 图5.6(7)5月份开支情况信息录入如图5.7所示 图5.7 (8)查看数据,输入2.如图5.8所示 图5.8(9)信息修改如图5.9所示图5.9(10)信息查询如图5.10所示图5.10 (11)5月份开支情
8、况费用排序如图5.11所示图5.11 (12)开支情况记录删除如图5.12所示图5.12 (13)个人帐簿管理系统退出如图5.13所示 图 5.13 6. 源程序(带注释)#include #include #include #include /文件保存路径#define FilePath1 Myinfor.dat#define FilePath2 Myinfor.txt/查询用声明#define Status int#define OK 1#define Error 0#define NotFound 2typedef struct int month;/月份 int food;/食品消费
9、int house;/房租费用 int edu;/子女教育费用 int elc;/水电费用 int health;/医疗费用 int store;/储蓄费用 int income;/收入费用 Infor;typedef struct / 查询用自定义数据类型 int no; int data; pType;void menu(void); /菜单void input(Infor *newI); /接收键盘输入void writeinfor(Infor *newI);/向文件内写入内容void changeFormat(void );/将dat格式文件转换为txt文件Status search(
10、Infor *a);/查询函数返回查询的结果及查询的状态void paixu(Infor *a);/对查询据结果排序void modify(Infor *a,int mon);/修改数据void delRecord(int mon);/删除数据void main() while(1) menu(); void menu(void) int item; int mon; Infor *a; a=(Infor *)malloc(sizeof(Infor); do printf(n个人帐簿管理系统nn); printf(tt1.录入数据。n); printf(tt2.查看数据。n); printf(
11、tt3.修改数据。n); printf(tt4.查询数据。n); printf(tt5.排序数据。n); printf(tt6.删除数据。n); printf(tt0.退出系统。nn); printf(请输入要进行的操作: ); scanf(%d,&item); while(item6 | itemmonth; if (item!=OK) printf(n没有符合条件的记录!n); else printf(n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入n); printf(- n); printf(%7d %8d %8d %8d %8d %8d %8d %8d
12、n,a-month,a-food,a-house,a-edu,a-elc,a-health,a-store,a-income); input(a); modify(a,mon); break; /查询数据 case 4: item=search(a); if (item!=OK) printf(n没有符合条件的记录!n); else printf(n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入n); printf(- n); printf(%7d %8d %8d %8d %8d %8d %8d %8dn,a-month,a-food,a-house,a-edu
13、,a-elc,a-health,a-store,a-income); break; /排序数据 case 5: item=search(a); if (item!=OK) printf(n没有符合条件的记录!n); else paixu(a); break; /删除数据 case 6: item=search(a); mon=a-month; if (item!=OK) printf(n没有符合条件的记录!n); else printf(n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入n); printf(- n); printf(%7d %8d %8d %8d
14、 %8d %8d %8d %8dn,a-month,a-food,a-house,a-edu,a-elc,a-health,a-store,a-income); delRecord(mon); break; free(a);/释放内存空间void input(Infor *newI) printf(n请依次输入数据说明:中间以空格符隔开:n(本月月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 收入费用)n); scanf(%d%d%d%d%d%d%d%d,&newI-month,&newI-food,&newI-house,&newI-edu,&newI-elc,&newI-
15、health,&newI-store,&newI-income); fflush(stdin);void writeinfor(Infor *newI) FILE *fp; fp=fopen(FilePath1,ab+); if(fp=NULL) printf(无法创建文件:%s,FilePath1); exit(0); fwrite(newI,sizeof(Infor),1,fp);/这里可以做特别处理可防止存在同一月份有条以上的记录问题。这里就不写了。 fclose(fp); printf(数据录入成功!n);void changeFormat(void) /暂时只能操作一行文件有待改进
16、FILE *fp1,*fp2; Infor *a; a=(Infor *)malloc(sizeof(Infor); fp1=fopen(FilePath1,rb+); if(fp1=NULL) printf(无法找到文件:%sn,FilePath1); return ; /返回主函数 fp2=fopen(FilePath2,wt+); if(fp2=NULL) printf(无法创建文件:%sn,FilePath2); return ; /返回主函数 fputs( n个人帐簿管理系统nn,fp2); fputs(记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入n
17、,fp2); fputs(- n,fp2); printf(n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入n); printf(- n); rewind(fp1); fread(a,sizeof(Infor),1,fp1); while(!feof(fp1)/从原文件.dat中读数据写入显示文件.txt中 printf(%7d %8d %8d %8d %8d %8d %8d %8dn,a-month,a-food,a-house,a-edu,a-elc,a-health,a-store,a-income); fprintf(fp2,%7d %8d %8d %8
18、d %8d %8d %8d %8dn,a-month,a-food,a-house,a-edu,a-elc,a-health,a-store,a-income); fread(a,sizeof(Infor),1,fp1); fputs(- n,fp2); fputs(关闭本程序继续原程序!n,fp2); fclose(fp1); fclose(fp2); system(FilePath2); /调用打开转换的文本文件 remove(FilePath2);/删除文本文件文件Status search(Infor *a) FILE *fp1; int mon; int isfound=0; pri
19、ntf(请正确输入要查询的月份:); scanf(%d,&mon); fflush(stdin); /清除缓冲区 fp1=fopen(FilePath1,rb+); if(fp1=NULL) printf(无法找到文件:%sn,FilePath1); return Error; /返回主函数 rewind(fp1); fread(a,sizeof(Infor),1,fp1); while(!feof(fp1)/查询操作 if(a-month=mon) isfound=1; break; else isfound=0; fread(a,sizeof(Infor),1,fp1); fclose(f
20、p1); if(isfound) return OK; else return NotFound;void paixu(Infor *a) int i=0,j=0,flag=0,t; pType px8=0,0; char str810=记录月份,食品消费,房租费用,子女费用,水电费用,医疗费用,储蓄费用,本月收入; for(;imonth; px1.data=a-food; px2.data=a-house; px3.data=a-edu; px4.data=a-elc; px5.data=a-health; px6.data=a-store; px7.data=a-income; for(
21、i=1;i8;i+)/冒泡排序 flag=0; for(j=0;jpxj+1.data) t=pxj.data; pxj.data=pxj+1.data; pxj+1.data=t; t=pxj.no; pxj.no=pxj+1.no; pxj+1.no=t; flag=1; /输出结果 if(flag=0) break; printf(n); for(i=0;i8;i+) printf( %s,strpxi.no); printf(n- n); for(i=0;imonth=mon) fwrite(a,sizeof(Infor),1,fp2);/修改数据 else fwrite(b,size
22、of(Infor),1,fp2); fread(b,sizeof(Infor),1,fp1); fclose(fp1); fclose(fp2);remove(FilePath1); /删除源文件 rename(temp.dat,FilePath1);/重命名中间文件 printf(修改数据成功!n ); changeFormat(); /显示数据void delRecord(int mon) /删除数据 FILE *fp1,*fp2; Infor *b; b=(Infor *)malloc(sizeof(Infor); fp1=fopen(FilePath1,rt); fp2=fopen(t
23、emp.dat,wt+);rewind(fp1); fread(b,sizeof(Infor),1,fp1); while (!feof(fp1) /重写数据 if(b-month!=mon) fwrite(b,sizeof(Infor),1,fp2); fread(b,sizeof(Infor),1,fp1); fclose(fp1); fclose(fp2);remove(FilePath1); /删除源文件 rename(temp.dat,FilePath1);/重命名中间文件 printf(删除数据成功!n ); changeFormat(); /显示数据 总 结本次设计给我们带来了很
24、深的感触,C语言的精深以及程序的可爱都深深地吸引了我们,这次设计使我们自身的编程,读程能力得到了提升,也使我们更加深刻的认识到不断学习,努力探索的重要性,本次设计单凭自己的力量真的有些困难,幸亏有同学的帮助以及各种参考资料以供查询,以及自身不断努力和奋进,最终也得到一个令人还算满意的结果,总之,我在这次设计中体会到了自己的不足之处,我会在以后的学习和生活中将自身的水平完善,最终使自己拥有傲人的能力!参考文献1 严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社.2 严蔚敏,吴伟民.数据结构题集(C语言版).清华大学出版社.3 DATA STRUCTURE WITH C+. William Ford,William Topp .清华大学出版社(影印版). 4 谭浩强.c语言程序设计. 清华大学出版社.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1