第八节 ref和out 运用,方法调用,阶乘和递归
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
案例1:税后工资 static void Main(string[] args) { float c = 0.1f;//税率 Console.Write("请输入税收前工资:"); float pay=float.Parse(Console.ReadLine()); float b = Getpay(pay,c);//税后工资 Console.WriteLine("请输入税后工资:{0}", b); Console.ReadKey(); } /// <summary> /// 计算工资 /// </summary> /// <param name="pay"></param>税收前工资 /// <param name="c"></param>税率 /// <returns></returns> static float Getpay(float pay,float c) { //税后工资 float b = 0; if (pay <= 1600) { b = pay; } else { b = (pay - 1600) * (1 - c) + 1600; } return b; } ———————————————————————————————————————————————————————— 案例2:ref的运用 static void Main(string[] args) { /*对int类型进行传参是传值的方式 *传值会将实参的值复制一份给形参,那么对行参的修改无法影响实参的变化 *我们可以使用ref关键字(传引用),这样的实参和形参实际上使用的是同一个变量 *那么对形参的修改会影响到实参,所以下列能够做到互相的效果*/ int num1 = 10; int num2 = 5; Console.WriteLine("交换前两个数是{0},{1}",num1,num2); // Swap(num1,num2);//值传递不会改变 Swap(ref num1, ref num2); Console.WriteLine("交换后两个数是{0},{1}",num1,num2); Console.ReadKey(); } static void Swap(ref int num1,ref int num2)//加上ref 值才能引用 { int temp; temp=num1; num1=num2; num2=temp; } —————————————————————————————————————————————————————— 案例3 out关键字的运用 static void Main(string[] args) { /*如果希望一个方法有多个返回值,那么我们可以使用out关键字 * out关键字实际上是传引用的方式,你对out定义的关键字的 * 形参做了更改,是会影响到实参的,所以以下的传递out的变量i * 能够得到对形参更改后的值,其实out和ref关键字效果是一样的 * 都是传引用,但是out关键字通常用于多个返回值。而ref关键字通常是 * 实参传递给形参能够影响到实参的变化的情况下使用 * 注意使用ref关键字传递的实参,须赋值所传递的变量 * 使用out不需要赋值(因为常用于多个返回) * eee*/ int i; int t = TestMethod(out i); Console.WriteLine(t); Console.WriteLine(i); Console.ReadKey(); } static int TestMethod(out int num) { num = 10; return 20; } —————————————————————————————————————————————————————— 案例4 圆的半径 static void Main(string[] args) { Console.Write("请输入圆的半径:"); double radius = double.Parse(Console.ReadLine()); double c; double s=caclCircle(radius,out c); Console.WriteLine("周长:{0}", c); Console.WriteLine("面积:{0}", s); Console.ReadKey(); } /// <summary> /// 计算圆的面积和周长 /// </summary> /// <returns></returns> static double caclCircle(double r,out double c) { //求圆的面积和周长,因为该函数需要返回两个值所以使用out关键字 c = 2 * Math.PI * r;//周长 double s = Math.PI * r * r;//面积 return s; } ———————————————————————————————————————————————————————— 案例5 方法调用 static void Main(string[] args) { //方法调用,最简单的方法 p(); Console.ReadKey(); } static void p() { int pay; float a = 0.1f;//C# 默认是double,加个f编译器就知道是float的类型。 float b; Console.Write("请输入工资:"); pay = int.Parse(Console.ReadLine()); if (pay < 1600) b = pay; else b = (pay - 1600) * (1-a) + 1600; Console.WriteLine("交税收后的工资:{0}",b); } ———————————————————————————————————————————————————————— 案例6 阶乘 static void Main(string[] args) { Console.Write("请输入要阶乘的数:"); double a = double.Parse(Console.ReadLine()); double r = jc(a); Console.Write(r); Console.ReadKey(); } static double jc(double n) { double result=1; for (int i = 1; i <= n; i++) //result=1,result *=n,n-- { result = result * i; } return result; //if (n == 1) //{ // return 1; //} //else //{ // return n * jc(n - 1); //} } —————————————————————————————————————————————————————— 案例 7 调用前后值的变化 static void Main(string[] args) { Console.WriteLine("请数入两个数:"); double num1 = double.Parse(Console.ReadLine()); double num2=double.Parse(Console.ReadLine()); Console.WriteLine("方法调用前两个数的值是:{0},{1}", num1, num2); cd( num1,ref num2); Console.WriteLine("方法调用后两个数的值是:{0},{1}",num1,num2); Console.ReadKey(); } static void cd( double num1,ref double num2) { Console.WriteLine("刚进入两个数的值是:{0},{1}", num1, num2); num1 = num1 + 1; num2 = num2 + 1; Console.WriteLine("离开前两个数的值是:{0},{1}", num1, num2); } —————————————————————————————————————————————————————— 案例8 最大值和索引 static void Main(string[] args) { int[] aaa ={ 3, 2, 4, 9, 8 }; int sy;// int zd=ddd(aaa,out sy);// Console.Write("最大{0}索引{1}",zd,sy); Console.ReadKey(); } static int ddd(int[] aaa,out int sy) { int max = 0; for (int i = 1; i < aaa.Length-1; i++) { if (aaa[i]> aaa[max]) { max = i; } } sy = max + 1; return aaa[max]; } ————————————————————————————————————————————————————- 案例9 递归! static void Main(string[] args) { Console.WriteLine("输出1,1,2,3,5,8......递归"); int n = int.Parse(Console.ReadLine()); int m = aaa(n); Console.WriteLine(m); Console.ReadKey(); } public static int aaa(int i) { if (i == 0) return 0; else if (i == 1) return 1; else return aaa(i - 1) + aaa(i - 2); }