290 likes | 487 Views
第 5 章 方 法. 本章要点: 方法的概念 方法的定义 方法的调用 参数传递中的类型转换 参数的值传递和引用传递 方法的嵌套调用与递归调用. 5.1 循序渐进学理论. 5.1.1 C# 中的程序模块 —— 方法. 5.1.2 方法的定义. [ 格式 ] :方法修饰符 数据类型说明符 方法名 ([ 形式参数说明列表 ]) /* 定义方法头 * / { 变量、数组的定义语句 ; 其它可执行部分 } 【 例 5-1 】 编写一个方法,用来求任意两个整数之间的所有数的平方和。.
E N D
第5章方法 本章要点: 方法的概念 方法的定义 方法的调用 参数传递中的类型转换 参数的值传递和引用传递 方法的嵌套调用与递归调用
5.1 循序渐进学理论 5.1.1 C#中的程序模块——方法
5.1.2 方法的定义 [格式]:方法修饰符数据类型说明符方法名([形式参数说明列表]) /*定义方法头*/ { 变量、数组的定义语句; 其它可执行部分 } 【例5-1】编写一个方法,用来求任意两个整数之间的所有数的平方和。
【例5-2】编写一个实现如下功能的函数:要求用户输入姓名,然后输出五行如下信息:“欢迎您,***同志。这里是C#编程世界!”【例5-2】编写一个实现如下功能的函数:要求用户输入姓名,然后输出五行如下信息:“欢迎您,***同志。这里是C#编程世界!”
5.1.3 方法的调用 [格式1]:方法名([实际参数列表]) [格式2]:对象名.方法名([实际参数列表]) 例如,上一章编程中使用的语句“randomObj.Next();”就是调用对象randomObj的Next方法。 [格式3]:类名.方法名([实际参数列表])
【例5-3】 编写程序调用例5-1中的过程pfh。 【例5-4】 编写程序调用例5-2中的过程Welcome。
实参类型 相应的形参类型 bool object byte decimal,double,float,int,uint,long,ulong,object,short,ushort sbyte decimal,double,float,int,long,object,short char decimal,double,float,int,uint,long,ulong,object,ushort decimal object double object float double,object int decimal,double,float,long,object uint decimal,double,float,long,ulong,object long decimal,double,float,object ulong decimal,double,float,object short decimal,double,float,int,long,object ushort decimal,double,float,int,uint,long,ulong,object 5.1.4 参数传递中的类型转换
【例5-5】 分析下列程序的执行结果。 [程序代码] using System; class A_5_5 { static float Sqr(float k)//参数为float型 { return(k*k) ; } public static void Main() { int y;float yy; y=6; yy= Sqr(y); //调用Sqr方法 Console.WriteLine("{0}的平方是{1}",y,yy);//输出 } }
5.1.5 参数的传递:值传递、引用传递和输出参数 所谓参数传递是指实参把数据传给形参的方式,C#中的参数传递可分成四种:值传递、引用传递、输出参数和参数数组。 1.值传递 当使用“值传递”的方式来传递参数时,实参把值复制一份传给形参,形参接收了实参的值后与实参已不再存在任何联系。
【例5-6】 编写一个方法,用来把两个整型变量的值交换,在Main方法中调用该方法加以验证。
2.引用传递 当使用“引用传递”方式传递参数时,调用者给了被调用方法直接访问和修改调用者的原始数据的权利。在方法中对形参进行修改也就修改了对应的实参,这种方式又称双向传递。 在C#中要通过引用方式传递数据,需使用关键字ref。使用方法是在定义方法时,在按引用传递的形式参数的类型说明符前加上关键字ref,在调用方法时,在按引用传递的实际参数之前加上关键字ref。
3.输出参数 若将引用传递中的关键字ref用out替换,则参数就变成了输出参数。也允许在被调方法中修改与输出参数相对应的实参的值。输出参数通常用来指定由被调用方法对参数进行初始化。 【例5-7】利用引用传递实现例5-6的功能。
5.1.6 变量的生命期和作用域 1.变量的生命期 变量的持续周期(也称为生命周期)是指该变量在内存中存在的周期。 方法中的局部变量有一个自动的生命周期。自动生命周期变量是在程序执行到达它们的声明语句时由程序自动创建的;也就是说,声明的程序块被激活时,它们存在;而在它们声明的程序块退出时,释放它们。我们把具有自动生命周期的变量称为自动变量或局部变量。
2.变量的作用域 变量能够使用的程序段称变量的作用域。 变量的作用域有以下规则: (1)在程序块中声明的局部变量或引用仅可在该程序块或者在嵌套于该程序块的程序块中被使用。 (2)类的成员具有类的作用范围并且在类的声明空间中可以被看到。 (3)当程序块嵌套于方法体中,并且在外层程序块中的一个标识符和内层程序块中定义的标识符有相同的名字时,将会产生错误。
3.静态变量 静态变量是用static定义的变量,静态变量的生命周期是从定义它们的类被载入内存时开始,直到程序运行结束时为止。定义它们的类被载入内存时,就已经为这些变量分配了存储空间,并对它们进行了初始化。但静态变量相当于局部变量,其作用域与局部变量相同。
【例5-8】分析下面程序的运行结果。 using System; class A_5_8 { static int a=3,b; //① public static void Main() //② { int c=6; //③ a=a+2;b=b+2;c=c+2; //④ func1(); //⑤
Console.WriteLine("{0},{1},{2}",a,b,c); //⑥ } static void func1() { int b=2,c=3; //⑦ a=a+2;b=b+2;c=c+2; //⑧ Console.WriteLine("{0},{1},{2}",a,b,c); //⑨ } }
5.1.7 方法的嵌套与递归调用 1.方法的嵌套调用 【例5-9】编写一个函数求下列的函数值。
2.方法的递归调用 【例5-10】若干个人排成一个队领苹果,已知第一个人的领的苹果数为1个,从第二个人开始每个人领的苹果数是前一个人领的苹果数的2倍再加3,问第n个人领了多少个苹果?
一般来说如果某个问题能够用递归来求解,该问题一定能够归结成一个函数公式,如本题求第n个人领的苹果数,用函数apple(n)表示,则本题的apple(n)可描述如下。一般来说如果某个问题能够用递归来求解,该问题一定能够归结成一个函数公式,如本题求第n个人领的苹果数,用函数apple(n)表示,则本题的apple(n)可描述如下。 从程序设计的角度来说,递归过程必须解决两个问题:一是递归计算的公式,二是递归结束的条件。本题可以写成: 递归计算公式:apple (n)=2* apple (n-1)+3 n>1 递归结束条件:apple (1)=1 凡是能够表示成上述式子的数学问题均可以用递归来实现,在递归函数中一般可采用双分支语句来实现: if(递归结束条件) return(递归终止值); else return(递归计算公式);
5.2 典型实例练能力 5.2.1 典型实例一:求孪生质数 【实例题目】 编写程序求出100之内的所有孪生质数,所谓孪生质数是指两个质数,它们的差为2,如5和7、11和13等都是孪生质数。要求:判断某数是否为质数要用一个方法来实现,编写成Windows应用程序。程序的设计界面如图5-5所示,程序的运行界面如图5-6所示。
图5-5 程序设计界面 图5-6 程序运行界面
5.2.2 典型实例二:校园歌手评分 【实例题目】 某学校要举办校园歌手大奖赛,现在要让计算机为选手评分,评分原则为:从若干个评委的打分中去掉一个最低分去掉一个最高分,剩下的得分取平均即是选手的得分。要求:根据评委的打分求出选手的得分需编写成一个方法,要求编写成Windows应用程序。程序的设计界面如图5-7所示,程序的运行界面如图5-8所示。
图5-7 程序设计界面 图5-8 程序运行界面
5.3 上机练习重应用 5.3.1 上机练习一:求两个正整数的最大公约数与最小公倍数 【练习题目】 编写一个方法,该方法的功能是用辗转除余法求两个数的最大公约数和最小公倍数。
5.3.2 上机练习二:实现方阵转置 【练习题目】 编写一个方法用来把某方阵进行转置,然后调用它进行验证。