c语言个人财务管理系统[1]
- 格式:doc
- 大小:154.50 KB
- 文档页数:17
用C语言编写个人财务管理程序青岛理工大学《C语言程序设计》题目个人财务管理程序一、内容个人财务管理程序主要实现对每次财务收支的管理,具有输入收支信息、按天查询信息、按月查询信息、按年查询信息、查询全部信息、删除全部收支信息、按天删除部分收支信息、退出等功能。
本系统操作十分简单用户只需按提示选择所需要执行的功能或输入相应信息即可。
在主功能区中有1、2、3、0四种选择。
选主功能区中的 1 是输入收支信息。
选择主功能区中的2 是进入查询收支信息功能区,在查询功能区有五个子功能选择1、2、3、4、0;选择1 是按天查询收支信息;选择2 是按月查询收支信息,选择3 是按年查询收支信息,选择4是查询全部收支信息,其中2、3、4查询方式还可以显示总收入、总支出和总余额;选择0 是退出查询功能区。
选择主功能区中的3是进入删除收支信息功能区,在删除功能区中有1、2、0三种子功能选择,选择1 是按日期删除某天的收支信息,选择2 是删除所有的收支信息;选择0是退出删除功能区。
选择主功能区的0是退出个人财务管理系统。
二、上机环境操作系统:Windows XP开发工具:VC6.0三、函数调用关系图四、各函数功能说明1、void main() 主函数2、void input() 输入收支信息函数3、void Output() 查询收支信息函数4、void Dateput() 按天查询收支信息函数5、void Monput() 按月查询收支信息函数6、void Yearput() 按年查询收支信息函数7、void Allput() 查询所有收支信息8、void Delete() 删除收支信息函数9、void Delpart() 按日期删除部分信息函数 10、void Delall() 删除所有信息函数五、算法描述或流程图算法描述:函数一:void input() /*输入收支信息函数*/ {FILE *ap;printf("\t输入收入:"); /*输入收入*/scanf("%g",&RMB.shou);printf("\t收入来源:"); /*输入收入来源*/scanf("%s",RMB.a);printf("\t输入支出:");scanf("%g",&RMB.zhi); /*输入支出*/printf("\t支出去向:");scanf("%s",RMB.b); /*输入支出去向*/RMB.yu=RMB.shou-RMB.zhi;printf("\t输入年月日:");scanf("%d",&RMB.year); /*输入年月日*/scanf("%d",&RMB.mon);scanf("%d",&RMB.day);if((ap=fopen("money.txt","ab"))==NULL) /*打开文件*/printf("不能建立文件money.txt\n");elsefwrite(&RMB,sizeof(struct money),1,ap); /*将收支信息记录在money.txt文件*/fclose(ap); /*关闭文件*/printf("************************************************************ **********\n");}函数二:void Output() /*查询收支信息函数*/ {int i;while(1){printf("\n 1 按天查询部分收支信息\n");printf(" 2 按月查询部分收支信息\n");printf(" 3 按年查询部分收支信息\n");printf(" 4 查询全部收支信息\n");printf(" 0 退出查询\n");printf(" 请选择查询方式:"); /*输入选择*/scanf("%d",&i);if(i==1){Dateput(); /*调用按日期查询收支信息函数*/}else if(i==2)Monput();else if(i==3)Yearput();else if(i==4){Allput(); /*调用查询全部收支信息函数*/}else if(i==0){printf("************************************************************ *****\n");break; /*退出查询收支信息函数*/}else{printf(" 输入错误!\n");printf("************************************************************ ******\n");break; /*用户输入错误时退出*/}}}函数三:void Dateput() /*按日期查询收支信息函数*/ {FILE *ap;int y,m,d,n=0;float zs=0,zz=0,s=0;printf("\t输入要查询的年月日:"); /*输入要查询的年、月、日*/scanf("%d%d%d",&y,&m,&d);if((ap=fopen("money.txt","r"))==NULL)printf("不能读取money.txt文件\n");while(1){if(fread(&RMB,sizeof(struct money),1,ap)>0) /*从文件读取信息*/{if(y==RMB.year&&m==RMB.mon&&d==RMB.day) /*查找用户查询的收支信息并将其输出*/{printf("\t收入:%g\n\t收入来源:%s\n",RMB.shou,RMB.a);printf("\t支出:%g\n\t支出去向:%s\n",RMB.zhi,RMB.b);printf("\t余额:%g\n\n",RMB.yu);zs+=RMB.shou; /*统计该天的总收入、总支出、总余额*/zz+=RMB.zhi;s+=RMB.yu;n++; /*统计该天的收支次数*/}}else break;}fclose(ap); /*关闭文件*/if(n==0) printf("\t无该日期的收支信息!\n");if(n>=2) /*若该天收支次数大于1则输出该天的总收入、总支出、总余额*/ {printf("\n\t该天有%d次收支信息\n",n);printf("\t该天总收入:%g\n",zs);printf("\t该天总支出:%g\n",zz);printf("\t该天总余额:%g\n",s);}printf("************************************************************ ***********\n");}函数四:void Monput() /*按月查询收支信息函数*/{FILE *ap;int y,m;float zs=0,zz=0,s=0;printf("输入要查询的年月:");scanf("%d%d",&y,&m);if((ap=fopen("money.txt","r"))==NULL)printf("不能打开money.txt文件!\n");while(fread(&RMB,sizeof(struct money),1,ap)>0){if(y==RMB.year&&m==RMB.mon) /*在文件中查找符合条件的信息并输出*/{printf("\t%d年%d月%d日\n",RMB.year,RMB.mon,RMB.day);printf("\t收入:%g\n\t收入来源:%s\n",RMB.shou,RMB.a);printf("\t支出:%g\n\t支出去向:%s\n",RMB.zhi,RMB.b);printf("\t余额:%g\n\n",RMB.yu);zs+=RMB.shou; /*统计查询月份的总收入、总支出、总余额*/zz+=RMB.zhi;s+=RMB.yu;}}fclose(ap);printf("\t%d年%d月总收入:%g\n",y,m,zs); /*输出所查询月份的总收入、总支出、总余额*/printf("\t%d年%d月总支出:%g\n",y,m,zz);printf("\t%d年%d月总余额:%g\n",y,m,s);printf("************************************************************ ******************");}函数五:void Yearput() /*按年查询收支信息函数*/{FILE *ap;int y;float zs=0,zz=0,s=0;printf("输入要查询的年份:");scanf("%d",&y);if((ap=fopen("money.txt","r"))==NULL)printf("不能打开money.txt文件!\n");while(fread(&RMB,sizeof(struct money),1,ap)>0){if(y==RMB.year) /*输出符合条件的信息*/{printf("\t%d年%d月%d日\n",RMB.year,RMB.mon,RMB.day);printf("\t收入:%g\n\t收入来源:%s\n",RMB.shou,RMB.a);printf("\t支出:%g\n\t支出去向:%s\n",RMB.zhi,RMB.b);printf("\t余额:%g\n\n",RMB.yu);zs+=RMB.shou; /*统计查询年份的总收入、总支出、总余额*/zz+=RMB.zhi;s+=RMB.yu;}}fclose(ap);printf("\t%d年总收入:%g\n",y,zs); /*输出年度总收入、总支出、总余额*/ printf("\t%d年总支出:%g\n",y,zz);printf("\t%d年总余额:%g\n",y,s);printf("******************************************************************************\n");}函数六:void Allput() /*查询全部收支信息函数*/{FILE *ap;float s=0,zs=0,zz=0;if((ap=fopen("money.txt","r"))==NULL)printf("不能读取money.txt文件\n");while(1){if(fread(&RMB,sizeof(struct money),1,ap)>0) /*在money.txt文件中读取信息*/{printf("\t日期:%d %d %d\n",RMB.year,RMB.mon,RMB.day); /*输出年、月、日*/printf("\t收入:%g\n\t收入来源:%s\n",RMB.shou,RMB.a); /*输出查询的收入、收入来源*/printf("\t支出:%g\n\t支出去向:%s\n",RMB.zhi,RMB.b); /*输出查询的支出、支出去向*/printf("\t余额:%g\n\n",RMB.yu); /*输出余额*/zs+=RMB.shou; /*统计总收入*/zz+=RMB.zhi; /*统计总支出*/s+=RMB.yu; /*统计总余额*/}else break;}printf("************************************************************ ***********\n");printf("\t总收入:%g\n\t总支出:%g\n\t总余额:%g\n",zs,zz,s); /*输出总收入、总支出、总余额*/printf("************************************************************ ***********\n");fclose(ap); /*关闭文件*/}函数七:void Delete() /*删除收支信息函数*/{int i;while(1){printf("\n 1 按日期部分删除\n");printf(" 2 全部删除\n");printf(" 0 退出删除\n");printf(" 请选择删除方式:");scanf("%d",&i); /*收受用户输入的删除方式*/if(i==1) /*按日期删除部分收支信息*/{Delpart(); /*调用按日期删除部分收支信息函数*/}else if(i==2) /*删除全部信息*/{Delall(); /*调用删除全部收支信息函数*/}else if(i==0) /*退出删除*/{printf("************************************************************ *****\n");break;}else /*用户输入的信息错误*/{printf(" 输入错误!\n");printf("************************************************************ ***\n");break;}}}函数八:void Delpart() /*按日期删除部分收支信息函数*/ {FILE *ap;List *head,*r,*s,*pb;int n=0,y,m,d;head=(List *)malloc(sizeof(List)); /*创建头节点*/head->next=NULL;r=head;if((ap=fopen("money.txt","r"))==NULL)printf("不能打开money.txt文件!\n");printf(" 输入要删除的年月日:");scanf("%d%d%d",&y,&m,&d);while(fread(&RMB,sizeof(struct money),1,ap)>0) /*在文件中读取信息查找要删除的信息*/{if(y==RMB.year&&m==RMB.mon&&d==RMB.day)n++;else{s=(List *)malloc(sizeof(List)); /*尾插入法创建链表并将不需要删除的信息存在数据域*/s->data=RMB;r->next=s;r=s;}}r->next=NULL; /*为节点的next置为NULL*/fclose(ap); /*关闭文件*/if(n) /*要删除的信息存在*/{ap=fopen("money.txt","wb"); /*重新打开文件并删除原全部记录*/pb=head->next;while(pb!=NULL){fwrite(&pb->data,sizeof(struct money),1,ap); /*将链表数据域中的数据读入文件得到删除后的新文件*/pb=pb->next;}fclose(ap); /*删除成功,关闭文件*/printf(" \n 成功删除%d年%d月%d日的收支信息!\n",y,m,d);printf("************************************************************ ****\n");}else /*要删除的信息部存在*/{printf(" \n 无%d年%d月%d日的收支信息!\n",y,m,d);printf("************************************************************ ****\n");}}函数九:void Delall() /*删除全部收支信息函数*/{FILE *ap;ap=fopen("money.txt","wb");fclose(ap);printf(" \n 成功删除全部收支信息!\n");printf("************************************************************ *\n");}函数函数十:void main(){int i;printf("**********************^_^欢迎进入个人财务管理程序^_^*************************\n");printf(" 1 输入收支信息\n");printf(" 2 查询收支信息\n");printf(" 3 删除收支信息\n");printf(" 0 退出\n");printf(" 请选择要执行的功能:");scanf("%d",&i);while(i!=0){if(i==1){input(); /*调用输入收支信息函数*/printf(" 1 输入收支信息\n");printf(" 2 查询收支信息\n");printf(" 3 删除收支信息\n");printf(" 0 退出\n");printf(" 请选择要执行的功能:");scanf("%d",&i);}else if(i==2){Output(); /*调用查询收支信息函数*/ printf(" 1 输入收支信息\n");printf(" 2 查询收支信息\n");printf(" 3 删除收支信息\n");printf(" 0 退出\n");printf(" 请选择要执行的功能:");scanf("%d",&i);}else if(i==3) /*调用删除收支信息函数*/ {Delete();printf(" 1 输入收支信息\n");printf(" 2 查询收支信息\n");printf(" 3 删除收支信息\n");printf(" 0 退出\n");printf(" 请选择要执行的功能:");scanf("%d",&i);}else /*用户输入错误时提示*/{printf("\n 只能输入1或2或3或0!\n");printf(" 请重新选择要执行的功能:");scanf("%d",&i);}}printf("========================^_^ 谢谢您的使用!^_^============================\n");}六、程序运行效果图七、总结通过做个人财务管理程序这课程设计,我意识到逻辑分析能力理清问题的思路以及函数间的相互调用关系很重要。
个人财政支出管理付欣05计算机四班指导老师:梁新元一、问题描述及分析 (1)二、实验程序设计思想及功能描述 (2)3、主要函数模块的设计思想和具体实现 (3)三、实验程序测试 (7)1、程序开始执行时系统的所显示的页面: (7)2、选择退出系统: (7)3、选择登陆,并且输入的帐号和密码都正确: (7)4、用户输入的帐号不正确: (8)5、用户输入的帐号正确,密码不正确: (8)四、实验程序自我评价 (9)五、课程设计创新 (10)六、课程设计总结 (10)七、参考书目: (10)八、实验程序源代码 (10)一、问题描述及分析编写一个个人财政支出管理系统,主要解决的问题是作为一个系统而言,它所要面对不只是某一个人而言,而是要面对很多的用户。
那么想要解决这一问题,就必须要求这个系统能够存储许多用户的基本信息和记录。
同时也要求系统能够对不同的用户的身份进行查找和验证。
在验证通过之后,在对其进行用户所要求的操作。
作为一个财政支出系统,那么就要求对于用户关于金钱的每一项操作都要有相应的记录,同时并允许用户对于每一条整体的记录进行操作,例如可以根据时间来查找某一确定日期是否进行了收入或者支出的操作,也可以根据特定的需要来删除某一条整体的记录。
但不允许对每条记录的单项数据进行更改,因为不管是收入还是支出,所涉及的金额都是固定的,时间也是固定的,所以系统不允许用户对其进行操作。
除此之外,还必须有足够大的空间来存储新的记录。
所以此程序就是基于这个思想而编写出来的,基本满足了用户对于一个财政支出管理系统所要求的相关功能。
二、实验程序设计思想及功能描述根据前面对于编写一个个人财政支出管理系统的程序的问题描述和分析,确定了此程序的基本思想和相关功能。
1、基本思想首先定义一个结构体数组,这个数组的功能便是用来所有用户的所有信息。
它的成员为每个用户的帐号(account)、密码(code)、姓名(name)、记录(record rec[max]),以及记录的条数(rec_len)。
小我财务支出治理付欣 05盘算机四班指点先生:梁新元一.问题描写及剖析1二.试验程序设计思惟及功效描写13.重要函数模块的设计思惟和具体实现2三.试验程序测试41.程序开端履行时体系的所显示的页面:42.选择退出体系:53.选择登陆,并且输入的帐号和暗码都准确:54.用户输入的帐号不准确:55.用户输入的帐号准确,暗码不准确:6四.试验程序自我评价7五.课程设计创新7六.课程设计总结7七.参考书目:7八.试验程序源代码8一.问题描写及剖析编写一个小我财务支出治理体系,重要解决的问题是作为一个体系而言,它所要面临不只是某一小我而言,而是要面临很多的用户.那么想要解决这一问题,就必须请求这个体系可以或许存储很多用户的根本信息和记载.同时也请求体系可以或许对不合的用户的身份进行查找和验证.在验证经由过程之后,在对其进行用户所请求的操纵.作为一个财务支出体系,那么就请求对于用户关于金钱的每一项操纵都要有响应的记载,同时并许可用户对于每一条整体的记载进行操纵,例如可以依据时光来查找某一肯定日期是否进行了收入或者支出的操纵,也可以依据特定的须要来删除某一条整体的记载.但不许可对每笔记载的单项数据进行更改,因为不管是收入照样支出,所涉及的金额都是固定的,时光也是固定的,所以体系不许可用户对其进行操纵.除此之外,还必须有足够大的空间来存储新的记载.所以此程序就是基于这个思惟而编写出来的,根本知足了用户对于一个财务支出治理体系所请求的相干功效.二.试验程序设计思惟及功效描写依据前面临于编写一个小我财务支出治理体系的程序的问题描写和剖析,肯定了此程序的根本思惟和相干功效.1、根本思惟起首界说一个构造体数组,这个数组的功效等于用来所有效户的所有信息.它的成员为每个用户的帐号(account).暗码(code).姓名(name).记载(record rec[max]),以及记载的条数(rec_len).个中记载(record rec[max])这个成员本身也是一个构造体数组.它包含了用户所有的记载(record),并且依据用户的操纵,记载这个成员变量也会有所跟改,例如假如拥戴增长了一笔记载,那么这一笔记载就会存储在此成员变量中.除了这个成员变量是动态变更之外,记载的条数(rec_len)也会依据用户的操纵进行变更,例如假如用户增长了一笔记载,则rec_len就会自加1,假如用户删除了一笔记载,则rec_len就会自减1.记载(record rec[max])这个成员变量是今后函数中操纵的重要内容.除了这两个成员变量之外,其它的成员变量则不会被转变,体系只许可用户对其进行拜访,但不许可进行操纵,因为这几个成员变量的感化主如果用来验证用户的身份用的,所以不成以更改.个中的暗码(code)甚至只能别体系挪用,而不克不及对用户进行显示的,也就是说暗码(code)对于用户是不成预知的,如许做的目标是为了体系自身的安然性,以免用户的信息被其他人看到.这就是这个构造体数组的功效和根本成员变量及各个成员变量的功效.界说了构造体数组之后,起首要做的就是要把所有的记载都存入这个构造体数组中,以便利用户的操纵.所以在main函数中有体系自行挪用了old_record这个函数来存入信息.在此之落后行的操纵等于让用户选择所要进行的是登陆体系的操纵照样退出体系的操纵.假如选择登陆,则要输入帐号和暗码.之后由体系来检讨帐号的消失性和暗码的准确性.假如这两项都经由过程了体系的检讨,那么用户即可以进行具体记载的操纵了.这等于这个程序的根本设计思惟.2.各个函数模块的功效(1)old_record( ):此函数由体系自行挪用,感化是将所有效户信息存入体系.(2)void save( ): 此函数的感化是将构造体数组中的信息写入文件存储,由体系挪用.(3)load( ):此函数的感化是将构造体数组中写入文件的信息读出,由体系挪用.(4)lookup_accounts():此函数的感化是将用户输入的帐号与体系中的所有帐号进行比较,检讨体系中是否有此帐号.(5) check_code( ):此函数是感化是在体系查询到了帐号之后,对用户输入的帐号和暗码进行磨练,看是否相对应.(6)print_message():此函数的功效是在体系检讨了用户输入的帐号和暗码之后,假如用户经由过程了体系的检讨,在此显示用户可见的根本信息.(7)find_record():此函数的感化是依据用户输入的日期进行查找操纵.(8)insert_record():此函数的功效是在记载中增长一条新的记载,这个记载由用户输入.(9)del_record():此函数的功效是依据用户的输入的地位,将响应地位的记载删除.(10)sum_num():此函数的功效是盘算所有收入和支出的总和,盘算全体的收入的总合,盘算全体输出的总合.(11)打印输出记载的函数:在本程序中一共有三个打印输出记载的函数,分离为all_print().acc_print ().pay_print()这三个函数.它们的功效依次是打印输出全体记载,打印输出输入记载,打印输出支出记载.(12)mian( ):在主函数中,可以依据用户的选择来操纵体系许可用户运用的功效,也可以随时退出这个体系.3.重要函数模块的设计思惟和具体实现(1)void save( )函数和load( )函数.这两个函数的功效是在体系挪用了old_record( )这个函数之后,构造体内就有了所有效户的所有信息.Save( )函数的感化是将所有的信息都存入文件中,便于数据的保管和读取.Load ( )函数的感化则是把存入的文件中的信息读出来.这两个函数所涉及的常识点为文件的读入和写出.主如果freadhe和fwrite两个函数的运用.它们的一般挪用情势为:fread(buffer,size,count,fp);fwrite(buffer,size ,count,fp);个中:Buffer:是一个指针,对fread来说,它是读入数据的存放地址.对fwrite来说,是要输出数据的地址.Size:要读写的字节数.Count:要进行读写若干个size字节的数据项.Fp;文件型指针.挪用这两个函数之后,假如挪用成功,则函数返回值为count 的值,即输入或输出数据项的完全个数.(2)lookup_accounts()函数和 check_code( )函数:这两个函数的功效主如果用来查对用户的身份.体系先磨练的是axxounts这个函数.依据用户输入的帐号与体系中所有的帐号进行比较,查找看是否有雷同的.假如找到了,则进行对暗码进行磨练,看暗码与帐号是否对应.在磨练帐号的时刻,假如用户输入的帐号在体系中不消失,体系则会给出提醒请求用户从新输入.但假如用户输入了三次体统都找不到帐号的时刻,体系则会强迫请求用户退出体系,此时则显示停止语的迎接词.而假如帐号找到了,但用户输入的暗码与原有暗码不一致,体系也会给出提醒信息请求用户再次输入.同样的,假如用户输入三次体统都磨练到不是准确的暗码的时刻,体系则会强迫请求用户退出体系,此时则显示停止语的迎接词.在这两个函数中重要用到的常识点就是对字符串的相干操纵.假如帐号和暗码都经由过程磨练之后,此函数则将返回struct list_record类型的数据.字符串处理的函数重要有以下几个:puts函数:其一般情势为puts(字符数组).其感化是将一个字符串输出到终端.Gets函数:其一般情势为gets (字符数组).其感化是从终端输入一个字符串到字符数组,并且得到一个函数值.该函数值是字符数组的肇端地址.Stract函数:其一般情势为strcat(字符数组1,字符数组2).Strcat是字符串衔接的缩写.其感化是衔接两个字符数组中的字符串,把字符串2接到字符串1的后面,成果放在字符数组1 中,函数挪用后得到一个函数值——字符数组1的地址.Strcpy函数:其一般情势为strcpy(字符数组1,字符数组2).Strcpy是字符串复制的简写.它的感化是将字符串2复制到字符数组1中去.在本程序中.用到的最多的等于此函数.strcmp 函数:其一般情势为strcmp(字符串1,字符串2).Strcmp是字符串比较的缩写.它的感化是比较字符串1和字符串2,比较的成果有函数值带回.假如字符串1=字符串2,则函数值为0;假如字符串1大于字符串2,则函数值为一个正整数,不然则为负整数.(3)find_record()函数:此函数的功效是依据用户输入的时光查找当天的记载.这个函数的参数为一个指向构造体的指针和一个字符串.字符串是用语输入的日期,指向构造体的指针指向的则是用户输入的帐号的这个构造体.假如找到了用户输入的日期,则输出当天的所以记载.假如找不到,则显示无此日的记载.(4)insert_record()函数和del_record()函数:这两个函数的功效是增长新的记载和删除用户指定的记载.在insert_record( )函数中,此函数的参数是一个指向struct list_record的指针和一个指向struct record的指针还有一个选择拔出地位的整形变量.在主函数中,先界说一个struct record的构造体.这个构造体的内容是由用户输入的,也就是用户所要向struct list_record这个构造体中输入的新的记载的内容.然后再在主函数中界说一个指向struct record构造体的指针,并指向已经输入记载的构造体,最后将此指针作为实参传入函数.因为向函数中传如是指针,所以在函数中记载更改之后,返回主函数的是更改后的记载.在del_record()函数中,有效户在主函数中输入要删除的记载的地位,然后挪用此函数,那么就会履行删除该记载的操纵.与insert_record函数一样,参数传递的也是指针,所以在函数中更改的记载,返回主函数后依旧是更改后的记载.(5)sum_num()函数:此函数的功效是用来盘算用户所有记载中的钱数的总和,以便利用户对于体系的操纵,同时也可以运用户对本身的帐户有更深刻的懂得.除此之外,该函数还能会对用户所有的收入和所有的支出进行乞降,运用户可以或许知道本身的所有的收入的总和和所有支出的总和,如许也便利了用户进行下一步的操纵.(6)打印输出函数:在此程序中,打印输出函数共有三个,分离是输出全体记载,输出收入记载和输出支出记载.在这里界说三个输出函数是为了便利用户可以或许更轻易的进行操纵.假设只有一个输出全体记载的函数,那么假如用户只想检讨收入的记载或者支出的记载,此时用户只能本身一条一条的去检讨,如许就会让用户觉得不便利.一个优越的治理体系的目标就是能尽可能的知足用户的所有须要,分工越是准确越好,所认为了知足此项请求,在此界说了三个输出函数.(7)main( )函数:在一个程序中,main( )函数是最为重要的一个函数,因为它是所有程序履行的进口.同时函数也是以main( )函数的停止作为停止的,由此可见main()函数的重要性.在本程序中,所以的功效模块函数都是在main()函数中挪用的,如许做的目标是为了是全部程序的构造简略紧凑,同时也是为了程序的调试便利.但如许也就相对的增长了main()函数的庞杂性.在本程序中,main ()函数中涉及的语法常识包含轮回的嵌套运用,分之构造的嵌套运用,指针的运用,指向构造体指针的运用等很多语法构造.因为main()函数在本程序中有着至关重要的感化,所以在此具体解释.在程序开端履行之后,起首由用户来选择是要登陆体系照样要推出体系.假如是退出体系,那么程序便会停止.假如选择登陆,那么体系便会请求用户输入帐号和暗码.体系先会对帐号进行检讨,假如检讨经由过程了,则要对暗码进行检讨,假如经由过程了,则会显示用户信息,同时也许可用户对记载进行操纵,而所有的操纵都是由用户自行随便选择的,直到用户选择退出体系之后,程序便会停止.这是在用户输入的帐号和暗码都经由过程检讨的情形.假如帐号没有经由过程检讨,体系便会请求用户从新输入,然后体系再对其进行检讨,经由过程了就持续,通不过则还要从新输入,但用户输入帐号的次数最多只有三次.三次之后,体系变会自行推出.假如帐号经由过程了检讨,而暗码没有经由过程,那么体系也会请求用户从新输入,同样输入的次数不会超出三次,不然体系便会自行退出.这等于main()函数的具体设计思惟和具体的功效的描写.三.试验程序测试1.程序开端履行时体系的所显示的页面:2.选择退出体系:3.选择登陆,并且输入的帐号和暗码都准确:4.用户输入的帐号不准确:5.用户输入的帐号准确,暗码不准确:6.用户进行具体操纵:四.试验程序自我评价在这个程序中,我认为我已经完成了所请求的根本操纵,同时也增长了响应的功效模块来让用户操纵.设计的基起源基本则就是尽可能的知足用户的所有请求,同时也能尽可能便利的运用户对体系进行操纵.固然这个程序可能还出缺少之处,但我对于这个程序照样比较知足的.五.课程设计创新本程序重要模拟是是银行的ATM机的相干功效,除此之外,还增长了许可用户对于记载的一些操纵.而不是只许可用户进行检讨,如许就增长了体系的灵巧性.六.课程设计总结本程序在编写是,重要就是基于用户的角度去剖析该若何设计此程序,和编写功效模块的.在编写程序时,所有的数据都是对构造体进行的操纵,在此进程中,我发明了本身在对指针操纵的时刻,尤其是对指向构造体数组的指针和指向构造体的指针的操纵都不敷闇练.但在编写完此程序之后,我感到本身对语法的运用有了显著的进步.七.参考书目:1.C程序设计(第三版)谭浩强清华大学出版社2.数据构造(C说话版)谭浩强清华大学出版社3.程序设计基本(C说话版)龙昭华王玉柱重庆大学出版社八.试验程序源代码#include<stdio.h>#include<string.h>#define null 0#define max 20#define ok 1struct record{char date[20];char operate[20];int num;};struct list_record{char account[20];char code[20];char name[20];int rec_len;struct record rec[max];}r[max];//体系原稀有据,用户不成知int old_record( struct list_record r[]){int i;for(i=0;i<3;i++)r[i].rec_len=4;strcpy(r[0].account,"1001");//账号strcpy(r[1].account,"1002");strcpy(r[2].account,"1003");strcpy(r[0].code,"111111");//暗码strcpy(r[1].code,"222222");strcpy(r[2].code,"333333");strcpy(r[0].name ,"wang");//姓名strcpy(r[1].name ,"li");strcpy(r[2].name ,"zhang");strcpy(r[0].rec[0].date,"07-01-01");//日期strcpy(r[0].rec[2].date,"07-03-01"); strcpy(r[0].rec[3].date,"07-04-01"); strcpy(r[1].rec[0].date,"07-01-02"); strcpy(r[1].rec[1].date,"07-02-02"); strcpy(r[1].rec[2].date,"07-03-02"); strcpy(r[1].rec[3].date,"07-04-02"); strcpy(r[2].rec[0].date,"07-01-03"); strcpy(r[2].rec[1].date,"07-02-03"); strcpy(r[2].rec[2].date,"07-03-03"); strcpy(r[2].rec[3].date,"07-04-03"); strcpy(r[0].rec[0].operate,"in");strcpy(r[0].rec[1].operate,"out");strcpy(r[0].rec[2].operate,"in");strcpy(r[0].rec[3].operate,"out");strcpy(r[1].rec[0].operate,"out");strcpy(r[1].rec[1].operate,"in");strcpy(r[1].rec[2].operate,"out");strcpy(r[1].rec[3].operate,"in");strcpy(r[2].rec[0].operate,"in");strcpy(r[2].rec[1].operate,"out");strcpy(r[2].rec[2].operate,"in");r[0].rec[0].num=3000;r[0].rec[1].num=-1500;r[0].rec[2].num=2500;r[0].rec[3].num=-1000;r[1].rec[0].num=-3000;r[1].rec[1].num=5000;r[1].rec[2].num=-1000;r[1].rec[2].num=2000;r[2].rec[0].num=1000;r[2].rec[1].num=-1500;r[2].rec[2].num=3000;r[2].rec[2].num=-500;return ok;}//将数据写入文件void save( ){FILE *fp;int i;if((fp=fopen("wenjian","wb"))==null)//只许可写数据 {printf("can not open the file.\n");return;}for(i=0;i<max;i++)if(fwrite(&r[i],sizeof(struct list_record),1,fp)!=1) printf("file write error.\n");fclose(fp);}//文件读出void load( ){FILE *fp;int i;if((fp=fopen("wenjian","rb"))==null){printf("can not open infile.\n");return;}for(i=0;i<max;i++)if(fread(&r[i],sizeof(struct list_record),1,fp)!=1) {if(feof(fp))//文件停止为1;不然为0(fclose(fp));Return;//为什么在这加return}fclose(fp);}//将用户输入的帐号与体系华夏有帐号比较,查找用户帐号int lookup_accounts( struct list_record r[],char acc[]){int i;for(i=0;i<3;i++)if(strcmp(r[i].account,acc)==0){return ok;}printf("帐号不消失,请从新输入!\n");return null;}//检讨暗码函数struct list_record check_code(struct list_record r[],char acc[],char c[]){int i;struct list_record a;strcpy(a.account,"0");strcpy(a.code,"0");a.rec_len=0;for(i=0;i<a.rec_len;i++){strcpy(a.rec[i].date,"0");strcpy(a.rec[i].operate,"0");a.rec[i].num=0;}for(i=0;i<3;i++)if(strcmp(r[i].account,acc)==0)if(strcmp(r[i].code,c)==0)return r[i];printf("the code is wrong,please input again!\n"); return a;}//显示用户根本信息void print_message( struct list_record *p){printf("姓名:%s\n",p->name);printf("帐号:%s\n",(*p).account);}//依据用户输入的日期,查找记载int find_record( struct list_record *p,char d[]){int i;for(i=0;i<(*p).rec_len;i++){if(strcmp((*p).rec[i].date,d)==0){printf("date operate money\n");printf("%s ",(*p).rec[i].date);printf("%s ",(*p).rec[i].operate);printf("%d \n",(*p).rec[i].num);return ok;}}if(i==(*p).rec_len)printf("the date is not exit!\n");return null;}//拔出函数,依据用户输入的信息,增长记载int insert_record( struct list_record *p,struct record *p1,int lop){int i;if((lop<1)||(lop>((*p).rec_len+1))){printf("the position is wrong.\n");return 0;}else{for(i=(*p).rec_len;i>lop-1;i--){strcpy((*p).rec[i].date,(*p).rec[i-1].date);strcpy((*p).rec[i].operate,(*p).rec[i-1].operate);(*p).rec[i].num=(*p).rec[i-1].num;}strcpy(p->rec[i].date,p1->date);strcpy((*p).rec[i].operate,(*p1).operate);(*p).rec[i].num=(*p1).num;(*p).rec_len++;return ok;}}// 删除记载函数int del_record( struct list_record *p,int lop2) {int i;if((lop2<1)||(lop2>(*p).rec_len)){printf("the position is wrong.\n");return null;}else{for(i=lop2-1;i<(*p).rec_len-1;i++){strcpy((*p).rec[i].date,(*p).rec[i+1].date);strcpy((*p).rec[i].operate,(*p).rec[i+1].operate);(*p).rec[i].num=(*p).rec[i+1].num;}(*p).rec_len--;return ok;}}//输出全体记载函数void all_print( struct list_record *p){ int i;printf("date operate num\n");for(i=0;i<(*p).rec_len;i++){ printf("%s ",(*p).rec[i].date);printf("%s ",(*p).rec[i].operate); printf("%d ",(*p).rec[i].num);printf("\n");}}//盘算总的钱数int sum_num( struct list_record *p){int i;int sum=0;int sum_in=0;int sum_out=0;for(i=0;i<(*p).rec_len;i++){sum+=(*p).rec[i].num;if((*p).rec[i].num>0)sum_in+=(*p).rec[i].num;if((*p).rec[i].num<0)sum_out+=(*p).rec[i].num;}printf("总金额为: %d\n",sum);printf("总收入为: %d\n",sum_in);printf("总支出为: %d\n",sum_out);return ok;}//输出收入记载int acc_print( struct list_record *p){int i;int sum_acc=0;printf("date operate num\n");for(i=0;i<(*p).rec_len;i++)if((*p).rec[i].num>0){sum_acc+=(*p).rec[i].num;printf("%s ",(*p).rec[i].date);printf("%s ",(*p).rec[i].operate); printf("%d ",(*p).rec[i].num);printf("\n");}printf("总收入金额为: %d\n",sum_acc);return ok;if(sum_acc==0)printf("there is no account.\n");return null;}//输出支出记载int pay_print( struct list_record *p) {int i;int sum_pay=0;printf("date operate num\n"); for(i=0;i<p->rec_len;i++)if((*p).rec[i].num<0){sum_pay+=(*p).rec[i].num;printf("%s ",(*p).rec[i].date); printf("%s ",(*p).rec[i].operate); printf("%d ",(*p).rec[i].num);printf("\n");}printf("总的支出为: %d\n",sum_pay); return ok;if(sum_pay==0)printf("there is no payout.\n");return null;}void main( ){int j=0,n=0;//n记载暗码输入次数int x,k,lop1,lop2;//k为敕令数字选项char data1[20];char accou[20],cod[20];//accou账号cod暗码struct record *p0;//内容是由用户输入的struct record a;struct list_record b;struct list_record *p;b.rec_len=0;p0=&a;old_record(r);save( );load( );//显示printf(" 迎接运用小我财务支出治理体系!\n");printf("------------------------------------------------------------\n");printf("| |\n");printf("| 1.登陆体系|\n");printf("| 随便率性键.退出体系|\n");printf("| |\n");printf("------------------------------------------------------------\n");scanf("%d",&x);if(x!=1)printf(" 感激您运用本体系,再会!\n");else{do{printf("请输入帐号:"); //while(j<3);scanf("%s",accou);if(lookup_accounts(r,accou))//将用户输入的帐号accou与体系中的所有帐号r进行比较,检讨体系中是否有此帐号.{ printf("请输入暗码:"); //while(j<3);scanf("%s",cod);b=check_code(r,accou,cod);//在体系查询到了帐号之后,对用户输入的帐号和暗码进行磨练,看是否相对应.if(b.rec_len==0)//rec_len记载的条数{do{b=check_code(r,accou,cod); //scanf("%s",cod);n++;}while(n<3);if(n=3)printf("您的暗码不准确,请退出体系,感谢运用,再会!\n");break;}else{printf("---------------请选择您要进行的操纵-------------------\n");printf("| |\n"); //while(j<3);printf("| 2.查找记载|\n");printf("| 3.增长记载|\n");printf("| 4.删除记载|\n");printf("| 5.输出所有记载|\n");printf("| 6.输出所有收入记载|\n");printf("| 7.输出所有支出记载|\n");printf("| |\n");printf("-----------------------------------------------------|\n");p=&b;print_message(p);//在体系检讨了用户输入的帐号和暗码之后,假如用户经由过程了体系的检讨,在此显示用户可见的根本信息.do{scanf("%d",&k); //while(k>0)if(k==10)printf("感激您运用本体系,再会!\n");if(k==2){printf("请输入您要查询的日期:");scanf("%s",data1);find_record(p,data1);}if(k==3){printf("请输入你要拔出的地位:\n");scanf("%d",&lop1);printf("请输入您要添加的记载:\n");printf("日期:");scanf("%s",p0->date);printf("操纵:");scanf("%s",p0->operate);printf("金额:");scanf("%d",&(p0->num));insert_record(p,p0,lop1);//增长新的记载 }if(k==4)printf("请输入您要删除的记载的地位:\n");scanf("%d",&lop2);del_record(p,lop2);}if(k==5){all_print(p);sum_num(p);}if(k==6)acc_print(p);//输出所有收入记载if(k==7)pay_print(p);//输出所有支出记载}while(k>0);break;}}j++;}while(j<3);printf("感激您运用本体系,再会!\n");}。
个人帐簿管理系统设计五、程序运行结果1、原文件内容#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <windows.h>//文件保存路径#define FilePath1 "Myinfor.dat"#define FilePath2 "Myinfor.txt"//查询用声明#define Status int#define OK 1#define Error 0#define NotFound 2typedef struct {int month;//月份int spxf;//食品消费int fzfy;//房租费用int znjy;//子女教育费用int sdfy;//水电费用int ylfy;//医疗费用int cxfy;//储蓄费用int srfy;//收入费用} 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(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******个人帐簿管理系统设计*****\n\n");printf("1.录入数据\n");printf("2.查看数据\n");printf("3.修改数据\n");printf("4.查询数据\n");printf("5.排序数据\n");printf("6.删除数据\n");printf("0.退出系统\n\n");printf("请输入要进行的操作: " );scanf("%d",&item);}while(item>6 || item<-1);switch(item){ //退出程序case 0: getchar();getchar();exit(1);break;//录入数据case 1: input(a);writeinfor(a);break;//查看数据case 2: changeFormat();break;//修改数据case 3: item=search(a);mon=a->month;if (item!=OK) printf("\n没有符合条件的记录!\n");else{printf("\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入\n");printf("----------------------------------------------------------------------- \n");printf("%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fzfy,a->znjy,a->sdfy,a->ylfy, a->cxfy,a->srfy);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 %8d\n",a->month,a->spxf,a->fzfy,a->znjy,a->sdfy,a->ylfy, a->cxfy,a->srfy);}break;//排序数据case 5: item=search(a);if (item!=OK) printf("\n没有符合条件的记录!\n");elsepaixu(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 %8d %8d %8d %8d\n",a->month,a->spxf,a->fzfy,a->znjy,a->sdfy,a->ylfy, a->cxfy,a->srfy);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->spxf,&newI->fzfy,&newI->znjy,&newI->s dfy,&newI->ylfy,&newI->cxfy,&newI->srfy);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);//这里可以做特别处理可防止存在同一月份有2条以上的记录问题。
程序设计工程训练报告C语言程序设计个人财务管理系统课程名称C语言程序设计工程训练姓名院(系)信息科学与技术学院专业班级学号指导教师教务处制目录1.需求分析 (1)2系统总框图和功能模块说明 (1)2.1系统总框图 (1)2.2功能模块说明 (1)3系统设计 (2)3.1主要结构体 (2)3.2主要功能函数 (2)4系统调试 (3)4.1、程序开始执行时系统的所显示的页面: (3)4.2、选择退出系统: (3)4.3、选择登陆,并且输入的和密码都正确: (3)4.4、用户输入的不正确: (4)4.5、用户输入的正确,密码不正确: (4)4.6、用户进行具体操作: (5)5总结 (6)6源程序清单 (6)1.需求分析编写一个个人财政支出管理系统,主要解决的问题是作为一个系统而言,它所要面对不只是某一个人而言,而是要面对很多的用户。
那么想要解决这一问题,就必须要求这个系统能够存储许多用户的基本信息和记录。
同时也要求系统能够对不同的用户的身份进行查找和验证。
在验证通过之后,在对其进行用户所要求的操作。
作为一个财政支出系统,那么就要求对于用户关于金钱的每一项操作都要有相应的记录,同时并允许用户对于每一条整体的记录进行操作,例如可以根据时间来查找某一确定日期是否进行了收入或者支出的操作,也可以根据特定的需要来删除某一条整体的记录。
但不允许对每条记录的单项数据进行更改,因为不管是收入还是支出,所涉及的金额都是固定的,时间也是固定的,所以系统不允许用户对其进行操作。
除此之外,还必须有足够大的空间来存储新的记录。
所以此程序就是基于这个思想而编写出来的,基本满足了用户对于一个财政支出管理系统所要求的相关功能。
2系统总框图和功能模块说明2.1系统总框图2.2功能模块说明(1)old_record( ):此函数由系统自行调用,作用是将所有用户信息存入系统。
(2)void save( ): 此函数的作用是将结构体数组中的信息写入文件存储,由系统调用。
个人帐簿管理系统目录摘要 (1)1绪论 (1)2系统分析 (1)2.1功能需求 (1)2.2数据需求 (1)2.3性能需求 (2)3总体设计 (2)3.1系统设计方案 (2)3.2功能模块设计 (2)4详细设计 (3)4.1录入数据模块 (3)4.2修改数据子模块 (4)4.3查询数据子模块 (5)4.4排序数据子模块 (6) (6)4.6删除数据子模块 (7)5调试与测试 (8)5.1调试 (8)5.2测试 (8)6结论 (9)结束语 (9)参考文献 (9)附录1-用户手册 (10)附录2-源程序 (13)摘要个人帐簿管理系统的开发是为了方便个人记录每月的全部收入及开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。
并进行查询和排序等。
主要实现以下功能:(1) 记录月份以及每月的食品消费,房租,子女教育费用,水电费,医疗费,储蓄等内容。
(2) 要求该系统能查看该数据并进行修改和查询等。
(3)并用冒泡法进行排序以及能进行内容的删除。
报告从系统分析,总体设计,详细设计,调试与测试方面进行描述和介绍。
关键词:个人帐簿管理系统;扩充;修改;删除。
1绪论当今社会是个劳逸结合的社会,计算机在人们的生活中越来越重要,个人账簿管理的开发给大众的生活平添了方便。
个人账簿管理系统是一个比较普遍的管理系统,它的存在方便个人记录每月的全部收入及开支情况。
根据课程设计任务书要求,个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。
进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情况。
另外要求建立一个文件,包括某人5个月的收支情况,能对文件中的信息进行扩充(追加),修改和删除;完成对每月的开支排序,以及完成系统查询功能。
可进行功能的适当扩充。
2系统分析2.1 功能需求个人帐簿管理系统要求记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等并能进行修改,查询,排序,删除等功能。
#include"stdio.h"#include "string.h"#define M 100struct stu{char user[10]; //用户名char cipher[10]; //密码struct Income;struct Expense;};struct Income{float gongzi;float jiangjin;float jintie;float zhongjiang;float total1;};struct Expense{float shuidian;float tongxun;float huoshi;float jiaoji;float lvyou;float fangzu;float total2;};char user[][10]={"liwenjian", "wangsiyao"," wuchao"},cipher[][6]={"123","456" ,"789"};int index=0;int enter(struct stu s[],struct Income I[],struct Expense E[]);void print(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); void search(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); int insert(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); int del(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); void save(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); int load(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); void modify(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); void sort(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); int menu();int main(){struct stu person[M];int length;for(;;)switch(menu()) //调用主菜单函数,返回值为整数,作开关语句的条件 {case 1: length=enter(person);break; //输入记录case 2: print(person,length); break; //显示全部记录case 3: search(person,length); break; //查找记录case 4: length=insert(person,length); break; //插入记录 case 5: length=del(person,length); break; //删除记录case 6: save(person,length); break; //保存文件case 7: length=load(person); break; //读文件case 8: sort(person,length); break; //排序case 9: modify(person,length); break; //修改记录信息case 10: return 0; //如果菜单返回值为10,则程序结束 }}int menu(){int choice;printf(" MENU\n");printf(" *********************************\n");printf(" 1. 输入有户名及密码\n"); //输入记录printf(" 2. 显示所有记录\n" ); // 显示所有记录 printf(" 3. 按用户名查找记录\n"); //按用户名查找记录printf(" 4. 插入记录\n"); //插入记录到数组中printf(" 5. 删除记录");printf(" 6. 保存文件\n"); //将数组中的记录保存到文件中 printf(" 7. 从文件中读文件\n"); //从文件中读入记录printf(" 8. 排序\n"); //排序printf(" 9. 修改记录信息\n"); //修改记录信息printf(" 10.退出\n"); //退出printf(" *********************************\n");do{printf("\n 输入选项(1-10):");scanf("%d",&choice); //以整型数的形式保存选择号}while(choice<1 || choice>10); //选择项不在1~10之间,重新选择return choice; //返回选择项,主程序根据该返回值调用相应的函数}int enter(struct stu s[]){ int i=0,n=0,j;//char user[][10]={"liwenjian", "wangsiyao"," wuchao"},cipher[][6]={"123","456" ,"789"};do{printf("请输入用户名及密码:\n");scanf("%s%s",s[index].user,s[index].cipher);for(j=0;j<3;j++)if(strcmp(s[index].user,user[j])==0 && strcmp(s[index].cipher,cipher[j])==0) break;if(j==3){printf("用户名及密码错误!\n");n++;}}while(n<3);if(n==3)return 0;//input other termprintf("收入信息");printf("工资");scanf("%f",struct Income I[i].gongzi);printf("奖金");scanf("%f",struct Income I[i].jiangjin);printf("津贴");scanf("%f",struct Income I[i].jintie);printf("中奖");scanf("%f",struct Income I[i].zhongjiang);printf("支出信息");printf("水电");scanf("%f",struct Expense E[i].shuidian);printf("通讯");scanf("%f",struct Expense E[i].tongxun);printf("伙食");scanf("%f",struct Expense E[i].huoshi);printf("交际");scanf("%f",struct Expense E[i].jiaoji);printf("旅游");scanf("%f",struct Expense E[i].lvyou);printf("房租");scanf("%f",struct Expense E[i].fangzu);struct I;[i]total1==struct Income I[i].gongzi+struct Income I[i].jiangjin+struct Income I[i].jintie+struct Income I[i].zhongjiang;struct E;[i]total2==struct Expense E[index].shuidian+struct Expense E[index].tongxun+struct Expense E[index].huoshi+struct Expense E[index].jiaoji+struct Expense E[index].lvyou+struct Expense E[index].fangzu;index++;return index;}//显示信息void print(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c);{int i;printf(" 用户信息");printf("\n******************************************************************************\n ");printf(" | 用户 |工资|奖金|津贴|中奖|收入总和|水电|通讯|伙食|交际|旅游|房租|支出总和|\n");printf("|-------|----|----|----|----|--------|----|----|----|----|----|----|--------|\n" );printf("|%-8s|%-8f|%-8f|%-4f|%-4f|%-8f|%-8f|%-8f|%-4f|%-4f|%-8f|%-4f|%-8f|",s[i].user,I[ i].jiangjin,I[i].jintie,I[i].zhongjiang,I[i].total1I[i].jiangjin,I[i].jintie,I[i].zhongjiang,I[i].total1E[i].shuidian,E[i].tongxun,E[i].huoshi,E[i].jiaoji,E[i].lvyou,E[i].fangzu,E[i].total2printf("******************************************************************************\n ");getchar();}/*按用户查找记录信息*/void search(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); {char user[]; //存放姓名的字符数组int i;printf("请输入用户名:");scanf("%s",urer); //输入待查找的姓名for(i=0;i<n;i++) //查找从第一条记录开始,直到最后一条记录为止 if(strcmp(user,s[i].user)==0) //待查找的姓名与数组中的记录姓名比较,相等则显示找到的记录信息{printf( "\n 找到的记录信息");printf( "\n ******************************************************************************\n ");printf(" | 用户 |工资|奖金|津贴|中奖|收入总和|水电|通讯|伙食|交际|旅游|房租|支出总和|\n");printf("|-------|----|----|----|----|--------|----|----|----|----|----|----|--------|\n" );printf("|%-8s|%-8f|%-8f|%-4f|%-4f|%-8f|%-8f|%-8f|%-4f|%-4f|%-8f|%-4f|%-8f|",s[i].user,I[ i].jiangjin,I[i].jintie,I[i].zhongjiang,I[i].total1I[i].jiangjin,I[i].jintie,I[i].zhongjiang,I[i].total1E[i].shuidian,E[i].tongxun,E[i].huoshi,E[i].jiaoji,E[i].lvyou,E[i].fangzu,E[i].total2printf (" *******************************end********************************************\n ");}elseprintf("没找到!"); //显示没有该用户}/*按用户删除记录信息*/int del(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); {char user[10]; //存放要删除记录的学号int i,j;printf("请输入要删除的用户:");scanf ("%s",user); //输入要删除记录的学号for(i=0;i<3;i++){if(strcmp(user,s[i].user)==0){for(j=i+1;j<n;j++) //从i+1位置记录开始到最后一个记录为止依次前移,删除i位置记录{strcpy(s[j-1].user,s[j].user);strcpy(I[j-1].gongzi,I[j].gongzi);strcpy(I[j-1].jiangjin,I[j].jiangjin);strcpy(I[j-1].jintie,I[j].jintie);strcpy(I[j-1].zhongjiang,I[j].zhongjiang) :strcpy(I[j-1].total1,I[j].tatol1);strcpy(E[j-1].shuidian,E[j].shuidian);strcpy(E[j-1].tongxun,E[j].tongxun);strcpy(E[j-1].huoshi,E[j].huoshi);strcpy(E[j-1].jiaoji,E[j].jiaoji);strcpy(E[j-1].lvyou,E[j].lvyou);strcpy(E[j-1].fangzu,E[j].fangzu)strcpy(E[j-1].total2,E[j]total2);}break;}}n--; //记录数减1return (n);}/*将记录信息保存到磁盘文件中*/void save(struct stu s[],int a,struct Income I[],int b,struct Expense E[], int c); {FILE *fp; //定义指向文件的指针int i;char outfile[20]; //保存输出文件名printf("Enter outfile name. for example c:\\cfile\\inf.tex\n");//提示输入文件名格式信息scanf("%s",outfile);if((fp=fopen(outfile, "wb"))==NULL) //为输出打开一个二进制文件,如果没有则建立 {printf("can not open file\n"); //如果不能打开,则结束程序return;}else{for(i=0;i<n;i++)fwrite(&s[i],sizeof(struct stu),1,fp); //写入一条记录 fclose(fp); //关闭文件printf("------ 保存成功! !------\n"); //显示保存成功}}。
c语言个人财务管理系统作品测试文案(一)C语言个人财务管理系统作品测试:轻松管理您的财务未来!轻松掌控财务,创造更美好的明天在这个日益繁忙的世界里,管理个人财务变得越来越重要。
我们为您带来了一款强大的个人财务管理系统——C语言个人财务管理系统作品测试!这款软件充分利用了C语言的强大功能,为您提供了一种简单而有效的方法来管理和规划您的财务未来。
功能强大,满足个人财务需求 C语言个人财务管理系统作品测试包含了您需要的所有功能,包括:1.账户管理:轻松添加、修改和删除账户,助您实时了解各项财务状况。
2.收入与支出记录:详细记录每笔收支,让您清楚地了解自己的财务状况。
3.预算规划:根据您的收入和支出制定合理的预算,助您更好地管理财务。
4.资产负债表:直观展示您的资产和负债情况,助您确保财务健康。
5.财务报表分析:通过图表和数据分析,让您深入了解自己的财务状况,为未来做好规划。
安全可靠,您的财务信息得到保障我们深知您对个人财务信息的安全性和隐私性的重视,因此C语言个人财务管理系统作品测试采用了严格的安全措施,确保您的财务数据安全无忧。
同时,我们承诺不会泄露您的任何个人信息,让您安心使用。
简单易用,无需专业知识 C语言个人财务管理系统作品测试专为普通用户设计,无论您是否具备财务背景,都能轻松上手。
清晰的界面设计和简洁的操作流程,让您无需花费大量时间学习即可掌握。
免费试用,让您零风险体验我们为您提供免费试用服务,您可以在试用期内充分体验C语言个人财务管理系统作品测试的强大功能。
相信您会爱上这款软件,让它成为您财务管理的得力助手!现在就加入C语言个人财务管理系统作品测试的用户大军吧!让我们携手共创美好的财务未来!C语言个人财务管理系统作品测试:智能助手,成就理财新篇章!科技引领未来,让理财无所畏惧在数字化时代,我们需要一个更智能、更便捷的方式来管理个人财务。
C语言个人财务管理系统作品测试为您提供了这样一款理想的工具,助您轻松应对各种财务挑战,迈向更美好的生活。
步调安排工程锻炼报告之阳早格格创做C谈话步调安排部分财务管造系统课程称呼 C谈话步调安排工程锻炼姓名院(系)疑息科教取技能教院博业班级教号指挥西席教务处造目录2系统总框图战功能模块证明13系统安排24系统调试34.1、步调启初真止时系统的所隐现的页里:34.2、采用退出系统:34.3、采用登陆,而且输进的帐号战暗号皆精确:3 4.4、用户输进的帐号没有精确:44.5、用户输进的帐号精确,暗号没有精确:44.6、用户举止简直支配:55归纳66源步调浑单6编写一个部分财务开销管造系统,主要办理的问题是动做一个系统而止,它所要里对付没有不过某一部分而止,而是要里对付很多的用户.那么念要办理那一问题,便必须央供那个系统不妨保存许多用户的基础疑息战记录.共时也央供系统不妨对付分歧的用户的身份举止查找战考证.正在考证通过之后,正在对付其举止用户所央供的支配.动做一个财务开销系统,那么便央供对付于用户闭于款项的每一项支配皆要有相映的记录,共时并允许用户对付于每一条完齐的记录举止支配,比方不妨根据时间去查找某一决定日期是可举止了支进大概者开销的支配,也不妨根据特定的需要去简略某一条完齐的记录.但是没有允许对付每条记录的单项数据举止变动,果为没有管是支进仍旧开销,所波及的金额皆是牢固的,时间也是牢固的,所以系统没有允许用户对付其举止支配.除此除中,还必须有脚够大的空间去保存新的记录.所以此步调便是鉴于那个思维而编写出去的,基础谦脚了用户对付于一个财务开销管造系统所央供的相闭功能.2系统总框图战功能模块证明功能模块证明(1)old_record( ):此函数由系统自止调用,效率是将所有用户疑息存进系统.(2)void save( ): 此函数的效率是将结构体数组中的疑息写进文献保存,由系统调用.(3)load( ):此函数的效率是将结构体数组中写进文献的疑息读出,由系统调用.(4)lookup_accounts():此函数的效率是将用户输进的帐号取系统中的所有帐号举止对付比,查看系统中是可有此帐号.(5)check_code( ):此函数是效率是正在系统查询到了帐号之后,对付用户输进的帐号战暗号举止考验,瞅是可相对付应.(6)print_message():此函数的功能是正在系统查看了用户输进的帐号战暗号之后,如果用户通过了系统的查看,正在此隐现用户可睹的基础疑息.(7)find_record():此函数的效率是根据用户输进的日期举止查找支配.(8)insert_record():此函数的功能是正在记录中减少一条新的记录,那个记录由用户输进.(9)del_record():此函数的功能是根据用户的输进的位子,将相映位子的记录简略.(10)sum_num():此函数的功能是估计所有支进战开销的总战,估计局部的支进的总合,估计局部输出的总合.(11)挨印输出记录的函数:正在本步调中一公有三个挨印输出记录的函数,分别为all_print()、acc_print()、pay_print()那三个函数.它们的功能依次是挨印输出局部记录,挨印输出输进记录,挨印输出开销记录.(12)mian( ):正在主函数中,不妨根据用户的采用去支配系统允许用户使用的功能,也不妨随时退出那个系统.3系统安排主要结构体部分疑息账户疑息主要功能函数old_record( ) //将所有用户疑息存进系统print_message() //隐现用户可睹的基础疑息sum_num() //估计所有支进战开销的总战all_print()、acc_print()、pay_print() //挨印输出局部记录,挨印输出输进记录,挨印输出开销记录4系统调试4.1、步调启初真止时系统的所隐现的页里:4.2、采用退出系统:4.3、采用登陆,而且输进的帐号战暗号皆精确:4.4、用户输进的帐号没有精确:4.5、用户输进的帐号精确,暗号没有精确:4.6、用户举止简直支配:5归纳本步调正在编写是,主要便是鉴于用户的角度去分解该怎么样安排此步调,战编写功能模块的.正在编写步调时,所有的数据皆是对付结构体举止的支配,正在此历程中,尔创造了自己正在对付指针支配的时间,更加是对付指背结构体数组的指针战指背结构体的指针的支配皆没有敷流利.但是正在编写完此步调之后,尔感觉自己对付语法的应用有了明隐的普及.6源步调浑单#include<stdio.h>#include<string.h>#define null 0#define max 20#define ok 1struct record{char date[20];char operate[20];int num;};struct list_record{char account[20];char code[20];char name[20];int rec_len;struct record rec[max];}r[max];//系统本罕见据,用户没有成知int old_record( struct list_record r[]){int i;for(i=0;i<3;i++)r[i].rec_len=4;strcpy(r[0].account,"1001");strcpy(r[1].account,"1002");strcpy(r[2].account,"1003");strcpy(r[0].code,"111111");strcpy(r[1].code,"222222");strcpy(r[2].code,"333333");strcpy(r[0].name ,"wang");strcpy(r[1].name ,"li");strcpy(r[2].name ,"zhang");strcpy(r[0].rec[0].date,"07-01-01"); strcpy(r[0].rec[1].date,"07-02-01"); strcpy(r[0].rec[2].date,"07-03-01"); strcpy(r[0].rec[3].date,"07-04-01"); strcpy(r[1].rec[0].date,"07-01-02"); strcpy(r[1].rec[1].date,"07-02-02"); strcpy(r[1].rec[2].date,"07-03-02"); strcpy(r[1].rec[3].date,"07-04-02"); strcpy(r[2].rec[0].date,"07-01-03"); strcpy(r[2].rec[1].date,"07-02-03"); strcpy(r[2].rec[2].date,"07-03-03"); strcpy(r[2].rec[3].date,"07-04-03"); strcpy(r[0].rec[0].operate,"in");strcpy(r[0].rec[1].operate,"out");strcpy(r[0].rec[2].operate,"in");strcpy(r[0].rec[3].operate,"out");strcpy(r[1].rec[0].operate,"out");strcpy(r[1].rec[1].operate,"in");strcpy(r[1].rec[2].operate,"out");strcpy(r[1].rec[3].operate,"in");strcpy(r[2].rec[0].operate,"in");strcpy(r[2].rec[1].operate,"out");strcpy(r[2].rec[2].operate,"in");strcpy(r[2].rec[3].operate,"out");r[0].rec[0].num=3000;r[0].rec[1].num=-1500;r[0].rec[2].num=2500;r[0].rec[3].num=-1000;r[1].rec[0].num=-3000;r[1].rec[1].num=5000;r[1].rec[2].num=-1000;r[1].rec[2].num=2000;r[2].rec[0].num=1000;r[2].rec[1].num=-1500;r[2].rec[2].num=3000;r[2].rec[2].num=-500;return ok;}//将数据写进文献void save( ){FILE *fp;int i;if((fp=fopen("wenjian","wb"))==null){printf("can not open the file.\n");return;}for(i=0;i<max;i++)if(fwrite(&r[i],sizeof(struct list_record),1,fp)!=1) printf("file write error.\n");fclose(fp);}//文献读出void load( ){FILE *fp;int i;if((fp=fopen("wenjian","rb"))==null){printf("can not open infile.\n");return;}for(i=0;i<max;i++)if(fread(&r[i],sizeof(struct list_record),1,fp)!=1){if(feof(fp))(fclose(fp));return;}fclose(fp);}//将用户输进的帐号取系统中本有帐号比较,查找用户帐号int lookup_accounts( struct list_record r[],char acc[]){int i;for(i=0;i<3;i++)if(strcmp(r[i].account,acc)==0){return ok;}printf("帐号没有存留,请沉新输进!\n");return null;}//查看暗号函数struct list_record check_code(struct list_record r[],char acc[],char c[]){int i;struct list_record a;strcpy(a.account,"0");strcpy(a.code,"0");a.rec_len=0;for(i=0;i<a.rec_len;i++){strcpy(a.rec[i].date,"0");strcpy(a.rec[i].operate,"0");a.rec[i].num=0;}for(i=0;i<3;i++)if(strcmp(r[i].account,acc)==0)if(strcmp(r[i].code,c)==0)return r[i];printf("the code is wrong,please input again!\n"); return a;}//隐现用户基础疑息void print_message( struct list_record *p) {printf("姓名:%s\n",p->name);printf("帐号:%s\n",(*p).account);}//根据用户输进的日期,查找记录int find_record( struct list_record *p,char d[]) {int i;for(i=0;i<(*p).rec_len;i++){{printf("date operate money\n");printf("%s ",(*p).rec[i].date);printf("%s ",(*p).rec[i].operate);printf("%d \n",(*p).rec[i].num);return ok;}}if(i==(*p).rec_len)printf("the date is not exit!\n");return null;}//拔出函数,根据用户输进的疑息,减少记录int insert_record( struct list_record *p,struct record *p1,int lop) {int i;if((lop<1)||(lop>((*p).rec_len+1))){printf("the position is wrong.\n");return 0;}else{for(i=(*p).rec_len;i>lop-1;i--){strcpy((*p).rec[i].date,(*p).rec[i-1].date);strcpy((*p).rec[i].operate,(*p).rec[i-1].operate);(*p).rec[i].num=(*p).rec[i-1].num;}strcpy((*p).rec[i].operate,(*p1).operate);(*p).rec[i].num=(*p1).num;(*p).rec_len++;return ok;}}// 简略记录函数int del_record( struct list_record *p,int lop2){int i;if((lop2<1)||(lop2>(*p).rec_len)){printf("the position is wrong.\n");return null;}else{for(i=lop2-1;i<(*p).rec_len-1;i++){strcpy((*p).rec[i].date,(*p).rec[i+1].date);strcpy((*p).rec[i].operate,(*p).rec[i+1].operate); (*p).rec[i].num=(*p).rec[i+1].num;}(*p).rec_len--;return ok;}}//输出局部记录函数void all_print( struct list_record *p){ int i;printf("date operate num\n"); for(i=0;i<(*p).rec_len;i++){ printf("%s ",(*p).rec[i].date); printf("%s ",(*p).rec[i].operate); printf("%d ",(*p).rec[i].num); printf("\n");}}//估计总的钱数int sum_num( struct list_record *p) {int i;int sum=0;int sum_in=0;int sum_out=0;for(i=0;i<(*p).rec_len;i++){sum+=(*p).rec[i].num;if((*p).rec[i].num>0)sum_in+=(*p).rec[i].num;if((*p).rec[i].num<0)sum_out+=(*p).rec[i].num;}printf("总金额为: %d\n",sum);printf("总支进为: %d\n",sum_in); printf("总开销为: %d\n",sum_out); return ok;}//输出支进记录int acc_print( struct list_record *p){int i;int sum_acc=0;printf("date operate num\n");for(i=0;i<(*p).rec_len;i++)if((*p).rec[i].num>0){sum_acc+=(*p).rec[i].num;printf("%s ",(*p).rec[i].date);printf("%s ",(*p).rec[i].operate); printf("%d ",(*p).rec[i].num);printf("\n");}printf("总支进金额为: %d\n",sum_acc); return ok;if(sum_acc==0)printf("there is no account.\n");return null;}//输出开销记录int pay_print( struct list_record *p){int i;int sum_pay=0;printf("date operate num\n");for(i=0;i<p->rec_len;i++)if((*p).rec[i].num<0){sum_pay+=(*p).rec[i].num;printf("%s ",(*p).rec[i].date);printf("%s ",(*p).rec[i].operate);printf("%d ",(*p).rec[i].num);printf("\n");}printf("总的开销为: %d\n",sum_pay);return ok;if(sum_pay==0)printf("there is no payout.\n");return null;}void main( ){int j=0,n=0;int x,k,lop1,lop2;char data1[20];char accou[20],cod[20];struct record *p0;struct record a;struct list_record b;struct list_record *p;b.rec_len=0;p0=&a;old_record(r);save( );load( );printf(" 欢迎使用部分财务开销管造系统!\n");printf("------------------------------------------------------------\n");printf("| |\n");printf("| 1、登陆系统 |\n");printf("| 2、退出系统 |\n");printf("| |\n");printf("------------------------------------------------------------\n");scanf("%d",&x);if(x==0)printf(" 感动您使用本系统,再睹!\n");else{do{printf("请输进帐号:"); //while(j<3);scanf("%s",accou);if(lookup_accounts(r,accou)){ printf("请输进暗号:"); //while(j<3);scanf("%s",cod);b=check_code(r,accou,cod);if(b.rec_len==0){do{b=check_code(r,accou,cod); //while(n>3)scanf("%s",cod);n++;}while(n<3);if(n=3)printf("您的暗号没有精确,请退出系统,开开使用,再睹!\n"); break;}else{printf("---------------请采用您要举止的支配-------------------\n"); printf("| |\n"); //while(j<3);printf("| 2、查找记录 |\n");printf("| 3、减少记录 |\n");printf("| 4、简略记录 |\n");printf("| 5、输出所有记录 |\n");printf("| 6、输出所有支进记录 |\n");printf("| 7、输出所有开销记录 |\n");printf("| |\n");printf("-----------------------------------------------------|\n");p=&b;print_message(p);do{scanf("%d",&k); //while(k>0)if(k==10)printf("感动您使用本系统,再睹!\n");if(k==2){printf("请输进您要查询的日期:");scanf("%s",data1);find_record(p,data1);}if(k==3){printf("请输进您要拔出的位子:\n");scanf("%d",&lop1);printf("请输进您要增加的记录:\n");printf("日期:");scanf("%s",p0->date);printf("支配:");scanf("%s",p0->operate);printf("金额:");scanf("%d",&(p0->num));insert_record(p,p0,lop1);}if(k==4){printf("请输进您要简略的记录的位子:\n"); scanf("%d",&lop2);del_record(p,lop2);}if(k==5){all_print(p);sum_num(p);}if(k==6)acc_print(p);if(k==7)pay_print(p);}while(k>0);break;}}j++;}while(j<3);printf("感动您使用本系统,再睹!\n");}}(2)量化评分表请教死将底下结果评比表复造到报告的末尾一页(单独一页).。
程序设计工程训练报告C语言程序设计个人财务管理系统课程名称C语言程序设计工程训练姓名院(系)信息科学与技术学院专业班级学号指导教师教务处制页脚内容1目录1.需求分析 (1)2系统总框图和功能模块说明 (2)2.1系统总框图 (2) (2)2.2功能模块说明 (2)3系统设计 (3)3.1主要结构体 (3)3.2主要功能函数 (3)4系统调试 (4)页脚内容24.1、程序开始执行时系统的所显示的页面: (4)4.2、选择退出系统: (4)4.3、选择登陆,并且输入的帐号和密码都正确: (5)4.4、用户输入的帐号不正确: (5)4.6、用户进行具体操作: (6)5总结 (7)6源程序清单 (7)页脚内容31.需求分析编写一个个人财政支出管理系统,主要解决的问题是作为一个系统而言,它所要面对不只是某一个人而言,而是要面对很多的用户。
那么想要解决这一问题,就必须要求这个系统能够存储许多用户的基本信息和记录。
同时也要求系统能够对不同的用户的身份进行查找和验证。
在验证通过之后,在对其进行用户所要求的操作。
作为一个财政支出系统,那么就要求对于用户关于金钱的每一项操作都要有相应的记录,同时并允许用户对于每一条整体的记录进行操作,例如可以根据时间来查找某一确定日期是否进行了收入或者支出的操作,也可以根据特定的需要来删除某一条整体的记录。
但不允许对每条记录的单项数据进行更改,因为不管是收入还是支出,所涉及的金额都是固定的,时间也是固定的,所以系统不允许用户对其进行操作。
除此之外,还必须有足够大的空间来存储新的记录。
所以此程序就是基于这个思想而编写出来的,基本满足了用户对于一个财政支出管理系统所要求的相关功能。
页脚内容12系统总框图和功能模块说明2.1系统总框图2.2功能模块说明(1)old_record( ):此函数由系统自行调用,作用是将所有用户信息存入系统。
(2)void save( ): 此函数的作用是将结构体数组中的信息写入文件存储,由系统调用。
c语言个人财务管理系统[1]标准化文件发布号:(9312-EUATWW-MWUB-WUNN-INNUL-DQQTY-个人财政支出管理付欣 05计算机四班指导老师:梁新元一、问题描述及分析....................................................................................... 错误!未定义书签。
二、实验程序设计思想及功能描述............................................................... 错误!未定义书签。
3、主要函数模块的设计思想和具体实现............................................ 错误!未定义书签。
三、实验程序测试........................................................................................... 错误!未定义书签。
1、程序开始执行时系统的所显示的页面:........................................ 错误!未定义书签。
2、选择退出系统:................................................................................ 错误!未定义书签。
3、选择登陆,并且输入的帐号和密码都正确:................................ 错误!未定义书签。
4、用户输入的帐号不正确:................................................................ 错误!未定义书签。
5、用户输入的帐号正确,密码不正确:............................................ 错误!未定义书签。
四、实验程序自我评价................................................................................... 错误!未定义书签。
五、课程设计创新........................................................................................... 错误!未定义书签。
六、课程设计总结........................................................................................... 错误!未定义书签。
七、参考书目:............................................................................................... 错误!未定义书签。
八、实验程序源代码....................................................................................... 错误!未定义书签。
一、问题描述及分析编写一个个人财政支出管理系统,主要解决的问题是作为一个系统而言,它所要面对不只是某一个人而言,而是要面对很多的用户。
那么想要解决这一问题,就必须要求这个系统能够存储许多用户的基本信息和记录。
同时也要求系统能够对不同的用户的身份进行查找和验证。
在验证通过之后,在对其进行用户所要求的操作。
作为一个财政支出系统,那么就要求对于用户关于金钱的每一项操作都要有相应的记录,同时并允许用户对于每一条整体的记录进行操作,例如可以根据时间来查找某一确定日期是否进行了收入或者支出的操作,也可以根据特定的需要来删除某一条整体的记录。
但不允许对每条记录的单项数据进行更改,因为不管是收入还是支出,所涉及的金额都是固定的,时间也是固定的,所以系统不允许用户对其进行操作。
除此之外,还必须有足够大的空间来存储新的记录。
所以此程序就是基于这个思想而编写出来的,基本满足了用户对于一个财政支出管理系统所要求的相关功能。
二、实验程序设计思想及功能描述根据前面对于编写一个个人财政支出管理系统的程序的问题描述和分析,确定了此程序的基本思想和相关功能。
1、基本思想首先定义一个结构体数组,这个数组的功能便是用来所有用户的所有信息。
它的成员为每个用户的帐号(account)、密码(code)、姓名(name)、记录(record rec[max]),以及记录的条数(rec_len)。
其中记录(record rec[max])这个成员本身也是一个结构体数组。
它包含了用户所有的记录(record),并且根据用户的操作,记录这个成员变量也会有所跟改,例如如果拥护增加了一条记录,那么这一条记录就会存储在此成员变量中。
除了这个成员变量是动态变化之外,记录的条数(rec_len)也会根据用户的操作进行变化,例如如果用户增加了一条记录,则rec_len就会自加1,如果用户删除了一条记录,则rec_len就会自减1。
记录(record rec[max])这个成员变量是以后函数中操作的主要内容。
除了这两个成员变量之外,其它的成员变量则不会被改变,系统只允许用户对其进行访问,但不允许进行操作,因为这几个成员变量的作用主要是用来验证用户的身份用的,所以不可以更改。
其中的密码(code)甚至只能别系统调用,而不能对用户进行显示的,也就是说密码(code)对于用户是不可预知的,这样做的目的是为了系统自身的安全性,以免用户的信息被其他人看到。
这就是这个结构体数组的功能和基本成员变量及各个成员变量的功能。
定义了结构体数组之后,首先要做的就是要把所有的记录都存入这个结构体数组中,以方便用户的操作。
所以在main函数中有系统自行调用了old_record这个函数来存入信息。
在此之后进行的操作便是让用户选择所要进行的是登陆系统的操作还是退出系统的操作。
如果选择登陆,则要输入帐号和密码。
之后由系统来检查帐号的存在性和密码的正确性。
如果这两项都通过了系统的检查,那么用户便可以进行具体记录的操作了。
这便是这个程序的基本设计思想。
2、各个函数模块的功能(1)old_record( ):此函数由系统自行调用,作用是将所有用户信息存入系统。
(2)void save( ): 此函数的作用是将结构体数组中的信息写入文件存储,由系统调用。
(3)load( ):此函数的作用是将结构体数组中写入文件的信息读出,由系统调用。
(4)lookup_accounts():此函数的作用是将用户输入的帐号与系统中的所有帐号进行对比,查看系统中是否有此帐号。
(5) check_code( ):此函数是作用是在系统查询到了帐号之后,对用户输入的帐号和密码进行检验,看是否相对应。
(6)print_message():此函数的功能是在系统检查了用户输入的帐号和密码之后,如果用户通过了系统的检查,在此显示用户可见的基本信息。
(7)find_record():此函数的作用是根据用户输入的日期进行查找操作。
(8)insert_record():此函数的功能是在记录中增加一条新的记录,这个记录由用户输入。
(9)del_record():此函数的功能是根据用户的输入的位置,将相应位置的记录删除。
(10)sum_num():此函数的功能是计算所有收入和支出的总和,计算全部的收入的总合,计算全部输出的总合。
(11)打印输出记录的函数:在本程序中一共有三个打印输出记录的函数,分别为all_print()、acc_print()、pay_print()这三个函数。
它们的功能依次是打印输出全部记录,打印输出输入记录,打印输出支出记录。
(12)mian( ):在主函数中,可以根据用户的选择来操作系统允许用户使用的功能,也可以随时退出这个系统。
3、主要函数模块的设计思想和具体实现(1)void save( )函数和load( )函数。
这两个函数的功能是在系统调用了old_record( )这个函数之后,结构体内就有了所有用户的所有信息。
Save( )函数的作用是将所有的信息都存入文件中,便于数据的保存和读取。
Load ( )函数的作用则是把存入的文件中的信息读出来。
这两个函数所涉及的知识点为文件的读入和写出。
主要是freadhe和fwrite 两个函数的应用。
它们的一般调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size ,count,fp);其中:Buffer:是一个指针,对fread来说,它是读入数据的存放地址。
对fwrite来说,是要输出数据的地址。
Size:要读写的字节数。
Count:要进行读写多少个 size字节的数据项。
Fp;文件型指针。
调用这两个函数之后,如果调用成功,则函数返回值为count的值,即输入或输出数据项的完整个数。
(2)lookup_accounts()函数和 check_code( )函数:这两个函数的功能主要是用来核对用户的身份。
系统先检验的是axxounts 这个函数。
根据用户输入的帐号与系统中所有的帐号进行比较,查找看是否有相同的。
如果找到了,则进行对密码进行检验,看密码与帐号是否对应。
在检验帐号的时候,如果用户输入的帐号在系统中不存在,系统则会给出提示要求用户从新输入。
但如果用户输入了三次体统都找不到帐号的时候,系统则会强制要求用户退出系统,此时则显示结束语的欢迎词。
而如果帐号找到了,但用户输入的密码与原有密码不一致,系统也会给出提示信息要求用户再次输入。
同样的,如果用户输入三次体统都检验到不是正确的密码的时候,系统则会强制要求用户退出系统,此时则显示结束语的欢迎词。
在这两个函数中主要用到的知识点就是对字符串的相关操作。
如果帐号和密码都通过检验之后,此函数则将返回struct list_record类型的数据。
字符串处理的函数主要有以下几个:puts函数:其一般形式为puts(字符数组)。
其作用是将一个字符串输出到终端。
Gets函数:其一般形式为gets (字符数组)。
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。
该函数值是字符数组的起始地址。
Stract函数:其一般形式为strcat(字符数组1,字符数组2)。
Strcat是字符串连接的缩写。
其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1 中,函数调用后得到一个函数值——字符数组1的地址。