Lecture7一函数 绳伟光 微纳电子学系 上海交通大学 2017-03-17 1/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lecture 7 —— 函数 绳伟光 微纳电子学系 上海交通大学 2017-03-17 1 / 47
提纲 函数的概念 C99中的函数 返回语句 程序终止 5 递归 2/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 提纲 1 函数的概念 2 C99 中的函数 3 返回语句 4 程序终止 5 递归 2 / 47
提纲 函数的概念 C99中的函数 返回语句 程序终止 递归 3/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 提纲 1 函数的概念 2 C99 中的函数 3 返回语句 4 程序终止 5 递归 3 / 47
函数概念引入 ●函数(function)可视为具有名字的一组语句序列的集合体 ·每个函数实质上是一个小程序,有自己的声明和语句 。使用函数的优点: ·利用函数,程序可以被分解为一系列的小片段,易于理解和修改 ·可以不用复制代码而多次使用相同代码 ·为某一个程序开发的代码片段可以很容易的被其它程序复用 4/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 函数概念引入 函数 (function) 可视为具有名字的一组语句序列的集合体 每个函数实质上是一个小程序,有自己的声明和语句 使用函数的优点: 利用函数,程序可以被分解为一系列的小片段,易于理解和修改 可以不用复制代码而多次使用相同代码 为某一个程序开发的代码片段可以很容易的被其它程序复用 4 / 47
函数简单示例1一计算平均数 ●如下是一个名为average的函数,计算两个double值的 平均值 double average(double a,double b) { return (a b)/2; ●开始的double关键字表示函数average的返回值类型 ·标识符a和b是average函数被调用时由调用者提供给 average,称为函数参数(function's parameters) ·每个函数有一个可执行的部分,称为函数体,由花括号括起 来 函数体的执行与一般语句序列的执行类似,只是最后return 会将返回值传递给函数的调用者 5/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 函数简单示例 1 —— 计算平均数 如下是一个名为 average 的函数,计算两个 double 值的 平均值 double average(double a, double b) { return (a + b) / 2; } 开始的 double 关键字表示函数 average 的返回值类型 标识符 a 和 b 是 average 函数被调用时由调用者提供给 average,称为函数参数 (function’s parameters) 每个函数有一个可执行的部分,称为函数体,由花括号括起 来 函数体的执行与一般语句序列的执行类似,只是最后 return 会将返回值传递给函数的调用者 5 / 47
函数简单示例1一计算平均数(续) ●函数调用(function call)由函数名后跟放在括号中的实际参 数(argument)的列表组成 ●parameter称为形式参数,简称形参;argument称为实 际参数,简称实参 ·average(X,y)调用函数average,x,y作为实际参数被拷 贝给形式参数a和b ·实际参数不必非得是变量,也可以是具有兼容类型的表达式, 比如average(5.1,8.9)和average(x/2,y/3) ·函数调用语句放在我们需要执行该函数的功能或希望得到该 函数返回值的地方,比如打印x,y的平均值: printf("Average:%g\n",average(x,y)); ·如果需要在后面继续使用函数的返回值,必须将返回值放置 在某个变量中,否则返回值会被丢弃 avg average(x,y); 6/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 函数简单示例 1 —— 计算平均数 (续) 函数调用 (function call) 由函数名后跟放在括号中的实际参 数 (argument) 的列表组成 parameter 称为形式参数,简称形参;argument 称为实 际参数,简称实参 average(x, y) 调用函数 average,x, y 作为实际参数被拷 贝给形式参数 a 和 b 实际参数不必非得是变量,也可以是具有兼容类型的表达式, 比如 average(5.1, 8.9) 和 average(x/2, y/3) 函数调用语句放在我们需要执行该函数的功能或希望得到该 函数返回值的地方,比如打印 x, y 的平均值: printf("Average: %g\n", average(x, y)); 如果需要在后面继续使用函数的返回值,必须将返回值放置 在某个变量中,否则返回值会被丢弃 avg = average(x, y); 6 / 47
函数简单示例1一计算平均数(续2) ●运行场景: Enter three numbers:3.5 9.6 10.2 Average of 3.5 and 9.6:6.55 Average of 9.6 and 10.2:9.9 Average of 3.5 and 10.2:6.85 ●代码: #include double average(double a,double b){ return (a +b)/2; int main(void){ double x,y,Z; printf("Enter three numbers:") scanf ("%1f%1f%lf",&x,&y,&z); printf("Avg.of %g,%g:%gIn",x,y,average(x,y)); printf("Avg.of %g,%g:%gIn",y,z,average(y,Z)) printf ("Avg.of %g,%g:%gIn",x,z,average(x,z)); return 0; 7147
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 函数简单示例 1 —— 计算平均数 (续 2) 运行场景: Enter three numbers: 3.5 9.6 10.2 Average of 3.5 and 9.6: 6.55 Average of 9.6 and 10.2: 9.9 Average of 3.5 and 10.2: 6.85 代码: #include double average(double a, double b) { return (a + b) / 2; } int main(void) { double x, y, z; printf("Enter three numbers: "); scanf("%l f%l f%l f ", &x, &y, &z); printf("Avg. of %g, %g: %g\n", x, y, average(x, y)); printf("Avg. of %g, %g: %g\n", y, z, average(y, z)); printf("Avg. of %g, %g: %g\n", x, z, average(x, z)); return 0; } 7 / 47
函数简单示例2一向下计数 ●如果函数的返回值没有价值,可以声明为无返回值,用Void标记, void是一种类型,表示无类型 void print_count(int n){ printf("T minus %d and counting In",n); ●调用实例: #include void print_count(int n){ printf("T minus %d and counting In",n); int main(void){ int i; for(i=10;i>0;--1) print_count(i); return 0; 8/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 函数简单示例 2 —— 向下计数 如果函数的返回值没有价值,可以声明为无返回值,用 void 标记, void 是一种类型,表示无类型 void print_count(int n) { printf("T minus %d and counting \n", n); } 调用实例: #include void print_count(int n) { printf("T minus %d and counting \n", n); } int main(void) { int i; for (i = 10; i > 0; --i) print_count(i); return 0; } 8 / 47
函数简单示例3一 无参数函数 。如函数没有参数,可在括号内放置void表示不需要参数 void myprint(void){ printf("Hello World!In"); ·调用无参数函数只需要函数名加上一对空括号即可 #include void myprint(void){ printf("Hello World!In"); } int main(void) myprint(); return 0; 9/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 函数简单示例 3 —— 无参数函数 如函数没有参数,可在括号内放置 void 表示不需要参数 void myprint(void) { printf("Hello World ! \n"); } 调用无参数函数只需要函数名加上一对空括号即可 #include void myprint(void) { printf("Hello World ! \n"); } int main(void) { myprint(); return 0; } 9 / 47
函数定义(Function Definitions) ●函数定义的一般形式 return-type function-name parameters { declarations statements ●return-type是函数所返回值的类型,return-type需遵循 下述规则: ·函数不能返回数组 ·返回类型指定为Void表示返回类型为空或无需返回值 。c89中省略返回类型则默认返回类型为int;C99则不许省 略返回类型 10/47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 函数定义 (Function Definitions) 函数定义的一般形式: return-type function-name ( parameters ) { declarations statements } return-type 是函数所返回值的类型,return-type 需遵循 下述规则: 函数不能返回数组 返回类型指定为 void 表示返回类型为空或无需返回值 C89 中省略返回类型则默认返回类型为 int;C99 则不许省 略返回类型 10 / 47