第6章函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、函数使用常识
一个源文件由一个或多个函数组成,可为多个C程序 公用。 C语言是以源文件为单位而不以函数为单位进行编译 的。 一个C程序由一个或多个源(程序)文件组成——可 分别编写、编译和调试。 C程序执行总是从main函数开始,一般情况下调用其 它函数后总是回到main函数,最后在 main函数中结 束整个程序的运行。 所有函数都是平行的、互相独立的,即在一个函数内 只能调用其他函数,不能再定义一个函数(嵌套定 义)。 一个函数可以调用其他函数或其本身,但任何函数均 不可调用main函数。
函数各部分作用
1)函数的说明部分 函数说明部分说明函数的类型, 函数名, 参数表 及参数类型。
(1)函数的类型说明 函数的类型即函数的返回值类型。若函数不提供返 回值,则可定义其类型为: void。 例如: void putdata(int a) (2) 函数名 函数名又称函数标识符。命名遵循C语语言标识符 的规定;函数名要反映函数完成的功能。
【例6.6】数组名作为函数参数
写一函数,用冒泡法对一组数据进行排序,在 主函数中调用该函数,查看运行结果。
sort(int a[],int n) {int i,j,t; for(i=0;i<n-1;i++) for(j=0;j<n-i-1;j++) if(a[j]<a[j+1]) {t=a[j];a[j]=a[j+];a[j+1]= t;} }
6.2 函数定义
方式1
函数返回值类型名 函数名(参数列表) 参数类型说明 { 局部变量说明; 如: int max(a,b) 语句序列; } int a,b; 函数返回值类型名 函数名(参数类型说明及参数列表) { 局部变量说明; 语句序列; } 如: int max(int a,int b)
方式2
省略函数类型名时,C语言默认其为int型。
2)函数体
函数体包括变量定义和执行语句序列。函数所完 成的工作由函数体中一段程序实现。 函数的返回值用返回语句return返回,形式: return(表达式);
或 return 表达式;
如果函数的类型与return语句的表达式的类型 不一致时, 则以函数的类型为准。返回时自动 进行数据转换。 如果明确表示不需返回值,应使用void作函数 返回值的数据类型,否则即使没有return语句, 仍将带回一个不确定的值。
将数据中的数据倒置存放,如:
„4‟
„2‟
Leabharlann Baidu
„7‟
„5‟
„6‟
„1‟
„3‟
„3‟
„1‟
„6‟
„5‟
„7‟
„2‟
„4‟
6.4函数的调用
1、库函数的调用 必须在源程序中用include命令将定义该库函数 的头文件“包含进来”。 2、自定义函数的调用 有参数函数的调用形式: 函数名(参数) 无参数函数的调用形式: 函数名() 注意:当实际参数的个数、次序、类型与对应形式 参数的个数、次序、类型不一致时,系统并不提示 错误,后果却难以预测。
int max(int x, int y) { int t; if (x>y) t = x; else t = y; return t; } 若程序运行时输入为: 10,5 便有输出为: 10
调用max函数时,实参a把值传给形参x, 实参b 把值传给形参y,按顺序传递, 与形参名称无关。 实参a和形参x, 实参b和形参y一一对应。
(3)参数表
参数表写在函数名后的( )内,由一个或多个变 量标识符及类型标识符组成。 参数表中的变量称为形式参数, 简称形参。 若函数没有形参,则称为无参函数,其后 “( )”不能省略。 参数必须指定类型。形参的类型说明有两种:
方法1: int max(a,b) int a,b; 方法2: int max(int a, int b)
main() {int aa[10],i,j; for(i=0;i<=9;i++) scanf( %d,&aa[i]) ; sort(aa,10); for(i=0;i<10;i++) printf(“ %d”,aa[i]); }
课堂练习
以下程序的输出结果是: f(int b[],int m,int n) A、10 {int i,s=0; B、18 for(i=m;i<n;i=i+2) s=s+b[i]; C、8 return(s); D、15 } main() {int x,a[]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7); printf(“%d\n”,x); }
一、模块化设计与函数
①什么是函数? 如果把编程比做制造一台 为什么要使用函数? ②为什么要使用函数? 便于实现模块化设计 机器,函数就好比其零部 件。 ③函数有哪些类型? 便于团队开发 可将这些“零部件”单独 便于使用现有的或别人的 ④如何自己定义一个 设计、调试、测试好,用 程序模块提高编程效能 时拿出来装配,再总体调 函数? 在C程序设计中,通常: 试。 ⑤如何调用一个函数? 将一个大程序分成几个子 这些“零部件”可以是自 程序模块(自定义函数) 己设计制造/别人设计制造 ⑥函数学习的难点是 将常用功能做成标准模块 /现在的标准产品 什么? (标准函数)放在函数库
⑤如何调用一个函数? ⑥函数学习的难点是 根据使用的方式,可分为: 无参函数 什么? 有参函数(函数内需要使
用主调函数中的数据)
一、模块化设计与函数
①什么是函数? 如何自己定义一个函数? ②为什么要使用函数? (见后) ③函数有哪些类型? 如何调用一个函数? (见后) ④如何自己定义一个 函数? 函数部分学习的难点是什么? ⑤如何调用一个函数? ■函数的概念 ■形参/实参/返回值的概念 ⑥函数学习的难点是 ■递归算法 什么? ■变量的作用域和生存期
【例6.7】函数fun的功能是:使一个字符 串按逆序存放,请填空: fun (char str[]) {char m;int i,j; for(i=0;j=strlen(str);i< ;i++,j--) {m=str[i]; str[i]= ; str[j-1]=m; } printf(“%s\n”,str); }
函 数 调
用
的 方
式(1)
按函数在程序中调用的位置,可以有以下三种函数调用方式: 1、函数语句:把函数调用作为一个语句。 如书中引例 2、函数表达式 函数出现在一个表达式中,这种表达式称为函数表达式。 这时要求函数带回一个确定的值以参加表达式的运算。 例如: c=2*max(a,b); 函数max是表达式的一部分,它的值乘2再赋给c. printstar( ); 这时不要求函数带回值,只要求函数完成一定的操作。
【例6-2】定义符号函数sign。
int sign(int x)
/*函数返回值类型未说明,默认为int,建议给出函数类型说明*/
/*形式参数说明*/ {int y; /*函数体局部变量*/ y=x>0?1:(x==0?0:-1); return y; /*返回函数值*/ } 注意:C语言函数分为两大部分: 函数的说明部分 函数体部分。
Let’s try„ 一、模块化设计与函数
【例6.1】编写一个儿童算术能力测试软件
main() { char ans = 'y'; clrscr( ); cover( ); /*调用软件封面显示函数*/ password( ); /*调用密码检查函数*/ while (ans =='y'|| ans =='Y') { question( ); /*调用产生题目函数*/ answers( ); /*调用接受回答函数*/ marks( ); /*调用评分函数*/ results( ); /*调用结果显示函数*/ printf("是否继续练习?(Y/N)\n"); ans=getch ( ); } printf("谢谢使用,再见!"); } /*定义所用函数*/ cover() { } /*软件封面显示函数*/ password(){ } /*密码检查函数*/ question(){ } /*产生题目函数*/ answers(){ } /*接受回答函数*/ marks(){ } /*评分函数*/ results(){ } /*结果显示函数*/
1)实参a、 b形参x 、y之间值的传递如图所示。
10 10 5 5
a x b y 2) 关于形式参数和实际参数说明如下:
形式参数在函数被调用时才被分配内存。当函数执行完毕返回 时, 形式参数占用的内存空间便被释放。 实参可以是变量、常量和表达式。 但实参必须有确定的值。
3) 形参和实参的类型必须相容。 4) 形参和实参之间的关系是: 单向的数据的传递 具体的传递方式有两种: 值传递方式(传值):将实参值单向传递给形参的一 种方式。 地址传递方式(传址):将实参地址单向传递给形参 的一种方式。
【例6.5】函数参数传递示例
main ( ) { int t =10; printf("%d %d ",sqr(t),t); /* sqr(t)是函数调用,t是 实参* / } int sqr(int x) /* 函数定义,x是形式参数* / { x = x * x; return (x); } 执行程序: 100 10 注意,传递给函数的只是参数值的复制品。所有发生 在函数内部的变化均无法影响调用时使用的变量。
第6章
函数
1. 概述 2. 函数的定义与说明(重点) 3. 函数的调用(重点,难点递归调用) 4. 变量的作用域(重点) 5. 变量的存储属性(重点,难点)
6.1函数概述
①什么是函数? 什么是函数? ②为什么要使用函数? ③函数有哪些类型? 一个独立的程序模块, ④如何自己定义一个 可以定义自己的变量 (仅在本函数内有效), 函数? 拥有自己的存储空间。 ⑤如何调用一个函数? 可以被其他函数或自身 ⑥函数学习的难点是 调用(主函数除外)。 什么?
这些函数现在不编程或还不会 编程,可先放空。 可以多人合作,每人完成若干 个函数(模块化)。 可在另一个源程序文件中定义。
一、模块化设计与函数
函数有哪些类型? ①什么是函数? 根据函数的来源,可分为: 库函数(标准函数) ②为什么要使用函数? 由系统提供,编程时可直接 ③函数有哪些类型? 使用之 ④如何自己定义一个 自定义函数 由编程者自己编写,使用时 函数? 要“先定义后使用”
中供其他程序调用
一、模块化设计与函数
【例6.1】编写一个儿童算术能力测试软件
main() 自定义函数 { char ans = 'y'; clrscr( ); cover( ); /*调用软件封面显示函数*/ password( ); /*调用密码检查函数*/ while (ans =='y'|| ans =='Y') { question( ); /*调用产生题目函数*/ answers( ); /*调用接受回答函数*/ marks( ); /*调用评分函数*/ results( ); /*调用结果显示函数*/ printf(“是否继续练习?(Y/N)\n”); ans=getch ( ); } printf(“谢谢使用,再见!”); }
例6.3 定义函数power(x,n), 求x的n次方。 函数定义如下:
float power( float x, int n) { int i; float t=1; for(i=1;i<=n;i++) t = t * x; /* 1*x*x*…*x 共乘n次 */ return t; } /* 返回t的值 */
6.3函数的参数
函数定义时填入的参数我们称之为形式参数,调 用时填入的参数,称之为实际参数,简称实参。
实参的个数必须与形参相等,且参数顺序、类 型要对应一致。实参与形参是按位置一一对应 地传递数据的。 [例6.4] 编程输入两个数, 输出其中较大的。
main( ) { int a, b, m; int max(int, int ); scanf(“%d,%d”, &a, &b); m = max(a, b); printf(“max=”,m);}