C语言程序设计-河南理工大学-第八章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河南工业大学 信息科学与工程学院
例8.4 参数求值顺序
第八章 函数
§8.1 概述
a函数 函数 main()主函数 主函数 b函数 函数 c函数 函数
必须的起点 库 函 数
d函数 函数
e函数 函数
f函数 函数
•C语言用函数实现程序模块化 语言用函数实现程序模块化 •一个程序由一个或多个源程序文件组成 一个程序由一个或多个源程序文件组成 •一个源程序文件由一个或多个函数组成 一个源程序文件由一个或多个函数组成 •C程序的执行从 程序的执行从main函数开始,并回到 函数开始, 程序的执行从 函数开始 并回到main函数结束 函数结束 •函数之间可以相互调用,或调用自身 函数之间可以相互调用, 函数之间可以相互调用 •不能调用 不能调用main函数 不能调用 函数 •函数之间相互独立,不存在从属关系 函数之间相互独立, 函数之间相互独立 •所有函数都可以调用库函数 所有函数都可以调用库函数
调用前 x: 7 x: 7 调用: 调用: a: 7 swap: x: 7 a: 11 temp 调用结束 x: 7 y: 11 b: y: b: 11 11 7 y: y: 11 11
河南工业大学 信息科学与工程学院
计算x的立方 例 计算 的立方 #include <stdio.h> a float cube(float x) product x { return(x*x*x); } main() { float a, product; printf("Please input value of a:"); scanf("%f",&a); product=cube(a); printf(”Cube of %.4f is %.4f\n",a,product); }
河南工业大学 信息科学与工程学院
求两个整数的最大值
main() main() { int x,y,nmax; scanf (“%d%d”,&x,&y); { int x,y,max; nmax=max(x,y); scanf(“%d%d”,&x,&y); printf((“max=%d”,nmax); } if(x>y) max=x; int max(int x,int y) else max=y; { int m; printf(“max=%d”,max); if(x>y) m=x; else m=y; } return m; } 思考:若程序中调用100次两个数求最大值, 思考:若程序中调用100次两个数求最大值,会是 100次两个数求最大值 什么情况? 什么情况?
河南工业大学 信息科学与工程学院
例 函数带回不确定值 printstar() { printf("**********"); } main() { int a; a=printstar(); printf("%d",a); } 输出: 输出:10 void printstar() { printf("a=printstar(); printf("%d",a); } 编译错误! 编译错误!
变量在整个模块范围内全局有效,如果将一个程序全部写 变量在整个模块范围内全局有效),各个相对独立的 样的函数,怎么办? 找数学书,考虑算法,编制求平方 样的函数,怎么办?(找数学书),各个相对独立的 将程序划分为若干模块(函数), 。然后程序员 将程序划分为若干模块(函数, 考虑算法, 个模块达到程序员所能够控制的规模。 个模块达到程序员所能够控制的规模 函数内, 在main()函数内,大家可以想象,变量可以在 函数内 大家可以想象,变量可以在main函数内 函数内 根代码)。C语言的库函数(标准函数)就是系统提供的 根代码) )可以由多人完成,每个人按照模块( 语言的库函数(标准函数) 语言的库函数 因为各个模块功能相对独 模块(函数) 模块(函数 可以由多人完成,每个人按照模块( 再进行各个模块的编制。 再进行各个模块的编制。因为各个模块功能相对独 任何位置不加控制地被修改。如果发现变量的值(状态) 任何位置不加控制地被修改。如果发现变量的值(状态) 调式好的、常用的模块,我们可以直接利用。 ,调式好的、常用的模块,我们可以直接利用。事实上我 步骤有限,所以流程容易控制, 函数)的功能要求,接口要求编制代码,调试, 立,步骤有限,所以流程容易控制,程序容易编制 函数)的功能要求,接口要求编制代码,调试,确 有问题, 有问题,你可能要在整个程序中查找哪里对此变量进行了 们的代码也可以重新利用,可以将已经调试好的, 们的代码也可以重新利用,可以将已经调试好的,功能相 修改。 ,修改 修改, 。 (函数)的正确性。最后将所有模块( 修改,什么操作会对此变量有影响 最后将所有模块( 保每个模块( 保每个模块 函数)的正确性。 。 对独立的代码改成函数,供以后调用。 对独立的代码改成函数,供以后调用。 函数)合并, 函数)合并,统一调试、运行。 使用函数后, 统一调试、运行。 使用函数后,变量局限于自己的函数内
河南工业大学 信息科学与工程学院
形式参数:定义函数时,函数名后 中的参数 形式参数:定义函数时,函数名后()中的参数 实际参数:调用函数时函数名后 中的表达式 实际参数:调用函数时函数名后()中的表达式 说明: 说明: 实参必须有确定的值 实参可以是常量、变量、表达式、 实参可以是常量、变量、表达式、函数调用 形参必须指定类型 形参与实参类型一致, 形参与实参类型一致,个数相同 若形参与实参类型不一致, 若形参与实参类型不一致,自动按形参类型 转换———函数调用转换 转换———函数调用转换 ——— 形参在函数被调用前不占内存;函数调用时为 形参在函数被调用前不占内存 函数调用时为 形参分配内存;调用结束, 形参分配内存;调用结束,内存释放
河南工业大学 信息科学与工程学院
例 函数返回值类型转换
main() { float a,b; int c; scanf("%f,%f",&a,&b); c=max(a,b); printf("Max is %d\n",c); } max(float x, float y) { float z; z=x>y?x:y; return(z); }
河南工业大学 信息科学与工程学院
使用函数的意义
§ 使用函数可以控制任务的规模 § 使用函数,程序的开发可以由多人分工协作 •一般应用程序都具有较大的规模。一个传动链计算机 一般应用程序都具有较大的规模。 一般应用程序都具有较大的规模 § 使用函数,可以重新利用已有的、调式好的、 辅助设计系统的源程序行数5万多行 万多行。 辅助设计系统的源程序行数 万多行。 成熟的程序模块 •使用函数可以 ,怎么合作? 使用函数可以将程序划分为若干功能相对独立的模 使用函数可以 怎么合作? 一个main()模块将程序划分为若干功能相对独立的模 模块, 一个使用函数可以控制变量的作用范围 模块 § ,这些模块还可以再划分为更小的模块,直到各这 想象一下,如果要用到求平方根,如果系统不提供sqrt这 想象一下,如果要用到求平方根,如果系统不提供 块 这些模块还可以再划分为更小的模块,
河南工业大学 信息科学与工程学院
函数分类
从用户角度
标准函数(库函数):由系统提供 标准函数(库函数):由系统提供 ): 用户自定义函数: 用户自定义函数:由用户按照逻辑功能自己编 写的程序 从函数形式 无参函数 有参函数
int max(int x,int y) { int m; if(x>y) m=x; else m=y; return m; }
河南工业大学信息科学与工程学院第八章函数main主函数81概述b函数a函数c函数d函数e函数f函数库函数必须的起点?c语言用函数实现程序模块化?一个程序由一个或多个源程序文件组成?一个源程序文件由一个或多个函数组成?c程序的执行从main函数开始并回到main函数结束?函数之间可以相互调用或调用自身?不能调用main函数?函数之间相互独立不存在从属关系?所有函数都可以调用库函数河南工业大学信息科学与工程学院求两个整数的最大值mainintxymax
×× 1.2 ×× 1.728 1.2
河南工业大学 信息科学与工程学院
§8.3.2 函数的返回值 返回语句 例 无返回值函数 void 形式: 表达式); 形式: return(表达式 ; swap(int x,int y ) 表达式 { return 表达式 int temp; 表达式; 或 temp=x; return; 或 x=y; 功能: 功能:使程序控制从被调用函数返回到调用函 y=temp; 数中, 数中,同时把返值带给调用函数 } 说明: 说明: 函数中可有多个return语句 函数中可有多个 语句 若无return语句,遇}时,自动返回调用函数 语句, 时 若无 语句 若函数类型与return语句中表达式值的类型 若函数类型与 语句中表达式值的类型 不一致,按前者为准,自动转换------函数调 不一致,按前者为准,自动转换 函数调 用转换 void型函数 型函数
河南工业大学 信息科学与工程学院
例 交换两个数
main() { int x=7,y=11; printf("x=%d,\ty=%d\n",x,y); printf("swapped:\n"); swap(x,y); printf("x=%d,\ty=%d\n",x,y); } swap(int a,int b) { int temp; temp=a; a=b; b=temp; }
河南工业大学 信息科学与工程学院
§8.2
一般格式
函数返回值类型 函数定义的一般形式 缺省int型 缺省 型 无返回值void 无返回值 合法标识符
函数返回值类型 { 说明部分 语句部分 }
函数名(形参类型说明表) 函数名(形参类型说明表)
函数体
8.2.1 无参函数 (现代风格) 8.2.2 有参函数 现代风格) 有参函数( 8.2.3 ) printstar(空函数 y) int max(int x,int dummy( ) { { printf(“**********\n”); } int z; { } 或 z=x>y?x:y; printstar(void ) 函数体为空 return(z); { } printf(“**********\n”); }
河南工业大学 信息科学与工程学院
§8.4 函数的调用 8.4.1 函数调用的一般形式 函数名(实参表 函数名 实参表); 实参表
说明: 说明:
实参与形参个数相等,类型一致, 实参与形参个数相等,类型一致,按顺序一一 对应 即使没有实参, 也不能省略 即使没有实参,()也不能省略 多个实参之间用逗号分隔 实参的求值顺序不确定, 实参的求值顺序不确定,应避免对此敏感的调 用形式: printf("%d,%d", i, i++); 用形式 自右向左) (Turbo C 自右向左)
河南工业大学 信息科学与工程学院
§参数传递方式 参数传递方式 值传递方式 值传递方式
方式:函数调用时 为形参分配单元 为形参分配单元,并将实 方式:函数调用时,为形参分配单元 并将实 复制到形参中 参的值复制到形参中;调用结束, 参的值复制到形参中;调用结束,形参单元 被释放, 被释放,实参单元仍保留并维持原值 特点: 特点: 形参与实参占用不同 不同的内存单元 形参与实参占用不同的内存单元 只能把实参的值传递给形参 不能把形参的值传递给实参 不能把形参的值传递给实参 对形参的值所作的改变不能带回 不能带回给实参 对形参的值所作的改变不能带回给实参
河南工业大学 信息科学与工程学院
§ 8.3 函数参数和函数的值 § 8.3.1 形式参数和实际参数 形式参数:定义函数时,函数名后 中的参数 形式参数:定义函数时,函数名后()中的参数 函数时 实际参数:调用函数时函数名后()中的表达式 实际参数:调用函数时函数名后 中的表达式 函数时函数名后 main() 例 比较两个数并输出大者 c=max(a,b); (main 函数) { int a,b,c; 函数) scanf("%d,%d",&a,&b); max(int x, int y) max 函数) 函数) ( c=max(a,b); 实参 { int z; printf("Max is %d",c); z=x>y?x:y; } return(z); max(int x, int y) 形参 { int z; } z=x>y?x:y; return(z); }
例8.4 参数求值顺序
第八章 函数
§8.1 概述
a函数 函数 main()主函数 主函数 b函数 函数 c函数 函数
必须的起点 库 函 数
d函数 函数
e函数 函数
f函数 函数
•C语言用函数实现程序模块化 语言用函数实现程序模块化 •一个程序由一个或多个源程序文件组成 一个程序由一个或多个源程序文件组成 •一个源程序文件由一个或多个函数组成 一个源程序文件由一个或多个函数组成 •C程序的执行从 程序的执行从main函数开始,并回到 函数开始, 程序的执行从 函数开始 并回到main函数结束 函数结束 •函数之间可以相互调用,或调用自身 函数之间可以相互调用, 函数之间可以相互调用 •不能调用 不能调用main函数 不能调用 函数 •函数之间相互独立,不存在从属关系 函数之间相互独立, 函数之间相互独立 •所有函数都可以调用库函数 所有函数都可以调用库函数
调用前 x: 7 x: 7 调用: 调用: a: 7 swap: x: 7 a: 11 temp 调用结束 x: 7 y: 11 b: y: b: 11 11 7 y: y: 11 11
河南工业大学 信息科学与工程学院
计算x的立方 例 计算 的立方 #include <stdio.h> a float cube(float x) product x { return(x*x*x); } main() { float a, product; printf("Please input value of a:"); scanf("%f",&a); product=cube(a); printf(”Cube of %.4f is %.4f\n",a,product); }
河南工业大学 信息科学与工程学院
求两个整数的最大值
main() main() { int x,y,nmax; scanf (“%d%d”,&x,&y); { int x,y,max; nmax=max(x,y); scanf(“%d%d”,&x,&y); printf((“max=%d”,nmax); } if(x>y) max=x; int max(int x,int y) else max=y; { int m; printf(“max=%d”,max); if(x>y) m=x; else m=y; } return m; } 思考:若程序中调用100次两个数求最大值, 思考:若程序中调用100次两个数求最大值,会是 100次两个数求最大值 什么情况? 什么情况?
河南工业大学 信息科学与工程学院
例 函数带回不确定值 printstar() { printf("**********"); } main() { int a; a=printstar(); printf("%d",a); } 输出: 输出:10 void printstar() { printf("a=printstar(); printf("%d",a); } 编译错误! 编译错误!
变量在整个模块范围内全局有效,如果将一个程序全部写 变量在整个模块范围内全局有效),各个相对独立的 样的函数,怎么办? 找数学书,考虑算法,编制求平方 样的函数,怎么办?(找数学书),各个相对独立的 将程序划分为若干模块(函数), 。然后程序员 将程序划分为若干模块(函数, 考虑算法, 个模块达到程序员所能够控制的规模。 个模块达到程序员所能够控制的规模 函数内, 在main()函数内,大家可以想象,变量可以在 函数内 大家可以想象,变量可以在main函数内 函数内 根代码)。C语言的库函数(标准函数)就是系统提供的 根代码) )可以由多人完成,每个人按照模块( 语言的库函数(标准函数) 语言的库函数 因为各个模块功能相对独 模块(函数) 模块(函数 可以由多人完成,每个人按照模块( 再进行各个模块的编制。 再进行各个模块的编制。因为各个模块功能相对独 任何位置不加控制地被修改。如果发现变量的值(状态) 任何位置不加控制地被修改。如果发现变量的值(状态) 调式好的、常用的模块,我们可以直接利用。 ,调式好的、常用的模块,我们可以直接利用。事实上我 步骤有限,所以流程容易控制, 函数)的功能要求,接口要求编制代码,调试, 立,步骤有限,所以流程容易控制,程序容易编制 函数)的功能要求,接口要求编制代码,调试,确 有问题, 有问题,你可能要在整个程序中查找哪里对此变量进行了 们的代码也可以重新利用,可以将已经调试好的, 们的代码也可以重新利用,可以将已经调试好的,功能相 修改。 ,修改 修改, 。 (函数)的正确性。最后将所有模块( 修改,什么操作会对此变量有影响 最后将所有模块( 保每个模块( 保每个模块 函数)的正确性。 。 对独立的代码改成函数,供以后调用。 对独立的代码改成函数,供以后调用。 函数)合并, 函数)合并,统一调试、运行。 使用函数后, 统一调试、运行。 使用函数后,变量局限于自己的函数内
河南工业大学 信息科学与工程学院
形式参数:定义函数时,函数名后 中的参数 形式参数:定义函数时,函数名后()中的参数 实际参数:调用函数时函数名后 中的表达式 实际参数:调用函数时函数名后()中的表达式 说明: 说明: 实参必须有确定的值 实参可以是常量、变量、表达式、 实参可以是常量、变量、表达式、函数调用 形参必须指定类型 形参与实参类型一致, 形参与实参类型一致,个数相同 若形参与实参类型不一致, 若形参与实参类型不一致,自动按形参类型 转换———函数调用转换 转换———函数调用转换 ——— 形参在函数被调用前不占内存;函数调用时为 形参在函数被调用前不占内存 函数调用时为 形参分配内存;调用结束, 形参分配内存;调用结束,内存释放
河南工业大学 信息科学与工程学院
例 函数返回值类型转换
main() { float a,b; int c; scanf("%f,%f",&a,&b); c=max(a,b); printf("Max is %d\n",c); } max(float x, float y) { float z; z=x>y?x:y; return(z); }
河南工业大学 信息科学与工程学院
使用函数的意义
§ 使用函数可以控制任务的规模 § 使用函数,程序的开发可以由多人分工协作 •一般应用程序都具有较大的规模。一个传动链计算机 一般应用程序都具有较大的规模。 一般应用程序都具有较大的规模 § 使用函数,可以重新利用已有的、调式好的、 辅助设计系统的源程序行数5万多行 万多行。 辅助设计系统的源程序行数 万多行。 成熟的程序模块 •使用函数可以 ,怎么合作? 使用函数可以将程序划分为若干功能相对独立的模 使用函数可以 怎么合作? 一个main()模块将程序划分为若干功能相对独立的模 模块, 一个使用函数可以控制变量的作用范围 模块 § ,这些模块还可以再划分为更小的模块,直到各这 想象一下,如果要用到求平方根,如果系统不提供sqrt这 想象一下,如果要用到求平方根,如果系统不提供 块 这些模块还可以再划分为更小的模块,
河南工业大学 信息科学与工程学院
函数分类
从用户角度
标准函数(库函数):由系统提供 标准函数(库函数):由系统提供 ): 用户自定义函数: 用户自定义函数:由用户按照逻辑功能自己编 写的程序 从函数形式 无参函数 有参函数
int max(int x,int y) { int m; if(x>y) m=x; else m=y; return m; }
河南工业大学信息科学与工程学院第八章函数main主函数81概述b函数a函数c函数d函数e函数f函数库函数必须的起点?c语言用函数实现程序模块化?一个程序由一个或多个源程序文件组成?一个源程序文件由一个或多个函数组成?c程序的执行从main函数开始并回到main函数结束?函数之间可以相互调用或调用自身?不能调用main函数?函数之间相互独立不存在从属关系?所有函数都可以调用库函数河南工业大学信息科学与工程学院求两个整数的最大值mainintxymax
×× 1.2 ×× 1.728 1.2
河南工业大学 信息科学与工程学院
§8.3.2 函数的返回值 返回语句 例 无返回值函数 void 形式: 表达式); 形式: return(表达式 ; swap(int x,int y ) 表达式 { return 表达式 int temp; 表达式; 或 temp=x; return; 或 x=y; 功能: 功能:使程序控制从被调用函数返回到调用函 y=temp; 数中, 数中,同时把返值带给调用函数 } 说明: 说明: 函数中可有多个return语句 函数中可有多个 语句 若无return语句,遇}时,自动返回调用函数 语句, 时 若无 语句 若函数类型与return语句中表达式值的类型 若函数类型与 语句中表达式值的类型 不一致,按前者为准,自动转换------函数调 不一致,按前者为准,自动转换 函数调 用转换 void型函数 型函数
河南工业大学 信息科学与工程学院
例 交换两个数
main() { int x=7,y=11; printf("x=%d,\ty=%d\n",x,y); printf("swapped:\n"); swap(x,y); printf("x=%d,\ty=%d\n",x,y); } swap(int a,int b) { int temp; temp=a; a=b; b=temp; }
河南工业大学 信息科学与工程学院
§8.2
一般格式
函数返回值类型 函数定义的一般形式 缺省int型 缺省 型 无返回值void 无返回值 合法标识符
函数返回值类型 { 说明部分 语句部分 }
函数名(形参类型说明表) 函数名(形参类型说明表)
函数体
8.2.1 无参函数 (现代风格) 8.2.2 有参函数 现代风格) 有参函数( 8.2.3 ) printstar(空函数 y) int max(int x,int dummy( ) { { printf(“**********\n”); } int z; { } 或 z=x>y?x:y; printstar(void ) 函数体为空 return(z); { } printf(“**********\n”); }
河南工业大学 信息科学与工程学院
§8.4 函数的调用 8.4.1 函数调用的一般形式 函数名(实参表 函数名 实参表); 实参表
说明: 说明:
实参与形参个数相等,类型一致, 实参与形参个数相等,类型一致,按顺序一一 对应 即使没有实参, 也不能省略 即使没有实参,()也不能省略 多个实参之间用逗号分隔 实参的求值顺序不确定, 实参的求值顺序不确定,应避免对此敏感的调 用形式: printf("%d,%d", i, i++); 用形式 自右向左) (Turbo C 自右向左)
河南工业大学 信息科学与工程学院
§参数传递方式 参数传递方式 值传递方式 值传递方式
方式:函数调用时 为形参分配单元 为形参分配单元,并将实 方式:函数调用时,为形参分配单元 并将实 复制到形参中 参的值复制到形参中;调用结束, 参的值复制到形参中;调用结束,形参单元 被释放, 被释放,实参单元仍保留并维持原值 特点: 特点: 形参与实参占用不同 不同的内存单元 形参与实参占用不同的内存单元 只能把实参的值传递给形参 不能把形参的值传递给实参 不能把形参的值传递给实参 对形参的值所作的改变不能带回 不能带回给实参 对形参的值所作的改变不能带回给实参
河南工业大学 信息科学与工程学院
§ 8.3 函数参数和函数的值 § 8.3.1 形式参数和实际参数 形式参数:定义函数时,函数名后 中的参数 形式参数:定义函数时,函数名后()中的参数 函数时 实际参数:调用函数时函数名后()中的表达式 实际参数:调用函数时函数名后 中的表达式 函数时函数名后 main() 例 比较两个数并输出大者 c=max(a,b); (main 函数) { int a,b,c; 函数) scanf("%d,%d",&a,&b); max(int x, int y) max 函数) 函数) ( c=max(a,b); 实参 { int z; printf("Max is %d",c); z=x>y?x:y; } return(z); max(int x, int y) 形参 { int z; } z=x>y?x:y; return(z); }