课 程 设 计
题 目 学 院 专 业 班 级 姓 名 指导教师
图书馆服务系统 计算机科学与技术学院 计算机科学与技术
计算机班
20XX 年 12 月 10 日
2
目录
图书馆服务系统 .................................................................................................. 4
一、需求分析 ................................................................................................ 4
1.需求概括 .............................................................................................. 4 2、数据流图 ........................................................................................... 4 二.概念模型设计 ....................................................................................... 5
1. 图书管理系统 .................................................................................... 5 2.设计分ER图 ...................................................................................... 6 3.设计全局ER图 .................................................................................. 7 三、关系模型设计 ....................................................................................... 8 四、数据库实现 ........................................................................................... 8
1.创建图书馆管理系统数据库 ........................................................... 8 2.建立和管理基本表............................................................................. 9 五、数据库应用程序分析 ....................................................................... 14
1.首先设计界面.................................................................................... 14 2.功能的实现 ........................................................................................ 15 六、设计总结 .............................................................................................. 19 七、参考文献 .............................................................................................. 20
3
图书馆服务系统
一、需求分析
1.需求概括
随着科学技术的不断提高,计算机科学日渐成熟, 作为计算机应用的一部分,使用计算机对图书信息进行管理,具有手工管理所无法比拟的优点。分析图书管理流程,系统应该实现以下功能:图书管理员可以维护图书信息,包括增加新书、修改图书信息、办理图书借阅登记、图书归还登记、丢失图书处理等。读者可以实现借书、还书、查阅图书信息等。具体要求如下:
(1)图书信息管理:录入各种图书信息、维护图书信息等。图书信息包括图书编号、名称、类型、作者、出版社等。
(2)读者信息管理:维护读者信息,根据实际情况修改、更新、删除读者信息。读者信息包括校园卡号、姓名等。
(3)借阅管理:包括借书、还书、过期图书归还处理等。 图书管理系统主要有3种用户:
(1)系统管理员:拥有系统最高权限、设置管理员等。
(2)图书管理员:维护图书基本数据,进行读者的图书借阅和归还处理。 (3)读者用户:查阅图书信息、借阅图书。
图书馆图书情况和管理规定,每种类型图书有很多不同的图书 每位读者可同时借阅6本,每本图书借阅期限是一个月。
2、数据流图
图书管理系统具体数据流图DFD如下:
4
二.概念模型设计
1. 图书管理系统
图书管理系统主要包含图书类型、图书信息和读者3个实体画出3个实体的ER图,并标出实体的主键,如图2.1、图2.2、图2.3。
5
2.设计分ER图
在图书借阅管理系统中涉及3个实体:图书、图书类型、读者,这三个实体之间互相存在着
联系。根据需求分析可知一名读者最多可借阅10本书,一本书可以被不同的读者借阅,因此读者与图书之间存在着多对多的关系,一本图书对应一种图书类型,一种图书类型可以对应
6
多种图书,因此图书与图书类型存在着一对多的关系。通过以上分析,可以得到图书管理系统的局部ER图,如图2.4.
图2.4
3.设计全局ER图
将实体的属性加入到初步ER图,可以得到图书馆借阅管理系统的全局ER图,如图2.5所
示。
7
三、关系模型设计
数据库的关系模型设计是根据概念结构设计的全局ER图,按照转换规则,将ER图转换成
数据模型的过程,即将所有的实体和联系转化为一系列的关系模式。
ER图中实体应该单独提取出来作为一个关系模式,主键用横线标出,图书馆管理系统关系模式如下:
1. 图书类型(图书分类号,图书分类名称,描述信息)为图书类型实体对应的关系模式,其中“图书分类号”是图书类型的主键。
2. 图书(图书编号,图书名称,作者,出版社,图书状态,图书描述)为图书实体对应的关系模式,其中“图书编号”是图书的主键。
3. 读者(卡号,姓名,联系方式,罚款金,级别)为读者实体对应的关系模式,其中“卡号”是读者实体的主键。
联系借阅是一个多对多的联系,按照转换规则,必须转换为一个的关系模式,其本身的属性包括借阅日期、归还日期,还应包括图书与读者的主键属性,所以借阅关系模式为:
4. 借阅(卡号,图书编号,借阅日期,归还日期)其中卡号和图书编号共同组成借阅这一实体的主键。借书的期限是一个月。当超过一个月,每多一天,该读者罚款金加0.1。
5. 预约(卡号,图书编号,预约日期)其中卡号和图书编号共同组成预约这一实体的主键。规定只有读者级别为高级才能进行预约功能。
四、数据库实现
本次课设是建立一个图书馆借阅管理系统,假定数据量不大,图书的更新增加操作也不频
繁。
1.创建图书馆管理系统数据库
在my sql 6.0中输入
8
创建数据库成功。
2.建立和管理基本表
(1)、建立基本表
经过上面的分析,要为“图书馆管理系统”数据库建立图书类型、图书、读者、借阅和预约5个基本表,下面对图书表的建立进行说明。 图书类型表的创建:
图书表的创建:
读者表的创建:
9
借阅表的创建:
预约表的创建:
(2)、管理基本表
基本表建立之后,随着应用环境和需求的变化,有时候需要修改已经建立好的基本表。 当需要增加某个字段时,例如,为读者表增加一列“sex”,数据类型是char(4)。具体的sql语句为:
alter table reader add sex char(4);
当我们需要删除图书类型表时,具体地sql语句为:
10
drop table bookclass; (3)、建立和管理视图
视图一 book_basic的建立:
视图二 reader_basic的建立:
删除视图可以用drop view语句进行删除,删除视图二的sql语句如下: drop view reader_basic; (4)、访问数据库
为了数据库访问操作的要求,事先向每个表中都填入一些数据。每个基本表的实验数据如下:
图书类别表:
图书表:
11
读者表:
借阅表:
预约表:
12
在数据库应用系统中,数据查询是最常用的功能。数据查询是根据用户提出的各种要求在关系中查询,得到查询结果。常用的查询有简单查询、连接查询、嵌套查询、组合查询。对图书馆管理系统进行查询。 (1)查询读者信息表:
使用的sql语言为: select * from reader;
(2)查询鬼吹灯的出版社: 使用sql语言为:
select bName,bPress from book
where bName=’鬼吹灯’;
(3)查询罗彬的借阅信息和级别: 使用sql语言为:
select book.bName,rName,Lend,Returns,rPay,rlevel
13
from book,reader,record where book.bId=record.bId and
reader.rId=record.rId and rName=’罗彬’;
五、数据库应用程序分析
1.首先设计界面
用户认证界面:
书籍查询界面:
14
借阅记录界面:
2.功能的实现
通过jsp技术在Eclipse JAVA EE平台往HTML中镶嵌jsp代码,用java.sql与数据库进行连接,设计出带有查询功能的网页 认证功能:(1)认证失败:
(2)认证成功:
15
查询功能:
点击查询 (1)查询成功:
16
(2)查询失败:
也可以查询所有图书, 点击图书一览表:
最后是借阅记录(管理员端):
(1)输入证件号、图书号、图书名任一个,点击查询
17
(2)查询错误:
(3)查询成功后的借阅记录界面:
18
最后附上Eclipse的项目图:
六、设计总结
通过本次的课程设计,了解了设计一个数据库的基本流程,通过画ER关系图,DFD图了解了使用Microsoft Visio的基本步骤,以前还只知道画图,PS等一些工具,现在有了Microsoft Visio可以方便快捷的画出流程图、ER图等等。在创建数据库的过程中,发生了很多的错误,比如表中列的约束条件的使用格式,关键字的拼写,特别是在设置主键外键的时候,教科书上讲的FOREIGN KEY后面的外键名没有加(),自己设置的时候总是报错,后来查阅了一些书籍之后知道了要加()。创建好数据库后,导入数据的时候也有一些需要注意的事,比如输入的数据的格式要与表中列的格式一致,同时也要满足列的约束条件。最后就是数据库中数据的查询,从一个表中查询数据没什么太大的难度,从多个表查询数据的时候尤
19
其要注意,如果两个表里面有相同的列名,就要在前面加上<表名.>,不然就会报错。最后就是数据库应用的实现,在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月
淮 海 工 学 院 计算机工程学院
课程设计报告
设计名称: 数据结构课程设计 选题名称: 姓 名: 学 号:
20
专业班级: 计算机科学与技术 系 (院): 计算机工程学院 设计时间:
设计地点: 计算机实验室、教室
指导教师评语: 签名: 年 月 日 成绩: 21
1.课程设计目的 1、训练学生灵活应用所学数据结构知识,完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3、提高综合运用所学的理论知识和方法分析和解决问题的能力; 4、训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。 2.课程设计任务与要求: 任务 根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。 设计题目从任务书所列选题表中选取,每班每题不得超过2人。 学生自选课题。 学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。学生自选课题需在18周前报课程设计指导教师批准方可生效。 要求: 1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。 1
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释; 4、每位同学需提交可运行的程序; 5、每位同学需提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算); 6、课程设计实践作为培养学生动手能力的一种手段,单独考核。 3.课程设计说明书 一 需求分析 停车场管理系统 (1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时计费。 (2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放,实现停车场的调度功能。 (3)用要求以顺序栈模拟停车场,以链队列模拟便道。 (4) 从终端读入汽车到达或离去的数据,每组数据包括三项: ①是“到达”还是“离去”; ②汽车牌照号码; ③“到达”或“离去”的时刻。 (5)每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。 二 概要设计 停车场管理系统 2
1、系统用到的抽象数据类型定义: typedef struct node { char num[10]; //车牌号码 Time reach; //到站时间 Time leave; //离开时间 }CarNode; typedef struct time { int hour; int min; }Time; typedef struct NODE { CarNode *stack[MAX+1]; //栈用顺序表示 int top; }SeqStackCar; typedef struct car { CarNode *data; // 便道上的车用链表表示 struct car *next; }QueueNode; typedef struct Node 3
{ QueueNode *head; // 设置头指针、尾指针。 QueueNode *rear; }LinkQueueCar; 2、 系统中的子程序和功能说明: (1)void InitStack(SeqStackCar *); //车辆节点进栈 当栈未满时,就把到达的车辆进栈。 (2)int InitQueue(LinkQueueCar *); //车辆节点进队列 当栈满了时,车辆就进入便道上的队列中 (3)int Arrival(SeqStackCar *,LinkQueueCar *); //车辆到达登记 车辆到达时,先登记车辆车牌号码。然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。。 (4) void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); //车辆离开处理 通过输入离开车辆的位置处理,然后调用PRINT(CarNode *p,int room);函数进行收费。。然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。 (5)void List(SeqStackCar,LinkQueueCar); //显示车场内和便道上的车辆情况 用个switch();函数选择显示车场内或是便道上的车辆情况。 包括对下面两个子函数的调用: void List1(SeqStackCar *S); void List2(LinkQueueCar *W); //分别为显示车场和便道上的车辆情况 (6)void PRINT(CarNode *p,int room); // 车辆离开是的收费 这个函数由车辆离开的函数调用,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。即只能当天停,当天开走。 3、 系统程序功能结构图 停车场管理系统 车辆到达 车辆离开 4 列表显示 车到离收车便
三 详细设计 停车场管理系统 算法的设计思想及流程图 主要模块算法描述: 本程序最主要的算法就是车辆到达登记的和车辆离开的。 1车辆到达:int Arrival(SeqStackCar *Enter,LinkQueueCar *W) ○首先定义一个栈和队列的结构体指针为:*p , *t , 然后申请一个车辆信息的内存空间,并把它赋给栈指针.车辆到达时就输入车牌号,并通过if(Enter->top 图1.1源代码: int Arrival(SeqStackCar *Enter,LinkQueueCar *W)// 车辆的到达登记 { CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode)); flushall(); printf(\"\\n请输入车牌号(例:B1234):\"); gets(p->num); if(Enter->top return(1); } } 图1.2源代码: void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)//车辆的离开 { int room; CarNode *p,*t; QueueNode *q; if(Enter->top>0) // 判断车场是否为空 { while(1) { printf(\"\\n请输入车在车场的位置/1--%d/:\ scanf(\"%d\ if(room>=1&&room<=Enter->top) break; else printf(\"\\n 输入有误,请重输: \"); } while(Enter->top>room) // 把要删除的车辆的前面的车开出来,进临时栈。 { Temp->top++; Temp->stack[Temp->top]=Enter->stack[Enter->top]; Enter->stack[Enter->top]=NULL; Enter->top--; 8 } 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 } else printf(\"\\n便道里没有车.\\n\"); } else printf(\"\\n车场里没有车.\"); 显示车场里的车辆情况源程序: void List1(SeqStackCar *S) //显示车场里的车辆情况 { int i; if(S->top>0) { printf(\"\\n车场:\"); printf(\"\\n 位置 到达时间 车牌号\\n\"); for(i=1;i<=S->top;i++) { printf(\" %d \ printf(\" %d:%d \ puts(S->stack[i]->num); } else printf(\"\\n车场里没有车\"); } 10 } 显示便道上的车辆情况源代码: void List2(LinkQueueCar *W) //显示便道上的车辆情况 { QueueNode *p; int i; p=W->head->next; if(W->head!=W->rear) { printf(\"\\n等待车辆的号码为:\"); for(i=1; (p!=NULL); i++) } 11 { printf(\"\\n第 %d 车辆.\puts(p->data->num); p=p->next ; } else printf(\"\\n便道里没有车.\"); printf(\"\\n\"); } 开始 初始化两个栈Enter和Temp及一个队列Wait。 进入主菜单 车到达 车离开 列表显示 退出 是 车场是否为空 否 车场内信息 便道车信息 退出列表显示 Room前车辆进临时栈 对room计费 否 判便道是否有车 是 判断栈是否为满 否 元素进栈Enter 是 元素进队列Wait 便道车进车场 栈Enter元素出栈 队列Wait中元素出队 队列中元素进栈 结束 12 图1.3:停车场管理系统主流程图. 四 程序设计与调试分析 停车场管理系统 测试数据: 每个测试的数据都是以字符串的形式存储的,输入数据是严格按照提示的信息执行。 调试遇到的问题与解决方法: 在调试的过程中,输出员工信息的时候格式老是错位,调试了很多次才得以调整;在从文件中读出数据时老是显示不出数据,最后才发现原来是忘了写输出语句,但是在添加上去之后,能输出信息却有很多的乱码,仔细检查了一遍又一遍后终于发现了,原来是自己定义的指针在循环的过程中次序混乱了。在调试的过程中我还发现我的提示语句不多,导致让别人不知道下一步要做些什么,所以就适当的添加了一些提示的信息。 五 用户手册 停车场管理系统 【 使用说明 】 (1)进入程序的界面,出现命令的帮助信息(停车场的最大容量为三辆车,多了则进入便道中等待其他车离开车场)。 (2)输入1:车辆到达登记;输入2:车辆离开登记;输入3:车辆列表显示;输入4:退出系统(首先得进行车辆登记,否则停车场里没有车) (3)车辆登记时,到达的时间与离开的时间一定要严格按照时间的模式,如:8:00 (4)显示车辆列表时,有相应的信息提示,看自己的意愿执行程序。 13 (5)在觉得操作完毕时输入4:退出系统。 【 程序中的头文件 】 #include 15 16 17 18 一 需求分析 简单的员工管理系统 (1)该程序可用于对企业员工情况基本信息的存储、更新、查询、输出等操作,以实现对企业员工的管理。 (2) 其中更新功能包括:添加信息、删除信息、修改信息、可根据需要添加一个或多个员工信息,也可对个别员工信息进行适当的删除或修改。以便随时更新员工信息。 (3) 程序中设计的查询功能可根据需要从若干数据中查询某个员工信息,并且可根据两种不同的方法查询:按工作证号查询和按姓名查询。以满足不同的需要。 二 概要设计 简单的员工管理系统 1、 系统用到的抽象数据类型定义: struct wokers //定义结构体 { char num[10]; //员工工号 char name[15]; //员工姓名 char sex[15]; //员工性别 char birthday[15];//员工出生年月 char degree[10]; //员工学历 char position[10];//员工职位 char salary[10]; //员工工资 char address[20];//员工地址 19 }; char telephone[20];//员工电话 typedef struct node { struct wokers data; struct node *next;//建立一个链表 }Node; 2、 系统中的子程序和功能说明: (1)菜单模块:显示员工管理系统的主菜单,供用户选择所需的功能,通过主函数来实现。 (2)添加模块:添加员工的工号、姓名以及其它的一些职工的相关信息,通过自己定义的void Add(Node *woker)函数来实现。 (3)修改模块:可以修改需要修改的员工的相关信息,通过自己定义的void change(Node *woker)函数 来实现。 (4)浏览模块:浏览所有员工的相关信息,通过自己定义的void Disp(Node *woker)函数来实现。 (5)删除模块:删除需要删除的员工的所有信息,通过自己定义的void delet(Node *woker)函数来实现。 (6)查询模块:可以按员工号和员工姓名来查询职工的相关信息,通过自己定义的void search(Node *woker)函数来实现。 (7)保存模块:将内存中员工的信息输出到磁盘文件中,可以通过自己定义的void save(Node *woker)函数来实现。 (8)读取模块:将磁盘文件中员工的信息输出到屏幕中,可以通过自己定义的void load(Node *woker)函数来实现。 20 3、 系统程序功能结构图 21 简单员工管理系统 添加员工信修改 员工信浏览员工信保存员工信删除员工信读取员工信查找员工信息 按员工工号查按员工姓名查 三 详细设计 算法的设计思想及流程图 简单的员工管理系统 主要模块算法描述 本程序的主要算法就是对于员工信息的添加、浏览、查找、删除模块 为了方便起见本程序定义的结构体中,员工的信息都是以字符串来存储的。 ①在对员工信息的添加中,本程序利用的是链表将每个员工的信息都顺序的录入链表中。 ②同样的利用此方法浏览员工的信息,利用while()循环,直到指针p到链表的末尾。 ③在查找模块利用函数void search()实现,里面包括两个子模块,第一个是以员工的工号来查找员工的相应的信息,第二个则是以员工的姓名来查找员工的相应的信息。 ④删除模块则是利用void delet()函数来实现。输入想删除的员工的工号,然后把相应的员工的信息都删除。 22 开始 Y Y 链表为空 Y 输入要删除的员工的工号 N 找到要删除的员工与否 Y 删除相应的员工信息 结束 图2.2:删除模块流程图 图2.1:查找模块流程图 23 图2.1源代码: void search(Node *woker)//按条件查找员工信息 { Node *p; int sel,flag2; char find[20]; p=woker->next; if(!woker->next)//若链表为空 { } printf(\"\\\*************************************\\n\"); printf(\"\\\*\1:按员工工号查找\ *\\n\"); printf(\"\\\*\2:按员工姓名查找\ *\\n\"); printf(\"\\\*************************************\\n\"); scanf(\"%d\if(sel==1) { flag2=0; printf(\"请输入你要查找的员工工号:\"); scanf(\"%s\while(p) printf(\"没有资料可以查找!\\n\"); return; 24 { 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\>data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); } else if(sel==2) { flag2=0; } if(flag2==0) printf(\"所要查找的员工不存在!\\n\"); p=p->next; printf(\"请输入你要查找的员工姓名:\"); scanf(\"%s\while(p) { if(strcmp(p->data.name,find)==0) { flag2=1; printf(\"工号 姓名 性别 生日 学历 职位 工25 资 住址 电话\\n\"); if(flag2==1) printf(\"%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\\n\>data.num,p->data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); } } } if(flag2==0) printf(\"所要查找的员工不存在!\\n\"); p=p->next; } 图2.2源代码: void delet(Node *woker)//删除员工信息 { Node *p,*r,*s; char find[10]; if(!woker->next) { } printf(\"请输入您要删除的员工工号!\\n\"); scanf(\"%s\p=woker->next; printf(\"没有资料可以显示!\\n\"); return; 26 } while(p!=NULL) { } if(!p) else { } r=woker; while(r->next!=p) r=r->next; printf(\"找不到您要删除的员工工号!\\n\"); if(strcmp(p->data.num,find)==0)//如果找到的话返回的是符合要求 break; p=p->next; s=r->next; r->next=r->next->next; 员工信息保存源代码: void save(Node *woker)//将员工信息保存到文件 { int n; Node *p; FILE *fp;//指向文件的指针 printf(\"需要保存吗?(1-保存 0-不保存)\"); scanf(\"%d\27 if(n) { if(woker->next==NULL) else p=woker->next; printf(\"无记录\"); if((fp=fopen(\"员工管理系统.txt\打开文件,并判断打开是否正常 printf(\"can not open file\\n\");//打开文件失败 while(p!=NULL) { fprintf(fp,\"%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\\n\>data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); } } } fclose(fp);//关闭文件 p=p->next; 28 29 图2.3:简单的员工管理系统主流程图 四 程序设计与调试分析 简单的员工管理系统 测试数据: 每个测试的数据严格按照提示的信息执行。 调试遇到的问题与解决方法: 在输入登记车辆到达时间的时候,没有相关的小时、分钟数字的范围——(小时 0~23,分钟 0~60);这就使程序不那么健壮了,还有,在计算收费时如果离开时间是到了第二天了,这样就可能会导致收费时负的或减少很多。就是说,还应该算天数,要不就要规定只能当天停,当天开走。我改了几次改不好,又鉴于程序要求中也没有提及,所以我也就没去改了。只要能实现主要的功能就好了。在以后不断的学习中,希望可以得以改善。 五 用户手册 简单的员工管理系统 【 使用说明 】 (1)进入程序的界面,出现命令的帮助信息,并严格按照提示的信息完成相应的操作。 (2)输入1:添加员工信息;输入2:修改员工信息;输入3:浏览员工信息;输入4:查找员工信息;输入5:删除员工信息;输入6:读取员工信息;输入7:退出系统 (3)首先得先添加员工的信息,否则链表中没有信息无法进行下一步操作。 30 (4)查找时,输入1:按员工工号查找;输入2:按员工姓名查找。 (5)在觉得操作完毕时输入7:退出系统。 【 程序中的头文件 】 #include \"stdio.h\" #include \"stdlib.h\" #include \"string.h\" 六 测试成果 简单的员工管理系统 31 32 33 34 35 36 37 38 七 附录(源程序清单) 简单的员工管理系统 #include \"stdio.h\" #include \"stdlib.h\" #include \"string.h\" struct wokers //定义结构体 { char num[10]; //员工工号 char name[15]; //员工姓名 char sex[15]; //员工性别 char birthday[15];//员工出生年月 char degree[10]; //员工学历 char position[10];//员工职位 char salary[10]; //员工工资 char address[20];//员工地址 char telephone[20];//员工电话 39 }; typedef struct node { struct wokers data; struct node *next;//建立一个链表 }Node; void Add(Node *woker) //输入员工信息 { Node *p,*r,*s; char n[10]; //先用于输入职工号,之后用于判断是否结束循环 r=woker; s=woker->next; //使s为第一个有用的结点 while(r->next!=NULL) r=r->next; //将指针置于表尾 while(1) { printf(\"输入0则返回主菜单!\\n\"); printf(\"请输入职工号:\\n\"); scanf(\"%s\if(strcmp(n,\"0\")==0) break; p=(Node *)malloc(sizeof(Node)); //申请空间 strcpy(p->data.num,n); printf(\"请输入员工姓名:\\n\"); scanf(\"%s\printf(\"请输入员工性别:\\n\"); scanf(\"%s\40 } } printf(\"请输入员工出生年月:\\n\"); scanf(\"%s\printf(\"请输入员工学历:\\n\"); scanf(\"%s\printf(\"请输入员工职位:\\n\"); scanf(\"%s\printf(\"请输入员工工资:\\n\"); scanf(\"%s\printf(\"请输入员工住址:\\n\"); scanf(\"%s\printf(\"请输入员工电话:\\n\"); scanf(\"%s\printf(\"已完成一条记录的添加!\\n\"); p->next=NULL; r->next=p; //将p与先前的链表连起来构成一条新的链表 r=p;//将r重新设为新链的最后一个有用的结点 void change(Node *woker) //修改员工信息 { Node *p; char find[20]; if(!woker->next) { } 41 printf(\"没有资料可以以修改!\\n\"); return; printf(\"请输入要修改的职工号:\"); scanf(\"%s\p=woker->next; while(p!=NULL) { if(strcmp(p->data.num,find)==0) //如果找到就跳出循环进下一步修改 break; p=p->next; } if(p) //如果指针不为空则找到了,并进行修改 { int x; while(1) { printf(\"完成修改请输入0,否则输入任意数再进行修改!\"); scanf(\"%d\if(x==0) break; printf(\"请输入新员工工号(字符型):\scanf(\"%s\printf(\"请输入新员工姓名(字符型):\scanf(\"%s\printf(\"请输入新员工性别(字符型):\scanf(\"%s\printf(\"请输入新员工出生年月(字符型):\scanf(\"%s\printf(\"请输入新员工学历(字符型):\42 } scanf(\"%s\printf(\"请输入新员工职位(字符型):\scanf(\"%s\printf(\"请输入新员工工资(字符型):\scanf(\"%s\printf(\"请输入新员工住址(字符型):\ scanf(\"%s\printf(\"请输入新员工电话(字符型):\ scanf(\"%s\} else } void Disp(Node *woker)//输出员工信息 { Node *p; p=woker->next; if(!p) { } printf(\"\\----------------显示结果----------------\\n\\n\"); printf(\"工号 姓名 性别 生日 学历 职位 工资 住址 电话\\n\"); while(p) { 43 printf(\"要修改的信息不存在!\\n\"); printf(\"\\n没有记录可以显示!\\n\"); return; printf(\"%-9s%-10s%-8s%-5s%-9s%-9s%-8s%-6s%-7s\\n\>data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); } void search(Node *woker)//按条件查找员工信息 { Node *p; int sel,flag2; } printf(\"\\n\"); p=p->next; char find[20]; p=woker->next; if(!woker->next)//若链表为空 { } printf(\"\\\*************************************\\n\"); printf(\"\\\*\1:按员工工号查找\ *\\n\"); printf(\"\\\*\2:按员工姓名查找\ *\\n\"); printf(\"\\\*************************************\\n\"); scanf(\"%d\if(sel==1) { flag2=0; printf(\"请输入你要查找的员工工号:\"); scanf(\"%s\printf(\"没有资料可以查找!\\n\"); return; 44 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\>data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); } else if(sel==2) { flag2=0; } if(flag2==0) printf(\"所要查找的员工不存在!\\n\"); p=p->next; printf(\"请输入你要查找的员工姓名:\"); scanf(\"%s\while(p) { if(strcmp(p->data.name,find)==0) { flag2=1; 45 资 住址 电话\\n\"); printf(\"工号 姓名 性别 生日 学历 职位 工 if(flag2==1) printf(\"%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\\n\>data.num,p->data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); } void load(Node *woker)//从文件中读取数据 { Node *p; FILE *fp;//指向文件的指针 int recordNum;//统计记录数 if((fp=fopen(\"员工管理系统.txt\打开文件 printf(\"can not open file\\n\");//打开文件失败 } } if(flag2==0) printf(\"所要查找的员工不存在!\\n\"); p=p->next; } p=woker; recordNum=0; printf(\"工号 姓名 性别 生日 学历 职位 工资 住址 电话\\n\"); while(!feof(fp)) { fscanf(fp,\"%s%s%s%s%s%s%s%s%s\>data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone);//从文件读入记录 printf(\"%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\\n\46 >data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); } void save(Node *woker)//将员工信息保存到文件 { int n; Node *p; FILE *fp;//指向文件的指针 printf(\"需要保存吗?(1-保存 0-不保存)\"); scanf(\"%d\if(n) { if(woker->next==NULL) else p=woker->next; printf(\"无记录\"); p=p->next; } fclose(fp); printf(\"\ ------------------文件里共有%d条记录--------------------\\n\recordNum++; if((fp=fopen(\"员工管理系统.txt\打开文件,并判断打开是否正常 printf(\"can not open file\\n\");//打开文件失败 while(p!=NULL) { fprintf(fp,\"%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7s\\n\>data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary,p->data.address,p->data.telephone); 47 } } } p=p->next; fclose(fp);//关闭文件 void delet(Node *woker)//删除员工信息 { Node *p,*r,*s; char find[10]; if(!woker->next) { } printf(\"请输入您要删除的员工工号!\\n\"); scanf(\"%s\p=woker->next; while(p!=NULL) { } if(!p) else { 48 printf(\"没有资料可以显示!\\n\"); return; if(strcmp(p->data.num,find)==0)//如果找到的话返回的是符合要求 break; p=p->next; printf(\"找不到您要删除的员工工号!\\n\"); } } r=woker; while(r->next!=p) r=r->next; s=r->next; r->next=r->next->next; void main() { Node *woker; int flag=1; Node *p; printf(\"\********************欢迎进入员工信息管理系统*******************\\n\"); woker=(Node*)malloc(sizeof(Node)); woker->next=NULL;; p=woker; while(flag) { printf(\"\ ****************************目录*****************************\"); printf(\"\\n\\-----------------------------------------\"); printf(\"\\n\\|\ 1:添加员工信息\\|\"); printf(\"\\n\\|\ 2:修改员工信息\\|\"); printf(\"\\n\\|\ 3:浏览员工信息\\|\"); printf(\"\\n\\|\ 4:查找员工信息\\|\"); printf(\"\\n\\|\ 5:删除员工信息\\|\"); printf(\"\\n\\|\ 6:读取员工信息\\|\"); 49 printf(\"\\n\\|\ 7:退出系统 \\|\"); printf(\"\\n\\-----------------------------------------\"); printf(\"\\n请输入您要操作的序号:\"); scanf(\"%d\switch(flag) { case 1:Add(woker);save(woker);break; case 2:change(woker);break; case 3:Disp(woker);break; case 4:search(woker);break; case 5:delet(woker);break; case 6:load(woker);break; case 7:{printf(\"\********************谢谢使用员工信息管理系统*******************\\n\");flag=0;break;} } } } default:printf(\"输入错误!\\n\");break; 八、课程设计心得 这次的课程设计比去年的c++的课程设计是难多了,不过,多了这半期的学习,还是能够应付的。我这次的课程设计题目是关于停车场问题和简单员工管理系统的。 在关于停车场问题中主要是运用了栈和队列的一些知识和操作。也没有用到其他太多的数据结构知识。程序基本上还是能够运行,结果也正确,能够实现那些基本的车辆到达、离开、收费、遍历显示等主要功能。 但我觉得这个程序还有很多小的地方是可以完善的,比如:在输入登记车辆到达时间的时候,50 没有相关的小时、分钟数字的范围——(小时 0~23,分钟 0~60);这就使程序不那么健壮了,还有,在计算收费时如果离开时间是到了第二天了,这样就可能会导致收费时负的或减少很多。就是说,还应该算天数,要不就要规定只能当天停,当天开走。我改了几次改不好,又鉴于程序要求中也没有提及,所以我也就没去改了。只要能实现主要的功能就好了。 在做简单员工管理系统的时候,主要运用的是链表来存储员工的信息,其中遇到了不少的问题,比如说对于数据在如何保存到文件中,又如何从文件中读取数据等等一系列的问题,但是到最后都一一解决了。 当然,这次的课程设计、编程实践还是大有收获的。 1、我知道了怎样去简化程序,减少他的时间复杂度和空间复杂度。还知道了怎样去完善程序,使其更具健壮性。 2、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。 51 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务