C语言课程设计报告银行账户信息管理系统_第1页
C语言课程设计报告银行账户信息管理系统_第2页
C语言课程设计报告银行账户信息管理系统_第3页
C语言课程设计报告银行账户信息管理系统_第4页
C语言课程设计报告银行账户信息管理系统_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z......资料....HUBEIUNIVERSITYOFAUTOMOTIVETECHNOLOGYC语言程序设计课程设计报告课设题目:银行账户信息管理专业:电子信息工程(汽车电子)班级:T1223-14姓名:朱鹏成绩:完成日期:2013年18周-2013年19周指导教师:吴波田漫柳目录C语言程序设计0课程设计报告0目录11.课程设计目的22.需求分析22.1要求22.2任务描述32.3运行环境42.4开发工具43.总体设计43.1系统流设计43.2系统模块设计54.详细设计64.1数据结构设计64.2模块接口设计74.3主要功能模块的流程图95.运行结果145.1欢迎界面145.2主菜单145.3次菜单-信息输入界面155.4信息查询界面155.5记录查询界面165.6退出界面166.程序调试与测试176.1主菜单选择测试176.2次菜单选择测试176.3客户信息的输入测试186.4客户密码测试206.5存取款金额测试216.6存取款日期测试227.问题与不足238.建议239.编程体会2410.程序源代码2511.参考文献4212.用户使用手册4212.1程序主要用途4212.2使用说明4212.3注意事项4312.4维护与升级431.课程设计目的通过课程设计,加深对结构化程序设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。通过课程设计,进一步掌握C语言中重要的数据结构。掌握并熟练运用指针、链表、结构体、文件等数据结构。通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。通过课程设计,培养C语言知识运用和自学能力,真正的把课堂上获得的知识运用起来,培养自己对程序编写的兴趣,并能独立设计和实现一个小型系统。通过课程设计,加强了自己的程序分析能力。2.需求分析2.1要求遵循软件开发过程的基本规;能灵活应用,初步具备运用C程序解决实际问题的能力。运用结构化程序设计方法,按照课程设计题目要求,完成包括需求分析、数据结构设计、概要设计、详细设计、编写代码、调试和测试C程序等过程。学会利用数组、结构体、链表进行相关信息表示。功能模块划分清晰,系统结构图符合功能操作要求,且有详尽的功能描述各主要功能模块有详尽的流程图及描述,用函数的形式实现,且调用入口、功能、出口等关系正确。所设计的C程序较好的可读性和可靠性;程序书写风格规,注释清晰。界面友好(良好的人机互交),凡需要输入信息时,都有较详尽的提示信息,并对输入信息有较完善的值域分析。程序经上机调试通过,不应出现语法型、功能型错误,并获得满意的结果。学会通过各功能性测试用例测试程序的能力,尽可能避免原则性错误的出现。掌握编写、调试和测试C语言程序的基本技巧,充分理解结构化程序设计的基本方法。C语言课程设计报告的容反应实际设计过程,且符合格式要求,无抄袭现象。2.2任务描述已知一银行有5个客户(客户信息为:编号、客户、客户地址、客户、账户总金额(最开始为0))。设计一程序,完成以下功能。存、取款时间必须通过调用系统时间获得。存款:输入客户编号、存款金额、存款日期,完成存款功能,需要判断客户编号是否存在,存款金额是否大于0,存款日期格式是否合法(格式为:YYYY-MM-DD,如2009-01-02))。取款:输入客户编号、存款金额、取款日期,完成取款功能,需要判断客户编号是否存在,取款金额是否大于0,取款金额是否小于客户的账户总金额,取款日期格式是否合法(格式为:YYYY-MM-DD,如2009-01-02))。查询指定客户的余额查询指定客户的存款记录查询指定客户的取款记录所有数据符合实际应用要求2.3运行环境Windows7系统VC++6.0编译环境2.4开发工具C语言3.总体设计3.1系统流设计程序整体功能结构如图一所示:开始初始化并显示欢迎信息开始初始化并显示欢迎信息显示主菜单,输入选择存款取款余额查询存款记录查询取款记录查询显示输入菜单,输入并显示用户信息存取款?输入存取金额,日期,存取款是3.2系统模块设计1)系统初始化模块函数voidstartvalue();实现初始化欢迎信息,并实现值得初始化。2)菜单模块函数intmenu();和intmenu2();分别实现一级二级菜单显示,一级菜单是主菜单,二级菜单是输入菜单,并返回相应的选项值。3)存取款模块函数voidDeposit_Withdraw();实现存取款的功能,其中会使用相关其他函数共同实现。4)信息查询模块函数intInfoFind();实现信息的查询功能,包括账户余额查询,存取款历史记录查询。5)日期审查模块函数intisDataRight();实现对日期的审查,其中同样会调用其他函数辅助实现。4.详细设计4.1数据结构设计根据系统要求,用户信息包括:数据项名称数据项系统表示数据类型数据长度备注客户编号P1->id整型8客户P1->name字符串10客户地址P1->address字符串1024客户P1->telnum整型8账户余额P1->account双精度16账户密码P1->password整型8根据系统要求,日期信息包括:数据项名称数据项系统表示数据类型数据长度备注年P1->year整型8月P1->month整型8日P1->day整型8时P1->hour整型8系统自动添加分P1->min整型8系统自动添加秒P1->sec整型8系统自动添加根据系统要求,存取款记录包括:数据项名称数据项系统表示数据类型数据长度备注客户编号P1->id整型8日期信息P1->InOutData结构体48存取款类型P1->ActionClass整型8存取款金额P1->ActionNum双精度16为了能实现系统的优越性和c语言的精华采用链表的建立取款记录表,示意图如下。存取款记录1存取款记录1存取款记录22通讯录信息1221存取款记录3存取款记录44.2模块接口设计1)所有函数声明//初始化voidstartvalue();//头部信息voidSysTitle();//一级菜单intmenu();//二级菜单intmenu2(intInfoClass);//输入函数voidInPut(char*cbo*,int*ibo*,double*money,intInPutClass,char*bo*name); /******日期时间相关函数******///将字符型的日期转换为整型,并分离出年月日voidChar2Int(char*DataIn,int*YearOut,int*MonthOut,int*DayOut);//判断是否为闰年intleap(intyear);//计算*年*月的天数intmonth_days(intyear,intmonth);//计算若干年的总天数unsignedintyearsdays(inttoyear);//计算*个月的总天数intdays(intyear,intmonth);//日期换算为秒,用于排序unsignedintData2Sec(USEDATA*DataIn);//判断日期逻辑是否正确intisDataNumRight(intYearIn,intMonthIn,intDayIn);//判断日期是否正确intisDataRight(char*DataIn,int*YearOut,int*MonthOut,int*DayOut);//调用系统时间,给结日期结构体添加时间voidsystime(USEDATA*Data4Time); //客户编号验证intisIDe*ist(intIDin); /*******存款、取款、查询相关函数*****///存取款voidDeposit_Withdraw(intActClass);//信息查询intInfoFind(intActClass,intInfoClass);//寻找插入点RECORDS*InPoint();//将存取款记录按照日期排序voidtoorder();//增加存取款记录intInOut(intIDin,doubleActNum,USEDATA*ActData,intActClass);//ID、、地址、查询结构体数组idintFind(intIDin,char*NameIn,char*AddressIn,intTelNumIn);//存取款记录和余额查询并输出intFindOutPut(intIDin,char*NameIn,char*AddressIn,intTelNumIn,intactclass);//退出voide*it0();2)全局变量 1、用于存储正确的日期信息的结构体USEDATARightData; 2、用于存储客户信息的结构体数组CUSTOMcustomer[5]; 3、用于存储存取款记录的链表的指针RECORDS*head=NULL,*p1=NULL,*p2=NULL;3)主要模块的实现系统以intmain()为入口,首先调用voidstartvalue()函数进行初始化,并显示欢迎信息。接着,按照用户的要求,调用voidDeposit_Withdraw()函数进行存取款的操作,或者调用intInfoFind()函数进行信息的查询。不管还是存取款还是信息查询,都需要调用voidInPut()函数进行输入信息的输入。存取款功能还会调用日期审查函数intisDataRight()对日期进行审查。通过审查之后,会调用intInOut()函数添加存取款记录,并修改账户余额。 最后调用voide*it0()函数退出。4.3主要功能模块的流程图1)系统初始化模块显示欢迎信息显示欢迎信息给系统初始化值进入系统2)菜单模块显示主菜单显示主菜单接受用户输入选项合法?显示次菜单是否为6接受用户输入选项合法?执行相应功能是否为0是是否否是否否执行退出函数3)存取款模块输入存取款人的信息输入存取款人的信息显示存取款人的信息输入密码正确?输入存取款金额合法?输入存取款日期合法?新增记录,修改账户余额返回主菜单显示?是是是是否否否否显示存取款人的信息4)信息查询模块输入被查询人的信息输入被查询人的信息将输入的信息转换为数组idId存在?输入密码正确?是否是否为余额?显示被查询人的余额显示被查询人的记录否是返回是否5)日期审查模块输入日期输入日期长度为10?第5位和第8位是‘-’?提取字符串中的数值,分离出年,月,日根据年,月,日判断日期逻辑是否正确正确?返回0返回1是是是否否否5.运行结果5.1欢迎界面5.2主菜单5.3次菜单-信息输入界面5.4信息查询界面5.5记录查询界面5.6退出界面6.程序调试与测试测试数据:客户编号客户客户地址客户账户余额账户密码1唐僧东土大唐88888880100000088888882悟空花果山8888888110000088888883猪八戒高老庄888888821000088888884沙和尚流沙河88888883100088888885佛祖西天8888888410000000088888886.1主菜单选择测试若用户输入错误选项,则如图显示:6.2次菜单选择测试若用户输入错误选项,则如图显示:6.3客户信息的输入测试1)若输入了不存在的客户2)若输入了不存在的客户:3)若输入了不存在的客户地址:4)若输入了不存在的客户:6.4客户密码测试1)密码输入错误:2)密码错误三次:6.5存取款金额测试1)金额为负值:2)取款金额大于账户余额:6.6存取款日期测试1)若输入错误格式的日期:2)若输入正确格式的日期,但是日期不符合实际:7.问题与不足1、需求分析中存在的为题 题目中说只有5个用户,而且没有对账户信息进行修改等操作,如果对账户信息的增删改三个功能,程序会更加完美。2、程序设计中的缺陷 存取款的时候,给系统添加记录的时候,会同时进行排序,排序方法用的是排序,排序方法比较简陋,数据量较大的时候会比较耗时间。8.建议课程设计的题目涉及围应该更广。对于课设的时间按排,可以提前把题目给学生,这样可以提前做课设以及复习考试。程序设计的功能应相对更加复杂一点,这样有利培养同学们的分析问题,解决问题的能力,同时也能提高同学们对代码的掌握能力。再者,就是题目,尽量少给一些提示,这样同学们可以更大程度的自己动脑子考虑怎解决问题。9.编程体会经历了编c语言课程设计后,我弄懂了在前几周课堂上没搞明白的东西,例如,链表的建立,排序,遍历等等。也提高了自己对指针的熟练度。以前就听说对指针的掌握程度决定了一个人的编程水平。所以,虽然写程序的过程中,遇到各种问题,调试的时候也是遇到各种令人头大的问题,但能借助课程设计提高自己对指针的熟练度,提高自己对c语言编程的熟练度,我还是觉得很开心的,也希望学校可以多开设一些这样的课程,既是让我们对自己所学知识的一个综合理解与使用,也可以提高我们的动手实践能力、对知识的运用能力。10.程序源代码/*************************************** 简易银行信息管理系统 ** 作者:朱鹏 ** **: ** 指导老师:吴波田漫柳 ***************************************/ /**************************************头文件**************************************/*include<stdio.h>*include<string.h>*include<stdlib.h>*include<time.h>*include<malloc.h>*include<conio.h>*include<windows.h>*defineLENsizeof(structrecords) /**************************************记录修改标记************************************/intRecorsChanged=0;FILE*fp; /**************************************日期结构体**************************************/typedefstructdata { intyear; intmonth; intday; inthour; intmin; intsec;}USEDATA;USEDATARightData; /**************************************客户信息结构体**************************************/typedefstructcustom { intid; charname[10]; charaddress[1024]; inttelnum; doubleaccount; intpassword;}CUSTOM;CUSTOMcustomer[5]; /**************************************存取款记录链表**************************************/typedefstructrecords { intid; USEDATAInOutData; intActionClass; doubleActionNum; structrecords*ne*t;}RECORDS;//head为头指针,p1,p2为链表操作指针RECORDS*head=NULL,*p1=NULL,*p2=NULL; /**************************************函数声明**************************************///初始化voidstartvalue();//头部信息voidSysTitle();//一级菜单intmenu();//二级菜单intmenu2(intInfoClass);//输入函数voidInPut(char*cbo*,int*ibo*,double*money,intInPutClass,char*bo*name); /***************************************日期时间相关函数***************************************///将字符型的日期转换为整型,并分离出年月日voidChar2Int(char*DataIn,int*YearOut,int*MonthOut,int*DayOut);//判断是否为闰年intleap(intyear);//计算*年*月的天数intmonth_days(intyear,intmonth);//计算若干年的总天数unsignedintyearsdays(inttoyear);//计算*个月的总天数intdays(intyear,intmonth);//日期换算为秒,用于排序unsignedintData2Sec(USEDATA*DataIn);//判断日期逻辑是否正确intisDataNumRight(intYearIn,intMonthIn,intDayIn);//判断日期是否正确intisDataRight(char*DataIn,int*YearOut,int*MonthOut,int*DayOut);//调用系统时间,给结日期结构体添加时间voidsystime(USEDATA*Data4Time); //客户编号验证intisIDe*ist(intIDin); /***************************************存款、取款、查询相关函数***************************************///存取款voidDeposit_Withdraw(intActClass);//信息查询intInfoFind(intActClass,intInfoClass);//寻找插入点RECORDS*InPoint();//将存取款记录按照日期排序voidtoorder();//增加存取款记录intInOut(intIDin,doubleActNum,USEDATA*ActData,intActClass);//ID、、地址、查询结构体数组idintFind(intIDin,char*NameIn,char*AddressIn,intTelNumIn);//存取款记录和余额查询并输出intFindOutPut(intIDin,char*NameIn,char*AddressIn,intTelNumIn,intactclass);//退出voide*it0(); /**************************************主函数**************************************//*功能:调用各个子函数完成功能输入:无返回:无*/intmain(){ intcurID=0,curTel=0; doublecurMoney=0; charInPutData[20]={0},curName[20]={0},curAddress[1024]; //客户初始化 startvalue(); while(1) { switch(menu()) { case1: //存款 system("cls"); Deposit_Withdraw(1); break; case2: //取款 system("cls"); Deposit_Withdraw(-1); break; case3: //余额查询 system("cls"); if(InfoFind(0,3)!=-1) { printf("\t\t查询完成!按任意键继续!"); getch(); } break; case4: //存款记录查询 system("cls"); if(InfoFind(1,4)!=-1) { printf("\t\t查询完成!按任意键继续!"); getch(); } break; case5: //取款记录查询 system("cls"); if(InfoFind(-1,5)!=-1) { printf("\t\t查询完成!按任意键继续!"); getch(); } break; case6: //退出 system("cls"); e*it0(); break; default: break; } } return0;} /**************************************初始化**************************************//*功能:给用户结构体数组赋值,并从文件中读取历史操作记录写入链表输入:无返回:无*/voidstartvalue(){ inti=0,startID=0,startActClass=0; doublestartActNum=0; USEDATAstartData; customer[0].id=1;strcpy(customer[0].name,"唐僧");strcpy(customer[0].address,"东土大唐");customer[0].telnum=88888880;customer[0].account=1000000.0;customer[0].password=8888888; customer[1].id=2;strcpy(customer[1].name,"悟空");strcpy(customer[1].address,"花果山");customer[1].telnum=88888881;customer[1].account=100000.0;customer[1].password=8888888; customer[2].id=3;strcpy(customer[2].name,"猪八戒");strcpy(customer[2].address,"高老庄");customer[2].telnum=88888882;customer[2].account=10000.0;customer[2].password=8888888; customer[3].id=4;strcpy(customer[3].name,"沙和尚");strcpy(customer[3].address,"流沙河");customer[3].telnum=88888883;customer[3].account=1000.0;customer[3].password=8888888; customer[4].id=5;strcpy(customer[4].name,"佛祖");strcpy(customer[4].address,"西天");customer[4].telnum=88888884;customer[4].account=100000000.0;customer[4].password=8888888; if(!((fp=fopen("records.t*t","r"))==NULL)) { while(!feof(fp)) { fscanf(fp,"%d%lf%d%d%d%d%d%d%d", &startID,&startActNum,&startActClass,&startData.year,&startData.month,&startData.day,&startData.hour,&startData.min,&startData.sec); if(feof(fp)) break; InOut(startID,startActNum,&startData,startActClass); } fclose(fp); } start: printf("\n\n\n"); SysTitle(); printf("\t\t▉▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▉\n"); printf("\t\t▉作者:朱鹏**:▉\n"); printf("\t\t▉▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▉\n"); printf("\t\t\n"); if(i==0) { printf("\t\t\t系统正在初始化~不要着急哦~亲~"); for(i=0;i<4;i++) { Sleep(1000); printf("."); } system("cls"); gotostart; } printf("\t\t\t亲~恭喜哦!初始化成功了哦~\n"); printf("\t\t\t按任意键进入系统了哦~~"); getch(); fflush(stdin); return;} /**************************************头部信息**************************************//*功能:显示程序头部信息输入:无返回:无*/voidSysTitle(){ system("title简易银行信息管理系统By朱鹏"); printf("\n\n"); printf("\t\t▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\n"); printf("\t\t▉※※※※※※※※欢迎使用※※※※※※※※▉\n"); printf("\t\t▉※※※※※简易银行信息管理系统※※※※※▉\n"); printf("\t\t▉※※※※※※※※※※※※※※※※※※※※▉\n");} /**************************************一级菜单**************************************//*功能:显示主菜单,并完成菜单的选择输入:无返回:选择的菜单序号[整型]*/intmenu(){ int*; system("cls"); SysTitle(); printf("\t\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▉▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▉\n"); printf("\t\t亲~输入数字1~6就能使用对应的功能了哦:"); do{ fflush(stdin); scanf("%d",&*); if(*<1||*>6) printf("\t\t亲~您的输入有误哟~请重新输入:"); }while(*<1||*>6); fflush(stdin); return*;} /**************************************二级菜单**************************************//*功能:显示二级菜单,并完成菜单的选择输入:操作类型[整型]返回:选择的菜单序号[整型]*/intmenu2(intInfoClass){ int*; charInfoName[20]={0}; switch(InfoClass) { case1: strcpy(InfoName,"存款");break; case-1: strcpy(InfoName,"取款");break; case3: strcpy(InfoName,"余额");break; case4: strcpy(InfoName,"存款记录");break; case5: strcpy(InfoName,"取款记录");break; } system("cls"); SysTitle(); printf("\t\t▉▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▉\n"); printf("\t\t▉%s--用户信息查询\t▉\n",InfoName); printf("\t\t▉▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▉\n"); printf("\t\t▉▉\n"); printf("\t\t▉1、输入客户编号查询(1~5)▉\n"); printf("\t\t▉2、输入客户查询▉\n"); printf("\t\t▉3、输入客户地址查询▉\n"); printf("\t\t▉4、输入客户查询▉\n"); printf("\t\t▉0、返回▉\n"); printf("\t\t▉▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▉\n"); printf("\t\t亲~输入数字0~4就能使用对应的功能了哦:"); do{ fflush(stdin); scanf("%d",&*); if(*<0||*>4) printf("\t\t亲~您的输入有误哟~请重新输入:"); }while(*<0||*>4); fflush(stdin); return*;} /**************************************输入函数**************************************//*功能:显示需要输入的容,并在给定的地址中赋值 输入 对应功能char*cbo* 存放字符串输入容int*ibo* 存放整型数据double*money[金额] 存放双精度数据[金额]intInPutClass [1.2.3]对应前面的三个输入值类型char*bo*name 输入信息的名字 返回:无*/voidInPut(char*cbo*,int*ibo*,double*money,intInPutClass,char*bo*name){ fflush(stdin); printf("\t\t请输入%s:",bo*name); if(InPutClass==1) //值为1,输入字符 gets(cbo*); elseif(InPutClass==2) //值为2,输入整数 scanf("%d",ibo*); elseif(InPutClass==3) //值为3,输入金额 { do { scanf("%lf",money); if(*money<0) printf("\t\t金额不能为负值哦~重新输入吧亲~:"); }while(*money<0); } fflush(stdin); return;} /**************************************日期、时间相关函数**************************************//*功能:将字符型的日期转换为整型,并分离出年月日 输入 对应功能char*DataIn 输入用户输入的字符型日期int*YearOut 存放年int*MonthOut 存放月int*DayOut 存放日 返回:无*/voidChar2Int(char*DataIn,int*YearOut,int*MonthOut,int*DayOut) { intcount=0,i=0; for(i=0;i<strlen(DataIn);i++) { if(DataIn[i]=='-') count++; elseif(count==0) *YearOut=(*YearOut)*10+DataIn[i]-'0'; elseif(count==1) *MonthOut=(*MonthOut)*10+DataIn[i]-'0'; elseif(count==2) *DayOut=(*DayOut)*10+DataIn[i]-'0'; } return;}/**功能:判断是否为闰年*输入:整型数据年*返回:闰年1/非闰年0[整型]*/intleap(intyear){ intlp; lp=(year%4==0&&year%100!=0||year%400==0)"1:0; returnlp;}/**功能:计算*年*月份的天数*输入:年,月*返回:输入年份月份的天数[整型]*/intmonth_days(intyear,intmonth){ intday; switch(month) { case1: case3: case5: case7: case8: case10: case12:day=31;break; case2:day=leap(year)"29:28;break; default:day=30; } returnday;}/**功能:计算若干年的总天数*输入:当前年份*返回:从1900到当前年份的总天数[整型]*/unsignedintyearsdays(inttoyear) { inti;unsignedintyds=0; for(i=1900;i<toyear;i++) yds+=365+leap(i); returnyds; }/**功能:计算*年前几个月份的总天数*输入:当前年,月*返回:该年从1月到输入月份的总天数[整型]*/intdays(intyear,intmonth){inti,ds=0; for(i=1;i<month;i++) ds=ds+month_days(year,i); returnds;}/**功能:将输入的日期转化为秒用于比较时间先后*输入:日期结构体的指针*返回:由日期换算的秒[无符号整型]*/unsignedintData2Sec(USEDATA*DataIn) { return((yearsdays(DataIn->year)+days(DataIn->year,DataIn->month)+DataIn->day)*24*60*60 +DataIn->hour*60*60+DataIn->min*60+DataIn->sec);}/**功能:判断日期逻辑是否正确*输入:年,月,日*返回:日期逻辑正确1/错误0[整型]*/intisDataNumRight(intYearIn,intMonthIn,intDayIn) { if(DayIn>0&&DayIn<month_days(YearIn,MonthIn)) return1;//返回1,表示日期逻辑正确 else return0;//返回0,表示日期逻辑错误}/**功能:判断日期是否正确* 输入 对应的功能*char*DataIn 用户的字符型日期*int*YearOut 存放整型年*int*MonthOut 存放整型年*int*DayOut 存放整型年*返回:日期正确1/错误0[整型]*/intisDataRight(char*DataIn,int*YearOut,int*MonthOut,int*DayOut) { intcount=0,i=0; *YearOut=*MonthOut=*DayOut=0; if(strlen(DataIn)==10&&DataIn[4]=='-'&&DataIn[7]=='-') { Char2Int(DataIn,YearOut,MonthOut,DayOut); if(isDataNumRight(*YearOut,*MonthOut,*DayOut)==1) return1;//返回1,表示日期格式正确 } else { *YearOut=*MonthOut=*DayOut=0;//格式错误,清空缓存 return0;//返回0,表示日期格式错误 }}/**功能:调用系统时间,给结日期结构体添加时间*输入:需要添加时间的日期结构体*返回:无*/voidsystime(USEDATA*Data4Time) { chartemptime[30]={0}; time_trawtime; structtm*timeinfo; time(&rawtime); timeinfo=localtime(&rawtime); //给结构体赋值 Data4Time->hour=timeinfo->tm_hour; Data4Time->min=timeinfo->tm_min; Data4Time->sec=timeinfo->tm_sec; return;} /**************************************客户编号验证**************************************//**功能:判断客户编号是否存在*输入:客户编号*返回:存在1/不存在0[整型]*/intisIDe*ist(intIDin){ inti=0; for(i=0;i<5;i++) if(IDin==customer[i].id) { return1;//客户编号正确 break; } if(i>=5) return0;//客户编号错误 } /**************************************存款、取款相关函数**************************************//**功能:存取款*输入:intActClass 操作类型 1存款 -1取款*返回:无*/voidDeposit_Withdraw(intActClass){ intcurID=0,curTel=0,curPassword=0,count=0; doublecurMoney=0; charInPutData[20]={0},curName[20]={0},curAddress[1024],*='n'; //输入客户编号 do { curID=InfoFind(0,ActClass); if(curID==-1) return; if(isIDe*ist(curID)==0) { printf("\t\t按任意键就可以继续了哦亲~"); getch(); } }while(isIDe*ist(curID)==0); //输入存款金额 InPut(NULL,NULL,&curMoney,3,(ActClass==1)""请输入存款金额":"请输入取款金额"); //输入日期 do { InPut(InPutData,NULL,NULL,1,(ActClass==1)""请输入存款日期(YYYY-MM-DD)":"请输入取款日期(YYYY-MM-DD)"); if(isDataRight(InPutData,&RightData.year,&RightData.month,&RightData.day)==0) printf("\t\t日期输入错误了哦亲~\n"); }while(isDataRight(InPutData,&RightData.year,&RightData.month,&RightData.day)==0); //加上系统时间 systime(&RightData); //存取款 if(InOut(curID,curMoney,&RightData,ActClass)==1) { printf("\t\t%s成功!\n\n",(ActClass==1)""存款":"取款"); RecorsChanged=1;//修改记录修改标记,1为修改过 do { InPut(&*,NULL,NULL,1,"亲~要显示现在账户信息吗?(Y/N)"); if(!(*=='Y'||*=='y'||*=='N'||*=='n')) printf("\t\t亲~你输入的不正确哟~\n"); fflush(stdin); }while(!(*=='Y'||*=='y'||*=='N'||*=='n')); if(*=='Y'||*=='y') FindOutPut(curID,NULL,NULL,NULL,0); } else printf("\t\t亲~%s失败哟~\n\n",(ActClass==1)""存款":"取款"); printf("\t\t按任意键就可以继续了哦亲~"); getch(); return;}/**功能:信息查询* 输入 对应功能* intActClass 操作类型 1存款 -1取款* intInfoClass 信息类型 3余额查询 4存款记录 5取款记录*返回:返回-1/客户编号id[整型]*/intInfoFind(intActClass,intInfoClass){ intcurID=0,curTel=0,curPassword=0,count=0,IDNum=0;; doublecurMoney=0; charInPutData[20]={0},curName[20]={0},curAddress[1024]; while(1) { do { switch(menu2(InfoClass)) { case1: InPut(NULL,&curID,NULL,2,"客户编号(1~5)"); break; case2: InPut(curName,NULL,NULL,1,"客户"); break; case3: InPut(curAddress,NULL,NULL,1,"客户地址"); break; case4: InPut(NULL,&curTel,NULL,2,"客户"); break; case0: return-1; break; } IDNum=Find(curID,curName,curAddress,curTel); curID=customer[IDNum].id; if(IDNum==-1&&isIDe*ist(curID)==0) { printf("\t\t亲~你输入的用户不存在哦\n"); printf("\t\t按任意键继续"); getch(); } }while(IDNum==-1&&isIDe*ist(curID)==0); //输入密码 do { InPut(NULL,&curPassword,NULL,2,"请输入密码"); if(curPassword!=customer[IDNum].password) printf("\t\t密码错误了哦亲~\n"); if(count>=2) { printf("\t\t密码错误了三次了哦亲~\n"); printf("\t\t按任意键返回系统吧~"); getch(); return-1; } count++; }while(curPassword!=customer[IDNum].password); FindOutPut(curID,curName,curAddress,curTel,ActClass); returncurID; } }/**功能:寻找插入点*输入:无*返回:插入点地址*/RECORDS*InPoint(){ RECORDS*Point=NULL; if(head==NULL)//链表为空,新建链表 { head=(RECORDS*)malloc(LEN); head->ne*t=NULL; Point=head; } else//链表不为空,插在链表尾部 { for(p1=head;p1!=NULL;p1=p1->ne*t) Point=p1; } returnPoint;}/**功能:将存取款记录按照日期排序*输入:无*返回:无*/voidtoorder(){ RECORDStemp; if(head==NULL) return; /*冒泡排序法*/ p1=head; do { for(p2=p1->ne*t;p2!=NULL;p2=p2->ne*t) if(Data2Sec(&(p1->InOutData))>Data2Sec(&(p2->InOutData))) { temp=*p1; *p1=*p2; *p2=temp; p2->ne*t=p1->ne*t;/*把链表恢复*/ p1->ne*t=temp.ne*t; } p1=p1->ne*t; }while(p1->ne*t!=NULL); return;}/**功能:增加存取款记录* 输入 对应功能* intIDin 客户编号*doubleActNum 存取款金额*USEDATA*ActData 存取款日期时间* intActClass 操作类型 1存款-1取款*返回:查询失败-1/成功用户信息在结构体数组中的编号[整型]*/intInOut(intIDin,doubleActNum,USEDATA*ActData,intActClass){ RECORDS*AddPoint=NULL,*temp=NULL; //获得插入点位置 AddPoint=InPoint(); //新建记录节点 p1=(RECORDS*)malloc(LEN); temp=AddPoint->ne*t; //填写存取款信息 p1->id=IDin; p1->ActionNum=ActNum; p1->InOutData=*ActData; p1->ActionClass=ActClass; //更改账户余额 IDin=Find(IDin,NULL,NULL,NULL); if(ActClass*ActNum+customer[IDin].account<0) { free(p1); return0; } customer[IDin].account+=ActClass*ActNum; //将存取款记录接上 AddPoint->ne*t=p1; p1->ne*t=temp; //排序 toorder(); return1;} /**************************************ID、、地址、查询结构体数组id**************************************//**功能:ID、、地址、查询结构体数组id* 输入 对应功能* intIDin 客户编号*char*NameIn 客户*char*AddressIn 客户地址* intTelNumIn 客户*返回:查询失败-1/成功用户信息在结构体数组中的编号[整型]*/intFind(intIDin,char*NameIn,char*AddressIn,intTelNumIn){ inti=0; for(i=0;i<5;i++) { if((customer[i].id==IDin) ||(NameIn!=NULL&&strcmp(NameIn,customer[i].name)==0) ||(AddressIn!=NULL&&strcmp(AddressIn,customer[i].address)==0) ||(TelNumIn==customer[i].telnum)) { returni; break; } } if(i>=5) return-1;} /**************************************存取款记录和余额查询并输出**************************************//**功能:存取款记录和余额查询并输出* 输入 对应功能* intIDin 客户编号*char*NameIn 客户*char*AddressIn 客户地址* intTelNumIn 客户* intactclass 操作类型 0余额-1取款记录1存款记录*返回:查询失败0/成功1[整型]*/intFindOutPut(intIDin,char*NameIn,char*AddressIn,intTelNumIn,intactclass) /*查询*/{ //需要将输入的用户编号转换为用户对应的信息编号 intIDNum=0; IDNum=Find(IDin,NameIn,AddressIn,TelNumIn); if(IDNum==-1&&isIDe*ist(IDin)==0) { printf("\t\t亲~你输入的用户不存在哦\n"); return0; } else { system("cls"); SysTitle(); printf("\t\t▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔\n\n"); if(actclass==-1||actclass==1) { printf("\t客户编号\t%s金额\t操作类型\t日期时间\n\n",(actclass==1)""存款":"取款"); for(p1=head;p1!=NULL;p1=p1->ne*t) if(p1->id==IDin&&p1->ActionClass==actclass) { printf("\t%d\t%s\t%.2lf\t\t%s\t\t%d-%d-%d%d:%d:%d\n", p1->id,customer[IDNum].name,p1->ActionNum,(actclass==1)""存款":"取款",p1->InOutData.year,p1->InOutData.month,p1->InOutData.day,p1->InOutData.hour,p1->InOutData.min,p1->InOutData.sec); } } elseif(actclass==0) { printf("\t客户编号\t家庭住址\t联系\t账

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论