第4章-C实用教程―面向对象编程进阶课件

上传人:痛*** 文档编号:241644017 上传时间:2024-07-12 格式:PPT 页数:53 大小:539.50KB
返回 下载 相关 举报
第4章-C实用教程―面向对象编程进阶课件_第1页
第1页 / 共53页
第4章-C实用教程―面向对象编程进阶课件_第2页
第2页 / 共53页
第4章-C实用教程―面向对象编程进阶课件_第3页
第3页 / 共53页
点击查看更多>>
资源描述
程序设计技术C#C#实用教程电子邮件:电子邮件:一二请在这里输入您的主要叙述内容整体概述三请在这里输入您的主要叙述内容请在这里输入您的主要叙述内容程序设计技术n nC#C#C#C#快速入门快速入门n nC#C#C#C#编程基础编程基础n n面向对象编程基础面向对象编程基础n n面向对象编程进阶面向对象编程进阶n nWindowsWindowsWindowsWindows应用程序应用程序n nGDI+GDI+GDI+GDI+编程编程n n文件操作文件操作n n数据库应用数据库应用n nC#C#C#C#多线程技术多线程技术n nWebWebWebWeb应用程序应用程序面向对象编程进阶n n类的继承与多态类的继承与多态n n操作符重载操作符重载n n类型转换类型转换n n接口接口n n结构和枚举结构和枚举n n排序与查找算法排序与查找算法n n递归算法递归算法n n异常处理异常处理n n委托与事件委托与事件类的继承与多态n n类的继承类的继承n n类的继承本质上就是类的扩充,即在一个已经存在类的基类的继承本质上就是类的扩充,即在一个已经存在类的基础之上通过扩展的方法创建另外的类。础之上通过扩展的方法创建另外的类。n n类的继承在类的继承在C#C#C#C#中是通过派生类实现的,当一个类从另一个中是通过派生类实现的,当一个类从另一个类派生出来时,派生类就自然具有了基类数据成员、属性类派生出来时,派生类就自然具有了基类数据成员、属性成员和方法成员。基类定义中这些成员的代码,已不需要成员和方法成员。基类定义中这些成员的代码,已不需要在派生类定义中重写,在派生类的定义中,只需书写基类在派生类定义中重写,在派生类的定义中,只需书写基类定义中所不具有的代码即可。定义中所不具有的代码即可。n n继承的作用继承的作用n n提高了代码的重用性,从而提高程序设计的效率;提高了代码的重用性,从而提高程序设计的效率;n n为程序设计中的特别需要提供了编写代码的自由空间,为程序设计中的特别需要提供了编写代码的自由空间,从而提供了已有程序设计成果的可扩展性。从而提供了已有程序设计成果的可扩展性。类的继承与多态n nC#C#C#C#中类继承遵循的规则中类继承遵循的规则n n派生类只能继承于一个基类。派生类只能继承于一个基类。n n派生类自然继承基类的成员,但不能继承基类的构造函数派生类自然继承基类的成员,但不能继承基类的构造函数成员。成员。n n类的继承可以传递。类的继承可以传递。n n派生类是对基类的扩展,派生类定义中可以声明新的成员,派生类是对基类的扩展,派生类定义中可以声明新的成员,但不能消除已继承的基类成员。但不能消除已继承的基类成员。n n基类中的成员声明时,不管其是什么访问控制方式,总能基类中的成员声明时,不管其是什么访问控制方式,总能被派生类继承,访问控制的不同只决定派生类成员是否能被派生类继承,访问控制的不同只决定派生类成员是否能够访问基类成员。够访问基类成员。n n派生类定义中如果声明了与基类同名的成员,则基类的同派生类定义中如果声明了与基类同名的成员,则基类的同名成员将被覆盖,从而使派生类不能直接访问同名的基类名成员将被覆盖,从而使派生类不能直接访问同名的基类的成员。的成员。n n基类可以定义虚方法成员等,这样派生类能够重载这些成基类可以定义虚方法成员等,这样派生类能够重载这些成员以表现类的多态性。员以表现类的多态性。类的继承与多态n n派生类定义格式派生类定义格式派生类通常定义的语法格式为:派生类通常定义的语法格式为:pulbic class pulbic class pulbic class pulbic class 派生类名称派生类名称:基类名称基类名称 /类体类体 n n基类名称:表示所继承的类;基类名称:表示所继承的类;n n访问控制修饰符:访问控制修饰符:publicpublicpublicpublic访问控制修饰符用于保证类访问控制修饰符用于保证类的开放性的开放性(默认控制修饰符默认控制修饰符);n n在派生类中继承了基类的所有成员,所以在派生类中仅定在派生类中继承了基类的所有成员,所以在派生类中仅定义需要增加的成员。义需要增加的成员。类的继承与多态n nprotectedprotectedprotectedprotected访问修饰符的作用访问修饰符的作用n n定义类时对数据成员访问控制定义类时对数据成员访问控制为了满足类的封装性要求,类中的数据成员一般应该是私为了满足类的封装性要求,类中的数据成员一般应该是私有的数据成员。对于私有的数据成员,只能通过类中定义有的数据成员。对于私有的数据成员,只能通过类中定义的公有属性或者共有的方法成员予以访问。的公有属性或者共有的方法成员予以访问。n nprotectedprotectedprotectedprotected访问修饰符的作用访问修饰符的作用n n定义类时对数据成员访问控制定义类时对数据成员访问控制为了满足类的封装性要求,类中的数据成员一般应该是私为了满足类的封装性要求,类中的数据成员一般应该是私有的数据成员。对于私有的数据成员,只能通过类中定义有的数据成员。对于私有的数据成员,只能通过类中定义的公有属性或者共有的方法成员予以访问。的公有属性或者共有的方法成员予以访问。public class Testpublic class Testpublic class Testpublic class Test private int a;private int a;private int a;private int a;public set(int x)public set(int x)public set(int x)public set(int x)a=x;a=x;a=x;a=x;Test t1;Test t1;Test t1;Test t1;t1.a=1000;t1.a=1000;t1.a=1000;t1.a=1000;t1.set(1000);t1.set(1000);t1.set(1000);t1.set(1000);类的继承与多态n nprotectedprotectedprotectedprotected访问修饰符的作用访问修饰符的作用n n派生类中不能访问基类中的私有数据成员派生类中不能访问基类中的私有数据成员public class Testpublic class Testpublic class Testpublic class Test private int a;private int a;private int a;private int a;public int b;public int b;public int b;public int b;public class TT:Testpublic class TT:Testpublic class TT:Testpublic class TT:Test public void set()public void set()public void set()public void set()a=100;a=100;a=100;a=100;b=200;b=200;b=200;b=200;类的继承与多态n nprotectedprotectedprotectedprotected访问修饰符的作用访问修饰符的作用n n对基类中的数据成员使用对基类中的数据成员使用protectedprotectedprotectedprotected修饰符,既能保证数修饰符,既能保证数据成员不被直接访问,又允许其派生类成员访问。据成员不被直接访问,又允许其派生类成员访问。public class Testpublic class Testpublic class Testpublic class Test protected int a;protected int a;protected int a;protected int a;protected int b;protected int b;protected int b;protected int b;public class TT:Testpublic class TT:Testpublic class TT:Testpublic class TT:Test public void set()public void set()public void set()public void set()a=100;a=100;a=100;a=100;b=200;b=200;b=200;b=200;n在类中将数据成员声明成为私有的或受保护的后,类的数据成员不能直接访问,必须添加设置或修改数据的公有方法成员。例4-14-1 类的继承示例(在SharpSharp类基础上派生出CircleCircle和RectangularRectangular类,在RectangularRectangular类基础上派生出SquareSquare类)。类的继承与多态n nbasebasebasebase关键字关键字n n派生类和基类构派生类和基类构造函数的调用造函数的调用n n派生类不继承基类的构造函数,在派生类对象中基类派生类不继承基类的构造函数,在派生类对象中基类部分成员仍然通过调用基类的构造函数进行初始化工部分成员仍然通过调用基类的构造函数进行初始化工作;作;n n创建派生类对象时,首先创建其从基类继承来的部分,创建派生类对象时,首先创建其从基类继承来的部分,然后才创建派生类自身扩展的部分;所以构造函数调然后才创建派生类自身扩展的部分;所以构造函数调用的次序是:先基类构造函数,再派生类构造函数;用的次序是:先基类构造函数,再派生类构造函数;n n若派生的级别不止一级(多级派生),例如,若派生的级别不止一级(多级派生),例如,C C C C类从类从B B B B类派生、类派生、B B B B类从类从A A A A类派生(即类派生(即A A A A是是B B B B的基类,的基类,B B B B是是C C C C的基类)的基类),则构造函数调用的次序依次为:,则构造函数调用的次序依次为:A A A A类的构造函数、类的构造函数、B B B B类的构造函数、类的构造函数、C C C C类的构造函数。类的构造函数。类的继承与多态n nbasebasebasebase关键字关键字n n向基类的构造函数传递参数向基类的构造函数传递参数向基类的构造函数传递参数必须通过派生类的构造函数进向基类的构造函数传递参数必须通过派生类的构造函数进行,其形式如下:行,其形式如下:public public public public 构造函数名构造函数名(形参列表形参列表):base():base():base():base(传递给基类的实参传递给基类的实参)/派生类构造函数代码派生类构造函数代码 public class T1public class T1public class T1public class T1 protected int a;protected int a;protected int a;protected int a;public T1(int x)public T1(int x)public T1(int x)public T1(int x)a=x;a=x;a=x;a=x;public class T2:T1public class T2:T1public class T2:T1public class T2:T1 protected int b;protected int b;protected int b;protected int b;public T2(int x,int y):base(y)public T2(int x,int y):base(y)public T2(int x,int y):base(y)public T2(int x,int y):base(y)b=x;b=x;b=x;b=x;例4-2 4-2 使用basebase向基类构造函数传递参数用法示例。类的继承与多态n nbasebasebasebase关键字关键字n nbasebasebasebase关键字除了能调用基类对象的构造函数,还可以调用关键字除了能调用基类对象的构造函数,还可以调用基类的方法。基类的方法。例例4-3 4-3 4-3 4-3 使用使用basebasebasebase调用基类中方法示例。调用基类中方法示例。n nSystem.ObjectSystem.ObjectSystem.ObjectSystem.Object类类C#C#C#C#所有类都派生于所有类都派生于System.ObjectSystem.ObjectSystem.ObjectSystem.Object类。在定义类时如果没有指类。在定义类时如果没有指定派生于哪一个类,系统就默认其派生于定派生于哪一个类,系统就默认其派生于ObjectObjectObjectObject类。例如:类。例如:public class Shape:System.Objectpublic class Shape:System.Objectpublic class Shape:System.Objectpublic class Shape:System.Object /TODO /TODO /TODO /TODO System.ObjectSystem.ObjectSystem.ObjectSystem.Object类常见的公有方法是:类常见的公有方法是:n nEqualsEqualsEqualsEquals:如果两个对象具有相同值时,方法将返回:如果两个对象具有相同值时,方法将返回truetruetruetrue。n nGetHashCodeGetHashCodeGetHashCodeGetHashCode:方法返回对象值的散列码。:方法返回对象值的散列码。n nToStringToStringToStringToString:通过在派生类中重写该方法,返回一个表示对象状态的字:通过在派生类中重写该方法,返回一个表示对象状态的字符串。符串。n nGetTypeGetTypeGetTypeGetType:根据内置对象类型指针获得当前对象的实际类型。:根据内置对象类型指针获得当前对象的实际类型。类的继承与多态n n多态性概述多态性概述n nC#C#C#C#中的多态性概念中的多态性概念多态性指允许每个对象以适合自己的方式去响应共同的消多态性指允许每个对象以适合自己的方式去响应共同的消息,即相同的操作可以作用于不同类型的对象并获得不同息,即相同的操作可以作用于不同类型的对象并获得不同的结果。即在程序运行时,执行的虽然是一个调用方法的的结果。即在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型不同实现不同的具体语句,却可以根据派生类对象的类型不同实现不同的具体操作。操作。n nC#C#C#C#中实现多态性的方法中实现多态性的方法在基类与派生类中声明具有同名的方法,并且在这些同名在基类与派生类中声明具有同名的方法,并且在这些同名的方法中编制不同的程序代码,即可在基类和派生类的相的方法中编制不同的程序代码,即可在基类和派生类的相同方法(同名方法)中分别实现不同的操作,从而为解决同方法(同名方法)中分别实现不同的操作,从而为解决同一问题提供多种途径同一问题提供多种途径类的继承与多态n n虚方法虚方法通过在派生类中使用关键字通过在派生类中使用关键字newnewnewnew对基类中虚方法的重载可以实对基类中虚方法的重载可以实现多态性,在基类中声明虚方法和派生类中对其的重载形式现多态性,在基类中声明虚方法和派生类中对其的重载形式如下:如下:n n基类中的虚方法声明形式基类中的虚方法声明形式public public public public virtualvirtualvirtualvirtual 方法名称方法名称(参数列表参数列表)/方法体方法体 n n派生类的重载声明形式派生类的重载声明形式public public public public overrideoverrideoverrideoverride 方法名称方法名称(参数列表参数列表)/方法体方法体 例4-4 4-4 虚方法的重载示例。类的继承与多态n n虚方法虚方法n n通过虚方法实现多态性的过程通过虚方法实现多态性的过程n n在基类和派生类的外面定义一个方法,其特点是:在基类和派生类的外面定义一个方法,其特点是:n n在方法中用基类的对象作为形式参数;在方法中用基类的对象作为形式参数;n n在方法中有通过形参对象调用虚方法在方法中有通过形参对象调用虚方法/重载方法的重载方法的语句;语句;n n(由于基类对象形式参数可以对应的实参既可以是基(由于基类对象形式参数可以对应的实参既可以是基类的对象,也可以是派生类的对象)类的对象,也可以是派生类的对象)n n将基类对象实参递给方法时,方法中调用的是基类将基类对象实参递给方法时,方法中调用的是基类中定义的相应方法;中定义的相应方法;n n将派生类对象实参递给方法时,方法中调用的是派将派生类对象实参递给方法时,方法中调用的是派生类中定义的相应方法;生类中定义的相应方法;例例4-5 4-5 4-5 4-5 用虚方法实现重载示例。用虚方法实现重载示例。类的继承与多态n n抽象类与抽象方法抽象类与抽象方法n n抽象方法抽象方法抽象方法是一个没有任何操作的方法,在抽象方法中没有抽象方法是一个没有任何操作的方法,在抽象方法中没有方法体,定义时必须使用关键字方法体,定义时必须使用关键字abstractabstractabstractabstract限定,定义的一限定,定义的一般形式为:般形式为:public public public public abstractabstractabstractabstract 返回类型返回类型 方法名(参数列表);方法名(参数列表);n n抽象类抽象类含有抽象方法的类称为抽象类,抽象类在定义时也必须使含有抽象方法的类称为抽象类,抽象类在定义时也必须使用关键字用关键字abstractabstractabstractabstract限定,其一般形式为:限定,其一般形式为:public public public public abstractabstractabstractabstract class class class class 类名类名 public public public public abstractabstractabstractabstract 返回类型返回类型 方法名(参数列表);方法名(参数列表);类的继承与多态n n抽象类与抽象方法抽象类与抽象方法n n重载抽象方法重载抽象方法定义抽象类的派生类时,派生类自然从抽象类继承抽象方定义抽象类的派生类时,派生类自然从抽象类继承抽象方法成员,由于基类中抽象方法并没有任何实现形式,所以法成员,由于基类中抽象方法并没有任何实现形式,所以在派生类中必须重载在派生类中必须重载(重写重写)抽象类中的抽象方法。抽象类中的抽象方法。n n抽象方法与虚方法的区别抽象方法与虚方法的区别n n虚方法有自己的实现代码(可以是空方法体);虚方法有自己的实现代码(可以是空方法体);n n抽象方法没有实现代码,没有方法体;抽象方法没有实现代码,没有方法体;n n对于基类的虚方法,派生类可以不对其进行重载;对于基类的虚方法,派生类可以不对其进行重载;n n对于基类中的抽象方法,派生类中必须进行重载;对于基类中的抽象方法,派生类中必须进行重载;例例4-6 4-6 4-6 4-6 抽象类和抽象方法实现示例。抽象类和抽象方法实现示例。类的继承与多态n n密封类和密封方法密封类和密封方法n n密封类密封类密封类是不允许其他类继承的类。定义密封类时需要使用密封类是不允许其他类继承的类。定义密封类时需要使用关键字关键字sealedsealedsealedsealed限定修饰,其一般形式如下:限定修饰,其一般形式如下:访问修饰符访问修饰符 sealedsealedsealedsealed class class class class 类名类名 /类体类体 n n密封方法密封方法可以将一个非密封类定义中的某个方法声明为密封方法。可以将一个非密封类定义中的某个方法声明为密封方法。一旦方法被声明为密封方法,将不允许在派生类中重载该一旦方法被声明为密封方法,将不允许在派生类中重载该方法。密封方法声明的一般形式如下:方法。密封方法声明的一般形式如下:public public public public sealedsealedsealedsealed int function()int function()int function()int function()/方法中的代码方法中的代码 面向对象编程进阶n n类的继承与多态类的继承与多态n n操作符重载操作符重载n n类型转换类型转换n n接口接口n n结构和枚举结构和枚举n n排序与查找算法排序与查找算法n n递归算法递归算法n n异常处理异常处理n n委托与事件委托与事件操作符重载n n操作符重载概念操作符重载概念在在C#C#C#C#应用程序设计中,可以将运算符的含义进行重新定义,应用程序设计中,可以将运算符的含义进行重新定义,使重新定义后的运算符在与自定义数据类型一起使用具有新使重新定义后的运算符在与自定义数据类型一起使用具有新类型所包含的含义。这种将类型所包含的含义。这种将C#C#C#C#语言原有运算符根据需要赋予语言原有运算符根据需要赋予新的含义的作法称为新的含义的作法称为“操作操作(运算运算)符重载符重载”。重载了合适的。重载了合适的运算符后,在应用程序中可以像使用语言的内部数据一样使运算符后,在应用程序中可以像使用语言的内部数据一样使用自定义数据类型的实例对象。用自定义数据类型的实例对象。n n 操作符重载方法的一般形式操作符重载方法的一般形式public static public static operator operator(参数表)/重载方法实现语句;操作符重载n n能够重载的运算符能够重载的运算符n n单目运算符单目运算符:+:+:+:+、-、!、!、+、-、truetruetruetrue、falsefalsefalsefalsen n双目运算符:双目运算符:+、-、*、/、%、&、|、=、!=!=!=!=、=、=、=、=-、newnewnewnew、isisisis、sizeofsizeofsizeofsizeof、typedeftypedeftypedeftypedef例例4-7 4-7 4-7 4-7 运算符运算符(操作符操作符)重载实现示例。重载实现示例。面向对象编程进阶n n类的继承与多态类的继承与多态n n操作符重载操作符重载n n类型转换类型转换n n接口接口n n结构和枚举结构和枚举n n排序与查找算法排序与查找算法n n递归算法递归算法n n异常处理异常处理n n委托与事件委托与事件类型转换n n表达式中的类型转换表达式中的类型转换n nC#C#C#C#中数据类型转换概念中数据类型转换概念C#C#C#C#语言允许在由简单数据类型构成的表达式中存在不同类语言允许在由简单数据类型构成的表达式中存在不同类型数据之间的运算,这些不同的数据类型由于表示的范围型数据之间的运算,这些不同的数据类型由于表示的范围和精度不同,涉及到如何来对这些不同的数据类型的数据和精度不同,涉及到如何来对这些不同的数据类型的数据进行运算及保存,需要程序设计语言提供在混合运算中和进行运算及保存,需要程序设计语言提供在混合运算中和数据类型转换方法。数据类型转换方法。n nC#C#C#C#中的数据类型转换方法中的数据类型转换方法n n隐式类型转换(系统自动类型转换)隐式类型转换(系统自动类型转换)n n显式类型转换(强制类型转换)显式类型转换(强制类型转换)n n使用使用ConvertConvertConvertConvert类进行转换类进行转换类型转换n n使用使用ConvertConvertConvertConvert转换转换System.ConvertSystem.ConvertSystem.ConvertSystem.Convert类中用一组静态方法实现类型的转换,即使类中用一组静态方法实现类型的转换,即使要转换的类型之间没有什么联系也可以很方便地实现类型的要转换的类型之间没有什么联系也可以很方便地实现类型的转换。转换。ConvertConvertConvertConvert类包含的类转换方法如下:类包含的类转换方法如下:方方 法法实现的转实现的转换类型换类型方方 法法实现的转实现的转换类型换类型Convert.ToBoolean()Convert.ToBoolean()Convert.ToBoolean()Convert.ToBoolean()boolboolboolboolConvert.ToInt32()Convert.ToInt32()Convert.ToInt32()Convert.ToInt32()intintintintConvert.ToByte()Convert.ToByte()Convert.ToByte()Convert.ToByte()bytebytebytebyteConvert.ToInt64()Convert.ToInt64()Convert.ToInt64()Convert.ToInt64()longlonglonglongConvert.ToChar()Convert.ToChar()Convert.ToChar()Convert.ToChar()charcharcharcharConvert.ToSByte()Convert.ToSByte()Convert.ToSByte()Convert.ToSByte()sbytesbytesbytesbyteConvert.ToString()Convert.ToString()Convert.ToString()Convert.ToString()stringstringstringstringConvert.ToSingle()Convert.ToSingle()Convert.ToSingle()Convert.ToSingle()floatfloatfloatfloatConvert.ToDecimal()Convert.ToDecimal()Convert.ToDecimal()Convert.ToDecimal()decimaldecimaldecimaldecimalConvert.ToUInt16()Convert.ToUInt16()Convert.ToUInt16()Convert.ToUInt16()ushortushortushortushortConvert.ToDouble()Convert.ToDouble()Convert.ToDouble()Convert.ToDouble()doubledoubledoubledoubleConvert.ToUInt32()Convert.ToUInt32()Convert.ToUInt32()Convert.ToUInt32()uintuintuintuintConvert.ToInt16()Convert.ToInt16()Convert.ToInt16()Convert.ToInt16()shortshortshortshortConvert.ToUInt64()Convert.ToUInt64()Convert.ToUInt64()Convert.ToUInt64()ulongulongulongulong例4-8 Convert4-8 Convert实现类型转换示例。面向对象编程进阶n n类的继承与多态类的继承与多态n n操作符重载操作符重载n n类型转换类型转换n n接口接口n n结构和枚举结构和枚举n n排序与查找算法排序与查找算法n n递归算法递归算法n n异常处理异常处理n n委托与事件委托与事件接口n n接口概念和接口概念和接口定义形式接口定义形式n n接口概念接口概念接口定义相当于一个约定,规定了实现该接口的类必须要接口定义相当于一个约定,规定了实现该接口的类必须要提供的属性、事件、方法。接口本身并不提供它所定义成提供的属性、事件、方法。接口本身并不提供它所定义成员的实现,仅规定了实现该接口的类或结构所必须提供的员的实现,仅规定了实现该接口的类或结构所必须提供的成员。成员。n n接口定义形式接口定义形式 访问修饰符访问修饰符 interface interface interface interface 接口名接口名 接口体接口体 接口n n接口的限制接口的限制n n不允许在接口中定义任何字段;不允许在接口中定义任何字段;n n不允许在接口中包含任何构造函数;不允许在接口中包含任何构造函数;n n不允许在接口中包含析构函数;不允许在接口中包含析构函数;n n不允许在接口中为任何方法指定访问修饰符;不允许在接口中为任何方法指定访问修饰符;n n不允许在接口中嵌套任何类型;不允许在接口中嵌套任何类型;n n接口实现接口实现为了实现一个接口,需要声明一个类或结构,该类(或结为了实现一个接口,需要声明一个类或结构,该类(或结构)从接口继承,并实现接口指定的全部方法。构)从接口继承,并实现接口指定的全部方法。例例4-9 4-9 4-9 4-9 接口的定义和实现示例。接口的定义和实现示例。例例4-10 4-10 4-10 4-10 类继承多接口使用示例。类继承多接口使用示例。面向对象编程进阶n n类的继承与多态类的继承与多态n n操作符重载操作符重载n n类型转换类型转换n n接口接口n n结构和枚举结构和枚举n n排序与查找算法排序与查找算法n n递归算法递归算法n n异常处理异常处理n n委托与事件委托与事件结构和枚举n n结构结构n n结构的引入结构的引入类定义的是一个引用类型,创建在堆类定义的是一个引用类型,创建在堆(heap)(heap)(heap)(heap)上。如果类中上。如果类中仅包含极少的数据和方法,则因管理该类(管理堆)造成仅包含极少的数据和方法,则因管理该类(管理堆)造成的系统开销显得极不合算。在这种情况下,可以使用结构的系统开销显得极不合算。在这种情况下,可以使用结构来代替类以减少系统开销。(注:可以将结构看成是一种来代替类以减少系统开销。(注:可以将结构看成是一种轻型的类)轻型的类)n n结构定义形式结构定义形式struct struct struct struct 类名类名 结构成员定义结构成员定义 n n结构与类的区别结构与类的区别主要区别:结构式值类型(主要区别:结构式值类型(参见参见P107P107P107P107表表4.44.44.44.4)例4-11 4-11 结构类型定义和使用示例。结构和枚举n n枚举枚举n n使用枚举数据类型的原因使用枚举数据类型的原因n n表达常数的物理意义表达常数的物理意义n n限制数据对象的取值范围限制数据对象的取值范围n n枚举的定义形式枚举的定义形式enum enum enum enum 枚举名枚举名:基本类型名基本类型名 枚举成员枚举成员 =常数表达式常数表达式,n n基本类型名:枚举类型声明可以显式地声明基本类型名:枚举类型声明可以显式地声明bytebytebytebyte、sbytesbytesbytesbyte、shortshortshortshort、ushortushortushortushort、intintintint、uintuintuintuint、longlonglonglong或或ulongulongulongulong的的一个基本类型。一个基本类型。n n如果没有显式地声明基本类型,则默认为如果没有显式地声明基本类型,则默认为intintintint。n n注意:不能用注意:不能用charcharcharchar作为基本类型。作为基本类型。例4-12 4-12 枚举类型定义和引用示例(表示交通灯可能的颜色)。面向对象编程进阶n n类的继承与多态类的继承与多态n n操作符重载操作符重载n n类型转换类型转换n n接口接口n n结构和枚举结构和枚举n n排序与查找算法排序与查找算法n n递归算法递归算法n n异常处理异常处理n n委托与事件委托与事件排序与查找算法n n插入排序插入排序n n插入排序的基本思想插入排序的基本思想每次将一个待排序的记录,按其关键字大小插入到前面已每次将一个待排序的记录,按其关键字大小插入到前面已经排好序序列中适当位置,直到全部记录插入完成为止。经排好序序列中适当位置,直到全部记录插入完成为止。n n插入排序方法插入排序方法n n直接插入排序直接插入排序n n希尔排序希尔排序n n直接插入排序基本思想直接插入排序基本思想假设待排序的记录存放在数组假设待排序的记录存放在数组R1.R1.R1.R1.n n n n 中。初始时,中。初始时,R1R1R1R1自成一个有序区,无序区为自成一个有序区,无序区为R2.R2.R2.R2.n n n n 。从。从i i i i=2=2=2=2起直至起直至i i i i=n n n n为为止,依次将止,依次将RRRRi i i i 插入当前的有序区插入当前的有序区R1.R1.R1.R1.i i i i 1111中,生成含中,生成含n n n n个记录的有序区。个记录的有序区。例例4-13 4-13 4-13 4-13 编程序实现直接插入排序算法,对随机生成的编程序实现直接插入排序算法,对随机生成的15151515个两位整数按升个两位整数按升序进行排序序进行排序。排序与查找算法n n冒泡排序冒泡排序冒泡排序算法的基本思想是两两比较待排序数据序列中的数冒泡排序算法的基本思想是两两比较待排序数据序列中的数据,根据比较结果来对换这两个数据在序列中的位置。其算据,根据比较结果来对换这两个数据在序列中的位置。其算法基本概念可描述如下:法基本概念可描述如下:n n从待排序列中第一个位置开始,依次比较相邻两个位置上从待排序列中第一个位置开始,依次比较相邻两个位置上的数据,若是逆序则交换,一趟扫描后,最大(或最小)的数据,若是逆序则交换,一趟扫描后,最大(或最小)的数据被交换到了最右边。的数据被交换到了最右边。n n不考虑已排好序的数据,将剩下的数据作为待排序列。不考虑已排好序的数据,将剩下的数据作为待排序列。n n重复上述两步直到排序完成,重复上述两步直到排序完成,n n n n个记录的排序最多进行个记录的排序最多进行n-1n-1n-1n-1趟。趟。例例4-14 4-14 4-14 4-14 编程序实现冒泡排序算法,对随机生成的编程序实现冒泡排序算法,对随机生成的15151515个三位整数按升序进个三位整数按升序进行排序并输出。行排序并输出。排序与查找算法n n选择排序选择排序选择排序法的基本思想是对于待排的选择排序法的基本思想是对于待排的n n n n个数据,在其中寻找最个数据,在其中寻找最大(或最小)的数值,并将其移动到所查找集合的最前面作大(或最小)的数值,并将其移动到所查找集合的最前面作为其第一个数据;反复进行类似操作,直到将整个待排数据为其第一个数据;反复进行类似操作,直到将整个待排数据集合处理完为止(只剩下一个待处理数据)。选择排序的基集合处理完为止(只剩下一个待处理数据)。选择排序的基本方法是:本方法是:n n在所有的记录中选取关键字值最大(或最小)的记录,并在所有的记录中选取关键字值最大(或最小)的记录,并将其与第一个记录交换位置。将其与第一个记录交换位置。n n将上次操作完成后剩下的记录中构成一个新处理数据集。将上次操作完成后剩下的记录中构成一个新处理数据集。n n在新处理数据集的所有记录中选取关键字值最大(或最小)在新处理数据集的所有记录中选取关键字值最大(或最小)的记录,并将其与新处理数据集中第一个记录交换位置。的记录,并将其与新处理数据集中第一个记录交换位置。n n如果还有待处理记录,转到第二步。如果还有待处理记录,转到第二步。例例4-15 4-15 4-15 4-15 编程序实现选择排序算法,对随机生成的编程序实现选择排序算法,对随机生成的15151515个两位整数按升序进个两位整数按升序进行排序并输出。行排序并输出。排序与查找算法n n顺序查找顺序查找顺序查找又称为线性查找。其基本过程是:从待查表中的第顺序查找又称为线性查找。其基本过程是:从待查表中的第一个记录开始,将给定的关键字值与表中每一个记录的关键一个记录开始,将给定的关键字值与表中每一个记录的关键字值逐个进行比较。如果找到相符合的记录时,查找成功,字值逐个进行比较。如果找到相符合的记录时,查找成功,如果查找到标得末端都未找到相符合的记录时,查找失败。如果查找到标得末端都未找到相符合的记录时,查找失败。顺序查找法适应于被查找集合无序的场合。顺序查找法适应于被查找集合无序的场合。例例4-16 4-16 4-16 4-16 编程序实现顺序查找算法,在随机生成的编程序实现顺序查找算法,在随机生成的15151515个整数中查找指定值,个整数中查找指定值,找到显示出关键字在数组中的位置,否则显示数组中不存在指定关键字找到显示出关键字在数组中的位置,否则显示数组中不存在指定关键字的提示信息。的提示信息。排序与查找算法n n折半查找(二分查找)折半查找(二分查找)折半查找法又称为二分查找法,该算法要求在一个对查找关折半查找法又称为二分查找法,该算法要求在一个对查找关键字而言有序的数据序列上进行,其基本思想是:逐步缩小键字而言有序的数据序列上进行,其基本思想是:逐步缩小查找目标可能存在的范围,具体描述如下:查找目标可能存在的范围,具体描述如下:n n选取表中中间位置的记录作为基准,将表分为两个子表。选取表中中间位置的记录作为基准,将表分为两个子表。n n当基准记录的关键字值与查找的关键字值相符合时,返回当基准记录的关键字值与查找的关键字值相符合时,返回基准记录位置,算法结束。基准记录位置,算法结束。n n当基准记录的关键字值与查找的关键字值不符合时,在处当基准记录的关键字值与查找的关键字值不符合时,在处理的两个子表中选取一个子表,重复执行上述两步,直到理的两个子表中选取一个子表,重复执行上述两步,直到被处理的子表中没有记录为止。被处理的子表中没有记录为止。例例4-17 4-17 4-17 4-17 编程序实现顺序查找算法,在随机生成的编程序实现顺序查找算法,在随机生成的15151515个整数中查找指定值,个整数中查找指定值,找到显示出关键字在数组中的位置,否则显示数组中不存在指定关键字找到显示出关键字在数组中的位置,否则显示数组中不存在指定关键字的提示信息。的提示信息。排序与查找算法n n数组的数组的ReverseReverseReverseReverse方法方法 数组数组ReverseReverseReverseReverse方法调用的一般形式方法调用的一般形式Array.Reverse(arrayName,start,length);Array.Reverse(arrayName,start,length);Array.Reverse(arrayName,start,length);Array.Reverse(arrayName,start,length);n narrayName:arrayName:arrayName:arrayName:表示被颠倒存放所有元素值的数组;表示被颠倒存放所有元素值的数组;n nstartstartstartstart:数组中颠倒存放的起始位置:数组中颠倒存放的起始位置(下标号下标号););););n nlengthlengthlengthlength:数组中颠倒存放的数据个数:数组中颠倒存放的数据个数(长度长度););););n n如果省略参数如果省略参数startstartstartstart和和lengthlengthlengthlength,表示颠倒存放整个数组,表示颠倒存放整个数组 例例4-18 4-18 4-18 4-18 编程序实现功能:从键盘上输入一个无符号整数,转换并输出该编程序实现功能:从键盘上输入一个无符号整数,转换并输出该整数的二进制表示。整数的二进制表示。排序与查找算法n n数组的数组的SortSortSortSort方法方法数组数组SortSortSortSort方法调用的一般形式方法调用的一般形式Array.Sort(arrayName);Array.Sort(arrayName);Array.Sort(arrayName);Array.Sort(arrayName);n narrayNamearrayNamearrayNamearrayName表示被排序的数组;表示被排序的数组;n n例例4-19 4-19 4-19 4-19 创建控制台应用程序,对一组随机产生的整型数据使用数组的创建控制台应用程序,对一组随机产生的整型数据使用数组的SortSortSortSort方法按升序排序。方法按升序排序。n n例例4-20 4-20 4-20 4-20 创建控制台应用程序实现功能:随机产生一个创建控制台应用程序实现功能:随机产生一个4 4 4 4行行10101010列二维整型列二维整型数组的所有元素值,然后对其奇数行按升序排序,偶数行按降序排序,数组的所有元素值,然后对其奇数行按升序排序,偶数行按降序排序,输出排序后的二维数组。输出排序后的二维数组。排序与查找算法n n数组的数组的BinarySearchBinarySearchBinarySearchBinarySearch方法方法数组二分查找方法数组二分查找方法BinarySearchBinarySearchBinarySearchBinarySearch调用的一般形式调用的一般形式Array.BinarySearch(arrayName,key);Array.BinarySearch(arrayName,key);Array.BinarySearch(arrayName,key);Array.BinarySearch(arrayName,key);n narrayNamearrayNamearrayNamearrayName:表示被查找的数组,要求数组是排过序的;:表示被查找的数组,要求数组是排过序的;n nkeykeykeykey:表示在数组中查找的关键字值;:表示在数组中查找的关键字值;n nBinarySearchBinarySearchBinarySearchBinarySearch方法的返回值是一个整型数据,有下面两种方法的返回值是一个整型数据,有下面两种情况:情况:n n返回值是返回值是0 0 0 0或者正值,表示在数组中找到了关键字值,或者正值,表示在数组中找到了关键字值,返回值表示该关键字在数组中的序号(下标);返回值表示该关键字在数组中的序号(下标);n n返回值是负值,表示数组中没有被查找的关键字值。返回值是负值,表示数组中没有被查找的关键字值。例例4-21 4-21 4-21 4-21 创建控制台应用程序,演示数组方法创建控制台应用程序,演示数组方法BinarySearchBinarySearchBinarySearchBinarySearch的使用。的使用。面向对象编程进阶n n类的继承与多态类的继承与多态n n操作符重载操作符重载n n类型转换类型转换n n接口接口n n结构和枚举结构和枚举n n排序与查找算法排序与查找算法n n递归算法递归算法n n异常处理异常处理n n委托与事件委托与事件递归算法n n方法的递归调用方法的递归调用n n方法递归调用的概念方法递归调用的概念一个一个方法方法直接地或间接地自己调用自己,称为直接地或间接地自己调用自己,称为方法方法的递归的递归调用。调用。n n方法方法递归调用的特递归调用的特点点n n调用方法与嵌套调用类似,但每次嵌套调用的方法都调用方法与嵌套调用类似,但每次嵌套调用的方法都是该方法数本身;是该方法数本身;n n调用不会无限制进行下去,即调用总会在某种条件下调用不会无限制进行下去,即调用总会在某种条件下结束;结束;n n每次调用时,本次的方法体并没有执行完毕。故必须每次调用时,本次的方法体并没有执行完毕。故必须依靠系统提供一个特殊部件(堆栈)存放未完成的操依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束时不会丢失操作;作,以保证当递归调用结束时不会丢失操作;递归算法n n例例4-22 4-22 4-22 4-22 递归调用例,反向输递归调用例,反向输出输入的字符串。出输入的字符串。static void Main(string args)static void Main(string args)reverse();reverse();public static void reverse()public static void reverse()char ch;char ch;ch=(char)Console.Read();ch=(char)Console.Read();if(ch=#)if(ch=#)Console.Write(ch);Console.Write(ch);else else reverse();reverse();Console.Write(ch);Console.Write(ch);输入数据:abc#数出结果:putchar(a)putchar(b)putchar(c)#cba堆栈结构示意递归算法 ch=a;if(ch=#)putchar(ch);else reverse();putchar(ch);ch=b;if(ch=#)putchar(ch);else reverse();putchar(ch);ch=c;if(ch=#)putchar(ch);else reverse();putchar(ch);ch=#;if(ch=#)putchar(ch);else reverse();putchar();reverse();主函数输出#输出c输出b输出a用嵌套调用方式理解递归调用递归算法n n例例4-23 4-23 4-23 4-23 汉诺塔汉诺塔(Tower of Hanoi)(Tower of Hanoi)(Tower of Hanoi)(Tower of Hanoi)问题。问题。有有A A A A、B B B B、C C C C三根杆,最左边杆上自下而上、由大到小顺序串有三根杆,最左边杆上自下而上、由大到小顺序串有64646464个金个金盘呈一塔形。现要把左边杆上的金盘全部移到右边杆上,条件是一次只盘呈一塔形。现要把左边杆上的金盘全部移到右边杆上,条件是一次只能移动一个盘,且不允许大盘压在小盘的上面。能移动一个盘,且不允许大盘压在小盘的上面。ABC3 32 21 11 12 21 1解题思想:把n-1n-1个盘子设法借助b b杆放到c c杆,记做hanoi(n-1,A,C,B)hanoi(n-1,A,C,B)3 3把第n n个盘子从a a杆移动到b b杆D1:ABD1:ABD2:ACD2:ACD1:BCD1:BCD3:ABD3:AB把c c杆上的n-1n-1个盘子借助a a杆移动到b b杆,记做hanoi(n-1,C,B,A)hanoi(n-1,C,B,A)D1:CA D1:CA 1 1D2:CB D2:CB 2 2D1:AB D1:AB 1 1算法:Hanoi(n,A,B,C)Hanoi(n,A,B,C)算法开始 If(n=1)then If(n=1)then金盘ABAB盘;/*/*如果盘数n=1n=1即只有一个圆盘*/*/Else ElseHanoi(n-1,A,C,B)Hanoi(n-1,A,C,B)/*/*先把A A顶上的n-1n-1个圆盘借助于B B移
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!