




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学号:课程设计题目图书馆服务系统学院计算机科学与技术学院专业计算机科学与技术班级计算机班姓名指导教师20XX年12月10日目录图书馆服务系统 2一、需求分析 21.需求概括 22、数据流图 3二.概念模型设计 41.图书管理系统 42.设计分ER图 53.设计全局ER图 6三、关系模型设计 7四、数据库实现 81.创建图书馆管理系统数据库 82.建立和管理基本表 8五、数据库应用程序分析 141.首先设计界面 142.功能的实现 15六、设计总结 19七、参考文献 20图书馆服务系统一、需求分析1.需求概括随着科学技术的不断提高,计算机科学日渐成熟,作为计算机应用的一部分,使用计算机对图书信息进行管理,具有手工管理所无法比拟的优点。分析图书管理流程,系统应该实现以下功能:图书管理员可以维护图书信息,包括增加新书、修改图书信息、办理图书借阅登记、图书归还登记、丢失图书处理等。读者可以实现借书、还书、查阅图书信息等。具体要求如下:(1)图书信息管理:录入各种图书信息、维护图书信息等。图书信息包括图书编号、名称、类型、作者、出版社等。(2)读者信息管理:维护读者信息,根据实际情况修改、更新、删除读者信息。读者信息包括校园卡号、姓名等。(3)借阅管理:包括借书、还书、过期图书归还处理等。图书管理系统主要有3种用户:(1)系统管理员:拥有系统最高权限、设置管理员等。(2)图书管理员:维护图书基本数据,进行读者的图书借阅和归还处理。(3)读者用户:查阅图书信息、借阅图书。图书馆图书情况和管理规定,每种类型图书有很多不同的图书每位读者可同时借阅6本,每本图书借阅期限是一个月。2、数据流图图书管理系统具体数据流图DFD如下:
二.概念模型设计1.图书管理系统图书管理系统主要包含图书类型、图书信息和读者3个实体画出3个实体的ER图,并标出实体的主键,如图2.1、图2.2、图2.3。2.设计分ER图在图书借阅管理系统中涉及3个实体:图书、图书类型、读者,这三个实体之间互相存在着联系。根据需求分析可知一名读者最多可借阅10本书,一本书可以被不同的读者借阅,因此读者与图书之间存在着多对多的关系,一本图书对应一种图书类型,一种图书类型可以对应多种图书,因此图书与图书类型存在着一对多的关系。通过以上分析,可以得到图书管理系统的局部ER图,如图2.4.图2.43.设计全局ER图将实体的属性加入到初步ER图,可以得到图书馆借阅管理系统的全局ER图,如图2.5所示。三、关系模型设计数据库的关系模型设计是根据概念结构设计的全局ER图,按照转换规则,将ER图转换成数据模型的过程,即将所有的实体和联系转化为一系列的关系模式。ER图中实体应该单独提取出来作为一个关系模式,主键用横线标出,图书馆管理系统关系模式如下:图书类型(图书分类号,图书分类名称,描述信息)为图书类型实体对应的关系模式,其中“图书分类号”是图书类型的主键。图书(图书编号,图书名称,作者,出版社,图书状态,图书描述)为图书实体对应的关系模式,其中“图书编号”是图书的主键。读者(卡号,姓名,联系方式,罚款金,级别)为读者实体对应的关系模式,其中“卡号”是读者实体的主键。联系借阅是一个多对多的联系,按照转换规则,必须转换为一个独立的关系模式,其本身的属性包括借阅日期、归还日期,还应包括图书与读者的主键属性,所以借阅关系模式为:借阅(卡号,图书编号,借阅日期,归还日期)其中卡号和图书编号共同组成借阅这一实体的主键。借书的期限是一个月。当超过一个月,每多一天,该读者罚款金加0.1。预约(卡号,图书编号,预约日期)其中卡号和图书编号共同组成预约这一实体的主键。规定只有读者级别为高级才能进行预约功能。四、数据库实现本次课设是建立一个图书馆借阅管理系统,假定数据量不大,图书的更新增加操作也不频繁。1.创建图书馆管理系统数据库在mysql6.0中输入创建数据库成功。2.建立和管理基本表(1)、建立基本表经过上面的分析,要为“图书馆管理系统”数据库建立图书类型、图书、读者、借阅和预约5个基本表,下面对图书表的建立进行说明。图书类型表的创建:图书表的创建:读者表的创建:借阅表的创建:预约表的创建:(2)、管理基本表基本表建立之后,随着应用环境和需求的变化,有时候需要修改已经建立好的基本表。当需要增加某个字段时,例如,为读者表增加一列“sex”,数据类型是char(4)。具体的sql语句为:altertablereaderaddsexchar(4);当我们需要删除图书类型表时,具体地sql语句为:droptablebookclass;(3)、建立和管理视图视图一book_basic的建立:视图二reader_basic的建立:删除视图可以用dropview语句进行删除,删除视图二的sql语句如下:dropviewreader_basic;(4)、访问数据库为了数据库访问操作的要求,事先向每个表中都填入一些数据。每个基本表的实验数据如下:图书类别表:图书表:读者表:借阅表:预约表:在数据库应用系统中,数据查询是最常用的功能。数据查询是根据用户提出的各种要求在关系中查询,得到查询结果。常用的查询有简单查询、连接查询、嵌套查询、组合查询。对图书馆管理系统进行查询。(1)查询读者信息表:使用的sql语言为:select*fromreader;(2)查询鬼吹灯的出版社:使用sql语言为:selectbName,bPressfrombook wherebName=’鬼吹灯’;(3)查询罗彬的借阅信息和级别:使用sql语言为:selectbook.bName,rName,Lend,Returns,rPay,rlevel frombook,reader,record wherebook.bId=record.bIdand reader.rId=record.rIdand rName=’罗彬’;五、数据库应用程序分析1.首先设计界面用户认证界面:书籍查询界面:借阅记录界面:2.功能的实现通过jsp技术在EclipseJAVAEE平台往HTML中镶嵌jsp代码,用java.sql与数据库进行连接,设计出带有查询功能的网页认证功能:(1)认证失败:(2)认证成功:查询功能:点击查询(1)查询成功:(2)查询失败:也可以查询所有图书,点击图书一览表:最后是借阅记录(管理员端):(1)输入证件号、图书号、图书名任一个,点击查询(2)查询错误:(3)查询成功后的借阅记录界面:最后附上Eclipse的项目图:六、设计总结通过本次的课程设计,了解了设计一个数据库的基本流程,通过画ER关系图,DFD图了解了使用MicrosoftVisio的基本步骤,以前还只知道画图,PS等一些工具,现在有了MicrosoftVisio可以方便快捷的画出流程图、ER图等等。在创建数据库的过程中,发生了很多的错误,比如表中列的约束条件的使用格式,关键字的拼写,特别是在设置主键外键的时候,教科书上讲的FOREIGNKEY后面的外键名没有加(),自己设置的时候总是报错,后来查阅了一些书籍之后知道了要加()。创建好数据库后,导入数据的时候也有一些需要注意的事,比如输入的数据的格式要与表中列的格式一致,同时也要满足列的约束条件。最后就是数据库中数据的查询,从一个表中查询数据没什么太大的难度,从多个表查询数据的时候尤其要注意,如果两个表里面有相同的列名,就要在前面加上<表名.>,不然就会报错。最后就是数据库应用的实现,在Eclipse中开始有各种错误,各种调试,跟数据库的接口也是测试了好久才完成,然后就是界面的设计与界面跳转时数据的传输,面对中文的时候会出现乱码的情况,这时候需要在代码中设置charset=gbk和request.setCharacterEncording(gbk)等等。总而言之,这次的课程设计不仅巩固了之前上课所学习的知识,也将知识运用到了实践之中,对数据库的了解也相比之前上了一个台阶。七、参考文献(1)、周爱武,汪海威,肖云.数据库课程设计[C].北京:机械工业出版社,2012:93-119.(2)、张海藩.软件工程导论[C].北京:清华大学出版社,2008:40-45.(3)、王珊.数据库系统简明教程[C].北京:高等教育出版社2007:190-21(4)邹竹彪.JSP网络编程从入门到精通[C].北京:清华大学出版社 2007年6月淮海工学院计算机工程学院课程设计报告设计名称:数据结构课程设计选题名称:姓名:学号:专业班级:计算机科学与技术系院):计算机工程学院设计时间:设计地点:计算机实验室、教室成绩:指导教师评语:成绩:签名:年月日1.课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4、训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。2.课程设计任务与要求:任务根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。设计题目从任务书所列选题表中选取,每班每题不得超过2人。学生自选课题。学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。学生自选课题需在18周前报课程设计指导教师批准方可生效。要求:1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。2、设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);6、课程设计实践作为培养学生动手能力的一种手段,单独考核。3.课程设计说明书一需求分析停车场管理系统(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时计费。(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放,实现停车场的调度功能。(3)用要求以顺序栈模拟停车场,以链队列模拟便道。(4)从终端读入汽车到达或离去的数据,每组数据包括三项:①是“到达”还是“离去”;②汽车牌照号码;③“到达”或“离去”的时刻。(5)每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。二概要设计停车场管理系统1、系统用到的抽象数据类型定义:typedefstructnode{ charnum[10];//车牌号码Timereach;//到站时间Timeleave;//离开时间}CarNode;typedefstructtime{ inthour; intmin;}Time;typedefstructNODE{ CarNode*stack[MAX+1];//栈用顺序表示inttop;}SeqStackCar;typedefstructcar{ CarNode*data;//便道上的车用链表表示structcar*next;}QueueNode;typedefstructNode{ QueueNode*head;//设置头指针、尾指针。QueueNode*rear;}LinkQueueCar;系统中的子程序和功能说明:(1)voidInitStack(SeqStackCar*);//车辆节点进栈当栈未满时,就把到达的车辆进栈。(2)intInitQueue(LinkQueueCar*);//车辆节点进队列当栈满了时,车辆就进入便道上的队列中(3)intArrival(SeqStackCar*,LinkQueueCar*);//车辆到达登记车辆到达时,先登记车辆车牌号码。然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。。(4)voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);//车辆离开处理通过输入离开车辆的位置处理,然后调用PRINT(CarNode*p,introom);函数进行收费。。然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。(5)voidList(SeqStackCar,LinkQueueCar);//显示车场内和便道上的车辆情况用个switch();函数选择显示车场内或是便道上的车辆情况。包括对下面两个子函数的调用:voidList1(SeqStackCar*S);voidList2(LinkQueueCar*W);//分别为显示车场和便道上的车辆情况(6)voidPRINT(CarNode*p,introom);//车辆离开是的收费这个函数由车辆离开的函数调用,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。即只能当天停,当天开走。系统程序功能结构图停车场管理系统停车场管理系统车辆到达车辆离开列表显示到达时间车牌号码离开时间收费情况车场信息便道信息 三详细设计停车场管理系统算法的设计思想及流程图主要模块算法描述:本程序最主要的算法就是车辆到达登记的和车辆离开的。EQ\o\ac(○,1)车辆到达:intArrival(SeqStackCar*Enter,LinkQueueCar*W)首先定义一个栈和队列的结构体指针为:*p,*t,然后申请一个车辆信息的内存空间,并把它赋给栈指针.车辆到达时就输入车牌号,并通过if(Enter->top<MAX)来判断该车是进车场内还是进便道上,如果是进车场内就把top加1,显示在车场内的位置,还要输入进车场的时间,然后把该节点进栈。如果是else就显示该车要停在便道上,并进行进队列的操作。EQ\o\ac(○,2)车辆离开:voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)定义一个整型变量room记录要离开车辆的位置,定义两个栈指针和一个队列指针,用个if(Enter->top>0)确保栈不空,然后用个while(1)确保输入的车辆离开位置的合法性。如果不和法,显示输入有误,要重新输入。通过while(Enter->top>room)判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进车场内,并要调用PRINT(p,room);这个函数计算显示费用.然后还要用if((W->head!=W->rear)&&Enter->top<MAX)语句判断便道上有没有车,如果有车就要显示进车场的车的车牌号,并登记进入时间,并要进行相应的出队列和进栈操作。NYNY开始车辆到达判断栈是否满元素进入队列wait元素进入栈Enter栈Enter元素出栈队列中元素进栈队列wait元素出队结束图1.2:车辆离开车场NYNY开始车场是否为空Room前车辆进临时栈对room计费判便道是否有车便道车进车场结束图1.1:车辆到达车场图1.1源代码:intArrival(SeqStackCar*Enter,LinkQueueCar*W)//车辆的到达登记{ CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:B1234):");gets(p->num); if(Enter->top<MAX) { Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[Enter->top]=p;return(1); } else { printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;return(1); }}图1.2源代码:voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)//车辆的离开{ introom;CarNode*p,*t;QueueNode*q; if(Enter->top>0)//判断车场是否为空 { while(1) { printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break; elseprintf("\n输入有误,请重输:"); } while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。 { Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--; }p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--; while(Temp->top>=1)//再把临时栈里德车辆进停车场 { Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--; } PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top<MAX)//如果便道上有车,则再开进停车场。 { q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));W->head->next=q->next; if(q==W->rear)W->rear=W->head; Enter->stack[Enter->top]=t;free(q); } elseprintf("\n便道里没有车.\n"); } elseprintf("\n车场里没有车.");}显示车场里的车辆情况源程序:voidList1(SeqStackCar*S)//显示车场里的车辆情况{ inti;if(S->top>0) { printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++) { printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num); } } elseprintf("\n车场里没有车");}显示便道上的车辆情况源代码:voidList2(LinkQueueCar*W)//显示便道上的车辆情况{ QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear) { printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++) { printf("\n第%d车辆.",i); puts(p->data->num); p=p->next; } } elseprintf("\n便道里没有车."); printf("\n");}开始开始初始化两个栈Enter和Temp及一个队列Wait。进入主菜单车到达车离开退出Room前车辆进临时栈对room计费便道车信息车场内信息判便道是否有车车场是否为空列表显示栈Enter元素出栈队列中元素进栈队列Wait中元素出队元素进栈Enter便道车进车场元素进队列Wait判断栈是否为满结束退出列表显示是否否是否是图1.3:停车场管理系统主流程图.四程序设计与调试分析停车场管理系统测试数据:每个测试的数据都是以字符串的形式存储的,输入数据是严格按照提示的信息执行。调试遇到的问题与解决方法:在调试的过程中,输出员工信息的时候格式老是错位,调试了很多次才得以调整;在从文件中读出数据时老是显示不出数据,最后才发现原来是忘了写输出语句,但是在添加上去之后,能输出信息却有很多的乱码,仔细检查了一遍又一遍后终于发现了,原来是自己定义的指针在循环的过程中次序混乱了。在调试的过程中我还发现我的提示语句不多,导致让别人不知道下一步要做些什么,所以就适当的添加了一些提示的信息。五用户手册停车场管理系统【使用说明】(1)进入程序的界面,出现命令的帮助信息(停车场的最大容量为三辆车,多了则进入便道中等待其他车离开车场)。(2)输入1:车辆到达登记;输入2:车辆离开登记;输入3:车辆列表显示;输入4:退出系统(首先得进行车辆登记,否则停车场里没有车)(3)车辆登记时,到达的时间与离开的时间一定要严格按照时间的模式,如:8:00(4)显示车辆列表时,有相应的信息提示,看自己的意愿执行程序。(5)在觉得操作完毕时输入4:退出系统。【程序中的头文件】#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05六测试成果停车场管理系统七附录(源程序清单)停车场管理系统#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05typedefstructtime//定义时间结构体{ inthour; intmin;}Time;typedefstructnode//定义车辆信息结构体{ charnum[10];//车牌号码Timereach;//到站时间Timeleave;//离开时间}CarNode;typedefstructNODE{ CarNode*stack[MAX+1];inttop;}SeqStackCar;typedefstructcar{ CarNode*data;structcar*next;}QueueNode;typedefstructNode{ QueueNode*head;QueueNode*rear;}LinkQueueCar;voidInitStack(SeqStackCar*);intInitQueue(LinkQueueCar*);intArrival(SeqStackCar*,LinkQueueCar*);voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);voidList(SeqStackCar,LinkQueueCar);voidmain(){ SeqStackCarEnter,Temp;LinkQueueCarWait;intch;InitStack(&Enter);InitStack(&Temp);InitQueue(&Wait);while(1) { printf("\n§※§※§※§※§※§欢迎使用停车场系统(停车场最大容量为3辆)§※§※§※§※§\t");printf("\n\t※◎※◎※◎※◎1.车辆到达登记.※◎※◎※◎※◎\t\n");printf("\n\t※◎※◎※◎※◎2.车辆离开登记.※◎※◎※◎※◎\t\n");printf("\n\t※◎※◎※◎※◎3.车辆列表显示.※◎※◎※◎※◎\t\n");printf("\n\t※◎※◎※◎※◎4.退出系统.※◎※◎※◎※◎\t\n"); while(1) { printf("请选择:");scanf("%d",&ch);if(ch>=1&&ch<=4) break;elseprintf("\n输入有误,请重新选择:1~4:"); } switch(ch) { case1:Arrival(&Enter,&Wait); break;case2:Leave(&Enter,&Temp,&Wait);break;case3:List(Enter,Wait);break;case4:exit(0);default:break; } }}//自定义函数voidInitStack(SeqStackCar*s)//栈的初始化{inti;s->top=0;for(i=0;i<=MAX;i++) s->stack[s->top]=NULL;}intInitQueue(LinkQueueCar*Q)//队列的初始化{ Q->head=(QueueNode*)malloc(sizeof(QueueNode)); if(Q->head!=NULL) { Q->head->next=NULL;Q->rear=Q->head;return(1); }elsereturn(-1);}voidPRINT(CarNode*p,introom)//车辆收费{ intA1,A2,B1,B2; printf("\n车辆离开的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*price);free(p);}intArrival(SeqStackCar*Enter,LinkQueueCar*W)//车辆的到达登记{ CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:B1234):");gets(p->num); if(Enter->top<MAX) { Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[Enter->top]=p;return(1); } else { printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;return(1); }}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)//车辆的离开{ introom;CarNode*p,*t;QueueNode*q; if(Enter->top>0)//判断车场是否为空 { while(1) { printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break; elseprintf("\n输入有误,请重输:"); } while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。 { Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--; }p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--; while(Temp->top>=1)//再把临时栈里德车辆进停车场 { Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--; } PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top<MAX)//如果便道上有车,则再开进停车场。 { q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));W->head->next=q->next; if(q==W->rear)W->rear=W->head; Enter->stack[Enter->top]=t;free(q); } elseprintf("\n便道里没有车.\n"); } elseprintf("\n车场里没有车.");}voidList1(SeqStackCar*S)//显示车场里的车辆情况{ inti;if(S->top>0) { printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++) { printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num); } } elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{ QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear) { printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++) { printf("\n第%d车辆.",i); puts(p->data->num); p=p->next; } } elseprintf("\n便道里没有车."); printf("\n");}voidList(SeqStackCarS,LinkQueueCarW)//显示,遍历{ intflag,tag;flag=1; while(flag) { printf("查看车辆列表显示:");printf("\n1.车场列表\n2.便道列表\n3.返回主菜单\n");printf("\n请选择1~3:"); while(1) { scanf("%d",&tag);if(tag>=1&&tag<=3)break;elseprintf("\n输入有误,请重新选择1~3:"); } switch(tag) { case1:List1(&S);break;case2:List2(&W);break;case3:flag=0;break;default:break; } }}一需求分析简单的员工管理系统(1)该程序可用于对企业员工情况基本信息的存储、更新、查询、输出等操作,以实现对企业员工的管理。(2)其中更新功能包括:添加信息、删除信息、修改信息、可根据需要添加一个或多个员工信息,也可对个别员工信息进行适当的删除或修改。以便随时更新员工信息。(3)程序中设计的查询功能可根据需要从若干数据中查询某个员工信息,并且可根据两种不同的方法查询:按工作证号查询和按姓名查询。以满足不同的需要。二概要设计简单的员工管理系统系统用到的抽象数据类型定义:structwokers//定义结构体{ charnum[10];//员工工号 charname[15];//员工姓名 charsex[15];//员工性别 charbirthday[15];//员工出生年月 chardegree[10];//员工学历 charposition[10];//员工职位 charsalary[10];//员工工资 charaddress[20];//员工地址 chartelephone[20];//员工电话};typedefstructnode{ structwokersdata; structnode*next;//建立一个链表}Node;系统中的子程序和功能说明:(1)菜单模块:显示员工管理系统的主菜单,供用户选择所需的功能,通过主函数来实现。(2)添加模块:添加员工的工号、姓名以及其它的一些职工的相关信息,通过自己定义的voidAdd(Node*woker)函数来实现。(3)修改模块:可以修改需要修改的员工的相关信息,通过自己定义的voidchange(Node*woker)函数来实现。(4)浏览模块:浏览所有员工的相关信息,通过自己定义的voidDisp(Node*woker)函数来实现。(5)删除模块:删除需要删除的员工的所有信息,通过自己定义的voiddelet(Node*woker)函数来实现。(6)查询模块:可以按员工号和员工姓名来查询职工的相关信息,通过自己定义的voidsearch(Node*woker)函数来实现。(7)保存模块:将内存中员工的信息输出到磁盘文件中,可以通过自己定义的voidsave(Node*woker)函数来实现。(8)读取模块:将磁盘文件中员工的信息输出到屏幕中,可以通过自己定义的voidload(Node*woker)函数来实现。系统程序功能结构图简单员工管理系统简单员工管理系统添加员工信息修改员工信息浏览员工信息保存员工信息删除员工信息查找员工信息按员工工号查找按员工姓名查找读取员工信息三详细设计算法的设计思想及流程图简单的员工管理系统主要模块算法描述本程序的主要算法就是对于员工信息的添加、浏览、查找、删除模块为了方便起见本程序定义的结构体中,员工的信息都是以字符串来存储的。①在对员工信息的添加中,本程序利用的是链表将每个员工的信息都顺序的录入链表中。②同样的利用此方法浏览员工的信息,利用while()循环,直到指针p到链表的末尾。③在查找模块利用函数voidsearch()实现,里面包括两个子模块,第一个是以员工的工号来查找员工的相应的信息,第二个则是以员工的姓名来查找员工的相应的信息。④删除模块则是利用voiddelet()函数来实现。输入想删除的员工的工号,然后把相应的员工的信息都删除。图2.2:删除模块流程图YY图2.2:删除模块流程图YYYN开始链表为空输入要删除的员工的工号找到要删除的员工与否删除相应的员工信息结束Y图2.1:查找模块流程图图2.1源代码:voidsearch(Node*woker)//按条件查找员工信息{ Node*p; intsel,flag2;charfind[20]; p=woker->next; if(!woker->next)//若链表为空 { printf("没有资料可以查找!\n"); return; } printf("\t\t\t*************************************\n"); printf("\t\t\t*\t1:按员工工号查找\t*\n"); printf("\t\t\t*\t2:按员工姓名查找\t*\n"); printf("\t\t\t*************************************\n"); scanf("%d",&sel); if(sel==1) { flag2=0; printf("请输入你要查找的员工工号:"); scanf("%s",find); while(p) { if(strcmp(p->data.num,find)==0) { flag2=1; printf("工号姓名性别生日学历职位工资住址电话\n"); } if(flag2==1) printf("%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\n",p->data.num,p->,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); p=p->next; } if(flag2==0) printf("所要查找的员工不存在!\n"); } else if(sel==2) { flag2=0; printf("请输入你要查找的员工姓名:"); scanf("%s",find); while(p) { if(strcmp(p->,find)==0) { flag2=1; printf("工号姓名性别生日学历职位工资住址电话\n"); if(flag2==1) printf("%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\n",p->data.num,p->,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); p=p->next; } } if(flag2==0) printf("所要查找的员工不存在!\n"); }}图2.2源代码:voiddelet(Node*woker)//删除员工信息{ Node*p,*r,*s; charfind[10]; if(!woker->next) { printf("没有资料可以显示!\n"); return; } printf("请输入您要删除的员工工号!\n"); scanf("%s",find); p=woker->next; while(p!=NULL) { if(strcmp(p->data.num,find)==0)//如果找到的话返回的是符合要求 break; p=p->next; } if(!p) printf("找不到您要删除的员工工号!\n"); else { r=woker; while(r->next!=p) r=r->next; s=r->next; r->next=r->next->next; }}员工信息保存源代码:voidsave(Node*woker)//将员工信息保存到文件{ intn; Node*p; FILE*fp;//指向文件的指针 printf("需要保存吗?(1-保存0-不保存)"); scanf("%d",&n); if(n) { if(woker->next==NULL) printf("无记录"); else p=woker->next; if((fp=fopen("员工管理系统.txt","wb"))==NULL)//打开文件,并判断打开是否正常 printf("cannotopenfile\n");//打开文件失败 while(p!=NULL) { fprintf(fp,"%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\n",p->data.num,p->,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); p=p->next; } fclose(fp);//关闭文件 }}图2.3:简单的员工管理系统主流程图四程序设计与调试分析简单的员工管理系统测试数据:每个测试的数据严格按照提示的信息执行。调试遇到的问题与解决方法:在输入登记车辆到达时间的时候,没有相关的小时、分钟数字的限制范围——(小时0~23,分钟0~60);这就使程序不那么健壮了,还有,在计算收费时如果离开时间是到了第二天了,这样就可能会导致收费时负的或减少很多。就是说,还应该算天数,要不就要规定只能当天停,当天开走。我改了几次改不好,又鉴于程序要求中也没有提及,所以我也就没去改了。只要能实现主要的功能就好了。在以后不断的学习中,希望可以得以改善。五用户手册简单的员工管理系统【使用说明】(1)进入程序的界面,出现命令的帮助信息,并严格按照提示的信息完成相应的操作。(2)输入1:添加员工信息;输入2:修改员工信息;输入3:浏览员工信息;输入4:查找员工信息;输入5:删除员工信息;输入6:读取员工信息;输入7:退出系统(3)首先得先添加员工的信息,否则链表中没有信息无法进行下一步操作。(4)查找时,输入1:按员工工号查找;输入2:按员工姓名查找。(5)在觉得操作完毕时输入7:退出系统。【程序中的头文件】#include"stdio.h"#include"stdlib.h"#include"string.h"六测试成果简单的员工管理系统七附录(源程序清单)简单的员工管理系统#include"stdio.h"#include"stdlib.h"#include"string.h"structwokers//定义结构体{ charnum[10];//员工工号 charname[15];//员工姓名 charsex[15];//员工性别 charbirthday[15];//员工出生年月 chardegree[10];//员工学历 charposition[10];//员工职位 charsalary[10];//员工工资 charaddress[20];//员工地址 chartelephone[20];//员工电话};typedefstructnode{ structwokersdata; structnode*next;//建立一个链表}Node;voidAdd(Node*woker)//输入员工信息{ Node*p,*r,*s; charn[10];//先用于输入职工号,之后用于判断是否结束循环 r=woker; s=woker->next;//使s为第一个有用的结点 while(r->next!=NULL) r=r->next;//将指针置于表尾 while(1) { printf("输入0则返回主菜单!\n"); printf("请输入职工号:\n"); scanf("%s",n); if(strcmp(n,"0")==0) break; p=(Node*)malloc(sizeof(Node));//申请空间 strcpy(p->data.num,n); printf("请输入员工姓名:\n"); scanf("%s",p->); printf("请输入员工性别:\n"); scanf("%s",p->data.sex); printf("请输入员工出生年月:\n"); scanf("%s",p->data.birthday); printf("请输入员工学历:\n"); scanf("%s",p->data.degree); printf("请输入员工职位:\n"); scanf("%s",p->data.position); printf("请输入员工工资:\n"); scanf("%s",p->data.salary); printf("请输入员工住址:\n"); scanf("%s",p->data.address); printf("请输入员工电话:\n"); scanf("%s",p->data.telephone); printf("已完成一条记录的添加!\n"); p->next=NULL; r->next=p;//将p与先前的链表连起来构成一条新的链表 r=p;//将r重新设为新链的最后一个有用的结点 }}voidchange(Node*woker)//修改员工信息{ Node*p; charfind[20]; if(!woker->next) { printf("没有资料可以以修改!\n"); return; } printf("请输入要修改的职工号:"); scanf("%s",find); p=woker->next; while(p!=NULL) { if(strcmp(p->data.num,find)==0)//如果找到就跳出循环进下一步修改 break; p=p->next; } if(p)//如果指针不为空则找到了,并进行修改 { intx; while(1) { printf("完成修改请输入0,否则输入任意数再进行修改!"); scanf("%d",&x); if(x==0) break; printf("请输入新员工工号(字符型):",p->data.num); scanf("%s",p->data.num); printf("请输入新员工姓名(字符型):",p->); scanf("%s",p->); printf("请输入新员工性别(字符型):",p->data.sex); scanf("%s",p->data.sex); printf("请输入新员工出生年月(字符型):",p->data.birthday); scanf("%s",p->data.birthday); printf("请输入新员工学历(字符型):",p->data.degree); scanf("%s",p->data.degree); printf("请输入新员工职位(字符型):",p->data.position); scanf("%s",p->data.position); printf("请输入新员工工资(字符型):",p->data.salary); scanf("%s",p->data.salary); printf("请输入新员工住址(字符型):",p->data.address); scanf("%s",p->data.address); printf("请输入新员工电话(字符型):",p->data.telephone); scanf("%s",p->data.telephone); } }else printf("要修改的信息不存在!\n");}voidDisp(Node*woker)//输出员工信息{ Node*p; p=woker->next; if(!p) { printf("\n没有记录可以显示!\n"); return; } printf("\t\t显示结果\n\n"); printf("工号姓名性别生日学历职位工资住址电话\n"); while(p) { printf("%-9s%-10s%-8s%-5s%-9s%-9s%-8s%-6s%-7s\n",p->data.num,p->,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); printf("\n"); p=p->next; }}voidsearch(Node*woker)//按条件查找员工信息{ Node*p; intsel,flag2;charfind[20]; p=woker->next; if(!woker->next)//若链表为空 { printf("没有资料可以查找!\n"); return; } printf("\t\t\t*************************************\n"); printf("\t\t\t*\t1:按员工工号查找\t*\n"); printf("\t\t\t*\t2:按员工姓名查找\t*\n"); printf("\t\t\t*************************************\n"); scanf("%d",&sel); if(sel==1) { flag2=0; printf("请输入你要查找的员工工号:"); scanf("%s",find); while(p) { if(strcmp(p->data.num,find)==0) { flag2=1; printf("工号姓名性别生日学历职位工资住址电话\n"); } if(flag2==1) printf("%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\n",p->data.num,p->,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); p=p->next; } if(flag2==0) printf("所要查找的员工不存在!\n"); } else if(sel==2) { flag2=0; printf("请输入你要查找的员工姓名:"); scanf("%s",find); while(p) { if(strcmp(p->,find)==0) { flag2=1; printf("工号姓名性别生日学历职位工资住址电话\n"); if(flag2==1) printf("%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\n",p->data.num,p->,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); p=p->next; } } if(flag2==0) printf("所要查找的员工不存在!\n"); }}voidload(Node*woker)//从文件中读取数据{ Node*p; FILE*fp;//指向文件的指针 intrecordNum;//统计记录数 if((fp=fopen("员工管理系统.txt","rb"))==NULL)//打开文件 printf("cannotopenfile\n");//打开文件失败 p=woker; recordNum=0;printf("工号姓名性别生日学历职位工资住址电话\n"); while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s%s%s%s",p->data.num,p->,p->data.sex,p->data.birthday,p->data.degree,p->data.positio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度医院与医药研发机构新药临床试验合作协议
- 二零二五年度互联网贷款居间推广合同范本
- 二零二五年度房产抵押贷款合同履行监督合同
- 二零二五年度个人对个人无担保紧急借款合同
- 二零二五年度股东合作风险共担与市场拓展合作协议
- 二零二五年度特色果树种植基地承包经营合同
- 二零二五年度人工智能医疗合作诚意金合同
- 二零二五年度美发店连锁经营合作协议书
- 二零二五年度旅游保险代理合作协议模板
- 2025年度邻里拆墙安全责任协议书
- 2025年黑龙江农业职业技术学院单招职业技能测试题库及答案1套
- 特种设备生产和充装单位许可规则
- 华润电力六合马鞍120兆瓦渔(农)光互补光伏发电项目110千伏送出工程报告表
- 女生自尊自爱知识讲座
- 小学生春季传染病预防
- deepseek在智慧城市建设中的应用前景
- 2025年电工特种作业人员上岗操作证考试全真模拟试题库及答案(共七套)
- 有创动脉血压监测
- 全国导游基础知识-全国导游基础知识章节练习
- 【安排表】2024-2025学年下学期学校升旗仪式安排表 主题班会安排表
- 2025年度老旧小区改造施工委托合同范本
评论
0/150
提交评论