第4章--方法--C#程序设计案例教程课件.ppt
C#程序设计案例教程程序设计案例教程第4章 方 法学习目标知识目标l理解使用方法的优点。l掌握方法的定义。l掌握方法的调用,了解方法的调用过程。l掌握方法嵌套调用和递归调用。l理解并掌握方法间的两种参数传递方式(值传递、引用传递)。l掌握方法的重载。技能目标l针对timer1控件的Tick事件所对应的方法进行编程,初步体会事件机制。l利用队列或链表让蛇在键的控制下运动起来,体会数据结构的作用。l通过建立DrawGrid()、GenerateSnake()、GenerateFood()、等方法,实现画格子、创建蛇、产生食物、游戏结束、蛇移动和加分等功能,从而掌握方法的定义和使用,并体会方法的作用和重要性。自学内容l复习数据结构队列知识。l了解覆写和事件初步知识。开 场 白 前几天,我去湘雅医院的骨科看病。一位老教前几天,我去湘雅医院的骨科看病。一位老教授先询问病情,然后观察了一下,就叫我去做授先询问病情,然后观察了一下,就叫我去做X光透视;一个小时后我将透视结果带给教授复诊,光透视;一个小时后我将透视结果带给教授复诊,教授根据结果开处方,然后让我去窗口缴费;收教授根据结果开处方,然后让我去窗口缴费;收银员收款后将缴费信息存入数据,并告诉我到领银员收款后将缴费信息存入数据,并告诉我到领药窗口取药,这时领药窗口的医务人员早就根据药窗口取药,这时领药窗口的医务人员早就根据联网系统的通知完成配药工作了,将药递给我。联网系统的通知完成配药工作了,将药递给我。最后,我领到药去打针。每一个环节都有熟门熟最后,我领到药去打针。每一个环节都有熟门熟路的专业人员负责,分工协作,我很顺利地完成路的专业人员负责,分工协作,我很顺利地完成看病这一看病这一“任务任务”。我们楼下有一个刚开的小诊所,目前只有一个医生。我们楼下有一个刚开的小诊所,目前只有一个医生。如果我到这个小诊所去看病,那么以上这些环节的实现如果我到这个小诊所去看病,那么以上这些环节的实现就全要靠这一个人完成。就全要靠这一个人完成。在这里将在医院看病称为第一种模式,将在诊所看病在这里将在医院看病称为第一种模式,将在诊所看病称为第二种模式,那么大家想想,第一种模式与第二种称为第二种模式,那么大家想想,第一种模式与第二种模式相比具有什么优势呢?模式相比具有什么优势呢?很明显,第一种模式是针对大型医院、复杂的病情。很明显,第一种模式是针对大型医院、复杂的病情。这种模式采用了分工形式,效率高,老教授能将精力专这种模式采用了分工形式,效率高,老教授能将精力专注于重点问题的解决,同时也方便升级(例如,更换一注于重点问题的解决,同时也方便升级(例如,更换一个更有经验的负责照片的医生)和维护,即使出现问题个更有经验的负责照片的医生)和维护,即使出现问题也能较快地找到可能出错的环节,例如,收款出错了也也能较快地找到可能出错的环节,例如,收款出错了也不至于又跑去麻烦老教授。不至于又跑去麻烦老教授。整个过程可以表示如下:整个过程可以表示如下:看病看病()询问病情询问病情();做做X光透视光透视();复诊复诊();开处方开处方();收款收款();配药配药();打针打针();其中对做其中对做X光透视光透视()这个方法而言,教授只是这个方法而言,教授只是想知道返回的结果,而不必自己亲自去实现;而想知道返回的结果,而不必自己亲自去实现;而对于收款对于收款()、配药、配药()、打针、打针()这几个方法来说,这几个方法来说,这些并不是教授关注的重点,没必要亲自去做,这些并不是教授关注的重点,没必要亲自去做,所以交由其他人员处理。这样,整个看病过程中,所以交由其他人员处理。这样,整个看病过程中,教授就通过教授就通过“方法方法”的形式将大部分工作分配给的形式将大部分工作分配给了其他专业人员去具体实现,自己就从繁重的工了其他专业人员去具体实现,自己就从繁重的工作中得以解放。作中得以解放。大家可以想象,如果将所有的方法中的详细代大家可以想象,如果将所有的方法中的详细代码都写在码都写在“看病看病”这个区域,是不是就和楼下诊这个区域,是不是就和楼下诊所的那个医生操作所有环节一样繁琐而混乱呢?所的那个医生操作所有环节一样繁琐而混乱呢?4.1.1.1 使用方法的意义在一个较大、较复杂的程序中,常常需要完成许多功能(称之为基本操作),这些基本操作由若干条语句有机组合而成,相互之间彼此独立。程序的设计就相当于搭积木,一般是由各个基本操作按照一定的方式有机组合而成的,这就是结构化程序设计方法。其中的每一个基本操作都称为一个方法,这些方法既可以调用其他方法,也可以被其他方法所调用。4.1 方法的定义与调用4.1.1 基础知识例如:求两个数中较大的一个static int Max(int a,int b)/方法定义方法定义 int c;c=ab?a:b;return c;3方法的参数列表 形参形参1,形参形参2,形参形参n,2方法名 方法名最好具有与本身功能相对应的实际含义,建议采用动词短语,如DrawTriangle。方法名一般使用Pascal命名法,就是组成方法名的单词直接相连,每个单词的首字母大写,如ReadLine、WriteLine。4.1.1.3 4.1.1.3 方法的调用方法的调用1方法调用时参数的传递 进行参数传递时实参与形参必须个数相等,类型一致,并按位置、顺序一一对应。在一般情况下,实参可以是常量、变量或表达式,形参必须是变量。如果实参是表达式,调用前会先计算表达式,然后把表达式的值传递给形参。2方法的调用方式方法有以下3种调用方式。(1)方法语句这种方式把方法调用作为一个语句来使用。例如,Console.WriteLine(请输入两个整数:);。这种方式适用于对没有返回值的方法的调用。(2)方法表达式方法的调用出现在一个表达式中。例如,Max()方法的调用语句:z=Max(x,y);z=2*Max(x,y);(3)方法参数这种方式把方法的调用结果作为另一个方法的参数。例如,Max(9,Max(5,11)是把Max(5,11)的调用结果11作为外层Max()方法的一个实参。方法表达式和方法参数这两种方式适用于对有返回值的方法的调用。3方法的调用过程 看病结束做透视透视结束返回结果去做透视Main()调用A方法结束A()方法A()结束返回结果图4.1 看病过程与方法的调用过程 4.2 方法的嵌套调用4.2.1 基础知识Main()调用A()方法结束A()方法调用B()方法B()方法B()方法结束A()方法结束图4.3 方法的嵌套调用过程4.2.2 案例多棵圣诞树案例情境在4.1.2节案例基础上,画出多棵不同颜色的圣诞树,可以进一步提炼出画圣诞树的方法。案例运行结果如图4.4所示。图4.4 画出多棵圣诞树的效果画三角形的方法:画三角形的方法:private void DrawTriangle(Color c,int x,int y,int h,int w)Pen p=new Pen(c);g.DrawLine(p,new Point(x,y),new Point(x-w,y+h);g.DrawLine(p,new Point(x,y),new Point(x+w,y+h);g.DrawLine(p,new Point(x-w,y+h),new Point(x+w,y+h);调用画三角形方法画树:调用画三角形方法画树:private void DrawTree(Color c,int x,int y)int h=20,w=20;DrawTriangle(c,x,y,h,w);/画树第一个部分,顶部画树第一个部分,顶部 DrawTriangle(c,x,y+h,h+10,w+10);/画树第二个画树第二个部分部分 DrawTriangle(c,x,y+h*2+10,h+20,w+20);/画树第三个部画树第三个部分分 DrawTriangle(c,x,y+4*h+10,30,0);/画树第四个画树第四个部分,树干部分,树干 4.3 方法的递归调用4.3.1.1 方法的递归调用一个方法直接或者间接调用自己称为递归,同时将该方法称为递归方法。1直接递归2间接递归4.3.1 基础知识头脑风暴:想想看,日常生活中还有哪些类似递归的情形?4.3.1.2 使用递归的条件一个问题要用递归的方法来解决,需满足以下条件:(1)原问题可转化为一个新问题,而这个新问题与原问题有相同的解决方法。(2)新问题可继续这种转化,在转化过程中,问题有规律地递增或递减。(3)在有限次转化后,问题得到解决,即具备递归结束的条件。代码代码class Program private static double Fac(int n)if(n=0|n=1)return 1;else return Fac(n-1)*n;static void Main(string args)int n=5;Console.WriteLine(0的阶乘为的阶乘为 1。,n,Fac(n);Console.ReadLine();4.4 方法的参数4.4.1.1 参数的传值方式参数以传值方式传递,被调用的方法将接受实参的一个副本,参数传递后,如果对被调用方法中的实参副本进行修改,不会影响原始实参的值。4.4.1 基础知识例如,我们设计一个交换两个数的方法,如下:void Swap(int a,int b)int t;t=a;a=b;b=t;在主函数中调用此方法:在主函数中调用此方法:int x=1,y=2;S);但这样并不能实现但这样并不能实现x与与y的交换。的交换。4.4.1.2 参数的传引用方式1ref引用参数采用传引用方式以后,Swap()方法调用过程中参数的引用传递类比示例如图4.8所示。张三的语文复习资料李四的数学复习资料赵三的语文复习资料黄四的数学复习资料将资料借给黄四将资料借给赵三李四的语文复习资料交换交换后后赵三的数学复习资料黄四的语文复习资料张三的数学复习资料交换了交换了图4.8 Swap()方法调用过程中参数的引用传递类比示例2out输出参数除了ref关键字外,C#还提供了out关键字用于参数的引用传递。ref参数必须在方法被调用前进行赋值,但在实际的应用中,有时仅需要调用方法计算出某个结果返回给调用者,而不需要调用者对这个参数进行初始化,在这种情况下可以使用out参数。out参数仅用于输出方法的某个结果。在“某班成绩处理”的示例中,max、min两个参数可以不用在Main()方法中初始化,仅用于从方法返回结果,因此可以用out关键字来修饰。namespace Example4_4_1 class Program static void Swap(int a,int b)/完成交换两个数的方法完成交换两个数的方法 int t;t=a;a=b;b=t;static void Main()int x,y;Console.WriteLine(请输入两个数字请输入两个数字:);x=int.Parse(Console.ReadLine();y=int.Parse(Console.ReadLine();Console.WriteLine(交换前交换前:0,1,x,y);Swap(x,y);Console.WriteLine(交换后交换后:0,1,x,y);Console.ReadLine();代码代码1namespace Example4_4_2 class Program static void S int a,ref int b)/完成交换两个数的方法完成交换两个数的方法 int t;t=a;a=b;b=t;static void Main()int x,y;Console.WriteLine(请输入两个数字:请输入两个数字:);x=int.Parse(Console.ReadLine();y=int.Parse(Console.ReadLine();Console.WriteLine(交换前:交换前:0,1,x,y);Swap(ref x,ref y);Console.WriteLine(交换后:交换后:0,1,x,y);Console.ReadLine();代码代码24.5 方 法 重 载1为什么需要重载 C#提供了重载机制,允许给多个功能相似的方法取相同的名字,在调用时由系统决定应该调用哪个方法。2什么是方法重载 两个或两个以上的一组方法,如果方法名相同,使用不同的参数列表来定义,称为方法重载。3系统如何确定该调用哪个方法 系统会根据参数个数或者参数类型的不同来区分。具体调用时,由编译器根据实参和形参的类型及个数来进行最佳匹配,自动确定调用哪个方法。4.5.1 基础知识4.5.2 案例求平方和案例简介 编写程序,分别实现求两个整数的平方和、求两个实数的平方和以及求3个整数的平方和。案例运行结果如图4.14所示。图4.14 求平方和的运行结果static int SumofSquares1(int a,int b)/求两个整数的平方和求两个整数的平方和 Console.WriteLine(调用了包含两个整型参数的方法调用了包含两个整型参数的方法);return(a*a+b*b);static int SumofSquares2(int a,int b,int c)Console.WriteLine(调用了包含调用了包含3个整型参数的方法个整型参数的方法);return(a*a+b*b+c*c);static double SumofSquares3(double a,double b)/求两实数的平方和求两实数的平方和 Console.WriteLine(调用了包含两个双精度参数的方法调用了包含两个双精度参数的方法);return(a*a+b*b);代码代码4.6 贪吃蛇项目分解创建方法 案例情境案例情境具体任务如下:具体任务如下:(1)建立多个方法,如)建立多个方法,如DrawGrid()、GenerateSnake()、GenerateFood()、GameOver()、AddScores()和和SnakeMove()等,用于实现画格子、创等,用于实现画格子、创建蛇、产生食物、游戏结束、蛇移动和加分建蛇、产生食物、游戏结束、蛇移动和加分等功能。等功能。(2)定义表示方向键值的枚举类型)定义表示方向键值的枚举类型Direction。(3)覆写()覆写(override,又称重写),又称重写)ProcessDialogKey()方法。方法。(4)针对)针对timer1控件控件Tick事件所对应的方事件所对应的方法法timer1_Tick()进行编程。进行编程。(5)通过)通过button1的的Click事件启动贪吃蛇。事件启动贪吃蛇。通过以上几个任务的实现,从而让蛇在玩家通过以上几个任务的实现,从而让蛇在玩家按键的指挥下运动起来。游戏启动前和结束按键的指挥下运动起来。游戏启动前和结束时的界面如图时的界面如图4.15和图和图4.16所示。所示。图4.15 游戏开始前 图4.16 游戏结束后 4.7 本 章 小 结本章通过多个案例系统地介绍了使用方法的必要性、方法的定义、方法的调用(包括嵌套调用和递归调用)、方法重载以及参数的两种传递方式。本章还介绍了5个实训点:如何定义方法;如何调用方法;如何用不同传递方式实现参数的传递;如何进行方法重载;如何实现蛇的移动。通过本章的学习,读者要达到能够使用方法来构建程序的能力目标。