- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
③return语句中的括号可以省略; return后面的值可以是一个表 达式。
#include “stdio” int max (int x,int y)
{{{ riifnet(txuz>r;yn) r(ext>uyrn?xx:;y); } rze=t(uxr>ny)y?;x:y;
} return(z); } void main( ) { int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b) printf(“Max is%d\n”,c); }
说明:库函数的原形说明存放在头文 件(.h)中,通过使用include预处理命 令将这些原形说明插入程序中。
三、函数调用的执行过程
四、函数的原形说明
在程序中调用函数需满足以下条件:
1、被调函数必须存在,且遵循“先定
义后使用”的原则。
2、如果被调函数的定义在主调函数
之后(位置),可以先给出原形说明。
原形说明的形式为:
各函数间的信息往来是由参数传递和返回语句实现的
一、形式参数和实际参数 函数参数:用于函数间数据的传递 形式参数:定义函数时使用的参数 实际参数:调用函数时使用的参数
函数max有两个形式参数x和y
形参x和y只是在函数max中使用
a和b是主函数中定义的变量 main调用函数max a和b为函数max的实参
printf(“Max is %d\n”, max(a,b));
说明:这种调用方式不能用于
void型函数。
一、函数调用的一般形式
二、函数调用的方式
三、函数调用的执行过程
① 按从右向左的顺序,计算实参
中各表达式的值。
例8-5 读程序,写出结果
#include “stdio.h”
② 按照位置,将实参的值一一对 float iabs(float x)
形式参数说明方法:
void main( ) { int a,b,c;
类型说明 变量名 [,类型说明 变量名]…… scanf(“%d%d”,&a,&b);
1、无参数的定义形式
c=max(a,b) printf(“Max is%d\n”,c0);
类型说明 函数名( )
}
{函数体}
例如:
2、有参数的定义形式 类型说明 函数名 (形式参数说明)
3、求f(x);若f(x)与f(x1)同符号,则根 必在(x1,x2)区间内,令x1=x;反之, 根必在(x1,x)区间内,令x2=x
4、重复2和3,直到|f(x)|< ε ( ε为一个 很小的数,如10-6)为止。此时有
f(x) ≈0
例8-6 用弦截法求方程的根。
x3-5x2+16x-80=0
程序说明: 1、函数f(x)=x3-5x2+16x-80 2、用函数xpoint(x1,x2)求弦截点
例8-6 用弦截法求方程的根。 x3-5x2+16x-80=0
算法分析:
对于任意的f(x)=0,
1、给定两个x1,x2,满足x1<x2且f(x1) 和f(x2)的符号相反
2、过f(x1)、f(x2)两点做直线(弦),交 于x轴与x,其中
x=
x1.f(x2)-x2.f(x1) f(x2)-f(x1)
8.4 函数的调用
一、函数调用的一般形式 一般形式:
函数名(实参表列) 说明: ① 如果调用无参函数,实参表列
可以忽略,但括号不能省。 ② 实参的个数和形参一般相等。 ③ 实参与形参的类型应一一对应,
必要时使用类型转换。 注意:不同系统中,实参的计算
顺序不同。微机上一般是从右 到左。为避免由此引起的混乱, 一般应在调用函数前计算出实 参的值。
x的坐标 3、用函数root(x1,x2)求区间
(x1,x2)上的根
思考用函数编程的好处
例 编写程序求Cnm=
n! m!(m-n)!
分析:
重复三次求阶乘运算,只是
每次的值不同。
将求阶乘的过程编写一个函
数fac,以不同的参数值k来调用
函数
的对应位置确定,与名字无关。
一、形式参数和实际参数 例8-3 读程序,写出运行结果
Sum of 1,3 is 4
一、形式参数和实际参数
二、函数的返回值
1、返回函数值的方法 函数的返回值也就是函数值,是 一个确定的值。
①如果一个函数由返回值,就必 须使用return语句。
②一个函数中可以有 一个以上的 return语句,但不论执行到哪个 return都将结束函数的调用返回 主函数。
#include “stdio” int max (int x,int y) { int z;
z=(x>y)?x:y; return(z); } void main( ) { int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b) printf(“Max is%d\n”,c0); }
59 95 Max is 95
一、形式参数和实际参数
说明:
1、定义函数时,必须说明形参的类型。
形参只能是变量或数组 2、函数被调用前,形参不占用内存; 函数调用结束后,形参所占用的内存 也将被收回。 3、实参可以是常量、变量或表达式。 4、实参也形参的类型必须一致。字符 型和整型可以互相匹配。 5、C语言中实参对形参的数据传递是 “值传递”,即单向传递。它仅由参
int sum(int x,int y) { int z; z=x+y;
{函数体} 3、空函数的定义形式
return(z); } 又如
void printhello(char name[])
类型说明 函数名 ([形式参数说明])
{ printf(“Hello,%s\n”,name);
{}
}
函数定义的一般形式:
***************** Hello,world. *****************
8.2 函数定义的一般形式
#include “stdio”
函数定义的一般形式:
int max(int x,int y) { int z;
类型说明 函数名 ([形式参数说明]) {函数体}
z=(x>y)?x:y; return(z); }
数
#include “stdio” int max (int bx,int ya) { int zc;
z=(xa>yb)?xa:yb;; return(zc); } void main( ) { int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b) printf(“Max is%d\n”,c0); }
#include “stdio” int max (int x,int y) { int z;
z=(x>y)?x:y; return(z); } void main( ) { int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b) printf(“Max is%d\n”,c0); }
类型说明 函数名 (参数类型, 参数类型,…);
8.5 函数的嵌套调用
嵌套调用是指在一个函数的 函数体中又调用了其它函数。
例8-1
#include “stdio.h”
void printstar( ) { printf(“*****************\n”); } void printmessage( ) {printf(“Hello,world.\n”); printstar( ); } void main( ) {printstar( ); printmessage( ); }
二、函数的返回值 1、返回函数值的方法 2、函数值的类型 ① 函数的类型即函数值的类型。例
如,函数max是int型的也就是函 数值是int型的。 ②省略了类型说明的函数是int型的。 ③return语句中表达式的值一般应与 函数类型一致。
④如果不一致,则需要进行类型转换。 只有数值型数据可以进行自动类型 转换,以函数类型为准。
二、函数的返回值
1、返回函数值的方法
2、函数值的类型
3、不需要返回值的函数
① 如果函数中没有使用return 语句,函数返回的是一个不 确定的数值。(参见例8-1)
②如果一个函数不需要返回值 (表示一个过程),可以用void 做类型说明。
③如果一个函数被声明为void类 型,就不允许再引用它的返回值 (即只能用函数语句形式调用)。
1. 我的程序有上百行,如何调试最方便?
2. 我想设计一个程序完成下面的计算:
m!n! 其中,m、n为正整数且m>n (m-n)! 该如何设计程序最有效?
内容提要: 概述 函数的定义 函数参数(变量、数组)和函数值 函数的调用 函数的嵌套调用 局部变量和全局变量及变量的存储类别
8.1 概述
C程序的结构如图所示 1. 一个C程序可以分为若干个函数 2. 每个程序有且只能有一个主函数
#include “stdio” finlotamt maxa(xi(nftloxa,tinxt,fyl)oat y) { filnotatz;z;
zz==((xx<>yy))??xx::yy;; rreettuurrnn((zz));; } void main( ) { int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b) printf(“Max is%d\n”,c0); }
3. 从用户角度看,函数可分为:
标准函数,即库函数
自定义函数
4. 从函数形式看,可分为:
无参数函数:如printstar( )