上游充通大¥ 1895 1920 47 006 第3讲函数与结构化程序设计 上产充通大学 1920 07 2006 1.函数的使用 2.函数的声明和调用 3.函数的参数传递 4.变量属性 5. 结构化程序设计思想
第3讲 函数与结构化程序设计 1. 函数的使用 2. 函数的声明和调用 3. 函数的参数传递 4. 变量属性 5. 结构化程序设计思想
函数的例子一自定义函数 口已知三角形的边长,求三角形的面积: 口计算公式: 一个三角形,边长分别为a,b,c,则其面积$: S=p(p-a)(p-b)(p-c) 其中:p= a+b+c 2 口C+程序计算右图5个三角形的面积? 国上濟文通大9 3/72 面积计算 #include #include using namespace std; int main O double S1,p1; double a1=5.0,b1=5.0,c1=4.0; p1=(a1+b1+c1)/2: s1=sqrt(p1*(p1-a1)*(p1-b1)*(p1-c1) 日目 重复5次? 图上海夫通大华 472
3/72 函数的例子——自定义函数 已知三角形的边长,求三角形的面积; 计算公式: 一个三角形,边长分别为a, b ,c, 则其面积S: S ൌ ሺ െ aሻሺ െ ܾሻሺp െ ܿሻ ൌ ܾܽܿ 2 其中: C++程序计算右图5个三角形的面积? 4/72 #include #include using namespace std; int main () { double S1,p1; double a1=5.0,b1=5.0,c1=4.0; p1 = (a1+b1+c1)/2; s1 = sqrt(p1*(p1-a1)*(p1-b1)*(p1-c1)) …… } 重复5次? 面积计算
面积计算 #include #include using namespace std; double calArea(double a,double b,double c) 构成 if ((a+b<=c)II(a+c<=b)II(b+c<=a)Ila<=0llb<=0llc<=0) 三角形? {cout<K“side length error!”;return-1:} double p=(a+b+c)/2; return sqrt (p*(p-a)*(p-b)*(p-c)); int main ( f double S1,p1,a1=5.0,b1=5.0,c1=4.0: 简单清晰 S1 calArea(a1,b1,c1); return 0; 圈上青文通大学 5/72 函数的例子一库函数 口可以将sin函数想象成 sin(x) 一个黑箱(black box) 口假设在它的上面放入一 个“值”,在它的下面 就会掉出“结果” 1.0 图上海夫通大华 6/72
5/72 #include #include using namespace std; double calArea(double a, double b, double c) { if((a+b<=c)||(a+c<=b)||(b+c<=a)||a<=0||b<=0||c<=0) {cout <<“ side length error!”; return -1;} double p=(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } int main ( ) { double S1,p1,a1=5.0,b1=5.0,c1=4.0; S1 = calArea(a1, b1 , c1); …… return 0; } 构成 三角形? 简单/清晰 面积计算 6/72 可以将sin函数想象成 一个黑箱(black box) 假设在它的上面放入一 个“值”,在它的下面 就会掉出“结果” 函数的例子——库函数
sin函数 口在程序中包含了头文件cmath..h,就能使用一些像sin的数学 函数。 口sin函数的参数必须是弧度。 回#include(1 ostream> #include using namespace std: const float PI 3.14: int main() double alpha,result: alpha =90: result sin(alpha PI 180): cout("result ="<(result<(endl: systen("pause"): return 0: 周上濟文通大¥ 772 函数的例子 口如果改变了输入的参 数,函数就能返回不 sindx) 同的值。 口函数的参数可以是常 数、变量或表达式。 alpha =90 口右图中将调用4次sin 120° alpha alpha3 参数 函数的结果加起来, 并将其和存入变量 尚 total中 0.866 1.0 -1.0 返回值 total sin(90)+sin(120)+sin(alpha)+sin(alpha 3) 图上海夫通大华 8/72
7/72 在程序中包含了头文件cmath.h,就能使用一些像sin的数学 函数。 sin函数的参数必须是弧度。 sin函数 8/72 如果改变了输入的参 数,函数就能返回不 同的值。 函数的参数可以是常 数、变量或表达式。 右图中将调用4次sin 函数的结果加起来, 并将其和存入变量 total中 函数的例子 参数 返回值
使用函数 口函数是程序设计语言中最重要的部分,每一个程序都 要用到函数。 口即使不定义新的函数,在每一个完整的C+程序中都 必须有一个main0函数。 口函数来源于已有的库函数或者自己开发。 MFC The Microsoft Foundation Class Library. OpenGL 周上清通大学 9/72 使用函数的好处 口方便软件程序的规划、组织、编程与调试 √规模较大的程序不可能由一个人完成; √避免所有的代码放到main函数中; √程序可以划分为程序模块,分别编译。 口常用功能模块编写成函数, 减少重复编写程序段的工作量 口提高软件质量 main a b d 图上唐夫通大些 10/72
9/72 函数是程序设计语言中最重要的部分,每一个程序都 要用到函数。 即使不定义新的函数, 在每一个完整的C++程序中都 必须有一个main()函数。 函数来源于已有的库函数或者自己开发。 使用函数 10/72 方便软件程序的规划、组织、编程与调试 规模较大的程序不可能由一个人完成; 避免所有的代码放到main函数中; 程序可以划分为程序模块,分别编译。 常用功能模块编写成函数,减少重复编写程序段的工作量 提高软件质量 使用函数的好处
上游充通大¥ 1895 1920 1987 006 1. 函数的使用 2.函数的声明和调用 3.函数的参数传递 4. 变量属性 5.结构化程序设计思想 函数的声明 口函数是面向过程程序设计中,对功能的抽象。 口函数声明的语法形式: 参数类型/参数名 若无返回值,写void 类型标识符函数名(形式参数表) 语句序列: 图上海夫通大华 12/72
1. 函数的使用 2. 函数的声明和调用 3. 函数的参数传递 4. 变量属性 5. 结构化程序设计思想 12/72 函数的声明 函数是面向过程程序设计中,对功能的抽象。 函数声明的语法形式: 类型标识符 函数名(形式参数表) { 语句序列; } 若无返回值,写void 参数类型/参数名
函数的声明 口使用和编写一个函数要包括: 函数原型说明 √声明函数的原型:声明 √一个或多个函数调用:调用 int main() √实现该函数的代码:定义 es 口对于库函数: √#include“xxx.h”的文件中已包括 函数调用 了函数原型的声明,C+的库文件中则包 。银量 含了函数实现的代码。 函数实现 国上海文大¥ 13/72 函数的声明 口所有函数在使用前必须被声明,以便让编译器知道用户的用法 是否正确。 口函数声明包括下列内容: √函数名 √函数的参数类型 √函数的返回类型 口函数的声明被称为函数的原型,它的形式为: √返回类型函数名(参数表); √参数表中的每个参数说明可以是类型,也可以是类型后面再接一个参 数名。如: int max(int,int); int max(int a,int b); 图上海夫通大华 14/72
13/72 使用和编写一个函数要包括: 声明函数的原型:声明 一个或多个函数调用:调用 实现该函数的代码:定义 对于库函数: #include “xxx.h”的文件中已包括 了函数原型的声明,C++的库文件中则包 含了函数实现的代码。 函数的声明 函数原型说明 int main( ) { …… …… 函数调用 …… …… } 函数实现 14/72 函数的声明 所有函数在使用前必须被声明,以便让编译器知道用户的用法 是否正确。 函数声明包括下列内容: 函数名 函数的参数类型 函数的返回类型 函数的声明被称为函数的原型,它的形式为: 返回类型 函数名(参数表); 参数表中的每个参数说明可以是类型,也可以是类型后面再接一个参 数名。如: int max(int, int); int max(int a, int b);
编写自己的函数(1) 口下面是一个调用和定义一个简单函数myMax的例子,该函数有 二个参数,返回值为两个整数的最大值。 #include 函数原型声明 using namespace std; int myMax (int x,int y); 函数实现 int main int myMax(intx,inty) int a,b,c; couty?x:y); cin>>a>>b; c=myMax (a,b); couty?x:y); 返回值 图上海夫通大华 16/72
15/72 下面是一个调用和定义一个简单函数myMax的例子,该函数有 二个参数,返回值为两个整数的最大值。 编写自己的函数(1) 函数原型声明 函数实现 函数调用 #include using namespace std; int myMax(int x, int y); int main() { int a ,b ,c; cout>a>>b; c=myMax(a,b); couty ? x:y); } 16/72 这个简单的函数例子能说明C++函数实现中所有的组成部分。 编写自己的函数(2) 返回值 函数名 参数 返回值 int myMax(int x,int y) { return (x>y ? x:y); }
函数声明规则 口库函数在调用前需要#include?相应的头文件。 口自定义的函数在调用时需要进行函数原型声明。 口函数原型声明与函数定义写法上需要保持一致,即函数类型、 函数名、参数个数和参数顺序必须相同。 口如果被调函数的定义在主调函数之前,可以不必加声明。 口如果在所有函数定义之前,在函数外部已经做了函数声明, 则在主调函数中无须再作声明。 国上海夫道大¥ 1772 在函数声明和函数调用中的参数名字 #include using namespace std; 口函数参数的名字对结果 int myMax (int x,int y); 没有任何影响。 int mainO 口如果将函数参数的名字 ×改成m效果是一样 int a,b,c; 的。 cout>a>>b; 中的名字,但编程时一 c=myMax (a,b) 般与函数声明时保持一 coutn?m:n): 图上海夫通大华 18/72
17/72 库函数在调用前需要#include相应的头文件。 自定义的函数在调用时需要进行函数原型声明。 函数原型声明与函数定义写法上需要保持一致,即函数类型、 函数名、参数个数和参数顺序必须相同。 如果被调函数的定义在主调函数之前,可以不必加声明。 如果在所有函数定义之前,在函数外部已经做了函数声明, 则在主调函数中无须再作声明。 函数声明规则 18/72 函数参数的名字对结果 没有任何影响。 如果将函数参数的名字 x 改成 m 效果是一样 的。 编译器不检查函数声明 中的名字,但编程时一 般与函数声明时保持一 致。 在函数声明和函数调用中的参数名字 m #include using namespace std; int myMax(int x, int y); int main() { int a ,b ,c; cout>a>>b; c=myMax(a,b); coutn ? m:n); }
上游充通大¥ 1895 1920 1987 006 1. 函数的使用 2. 函数的声明和调用 3.函数的参数传递 4. 变量属性 5.结构化程序设计思想 函数调用的执行过程 保存: ③ main() √返回地址 myMax() ② 当前现场 ① 调用myMax() ④ ⑦ ⑥ 恢复: 结束 ⑤ 主调程序现场 返回 返回地址 图上海夫通大华 20/72
1. 函数的使用 2. 函数的声明和调用 3. 函数的参数传递 4. 变量属性 5. 结构化程序设计思想 20/72 函数调用的执行过程 main() 调用myMax() 结束 myMax() 返回 ① ② ④ ⑥ ⑦ 保存: 返回地址 当前现场 ③ 恢复: 主调程序现场 返回地址 ⑤