1、C#程序设计,- 方法,复习,方法的定义修饰符 返回值类型 方法名(形参列表) 方法体;return(z); 2. 方法参数的传递数值传递引用传递,using System; namespace nsp class Programpublic static void AddOne(int a) a+; static void Main() int a=3;Console.WriteLine(“调用AddOne之前,a=0“,a);AddOne(a);Console.WriteLine(“调用AddOne之后,a=0“,a);Console.ReadLine(); ,输出结果: 调用AddOne
2、之前,a=3 调用AddOne之后,a=3,复习,using System; namespace nsp class Programpublic static int AddOne(int a) a+; return(a); static void Main() int a=3;Console.WriteLine(“调用AddOne之前,a=0“,a);a=AddOne(a);Console.WriteLine(“调用AddOne之后,a=0“,a);Console.ReadLine(); ,输出结果: 调用AddOne之前,a=3 调用AddOne之后,a=4,复习,方法的值传递,值传递实参
3、可以是常量、变量或表达式;如:AddOne(10) AddOne(a) AddOne(a+10)形参必须是变量如: AddOne(int x) 特点:(1)方法被调用时,为每个值类型参数分配新的内存空间,然后将对应的表达式运算的值复制到该内存空间。(2)一般情况下,在方法中更改形参的值不会影响主调方法中实参的值。,交换两数的值,定义一个方法用于交换两个数的值。运行结果如下图所示。,学习目标,1)理解并掌握方法间参数的引用传递; 2 ) 掌握方法重载; 3)掌握方法嵌套调用,了解递归调用;,2. 引用传递ref 参数类型 参数名实参: 变量,如: (ref a) 形参: 变量,如:(ref in
4、t x)特点: (1)引用类型的参数不再分配信的内存空间,引用参数和原变量保存的是同一个地址 (2)为了和传递值类型参数区分,前面加上ref关键字(Reference), 在方法中形参值的改变实际上就是实参值的改变。,ref引用参数传递,using System; namespace nsp class Programpublic static void AddOne(ref int a)a+;static void Main() int x=3;Console.WriteLine(“调用AddOne之前,x=0“,x);AddOne(ref x);Console.WriteLine(“调用A
5、ddOne之后,x=0“,x);Console.ReadLine(); ,输出结果: 调用AddOne之前,x=3 调用AddOne之后,x=4,ref 引用传递,考虑:如何使一个方法同时返回多个值。,using System; namespace nsp class Programpublic static void AddOne(int a,ref int b)a+; b+;static void Main() int x=3,y=4;Console.WriteLine(“调用AddOne之前,x=0,y=1“,x,y);AddOne(x,ref y);Console.WriteLine(
6、“调用AddOne之后,x=0,y=1“,x,y);Console.ReadLine(); ,输出结果: 调用AddOne之前,x=3,y=4 调用AddOne之后,x=4,y=5,引用传递,如果不想改变实参的值,又想返回多个值,怎么办?,3. 输出多个引用类型的参数如果不想改变实参的值,又想返回多个值。这时就用到了out关键字。输出引用类型参数的格式为:实参: 变量, out x,out y形参: 变量, out int c,out int d注意:(1)out参数传递,实参可以不初始化。,out参数传递,using System; namespace nsp class Programpu
7、blic static void MyMethod(int a,int b,out int c,out int d) c=a+; d=+b;static void Main() int x,y,m=10,n=20;MyMethod(m,n,out x,out y);Console.WriteLine(“调用MyMethod之后,m=0,n=1,x=2,y=3“,m,n,x,y);Console.ReadLine(); ,输出结果: 调用MyMethod之后,m=10,n=10,x=10,y=21,引用传递,如果实参的个数不确定时,形参如何接收个数不定的实参的值呢?,4. 传递个数不确定的参数当
8、需要传递的参数个数不确定时,例如求几个数的平均值,由于没有规定是几个数,运行程序时,每次输入的值的个数就不一定一样。为了解决这个问题,C#语言采用params 关键字声明参数的个数是不确定的。,params参数传递,using System; namespace nsp class Programpublic static int Average(params int v) int total,i;for(i=0,total=0;iv.Length;i+)total+=vi;return total/v.Length;static void Main() int x=Average(1,2,1
9、,4);Console.WriteLine(“1,2,1,4的平均值是0“,x);x=Average(4,5,6,7,8);Console.WriteLine(“4,5,6,7,8的平均值是0“,x);Console.ReadLine(); ,输出结果: 1,2,1,4的平均值是2 4,5,6,7,8的平均值是6,params 参数传递,(1) 如何交换两数的值,t=a; a=b; b=t;,(2) 定义方法public static void swap(ref int a,ref int b) int t=a; a=b; b=t; ,交换两数的值,(3) 编写主方法static void M
10、ain( ) int x=10,y=20; swap(ref x,ref y);Console.WriteLine(“x=0,y=1”,x,y); ,方法重载是指具有相同的方法名,但参数类型或参数个数不完全相同的多个方法可以同时出现在一个类中。这种技术非常有用,在开发过程中,我们会发现C#语言中的很多方法均使用了重载技术。,方法重载,using System; namespace nsp class Programpublic static int Add(int i,int j)return i+j;public static string Add(string s1,string s2)r
11、eturn s1+s2;public static int Add(int x,int y,int z)return x+y+z;static void Main() Console.WriteLine(Add(1,2);Console.WriteLine(Add(“1“,“2“);Console.WriteLine(Add(1,2,3);Console.ReadLine();,输出结果: 3 12 6,方法的嵌套调用,编写程序求两个数的最大公约数和最小公倍数。实现要求:把“求两数最大公约数”和“求两数最小公倍数”两个功能独立编写成方法,以便根据需要随时调用。运行结果如图。,方法的嵌套调用在调
12、用一个方法的过程 中又调用另一个方法,方法的嵌套调用,1. 求最大公约数的数学方法,已知两个整数a和b,a和b两个整数同时能被整除的最大值,就是a和b的最大公约数。,方法的嵌套调用,2求最小公倍数的数学方法,求a和b两个数的最小公倍数 ,最简单的求法就是公式法:a*b/a和b的最大公约数,因此求两数的最小公倍数必须先求出两数的最大公约数,Main()方法调用Least ()方法求最小公倍数,在Least ()方法中又需要先调用Greatest ()方法求出最大公约数,用于最后求出最小公倍数,3个方法形成了嵌套调用关系。,方法的嵌套调用,using System; class Program s
13、tatic void Main(string args) Console.Write(“); int num1 = int.Parse(Console.ReadLine(); int num2 = int.Parse(Console.ReadLine(); int result1 = Greatest (num1, num2); int result2 = Least(num1, num2); Console.WriteLine(“012“, num1, num2,result1); Console.WriteLine(“012“, num1, num2,result2); Console.R
14、eadLine(); ,编写主方法,static int Greatest (int a, int b) /求最大公约数 int t=0,i; if(ab) t=a; a=b; b=t; for(i=1;ib;i+)if(a%i=0 ,编写子方法,一个方法直接或者间接调用自己称为递归,同时将该方法称为递归方法。,方法的递归调用,方法的递归调用,求n的阶乘,using System; class Programpublic static int fac(int n) int f;if(n=0|n=1) f=1;else f=fac(n-1)*n;return(f);static void Mai
15、n() int n, y;Console.WriteLine(“请输入n的值:“);n=int.Parse(Console.ReadLine();y=fac(n);Console.WriteLine(“0!=1“,n,y);Console.ReadLine(); ,fac(5)=5*fac(4),fac(4)=4*fac(3),fac(3)=3*fac(2),fac(2)=2*fac(1),fac(1)=1,1,2*1=2,3*2=6,4*6=24,5*24=120,小结,1. 方法的定义、方法的调用(包括嵌套调用和递归调用) 以及参数的两种传递方式。2. 实训点:如何定义方法;如何调用方法;
16、如何用不同传递方式实现参数的传递.3. 通过方法的学习,能够达到学会使用方法来构建程序的能力目标。,任务,1.定义一个方法year判断某年是不是闰年,主方法中输出20003000年中的所有闰年。 2.定义一个方法ss判断某数是不是素数,主方法中输出100200之间的所有素数。 3.方法重载,定义方法smallest,计算2个整数的最小值,3个整数的最小值;计算10个整数的最小值,10个多精度类型的最小值;并在主方法中调用这个smallest。,预习课本第6章,类和对象,任务,If(ab)t=a;a=b;b=t; For( int i=1;i=a;i+)if(a%i=0 ,预习课本第6章,类和对象,