《2022年数据结构简单的职工管理系统完整版可用》由会员分享,可在线阅读,更多相关《2022年数据结构简单的职工管理系统完整版可用(34页珍藏版)》请在金锄头文库上搜索。
1、i 湖南涉外经济学院数据结构课程设计报告题目:简单的职工管理系统院系名称:计算机学院专业名称:计算机科学与技术班级:计科 201001班学生姓名:刘兴斌学号:30 指导教师:张建明设计起止时间:2011 年 11 月 20 日2011 年 12 月 30 日完成于 2011 年 12 月 29 日星期四名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 34 页 - - - - - - - - - i 目录第一章 序 . 1第二章系统总体功能的设计和分析 . 21、问题描述
2、. 22 、详细要求 . 23 、 功能分析 . 31、 具体要求. 错误!未定义书签。2、 系统流程分析 . 33、系统功能结构 . 34、模块函数构造 . 4第三章 详细设计分析 . 51、抽象数据类型定义 . 52、主函数设计 . 53、查找算法设计 . 64、排序算法设计 . 8第四章源程序代码 . 11 第五章系统实现29 第六章 课程设计总结. 31名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 34 页 - - - - - - - - - 1 第一章序电子信
3、息时代由如洪水一样的凶猛, 能在现实社会应用软件给我们的生活和工作带来方便和实用性就是软件存在的最大的价值。数据结构所能解决的就是这些复杂的问题简单化。数据结构 是计算机专业学生学习的一门基础课程,但十分的重要。本课程系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法, 介绍了常用的多种查找和排序技术。本课程将为整个专业的学习以及软件设计水平的提高打下良好的基础。为了学好数据结构,必须掌握编写一些在特定数据结构上的算法,并通过上机调试,更好地掌握各种数据结构及其特点。经过本次课程设计, 我们对于数据结构基本理论和存储结构及算法设计将有更加深入的理解,并提高我们在实际设计操作中系统
4、分析、结构确定、算法选择、数学建模和信息加工的能力,提高我们的C/C+语言程序设计能力,以及培养学我们编写程序设计文档的能力,为将来在实战工作中打下良好的基础。在经济发达的今天对于职工简单的管理都是有很大程度上的要求,一个工司能否较好较快的运行,与职工管理的好坏分不开关系,通过该系统,将一系列的问题系统化,能够更好的管理职工。简化管理,使管理更方便,准确性、直观性和实用性更强。本着以锻炼自己的能力为目的,通过设计与制作进一步学习和掌握简单的职工管理系统的原理和使用方法。 虽然在一定程度上较为简单,但也能体现在出在人员管理上的方便快捷, 也体现一个领导的管理水平是不是充满艺术。名师资料总结 -
5、- -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 34 页 - - - - - - - - - 2 第二章系统总体功能的设计和分析1 、 问题描述根据课程设计题目的要求,由于职工信息是一定要存放在指定的文件中,所以应提供文件的输入、输出等操作;在程序中需要浏览职工的信息,应提供显示、查找、删除、插入、排序等一系列的操作;另外还应提供键盘式选择菜单实现功能选择对功能要求的实现是解决管理系统的关键问题。一个管理系统能将其划分为插入、删除、查找、排序等功能。对不同的功能模块进行代码的编写实现,最后
6、通过一定的方式的进行连接测试和最终的调用,从而完成对各部分的操作。2 、详细要求1. 要求职工对象包括姓名、性别、 出生年月、 工作年月、 学历、职务、住址、电话等信息。(1)新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。(2)删除一名职工:从职工管理文件中删除一名职工对象。(3)查询:从职工管理文件中查询符合某些条件的职工。(4)修改:检索某个职工对象,对其某些属性进行修改。(5)排序:按某种需要对职工对象文件进行排序。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
7、4 页,共 34 页 - - - - - - - - - 3 3 功能分析1、实现提示职工对象数不必很多,便于一次读入内存,所有操作不经过内外存交换。(1)由键盘输入职工对象,以文件方式保存。程序执行时先将文件读入内存。(2)对职工对象中的 姓名 按字典顺序进行排序。(3)对排序后的职工对象进行增、删、查询、修改、排序等操作。2、 系统流程分析(1)输入功能的实现:要想实现职工管理系统的输入,必须要建立一个职工信息系统的抽象数据类型, 其中职工信息以链表的存储方式实现。由键盘输入职工对象,以文件方式保存。程序执行时先将文件读入内存。(2)系统处理功能的实现:系统管理员根据公司的人员流动情况,在
8、提示信息的提示下, 选择相应的服务进行操作。 如对职工对象中的 姓名 按字典顺序进行排序;对排序后的职工对象进行增、删、查询、修改、排序等操作。(3)输出的实现:根据选择的操作,输出与之对应的信息。综上可以绘制出职工管理功能的系统流程图,如图1 所示总控模块输入模块系统处理模块输出模块测试模块图1系统流程图3、系统功能结构根据职工管理系统问题的分析和设计要求,可以得到该职工管理系统可以分名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 34 页 - - - - - - -
9、- - 4 为五个模块:职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息查询模块、职工信息排序模块。其系统功能结构如图2 所示。职工管理系统新增职工信息删除职工信息查询职工信息排序职工信息修改职工信息对职务进行查询对电话进行查询对姓名进行查询对工作年月进行查询对住址进行查询对出生年月进行查询对学历进行查询对性别进行排序对出生年月进行排序对工作年月进行排序对姓名进行排序图2系统功能结构图4、模块函数构造根据系统功能结构图的描述, 可以构造出该系统的抽象数据类型和相对应的函数,其方法名和功能如表1 所示。表1函数功能表模块函数或数据结构功能链表数据类型typedef struct N
10、ode 定义链表结点typedef struct Datatype 定义职工信息ListInitiate(SLNode *head) 初始化链表系统处理模块SLNode *ListInsert(SLNode *head,DataType x) 插入职工信息ListDelete(SLNode *head) 删除职工信息ListModify(SLNode *head) 修改职工信息put(SLNode *head,FILE *fp) 保存职工信息Listfind(SLNode head) 查询职工信息Listpaixu(SLNode *head) 职工信息排序输出模块print(SLNode *h
11、ead) 显示职工信息名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 34 页 - - - - - - - - - 5 第三章详细设计分析1、抽象数据类型定义(1)定义表结点( typedef struct Node )typedef struct Node long int born_time,work_time,tele_num; char sex,nameALLMAX,degreeALLMAX,jobALLMAX,addressALLMAX; struct Node
12、 *next; SLNode; (2)定义职工信息( typedef struct Datatype )typedef struct long int born_time,work_time,tele_num; char nameALLMAX,sex,degreeALLMAX,jobALLMAX,addressALLMAX; DataType; (3)初始化链表( ListInitiate(SLNode *head) )void ListInitiate(SLNode *head)/-链表初始化 if(*head=(SLNode *)malloc(sizeof(SLNode)=NULL) ex
13、it(1);/ 动态分配存储空间(*head)-next=NULL; 2、主函数设计(1)根据详细设计要求, 可以得到主函数代码及其对应的程序流程图: 在主函数中,实现了友好的界面设计。系统需要输入职工的基本信息:姓名、性别、出生年月、工作年月、学历、职务、住址、电话等。这个系统还利用键盘输入提供的主菜单服务,在主菜单中,有七种操作的调用:新增职工信息: SLNode *ListInsert(SLNode *head,DataType x)查询职工信息: Listfind(SLNode head) 删除职工信息: ListDelete(SLNode *head)名师资料总结 - - -精品资料
14、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 34 页 - - - - - - - - - 6 修改职工信息: ListModify(SLNode *head)职工信息排序: Listpaixu(SLNode *head) 保存职工信息: put(SLNode *head,FILE *fp) 显示职工信息: print(SLNode *head) (2)主函数程序流程图如图3 所示:开始输入职工人数和对应的信息显示主菜单提示选择操作新增职工信息删除职工信息查询职工信息职工信息排序修改职工信息结束系统选
15、1选2选 3选4选 5选0选除上述数字之外的操作图3主函数程序流程图3、查找算法设计在查询算法中, 职工管理系统提供了七种查询操作,实现了系统的人性化查询操作。这些查询操作分别为:对姓名进行查询, 对性别进行查询, 对出生年月进行查询, 对工作年月进行查询,对学历进行查询,对职位进行查询,对住址进行查询,对电话进行查询等一些列操作。查找算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp() 函数判断字符串是否匹配。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,
16、共 34 页 - - - - - - - - - 7 查询算法程序流程图如图4 所示:链表是否为空选择执行的操作退出查询对年龄查询对学历查询对工作年月查询对住址查询对出生年月查询对姓名查询对职务查询无职工信息是否选 0选 3选 1选 4选 6选 5选 7选 2显示查询主菜单选择除上述数字之外的操作图4 查询算法程序流程图4、排序算法设计在排序算法中, 职工管理系统提供了四种查询操作,实现了系统的基本排序操作。这些排序操作分别为:对姓名进行排序, 对性别进行排序, 对出生年月进行排序, 对工作年月进行排序,等一些列操作。 排序算法中,利用链表的指针的移动扫描整个职工信息表,利用 strcmp()
17、 函数判断字符串是否匹配。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 34 页 - - - - - - - - - 8 排序的核心代码:for(q=head-next,p=head,s=p;q;s=p,p=q,q=q-next) if(p-born_timeq-born_time)/ 对出生年月进行排序 if(head=p) head-next=q-next; head=q; q-next=p; q=head-next; p=head; else p-next=q-n
18、ext; q-next=p; s-next=q; p=q; q=p-next; flag=1; 排序算法流程图如图5 所示:显示排序菜单链表是否为空选择操作对工作日期排序对出生日期排序退出排序系统对性别排序无职工信息是否选 0选 1选 2选 3选除上述操作的任意操作图5排序算法程序流程图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 34 页 - - - - - - - - - 9 第四章源程序代码#include #include #include #include
19、#include #include #include #include using namespace std; struct Employee / 声明职工的结构作为链表节点。/- 数据域 - string m_Code; string m_Name; unsigned short int m_Year; string m_Sex; string m_Post; string m_Department; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 34 页 - -
20、 - - - - - - - 10 unsigned int m_Wage; /链表节点的指针域 - struct Employee* Next; ; /- 个人习惯:取别名 - typedef struct Employee Node; typedef Node* Link; /- 函数声明 - Link Create(Link Head); void Release(Link Head); Link Add(Link Head); bool Search(Link Head); Link Search_Unique(Link Head); void Display_List(Link He
21、ad); void Display_Node(Link pNode); Link Modify(Link Head); Link Del(Link Head); void Save_ByFile(Link Head,fstream& ofile); Link Sort(Link Head); /- 函数实现 - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 34 页 - - - - - - - - - 11 Link Create(Link Head) / 创建一个带
22、头节点的空链表。Head=(Link)new Node; if(!Head) cout分配内存失败! m_Code=; Head-m_Name=; Head-m_Year=0; Head-m_Sex=; Head-m_Post=; Head-m_Department=; Head-m_Wage=0; Head-Next=NULL; return Head; void Release(Link Head) / 释放链表。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 34
23、 页 - - - - - - - - - 12 Link ptr;/ 声明一个操作用的指针。while(Head!=NULL) ptr=Head; Head=Head-Next; delete ptr;/释放节点资源。 Link Add(Link Head) / 前插法添加数据。Link pNew;/ 声明一个新节点。char again; string code,name,sex,post,department; unsigned short int year; unsigned int wage; do pNew=(Link)new Node; /数据域。coutcode; 名师资料总结
24、- - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 34 页 - - - - - - - - - 13 coutendlname; coutendlyear; while(cin.fail() cout请输入正确的年份格式。year; coutendlsex; coutendlpost; coutendldepartment; coutendlwage; while(cin.fail() cout请输入正确的工资数据。wage; coutm_Code=code; pNew-m_Name=
25、name; pNew-m_Year=year; pNew-m_Sex=sex; pNew-m_Post=post; pNew-m_Department=department; pNew-m_Wage=wage; /指针域。pNew-Next=Head-Next; Head-Next=pNew; cout数据添加成功!是否继续添加?(Y/N)again; while(again=Y|again=y); return Head; bool Search(Link Head) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整
26、理 - - - - - - - 第 16 页,共 34 页 - - - - - - - - - 15 / 查询同时满足“姓名”和“部门”的职工信息。Link ptr; string department; string name; ptr=Head-Next; coutdepartment; coutendlname; coutendl-查询结果-endl; coutendl职工代码、姓名、出生年份、性别、职称、部门、工资 m_Name=name)&(ptr-m_Department=department) Display_Node(ptr);/打印满足条件的节点。return true; p
27、tr=ptr-Next;/ 查询下一节点。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 34 页 - - - - - - - - - 16 cout无此职工的信息。 endl; return false; Link Search_Unique_Front(Link Head) / 查询满足“职工代码“的职工信息(职工代码必需唯一) 。Link ptr; string code; ptr=Head; coutcode; coutendl-查询结果-endl; coute
28、ndl职工代码、姓名、出生年份、性别、职称、部门、工资 Next) if(ptr-Next-m_Code=code) /Display_Node(ptr);/ 打印满足条件的节点。return ptr;/注意,是返回的查询到的节点的直接前趋节名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 34 页 - - - - - - - - - 17 点。ptr-Next=ptr-Next-Next;/ 查询下一节点。 return ptr; void Display_List(L
29、ink Head) Link ptr; ptr=Head-Next; cout=所有职工信息=endl; coutendl职工代码、姓名、出生年份、性别、职称、部门、工资 Next; void Display_Node(Link pNode) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 34 页 - - - - - - - - - 18 / 在标准输出设备上输出。coutsetw(10)leftm_Code setw(10)leftm_Name setw(10)le
30、ftm_Year setw(10)leftm_Sex setw(10)leftm_Post setw(10)leftm_Department setw(10)leftm_WageNext) cout- 你 现 在 可 以 修 改 此 职 工 的 信 息 了-endl; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 34 页 - - - - - - - - - 19 coutendl职工代码、姓名、出生年份、性别、职称、部门、工资 endl; /数据域。coutcode
31、; coutendlname; coutendlyear; while(cin.fail() cout请输入正确的年份格式。year; coutendlsex; coutendlpost; coutendldepartment; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 34 页 - - - - - - - - - 20 coutendlwage; while(cin.fail() cout请输入正确的工资数据。wage; coutNext-m_Code=code
32、;/因 ptr 是前趋节点,所以要用ptr-Next; ptr-Next-m_Name=name; ptr-Next-m_Year=year; ptr-Next-m_Sex=sex; ptr-Next-m_Post=post; ptr-Next-m_Department=department; ptr-Next-m_Wage=wage; cout没找到此职工的记录 ,无法修改。 Next; if(ptr) ptr_front-Next=ptr-Next; delete ptr;/删除此节点。 cout没找到此职工的记录 ,无法删除。 Next; ofile.clear();/ 清除文件结束状态
33、。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 23 页,共 34 页 - - - - - - - - - 22 while(pNode) ofilesetw(10)leftm_Code setw(10)leftm_Name setw(10)leftm_Year setw(10)leftm_Sex setw(10)leftm_Post setw(10)leftm_Department setw(10)leftm_WageNext; cout数据文件保存成功! Next=NULL)|
34、(Head-Next-Next=NULL)/此步条件判断非常有价值。 cout数据节点数少于2 个,不用排序! Next-Next; ptr_F=Head; Head-Next-Next=NULL;/ 到此,分成了两个链表。/第三步。while(ptr) ptr_N=ptr-Next; ptr_F=Head;/ptr_F 的归位。while(ptr_F-Next) if(ptr-m_Wageptr_F-Next-m_Wage) ptr-Next=ptr_F-Next; ptr_F-Next=ptr; break; /if 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
35、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 25 页,共 34 页 - - - - - - - - - 24 else ptr_F=ptr_F-Next; /while(ptr_F-Next) if(ptr_F-Next=NULL) ptr-Next=ptr_F-Next; ptr_F-Next=ptr;/ 表示插到有序链表的最后面了。 ptr=ptr_N;/ 归位,准备下一次排序。/while(ptr) cout从高到低,排序成功!endl; return Head; int main() Link Head=0; 名师资料总结 - - -精品资料
36、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 26 页,共 34 页 - - - - - - - - - 25 Head=Create(Head); fstream iofile; iofile.open(d:iofile.txt,ios_base:in|ios_base:out|ios_base:app);/文件以三种方式打开。if(!iofile) cout打开文件失败! endl; return -1; int menu; while(1) cout*endl; cout*欢迎进入职工管理系统*endl;
37、cout*endl; coutendl; cout endl; cout 主 菜 单 endl; cout = endl; cout endl; cout 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 27 页,共 34 页 - - - - - - - - - 26 endl; cout 1.注册职工2.修改信息endl; cout 3.删除信息4.信息查询endl; cout 5.保存文件6.工资排行endl; cout 7.信息显示0.退出系统endl; cout endl;
38、cout endl; cout endl; cout endl;coutendlmenu; while(cin.fail() cout请选择正确的菜单选项。menu; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 28 页,共 34 页 - - - - - - - - - 27 switch(menu) case 0: cout成功退出系统! endl; return 0; case 1: Head=Add(Head); break; case 2: Head=Modify(Hea
39、d); break; case 3: Head=Del(Head); break; case 4: Search(Head); break; case 5: Save_ByFile(Head,iofile); break; case 6: Sort(Head); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 29 页,共 34 页 - - - - - - - - - 28 break; case 7: Display_List(Head); break; default: cout
40、 请 选 择 正 确 的 菜 单 项 进 行 操 作 。 多 谢 合作!endl; Release(Head); iofile.close(); return 0; 第五章系统实现测试是使用人工或者自动手段来运行或测试某个系统的过程, 其目的在于检验是否满足规定的需求或弄清预期结果与实际结果之间的差别. 系统运行结果:(1)进入职工管理系统,如图6 所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 30 页,共 34 页 - - - - - - - - - 29 图6主菜单选择界
41、面(2)新增一职工信息并查询全部职工信息,如图7、8 所示:图7新增职工信息界面名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 31 页,共 34 页 - - - - - - - - - 30 图8查询职工信息界面(3)修改职工信息并与前面信息对照,如图9 所示:图9修改职工信息界面名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 32 页,共 34 页 - - - - -
42、- - - - 31 (4)退出系统,如图10 所示:选择0,退出职工管理系统。图10退出职工管理系统名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 33 页,共 34 页 - - - - - - - - - 32 第六章课程设计总结本次课程设计的一切实现和代码都是围绕数据结构进行设计的操作的。根据问题的描述可知, 需要解决问题并不是很复杂, 整个问题只需要实现简单的职工管理系统功能, 那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存。 但是,为了实现该功能,
43、却需要优秀的算法和以数据结构为核心思想作为框架, 以保证实现的时间最优化和空间的最大利用化。把职工信息存储在一个单链表中,利用指针实现对职工信息的各项简单的操作。程序在长久的修改和上网查询借鉴的情况下最终完成了题目描述所需要实现的功能, 但仍有我认为不足的问题, 还有需要改进的地方, 就是还可以在排序上面多设计几个算法, 实现多方位的排序。 我发现在这个系统中没有职工序号或者是工作序号之类的信息, 所以允许职工姓名相同, 在很大程度上面, 可能会出现职工信息有所重复,值得思考和改进并且实现最佳功能。经过这次数据结构课程设计, 我们不仅再一次的巩固了我对数据结构、算法、以及软件工程的知识的了解,
44、 并更加的明白了数据结构和算法对于程序时间和空间性能的极大影响, 及软件工程提供的开发流程和工具对于实现特定功能程序的深远而重大的意义。我们面对一个最现实的问题的时候, 应该迅速根据问题性质和特点抽象构成特定的数据结构, 用计算机的思维方式来看待, 每个问题都有可能能够抽象成多种数据结构, 每种数据结构也有可能适应不同的算法。应该全面的考虑这些的数据结构、算法以及它们的空间和时间效率是不是达到最大化的应用和实现,然后从中选择一个最优的作为实现程序的基本框架进行操作和实现。此外,我认为对程序的测试要做到十分的仔细,依据模块的特点和功能, 可以进行阶段性的测试和全面性的测试,采用各种软件测试方法对程序进行全方位的进行测试,确保各个模块的正确性和完整性。最终的目的是完整的实现了问题描述中要求的功能和使我们要解决的问题达到最优化解决。2011 年 12 月 29 日星期四名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 34 页,共 34 页 - - - - - - - - -