《(本科)第5章 函数ppt课件.pptx》由会员分享,可在线阅读,更多相关《(本科)第5章 函数ppt课件.pptx(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课程主讲人:第5章 函数C#C#程序设计程序设计第5章函数3班级管理程序班级管理程序 1 保存所有同学联系方式,包括:学号、姓名、联系方式、宿舍号。 2 保存班级课表,可以随时查看。 3 保存所有同学的所有课程成绩。 4 查看成绩: 可以输出最高平均成绩,最低平均成绩,平均成绩的排序。 可以输出某门课程的最高成绩,最低成绩,平均成绩的排序。 输出所有科目的不及格同学信息。例如:高数,张三,学号。4为什么要用函数为什么要用函数 如果程序的功能比较多,规模比较大,把所有代码都写在main函数中,就会使主函数变得庞杂、阅读和维护变得困难 有时程序中要多次实现某一功能(例如:找某门课程最高分,最低分)
2、,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼,修改困难。5解决的方法解决的方法:函数函数(functionfunction) 用模块化程序设计的思路,即把整个程序划分为不同的功能模块。 采用“组装”功能模块的办法简化程序设计的过程 要编写实现各种不同功能的模块。6函数函数(function)(function)(方法)(方法) 函数就是功能 每一个函数用来实现一个特定的功能 “方法”有特殊含义,所以现在不用这个术语。75.1.1 5.1.1 库函数和自定义函数库函数和自定义函数从用户使用的角度看,函数有两种。1库函数(方法) 它是由系统提供的,用户不必自己定义而直接使用它们。
3、 Console.WriteLine(); Math.Pow(5, 4); Array.Sort(score);2用户自己定义的函数 它是用以解决用户专门需要的函数。85.1.2 5.1.2 无参函数和有参函数无参函数和有参函数函数名(参数表) 例如: Console.WriteLine( ); Math.Pow(5, 4); Array.Sort(score); Console.WriteLine(“hello world!”); 调用时无须参数传入的函数。调用时需要参数传入的函数; 95.1.2 5.1.2 无参函数和有参函数无参函数和有参函数调用时需要参数传入的函数;调用时需要参数传入的
4、函数; 需要传入多个参数时,各参数之间用逗号分隔;需要传入多个参数时,各参数之间用逗号分隔; 参数可以是常量、已被赋值的变量、表达式、函数;参数可以是常量、已被赋值的变量、表达式、函数;double x= Math.Pow(5, 4);double num= Math.Pow(x,y);double n= Math.Pow(x+3,y);double k=Math.Sqrt(Math.Pow(x,3)+Math.Pow(Math.E,3);bool pfsFlag=Math.Sqrt(Math.Pow(i, 2) - 100 + 168) % 1 = 0Double x= Math.Pow(“
5、5”, 4); 函数调用必须按要求进行参数传递;函数调用必须按要求进行参数传递;105.1.3 5.1.3 函数返回值函数返回值函数调用后返回的最终结果(一个数据常量) ; 函数值可以作为普通的操作数使用。Double x = Math.Sqrt(Math.Pow(5,3)+8);int x = Convert.ToInt32(Console.ReadLine();函数调用后也可以没有返回值。例如: Console.WriteLine(“hello world!”);115.25.2 自定义函数自定义函数定义函数的一般形式为定义函数的一般形式为:static 类型名类型名 函数名(函数名( 形
6、式参数形式参数列列表表 ) 函数体函数体 return valuereturn value;/返回值;返回值; static:与类的概念有关。:与类的概念有关。类型名类型名: 表示函数的返回值类型。常见返回值如:表示函数的返回值类型。常见返回值如: void、int、double、char、bool、数组等、数组等 例:例: Double Double x = x = MathMath.Pow(5, 4);.Pow(5, 4); /static double Pow(double x,double y) /static double Pow(double x,double y) Console
7、 Console.WriteLine(x);.WriteLine(x); /static void /static void WriteLine(int value)WriteLine(int value)自定义函数自定义函数函数名:自定义,最好见名知意。函数名:自定义,最好见名知意。形参列表形参列表: 多个形参间要用逗号分隔;多个形参间要用逗号分隔; 要明确指定形参的数据类型,如:要明确指定形参的数据类型,如: int、double、char、bool、string、数组数组等等例:例: static void JiaoHuan(double x,double y)static void J
8、iaoHuan(double x,double y) static void static void Swap (double x,double Swap (double x,double y y) ) 定义函数的一般形式为定义函数的一般形式为:static 类型名类型名 函数名(函数名( 形式参数形式参数列列表表 ) 函数体函数体 return valuereturn value;/返回值;返回值; 135.25.2 自定义函数自定义函数类型名类型名: 表示函数的返回值类型。表示函数的返回值类型。 return value: value必须与类型名一致。必须与类型名一致。 void类型可不返
9、回值,即只写类型可不返回值,即只写return,或省略此句,或省略此句例:例: Double Double x = x = MathMath.Pow(5, 4);.Pow(5, 4); /static double Pow(double x,double y) /static double Pow(double x,double y) Console Console.WriteLine(x);.WriteLine(x); /static void /static void WriteLine(int value)WriteLine(int value)定义函数的一般形式为定义函数的一般形式为:
10、static 类型名类型名 函数名(函数名( 形式参数形式参数列列表表 ) 函数体函数体 return valuereturn value;/返回值;返回值; namespace ConsoleApplication1 class Program static void Main(string args) helloworld(); / ConsoleApplication1.Program.helloworld(); Console.ReadKey(); static void helloworld() Console.WriteLine(hello world); 自定义无参函数自定义无参
11、函数注意:自定义注意:自定义函数和函数和Main函数都是函数,二者是并列的函数都是函数,二者是并列的关系,不可以关系,不可以将函数将函数的定义写在的定义写在Main函数中。函数中。namespace ConsoleApplication1 class Program static void Main(string args) string str = console.ReadLine(); helloworld(str); Console.ReadKey(); static void helloworld(string s) Console.WriteLine(s); 自定义有参函数自定义有参
12、函数定义函数,返回两个整数相加的和。定义函数,返回两个整数相加的和。 自定义有返回值的有参函数自定义有返回值的有参函数 static int add(int a, int b) int c=a+b; return c; static void Main(string args) int x= 5, y = 6; int z=add(x,y); Console.WriteLine(z); Console.ReadKey(); 例:编写函数,检测一个字符串中是否含有非数值字符。例:编写函数,检测一个字符串中是否含有非数值字符。static bool ContainsVal(string s)ret
13、urn boolValue; static void Main(string args) string str = console.ReadLine(); bool x=ContainsVal(str); if(x=false) Console.WriteLine(“输入有误输入有误”); Console.ReadKey(); 自定义函数自定义函数例:编写函数,检测一个例:编写函数,检测一个整整数值是否在数组中出现。数值是否在数组中出现。static bool ContainsVal(int a,int b) return boolValue; static void Main(string
14、args) int x = 1, 3, 5, 7, 9 ; int y = 4; bool z = ContainsVal(x, y); if (z = false) Console.WriteLine(不存在不存在); Console.ReadKey(); 自定义函数自定义函数例:编写函数,把两个整数由大到小输出。例:编写函数,把两个整数由大到小输出。static void LoweringOutput(int a,int b) static void Main(string args) int x = 7; int y = 4; LoweringOutput(x,y); Console.R
15、eadKey(); 自定义函数自定义函数例:编写函数,把一个整型数组逆序排序并返回排序后的数组。例:编写函数,把一个整型数组逆序排序并返回排序后的数组。static int NiXu(int a) return a; static void Main(string args) int x = 1, 2, 3 ; x = NiXu(x); foreach (int n in x) Console.WriteLine(n); Console.ReadKey(); 自定义函数自定义函数21编写函数,实现N选M的抽奖程序。static void cj(int i,int k) int x=new in
16、tk; . foreach(int n in x) console.write(n); return; static void Main(string args) int a=33,b=7; cj(a,b); Console.ReadKey();自定义函数自定义函数22编写函数,实现N选M的抽奖程序。static int cj(int i,int k) int a; . return a;static void Main(string args) int a=33,b=7; int b = cj(a,b); foreach(int n in x) console.write(n); Conso
17、le.ReadKey();自定义函数自定义函数23编写函数,统计一个文本文档中某个词出现的次数。Static Int count(string fileName,string str) return value;static void Main(string args) int a=count(“c:sjd.txt”,”人民人民”); console.write(a); Console.ReadKey();自定义函数自定义函数例:交换两个例:交换两个整型整型数并输出。数并输出。 static static voidvoid Main( Main(stringstring args) args)
18、 intint x= x= 5, 5, y y = 6;= 6; swap(x,y); swap(x,y); ConsoleConsole.ReadKey();.ReadKey(); staticstatic voidvoid swap( swap(intint a, a, intint b) b) intint t = a; a = b; b = t; t = a; a = b; b = t; ConsoleConsole.WriteLine(.WriteLine(0 10 1,a,b);,a,b); returnreturn; ; 自定义函数自定义函数错误,找不到a,b。超出a,b的作用范
19、围。例:交换两个数并输出。例:交换两个数并输出。 static static voidvoid Main( Main(stringstring args) args) intint x= x= 5, 5, y y = 6;= 6; swap(x,y);swap(x,y); ConsoleConsole.WriteLine(.WriteLine(0 10 1, a, b);, a, b); ConsoleConsole.ReadKey();.ReadKey(); staticstatic voidvoid swap( swap(intint a, a, intint b) b) intint t
20、 = a; a = b; b = t; t = a; a = b; b = t; /Console.WriteLine(0 1,a,b);/Console.WriteLine(0 1,a,b); returnreturn; ; 例:交换两个数并输出。例:交换两个数并输出。 static static voidvoid Main( Main(stringstring args) args) intint x= x= 5, 5, y y = 6;= 6; swap(x,y);swap(x,y); ConsoleConsole.WriteLine.WriteLine( (“0 10 1”, x,y)
21、;, x,y); ConsoleConsole.ReadKey();.ReadKey(); staticstatic voidvoid swap( swap(intint a, a, intint b) b) intint t = a; a = b; b = t; t = a; a = b; b = t; /Console.WriteLine(0 1,a,b);/Console.WriteLine(0 1,a,b); returnreturn; ; 5.3.1 5.3.1 形式参数和实际参数形式参数和实际参数实际参数:调用时传给形参的具体值形式参数:调用前没有具体值,只是在形式上代表一个变量。
22、xy56ab56t55.3.2 5.3.2 函数调用的过程函数调用的过程 static static voidvoid Main( Main(stringstring args) args) intint x= x= 5, 5, y y = 6;= 6; swap(x,y);swap(x,y); ConsoleConsole.WriteLine(.WriteLine(0 10 1, , x, x, y y);); ConsoleConsole.ReadKey.ReadKey(); (); staticstatic voidvoid swap( swap(intint a, a, intint
23、b) b) intint t = a; a = b; b = t; t = a; a = b; b = t; /Console.WriteLine(0 1,a,b);/Console.WriteLine(0 1,a,b); returnreturn; ; 当函数被调用时才给形参分配内存单元当函数被调用时才给形参分配内存单元; static static voidvoid Main( Main(stringstring args) args) intint x= x= 5, 5, y y = 6;= 6; swap(x,y);swap(x,y); ConsoleConsole.WriteLine
24、(.WriteLine(0 10 1, , x, x, y y);); ConsoleConsole.ReadKey.ReadKey(); (); staticstatic voidvoid swap( swap(intint a, a, intint b) b) intint t = a; a = b; b = t; t = a; a = b; b = t; /Console.WriteLine(0 1,a,b);/Console.WriteLine(0 1,a,b); returnreturn; ; xy56ab56t565当函数被调用时才给形参分配内存单元当函数被调用时才给形参分配内存单
25、元;5.3.2 5.3.2 函数调用的过程函数调用的过程 static static voidvoid Main( Main(stringstring args) args) intint x= x= 5, 5, y y = 6;= 6; swap(x,y);swap(x,y); ConsoleConsole.WriteLine(.WriteLine(0 10 1, , x, x, y y);); ConsoleConsole.ReadKey.ReadKey(); (); staticstatic voidvoid swap( swap(intint a, a, intint b) b) in
26、tint t = a; a = b; b = t; t = a; a = b; b = t; /Console.WriteLine(0 1,a,b);/Console.WriteLine(0 1,a,b); returnreturn; ; xy56abt565当函数被调用时才给形参分配内存单元当函数被调用时才给形参分配内存单元;调用结束,所占内存被释放。调用结束,所占内存被释放。5.3.2 5.3.2 函数调用的过程函数调用的过程5.3.3 5.3.3 局部变量和全局变量局部变量和全局变量局部变量:在函数或代码块内部定义的变量,局部变量:在函数或代码块内部定义的变量, 作用域为定义语句到函数或
27、代码块结束。作用域为定义语句到函数或代码块结束。 static static voidvoid Main( Main(stringstring args) args) intint x= x= 5, 5, y y = 6;= 6; if(xy)if(x1f nnf n 5.3.5 5.3.5 函数的嵌套函数的嵌套调用:递归调用:递归调用调用38static void Main(string args) Console.Write(请输入要求阶乘的正整数:); int a = Convert.ToInt32(Console.ReadLine(); Console.WriteLine(0的阶乘为:
28、1,a,f(a); Console.ReadKey(); static int f(int n) int result; if (n = 1) result = 1; else result = n * f(n - 1); return result; static int f(int n) if (n = 1) return 1; else return n * f(n - 1);39static void Main(string args) Console.Write(请输入要求阶乘的正整数:); int a = Convert.ToInt32(Console.ReadLine(); Co
29、nsole.WriteLine(0的阶乘为:1,a,f(a); Console.ReadKey(); static int f(int n) if (n = 1) return 1; else return n * f(n - 1);编写递归函数一定要有终止递归的语句。编写递归函数一定要有终止递归的语句。40FibonacciFibonacci数列。有一对兔子,从出生后数列。有一对兔子,从出生后3 3个月起每个月起每个月都生一对兔子。小兔子长到第个月都生一对兔子。小兔子长到第3 3个月又生一对兔个月又生一对兔子。那么第子。那么第1212个月,有多少对兔子?。个月,有多少对兔子?。 1,1,2,
30、3,5,8,13,21,34,55,1 ; n=1,2( )(1)(2); n2f nf nf n 5.3.5 5.3.5 函数的嵌套函数的嵌套调用:递归调用:递归调用调用41 static static voidvoid Main( Main(stringstring args) args) ConsoleConsole.WriteLine(fibo(7); .WriteLine(fibo(7); ConsoleConsole.ReadKey();.ReadKey(); staticstatic intint fibo( fibo(intint n) n) ifif (n = 1 | n =
31、 2) (n = 1 | n = 2) returnreturn 1; 1; elseelse returnreturn fibo(n - 1) + fibo(n - 2); fibo(n - 1) + fibo(n - 2); 5.3.5 5.3.5 函数的嵌套函数的嵌套调用:递归调用:递归调用调用42 5.3.5 5.3.5 函数的嵌套函数的嵌套调用:递归调用:递归调用调用43 法国数学家爱德华卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。 不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 5.3.5 5.3.5 函数的嵌套函数的嵌套调用:递归调用:递归调用调用44 射击比赛中运动员10枪打了90环。问有多少种可能的打法? 5.3.5 5.3.5 函数的嵌套函数的嵌套调用:递归调用:递归调用调用