《清华大学C语言教学课件(共16个PPT)第15个培训资料.ppt》由会员分享,可在线阅读,更多相关《清华大学C语言教学课件(共16个PPT)第15个培训资料.ppt(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、清华大学C语言教学课件(共16个PPT)第15个一、程序设计方法概述一、程序设计方法概述2程序设计方法程序设计方法早期的程序设计方法早期的程序设计方法结构化程序设计方法结构化程序设计方法面向对象程序设计方法面向对象程序设计方法3早期的程序设计方法追求程序的高效率,早期的程序设计方法追求程序的高效率,编程过份依赖技巧,而不注重所编写程序的结编程过份依赖技巧,而不注重所编写程序的结构,也就是构,也就是没有固定程序设计方法没有固定程序设计方法的时期。程的时期。程序的可读性、可重用性都很差。其中一个典型序的可读性、可重用性都很差。其中一个典型问题是频繁使用问题是频繁使用goto语句。语句。虽然这种方法
2、存在很多问题,但对于单人虽然这种方法存在很多问题,但对于单人完成较为简单的任务,事实上还是经常被采用完成较为简单的任务,事实上还是经常被采用的。的。早期的程序设计方法早期的程序设计方法4结构化方法出现在结构化方法出现在70年代中期,我们可以年代中期,我们可以这样理解它:这样理解它:结构化程序设计方法是从程序要实现的结构化程序设计方法是从程序要实现的功功能能的角度出发的。一般按照的角度出发的。一般按照自顶向下自顶向下、逐步求逐步求精精的方式,将程序要完成的功能逐级划分成许的方式,将程序要完成的功能逐级划分成许多小的功能模块,象搭积木一样搭起来。这些多小的功能模块,象搭积木一样搭起来。这些小的功能
3、模块最终都可以转化成三种基本控制小的功能模块最终都可以转化成三种基本控制结构的组合。结构的组合。所谓的功能可以理解为对数据的操作。在所谓的功能可以理解为对数据的操作。在程序实现中,特定的功能或功能模块一般用程序实现中,特定的功能或功能模块一般用函函数数来实现,它们要对特定的来实现,它们要对特定的数据数据进行操作。进行操作。结构化程序设计方法结构化程序设计方法5结构化设计方法的特点结构化设计方法的特点结构化程序设计方法的主要技术是结构化程序设计方法的主要技术是自顶自顶向下向下、逐步求精逐步求精,采用,采用单入口单入口、单出口单出口的控制结构的控制结构自顶向下自顶向下是一种分解问题的技术,是一种分
4、解问题的技术,逐步逐步求精求精指结构化程序的连续分解,最终成指结构化程序的连续分解,最终成为下面三种基本控制结构的组合为下面三种基本控制结构的组合三种基本控制结构三种基本控制结构:顺序、分支、循环:顺序、分支、循环6分支结构分支结构语句1语句2语句3条件语句2语句1语句1语句2顺序结构顺序结构循环结构循环结构7例:例:从键盘输入一个学生的信息(包括姓名、从键盘输入一个学生的信息(包括姓名、年龄、性别、学号等)和一个老师的信息年龄、性别、学号等)和一个老师的信息(包括姓名、年龄、性别、是否授课等),(包括姓名、年龄、性别、是否授课等),然后将信息输出到屏幕。然后将信息输出到屏幕。一个简单的例子一
5、个简单的例子8分析:分析:根据需求(题目要求),我们可以把问根据需求(题目要求),我们可以把问题划分为两个功能模块,一个是题划分为两个功能模块,一个是输入模块输入模块,一个是一个是输出模块输出模块,做完了输入模块,再做,做完了输入模块,再做输出模块。再具体考虑每个模块如何实现输出模块。再具体考虑每个模块如何实现(逐步求精)。(逐步求精)。我们用我们用C语言来写,参看下面的代码:语言来写,参看下面的代码:9/void main()/主函数开始主函数开始/声明用于存储学生信息的变量声明用于存储学生信息的变量char strStudentName20;/学生姓名学生姓名int nStudentAge
6、;/学生年龄学生年龄char cStudentSex;/学生性别学生性别int nStudentNumber;/学生学号学生学号/声明用于存储老师信息的变量声明用于存储老师信息的变量char strTeacherName20;/老师姓名老师姓名int nTeacherAge;/老师年龄老师年龄char cTeacherSex;/老师性别老师性别int nIsTeaching;/是否授课是否授课/输入模块输入模块GetStudentInfo();/输入学生信息输入学生信息GetTeacherInfo();/输入老师信息输入老师信息/输出模块输出模块PrintStudentInfo();/输出学生
7、信息输出学生信息PrintStudentInfo();/输出老师信息输出老师信息描述学生的数据描述学生的数据描述老师的数据描述老师的数据函数函数函数函数10上面的例子中,我们可以进一步将属于学生和上面的例子中,我们可以进一步将属于学生和老师的变量放入老师的变量放入结构结构中中。这样可以在一定程度上完。这样可以在一定程度上完成成对数据的封装对数据的封装。但。但在结构化程序设计中,数据与在结构化程序设计中,数据与对其进行操作的函数仍是分离的。对其进行操作的函数仍是分离的。/声明学生结构声明学生结构Studentstruct Studentchar strStudentName20;/学生姓名学生姓
8、名int nStudentAge;/学生年龄学生年龄char cStudentSex;/学生性别学生性别int nStudentNumber;/学生学号学生学号;/声明老师结构声明老师结构Teacherstruct Teacherchar strTeacherName20;/老师姓名老师姓名int nTeacherAge;/老师年龄老师年龄char cTeacherSex;/老师性别老师性别int nIsTeaching;/是否教书是否教书;1112问题:问题:函数用于完成一定的功能,它们都是针函数用于完成一定的功能,它们都是针对特定的数据进行操作的。那么我们能对特定的数据进行操作的。那么我们
9、能不能以特定的数据为中心,将数据与对不能以特定的数据为中心,将数据与对其进行操作的函数封装起来呢?其进行操作的函数封装起来呢?13面向对象程序设计方法面向对象程序设计方法面向对象程序设计出现在面向对象程序设计出现在80年代中后期年代中后期面向对象程序设计是建立在结构化程序面向对象程序设计是建立在结构化程序设计基础上的,但它不再是从功能入手,设计基础上的,但它不再是从功能入手,而是从而是从对象对象(人、地方、事情等)入手(人、地方、事情等)入手面向对象程序设计以面向对象程序设计以类类作为构造程序的作为构造程序的基本单位,它具有封装、数据抽象、继基本单位,它具有封装、数据抽象、继承、多态等特点承、
10、多态等特点14简单地说,简单地说,对象就是现实世界中的各对象就是现实世界中的各种实体种实体,包括人、地点和事物等。例如,包括人、地点和事物等。例如,桌子、椅子、教室、学生、老师、电话、桌子、椅子、教室、学生、老师、电话、汽车等等。一般都要从汽车等等。一般都要从属性属性和和行为行为两个两个方面来对它们加以描述。在这里,我们方面来对它们加以描述。在这里,我们认为对象和对象的实例是同一个概念。认为对象和对象的实例是同一个概念。什么是对象?什么是对象?15对象具有的一些特征称为属性对象具有的一些特征称为属性,以,以一个一个人人为例,他的姓名、年龄、身高、体重等为例,他的姓名、年龄、身高、体重等可以作为
11、他的属性。可以作为他的属性。这些属性会有其对应这些属性会有其对应的值,一般至少会有一项区别于其它对象,的值,一般至少会有一项区别于其它对象,它们在程序设计中对应的是一定的它们在程序设计中对应的是一定的数据数据。为了达到目的,为了达到目的,对象对象必须提供的功能必须提供的功能(或必须提供的服务)称为对象的(或必须提供的服务)称为对象的行为行为,在程序设计中对应一定的方法(在程序设计中对应一定的方法(函数函数)。)。属性和行为属性和行为16类描述了一组具有相同属性(数据类描述了一组具有相同属性(数据元素)和相同行为(函数)的对象。元素)和相同行为(函数)的对象。类的数据成员是对对象属性的抽象,类的
12、数据成员是对对象属性的抽象,类的函数成员是对对象行为的抽象,类的函数成员是对对象行为的抽象,而类本身就是对对象的抽象。而类本身就是对对象的抽象。什么是类?什么是类?17class Student/Student类的声明类的声明public:/公有成员公有成员Student();/构造函数构造函数Student();/析构函数析构函数char*GetName();/查询姓名查询姓名intGetAge();/查询年龄查询年龄charGetSex();/查询姓名查询姓名intGetNumber();/查询学号查询学号boolSetName(char*n);/设置姓名设置姓名boolSetAge(in
13、t age);/设置年龄设置年龄boolSetSex(char*s);/设置性别设置性别boolSetNumber(int num);/设置学号设置学号protected:/保护成员保护成员charm_strName20;/姓名,字符串数组姓名,字符串数组intm_nAge;/年龄,整型年龄,整型charm_cSex;/性别,字符型性别,字符型intm_nNumber;/学号,整型学号,整型;例:例:C+中类的声明中类的声明Student类类成员函数成员函数成员函数成员函数成员变量成员变量18Student A;/声明声明Student的对象的对象AA.SetName(“张三张三”);/设置设
14、置A的名字的名字A.SetAge(20);/设置设置A的年龄的年龄例:例:C+中类使用中类使用1920总的来说,总的来说,结构化程序设计方法是一种模块化程序设计结构化程序设计方法是一种模块化程序设计方法,它在解决问题时是方法,它在解决问题时是以功能为中心以功能为中心的,的,一定的功能模块虽然也作用于特定的数据,一定的功能模块虽然也作用于特定的数据,但它们并没有被封装在一起。但它们并没有被封装在一起。面向对象程序设计方法则是面向对象程序设计方法则是以对象为中心以对象为中心来来解决问题的。属于同种对象的属性(数据)解决问题的。属于同种对象的属性(数据)和服务(功能)被抽象出来封装到一起。和服务(功
15、能)被抽象出来封装到一起。21二、面向对象程序设计方法二、面向对象程序设计方法22 数据抽象数据抽象 封装封装 继承继承 多态多态 动态绑定动态绑定面向对象方法的主要特点面向对象方法的主要特点23数据抽象数据抽象类是一组相似对象的抽象描述,它类是一组相似对象的抽象描述,它抽取了这些对象的共性组成了一个共同抽取了这些对象的共性组成了一个共同的概念。抽象数据类型的概念。抽象数据类型(Abstract Data Type,ADT)是一组相似的类的抽象,是一组相似的类的抽象,而一个类又是而一个类又是ADT的具体实现。的具体实现。24封装是指软件的组成部分(模块、子封装是指软件的组成部分(模块、子程序、
16、方法等)应该程序、方法等)应该互相独立互相独立,或者,或者隐隐藏设计的细节藏设计的细节。在传统的方法中,封装。在传统的方法中,封装通常局限于将功能和数据分开封装;而通常局限于将功能和数据分开封装;而在面向对象方法中,封装将功能和数据在面向对象方法中,封装将功能和数据同时装入对象中。同时装入对象中。参看参看Student类的例子类的例子封封 装装25class Student/Student类的声明类的声明public:/公有成员公有成员Student();/构造函数构造函数Student();/析构函数析构函数char*GetName();/查询姓名查询姓名intGetAge();/查询年龄查
17、询年龄charGetSex();/查询姓名查询姓名intGetNumber();/查询学号查询学号boolSetName(char*n);/设置姓名设置姓名boolSetAge(int age);/设置年龄设置年龄boolSetSex(char*s);/设置性别设置性别boolSetNumber(int num);/设置学号设置学号protected:/保护成员保护成员charm_strName20;/姓名,字符串数组姓名,字符串数组intm_nAge;/年龄,整型年龄,整型charm_cSex;/性别,字符型性别,字符型intm_nNumber;/学号,整型学号,整型;例:例:C+中类的声明
18、中类的声明Student类类26如果类与类之间有如果类与类之间有is-a(是一种)的(是一种)的关系,那么可以采用继承机制来表示。关系,那么可以采用继承机制来表示。子类可以自动继承父类中的一些属性和子类可以自动继承父类中的一些属性和行为,而不必再进行定义,从而实现了行为,而不必再进行定义,从而实现了代码的复用代码的复用。同时,继承也是产生。同时,继承也是产生新类新类的方法之一。的方法之一。继继 承承27从上图可以看出,学生和教师都是人从上图可以看出,学生和教师都是人的一种,所以,学生类和教师类可以从的一种,所以,学生类和教师类可以从人类继承而来,从而实现了代码的共享。人类继承而来,从而实现了代
19、码的共享。28class People/People类的声明类的声明public:/公有成员公有成员People();/构造函数构造函数People();/析构函数析构函数char*GetName();/查询姓名查询姓名intGetAge();/查询年龄查询年龄boolSetName(char*n);/设置姓名设置姓名boolSetAge(int age);/设置年龄设置年龄private:/私有成员私有成员protected:/保护成员保护成员charm_strName20;/姓名,字符串数组姓名,字符串数组intm_nAge;/年龄,整型年龄,整型charm_cSex;/性别,字符型性别,
20、字符型;类的声明举例类的声明举例People类类29class Teacher:public People/Teacher类的声明类的声明public:/公有成员公有成员Teacher();/构造函数构造函数Teacher();/析构函数析构函数bool IsTeaching();/查询是否授课查询是否授课private:/私有成员私有成员protected:/保护成员保护成员boolm_bIsTeaching/是否授课是否授课;类的声明举例类的声明举例Teacher类类30class Student:public Peoplepublic:Student();/构造函数构造函数Student
21、();/析构函数析构函数int GetNumber();/查询学号查询学号bool SetNumber(int n);/设置学号设置学号private:protected:intm_nNumber;/学号学号;类的声明举例类的声明举例Student类类31在程序中同一符号或名字在不同情况在程序中同一符号或名字在不同情况下具有不同解释的现象称为多态性下具有不同解释的现象称为多态性(Polymorphism)。在面向对象程序设)。在面向对象程序设计语言中,由程序员设计的多态性由两计语言中,由程序员设计的多态性由两种基本形式:种基本形式:编译时多态性编译时多态性和和运行时多运行时多态性态性。许多程序
22、设计语言都或多或少地。许多程序设计语言都或多或少地支持多态性,但支持多态性,但运行时多态性是面向对运行时多态性是面向对象程序设计语言的一大特点象程序设计语言的一大特点。多多 态态32编译时多态性编译时多态性是指在程序编译阶段即可是指在程序编译阶段即可确定下来的多态性,主要通过使用重载确定下来的多态性,主要通过使用重载(Overloading)机制获得,重载机制包括)机制获得,重载机制包括函数重载函数重载和和运算符重载运算符重载两大类。两大类。举一个举一个C+C+中的例子:中的例子:int Abs(int x);double Abs(double x);coutAbs(-4)endl;/调用调用
23、int AbscoutAbs(3.2)endl;/调用调用double Abs33运行时多态性运行时多态性是指必须等到程序动态是指必须等到程序动态运行时才可确定的多态性,主要通过运行时才可确定的多态性,主要通过继继承承结合结合动态绑定动态绑定获得。获得。动态绑定也称晚绑定,它也是面向对动态绑定也称晚绑定,它也是面向对象的重要特点之一。动态绑定的使用可象的重要特点之一。动态绑定的使用可以提高程序的可用性和可扩展性。以提高程序的可用性和可扩展性。34八十年代末以来,由八十年代末以来,由Booch,Coad,Yourdon,OMT,Jacobson等人提出的多种等人提出的多种面向对象面向对象方法在方
24、法在已经已经得到了广泛的得到了广泛的应用应用。面。面向对象方法中的三种基本活动就是:向对象方法中的三种基本活动就是:(1)(1)识别对象和类识别对象和类(2)(2)描述对象和类之间的关系描述对象和类之间的关系(3)(3)通过描述类的功能定义对象的行为通过描述类的功能定义对象的行为面向对象方法面向对象方法35科德将对象模型分为下面四个部件,也就是将科德将对象模型分为下面四个部件,也就是将对象分为了四组:对象分为了四组:(1)问题域)问题域PD(problem domain)(2)人机交互)人机交互HI(human interaction)(3)数据管理)数据管理DM(data managemen
25、t)(2)系统交互)系统交互SI(system interaction)科德(科德(Coad)方法)方法36问题域问题(问题域问题(PD)通常最先考虑,因为用通常最先考虑,因为用户往往最关心为自己的商业问题建模。问题户往往最关心为自己的商业问题建模。问题域部件包含与需要建模的问题直接有关的对域部件包含与需要建模的问题直接有关的对象。问题域部件的对象技术上呈现中型,它象。问题域部件的对象技术上呈现中型,它们几乎不了解或完全不了解人机交互、数据们几乎不了解或完全不了解人机交互、数据管理和系统交互部件的对象。管理和系统交互部件的对象。人机交互部件(人机交互部件(HI)包含为问题域对象和人包含为问题域
26、对象和人们之间提供界面的对象。在对象模型中,人们之间提供界面的对象。在对象模型中,人机交互部件的对象通常对应具体的窗口和报机交互部件的对象通常对应具体的窗口和报表。表。37数据管理部件(数据管理部件(DM)包含为问题域对象和包含为问题域对象和数据库系统或文件管理系统之间提供界面的数据库系统或文件管理系统之间提供界面的对象。在对象模型中,数据管理部件的对象对象。在对象模型中,数据管理部件的对象通常对应某些需要保存及搜索的问题域对象通常对应某些需要保存及搜索的问题域对象。系统交互部件(系统交互部件(SI)包含为问题域对象和其包含为问题域对象和其它系统或设备提供界面的对象。系统交互对它系统或设备提供
27、界面的对象。系统交互对象封装了通信协议,使得问题域对象不需要象封装了通信协议,使得问题域对象不需要了解底层的实现细节。了解底层的实现细节。38科德的面向对象方法包括一下四个活动:科德的面向对象方法包括一下四个活动:(1)确定系统的目标和特点)确定系统的目标和特点(2)确定四种模型部件的对象和模式)确定四种模型部件的对象和模式(3)建立对象责任)建立对象责任(2)定义服务场景以完成特定服务责任)定义服务场景以完成特定服务责任39三、三、C+语言语言C与与C+的比较的比较C+中的数据类型中的数据类型C+程序框架程序框架类和对象类和对象类的声明、实现、继承、多态性类的声明、实现、继承、多态性举例举例
28、40C 语语 言言C语言的优点:语言的优点:与硬件无关,可移植性强与硬件无关,可移植性强语言简洁,使用方便语言简洁,使用方便丰富的运算符和数据类型丰富的运算符和数据类型可直接访问内存地址可直接访问内存地址能进行位操作能进行位操作目标代码质量高,运行效率高目标代码质量高,运行效率高41C语言的弱点:语言的弱点:检查机制弱,编译时不能发现编程错误检查机制弱,编译时不能发现编程错误面向过程的语言,没有支持代码复用的面向过程的语言,没有支持代码复用的机制机制很难控制大规模程序的复杂性很难控制大规模程序的复杂性42C+语语 言言是是C的超集,保持了与的超集,保持了与C的的兼容兼容性性继承了继承了C语言语
29、言高效性高效性、灵活性灵活性的特点的特点扩充了对扩充了对面向对象程序设计面向对象程序设计和和高层次问题抽象高层次问题抽象方法的支持,是面向对象程序设计语言之一方法的支持,是面向对象程序设计语言之一完善了完善了C语言的语言的类型检查类型检查、代码重用代码重用、数据抽数据抽象象机制,便于大规模软件开发机制,便于大规模软件开发既反映了既反映了结构化结构化程序设计方法,又反映了程序设计方法,又反映了面向面向对象对象程序设计方法程序设计方法43#include/预编译命令预编译命令void main()/主函数开始主函数开始cout “Hello the world!”a;cout “输入的数据为输入的
30、数据为”a=0)&(age=200)/初始化年龄初始化年龄m_nAgem_nAge=age;elsem_nAge=0;/age不合法,则将不合法,则将m_nAge初始化为初始化为0switch(sex)/初始化性别初始化性别m_cSexcase M:m_cSex=M;break;/M表示男表示男case F:m_cSex=F;break;/F表示女表示女default:m_cSex=0;/0表示未赋值表示未赋值57/查询姓名的成员函数查询姓名的成员函数char*People:GetName()return m_strName;/返回姓名返回姓名/查询年龄的成员函数查询年龄的成员函数int Pe
31、ople:GetAge()return m_nAge;/返回年龄返回年龄/查询性别的成员函数查询性别的成员函数char People:GetSex()return m_cSex;/返回性别返回性别/用于设置的成员函数的实现不在此列出用于设置的成员函数的实现不在此列出/58void main()/主函数主函数People A;/声明类声明类People的对象的对象APeople B(Li Si);/声明类声明类People的对象的对象B,参数,参数Li Si/声明类声明类People指针,并构造实例指针,并构造实例People*C=new People(Zhang San,20,M);A.Set
32、Name(“Wang Wu”);/对对象对对象A设置名字设置名字cout “As name:”A.GetName()endl;/输出输出A的信息的信息cout As age:A.GetAge()endl;cout As sex:A.GetSex()endl endl;cout “Bs name:”B.GetName()endl;/输出输出B的信息的信息cout Bs age:B.GetAge()endl;cout “Bs sex:”B.GetSex()endl endl;cout “Cs name:”GetName()endl;/输出输出C的信息的信息cout Cs age:GetAge()e
33、ndl;cout Cs sex:GetSex()endl ShowData();/调用调用A类的函数类的函数c=b;c-ShowData();/调用调用B类的函数类的函数如果如果ShowData()不是虚函数,则不管不是虚函数,则不管c指向父类还是子指向父类还是子类的对象,所调用的都是父类的函数。类的对象,所调用的都是父类的函数。751 虚函数仅适用于有继承关系的类对象,所虚函数仅适用于有继承关系的类对象,所以只有类的成员函数才能说明为虚函数。以只有类的成员函数才能说明为虚函数。2 静态成员函数不能是虚函数静态成员函数不能是虚函数3 内联(内联(inline)函数不能是虚函数)函数不能是虚函数
34、4 构造函数不能是虚函数构造函数不能是虚函数5 析构函数可以是虚函数析构函数可以是虚函数虚函数的限制虚函数的限制76【1】面向对象系统分析与设计面向对象系统分析与设计Ronald J.Norman著,周之英等译,著,周之英等译,2000【2】面向对象程序设计基础面向对象程序设计基础,李师贤,李文军,李师贤,李文军,周晓聪周晓聪 编著,高等教育出版社,编著,高等教育出版社,1998【3】C+语言和面向对象程序设计(第二版),宛延语言和面向对象程序设计(第二版),宛延闿闿【4】C+讲义,徐玉华、殷人昆老师提供讲义,徐玉华、殷人昆老师提供【5】http:/ 主程序主程序Mongkey.hMonkey
35、类的声明类的声明Mongkey.cpp Monkey类的实现类的实现Ring.hRing类的声明类的声明Ring.cppRing类的实现类的实现78/*/*Monkey.h */*#ifndef _INCLUDE_MONKE_H_#define _INCLUDE_MONKE_H_class Monkeypublic:Monkey(int n=8,int begin=1,int m=3)/构造函数构造函数 numofMonkey=n;/猴子数目猴子数目 beginPos=begin;/起始位置起始位置 interval=m;/报数间隔报数间隔void Initial();/初始化函数初始化函数v
36、oid Getking();/得到猴王得到猴王protected:int numofMonkey;/猴子数目猴子数目int beginPos;/起始位置起始位置int interval;/报数间隔报数间隔;#endif79/*/*Ring.h */*#ifndef _INCLUDE_RING_H_#define _INCLUDE_RING_H_struct Mon /结构声明结构声明int code;/整型,猴子编号整型,猴子编号Mon*next;/结构指针,指向下一只猴子结构指针,指向下一只猴子;class Ring/Ring类声明,循环链表类声明,循环链表public:Ring(int n
37、);/构造函数构造函数 void Count(int m);/报数报数 void PutMon();/输出当前猴子输出当前猴子 void ClearMon();/删除当前猴子删除当前猴子 Ring();/析构函数析构函数protected:Mon*pBegin;/链表头链表头 Mon*pivot;/相邻的上一个猴子相邻的上一个猴子 Mon*pCurrent;/当前猴子当前猴子;#endif80/*/*Monking.cpp */*#include#include Monkey.hvoid main()/主函数主函数/主函数开始主函数开始Monkey monkey;/声明一个声明一个Monkey对象对象 monkey.Initial();/初始化初始化monkey.Getking();/得到猴王得到猴王/主函数结束主函数结束81结结 束束82此课件下载可自行编辑修改,仅供参考!此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢感谢您的支持,我们努力做得更好!谢谢