c语言第七章函数
合集下载
《c语言函数》PPT课件

其它函数: 可以互相调用函数、自调用函数,不能调用main()。
精选课件ppt
4
2、使用参数 入口参数: 主调函数向被调函数传递的数据------实参、形参。
出口参数: 被调函数向主调函数传递的数据------返回值。
精选课件ppt
5
§7.2 函数的定义 问题: 1、被调函数如何使用主调函数中的数据。 2、假设被调函数有办法使用主调函数中的数据,如何保证 被调函数和主调函数中数据类型的一致。
在函数中允许有多个return语句,但每次调用只能有一个 return 语句被执行, 因此只能返回一个函数值。
精选课件ppt
15
2、函数值(回传值)的类型与被调用函数的类型说明
函数调用语句 被调函数类型 回传值类型
在定义函数时,需要指定函数的类型:
例如:
int max(x,y);
doubel a(c1,c2); 等等
1、被调函数为库函数 对库函数的调用不需要再作说明, 但必须把该函数的头
文件用include命令包含在源文件前部。
精选课件ppt
23
2、用户自定义的函数 一般应该在主调函数中对被调函数的返回值的类型做说明。 对被调函数的说明也有两种格式,
一种为传统格式,其一般格式为: 类型说明符 被调函数名();
9
调用结束:形参临时单元被释放,形参数据失效,实参数 据不变。这就是所谓的单值传递。
函数的形参和实参具有以下特点:
(1)、形参变量只有在被调用时才分配内存单元,在调用 结束时, 即刻释放所分配的内存单元。因此,形参只有在 函数内部有效。 函数调用结束返回主调函数后则不能再使 用该形参变量。
精选课件ppt
}
精选课件ppt
精选课件ppt
4
2、使用参数 入口参数: 主调函数向被调函数传递的数据------实参、形参。
出口参数: 被调函数向主调函数传递的数据------返回值。
精选课件ppt
5
§7.2 函数的定义 问题: 1、被调函数如何使用主调函数中的数据。 2、假设被调函数有办法使用主调函数中的数据,如何保证 被调函数和主调函数中数据类型的一致。
在函数中允许有多个return语句,但每次调用只能有一个 return 语句被执行, 因此只能返回一个函数值。
精选课件ppt
15
2、函数值(回传值)的类型与被调用函数的类型说明
函数调用语句 被调函数类型 回传值类型
在定义函数时,需要指定函数的类型:
例如:
int max(x,y);
doubel a(c1,c2); 等等
1、被调函数为库函数 对库函数的调用不需要再作说明, 但必须把该函数的头
文件用include命令包含在源文件前部。
精选课件ppt
23
2、用户自定义的函数 一般应该在主调函数中对被调函数的返回值的类型做说明。 对被调函数的说明也有两种格式,
一种为传统格式,其一般格式为: 类型说明符 被调函数名();
9
调用结束:形参临时单元被释放,形参数据失效,实参数 据不变。这就是所谓的单值传递。
函数的形参和实参具有以下特点:
(1)、形参变量只有在被调用时才分配内存单元,在调用 结束时, 即刻释放所分配的内存单元。因此,形参只有在 函数内部有效。 函数调用结束返回主调函数后则不能再使 用该形参变量。
精选课件ppt
}
精选课件ppt
c语言 第7章 函数 njcc

※重点提示: 重点提示 要想让函数返回一个确定的值,必须通过语 句“return(表达式)”来实现,其中表达式就是 函数的返回值。如果没有return语句,或 return语句不带表达式并不表示没有返回值, 而是表示返回一个不确定的值。如果不希望 有返回值,必须在定义函数时把“数据类型 说明符”说明为“void”。
7.3.2 函数调用时的语法要求 函数调用时,需要遵循以下几条语法要求: (1)调用函数时,函数名必须与所调用的函数名字完全一 致。 (2)实参的个数必须与形参一致。实参可以是表达式,在 类型上应按位置与形参一一对应匹配。如果类型不匹配, C编译程序按赋值兼容的规则进行转换,否则,程序运行 后不能得到正确的结果。 (3)C语言规定,函数必须先定义后调用(函数的返回值类 型为int或char时除外)。 (4)实参可以是 C程序中函数可以直接或间接的自己调用 自己,即递归调用。 重点提示: ※重点提示:函数调用时,必须特别注意实参和形参的类型 匹配。
2.数据传递的形式 (1)C语言中,调用函数和被调函数之间的 数据可以通过三种方式进行传递: ① 实际参数和形式参数之间进行数据传递。 ② 通过return语句把函数值返回调用函数。 ③ 通过全局变量。 (2)参数值的传递 主调函数在调用函数时,需要把相应的实际 参数传给相应的形式参数,实际参数的个 数和类型要和形式参数的个数和类型一致。
7.5 调用函数和被调用函数之间的数据传递
1.形参和实参的概念 每个函数一般都能完成一定的功能,可以形象地把 函数看成一个加工厂,该加工厂对材料进行加工, 最后生产出产品。而加工厂加工的材料,称为 “函数的参数”,而加工出来的产品称为“函数 的返回值”(有的函数没有返回值)。在定义函数 时,只是形式化地说明函数加工的对象,这种对 象并不实际存在,就象建立一个本材加工厂时只 是说明该加工厂把木材加工成木板,但并没有实 际的木材,把这种参数称为“形式参数”。当程 序段要调用该函数完成指定的功能,就需要给它 实际的材料,以便加工出“产品”。就象一个人 要把木材加工成木板,就必须把实际的木材送到 加工厂加工一样,函数调用时传入的参数称为 “实际参数”。
《C语言程序设计(第五版)》课件-第7章函数

int main()
{ int a,yn=0;
while(yn==0)
{ printf("Input a number(0—9): mp;a); fun(a);
/*调用函数,a为实参*/
printf("If continue, please input 0, otherwise input 1:");
C语言程序设计
第7章 函数
7.2 函数的定义
根据有无参数,可以将函数分为无参函数和有参函数两种形式:
1.无参函数
定义形式如下:
类型标识符 函数名( )/*函数的首部*/
{
声明部分
/*函数体*/
执行部分
}
类型标识符用来说明函数返回值的类型,也称为函数的类型。若 省略类型标识符,则默认返回值类型为整型;当函数无返回值时,可 以指定函数的类型为void。
(5) 函数定义时,旧版的C语言中,函数首部中的形参列表仅包 含形参,形参的类型另起一行来说明;而新版的C语言中,函数首部 中的形参列表包含形参的类型和形参名。
例如,“int max(int x , int y)”为新版的函数定义方式。 而以下代码为旧版的函数定义方式: int max (x, y) int x, y; 一般来说,在新版的C语言中以上两种定义方式都能使用。
{ int j,k,flag=1; k=sqrt(p); for (j=2;j<=k;j++)
说明: prime函数用于判断参数p是否为素数,形参
if (p%j==0) {flag=0; break; }
p接收main函数传来的实参 i的值,prime函
return flag; }
C语言程序设计_课件_第七章(适于清华谭浩强版)

注意:
(1) return(表达式); 和return 表达式;都 是正确的。 (2) 带返回值的函数只能返回一个值。 (3) 在函数定义时,允许使用多个return语句, 但是应尽量在末尾使用一个return语句。 (4) return语句中的表达式与函数的返回值类 型不匹配时,以函数定义时的返回类型为准。
问题的提出 函数基础 函数的定义 函数说明 函数调用 参数传递 程序举例 递归调用 变量的存储类别
7.1 问题的提出
例6.20它可以解决的问题有: ①输入若干个学生的姓名、某课程的期中 和期末成绩,并计算每个学生的总评成绩; ②计算总评成绩的分数段情况; ③输出所有学生的姓名、期中、期末和总 评成绩; ④查询某个学生的总评成绩。
函数调用时需要传递数据。调用函数要将 实参的值传送给被调用函数的形参。 若函数定义首部是 double power(double x,int n) /*函数定义 */ 调 用 形 式 是 可 以 是 power(y,m) , 也 可 以 是 power(3.0,5)。 其中,x和n是形式参数,y和m是实际参数,3.0 和可以是一个变量 名,因为变量名也构成一个表达式,形式参数只 能是变量名。当实际参数是变量名时,它与形参 的名称既可以相同,也可以不同,只是要注意, 在函数定义内部应该使用形参的名称。 (2) 实际参数与形式参数的参数个数、数据类型 和顺序都应该一致,如果数据类型不一致,系统 将按照自动转换规则进行转换。
7.3 函数的定义
7.3.1 函数的定义形式 在C语言中函数定义的形式有两种。
第一种:
函数返回值的数据类型说明 函数名称(带有类型说明的参数表)
{
函数内部数据说明; 语句;
}
第二种:
C语言课件第07章

void main() { void s(int n); /*函数声明*/ int n=100; /*定义实参n,并初始化*/ s(n); /*调用函数*/ printf("n_s=%d\n",n); /*输出调用后实参的值,便于进行比较*/ getch(); } /* */ void s(int n) { int i; printf("n_x=%d\n",n); /*输出改变前形参的值*/ for(i=n-1; i>=1; i--) n=n+i; /*改变形参的值*/ printf("n_x=%d\n",n); /*输出改变后形参的值*/ }
main ( ) { int max( int n1, int n2) ; */ int x, y; ; scanf("%d%d", &x , &y); ; printf(“max=%d\n”, max(x,y)); ; }
/* 定义函数:max() max()后边,无“ ;” */
/* 定义语句中有完整的函数体 */ 定义语句中 /*主函数内:分别用到了声明与调用*/ 主函数内:分别用到了声明与调用 主函数内
2.说明 . (1)函数定义不允许嵌套。 函数定义不允许嵌套 定义不允许 在C语言中,所有函数(包括主函数main())都是平行的。一个 函数的定义,可以放在程序中的任意位置,主函数main()之前或之 后。但在一个函数的函数体内,不能再定义另一个函数,即不能嵌 套定义。 (2)空函数──既无参数、函数体又为空的函数。其一般形式 为: [函数类型] 函数名(void) {} (3)在老版本C语言中,参数类型说明允许放在函数说明部分 的第2行单独指定。
/*声明语句中的 max() 后 边 , 有 “ ; ” 声明语句中的max() 声明语句中的 max()后
C语言课件第07章-自定义函数

在主函数或其他函数中,我们可以使用y=sum();语句执行函数sum,并把 函数的值送给y,或者用printf("%d",sum());直接输出函数sum的值。
第7章 自定义函数
2. 有参函数的定义形式 如果一个函数,需要调用者提供原始数据才能执 行(如sqrt函数),则这种函数可以被定义成有 参函数。其定义形式如下:
第7章 自定义函数
下面我们定义一个函数,名叫 printStar,其功能就是专门输出 则,主函数代码可以简化为:
经过函数调用,程序的代码行大大缩水,且main 函数更清晰且可读性更好。
第7章 自定义函数
如果我们把printStar函数的代码放到d盘根目录 下的一个文本文件中,比如放到function.txt文 本文件中,其他的程序如果有需要,也完全可以 用#include <d:\function.txt>把有关内容包含 到对应程序文件中,在需要的时候调用printStar 函数即可 。 函数:函数就是一个用名字命名的独立的程序块( 子程序),能实现某些功能,可供本程序其他函数 ,或者另外一些程序的函数调用。
第7章 自定义函数
factorial 函数专门求n的阶乘
第7章 自定义函数
形式参数(形参):函数在声明(定义) 的时候,同时对函数所需要的参数的数量、类型做出 说明。这些参数的名字只是一种形式,只有在函数被 调用时,这些参数才能得到具体值,所以这些参数为 形式参数。比如,函数求阶乘函数中的n就是形式参 数。 实际参数(实参):一个有参函数在被调用的时候, 主调函数必须根据被调用函数形参(形式参数)的要 求,传递具体数据给被调用函数的形参,这些实际的 数据就叫做实际参数,也就是我们所说的实参。 实参是有具体值的,实参可以是常数,也可以是变量 。但在使用时必须有具体值。
C语言程序设计知识点—第7章 函数

C 语言程序设计知识点
第 7 章:函数
主讲教师:杨剑
1. 本章目标
熟练掌握函数的定义与调用方法 理解函数的定义、声明和调用的区别 理解函数原型、实参、形参和函数的返回值 了解函数的嵌套调用和递归调用的方法 掌握数组做为函数参数的使用方法 理解变量的作用域和存储方法
2. 函数机制的优点
~6~
C 语言程序设计知识点
主讲教师:杨剑
[练习]若各选项中所用变量已正确定义,函数 fun 中通过 return 语句返回一个函数值,
以下选项中错误的程序是( )
A.main()
{……x=fun(2,10); ……}
float fun(int a,int b){……}
B.float fun(int a,int b){……}
int data; scanf(“%d”,&data); printf(“%d”,add(data)); return 0;
~5~
C 语言程序设计知识点
主讲教师:杨剑
} int add(____②_____) {
int i,sum=0; for(i=1;i<=n;i++)
sum=sum+i; _______③__________ } 答案: ①int add(int); ②int n ③retrun sum;
{
printf(“%d\n”,F(3+5));
}
[练习]程序运行后的输出结果是( )
A.192 B.29
C.25
D.编译出错
答案:D
在 C 语言中,函数返回值的类型最终取决于( )
A.函数定义时在函数首部所说明函数类型
B.return 语句中表达式值的类型 C.调用函数时主调函数所传递的实参类型
第 7 章:函数
主讲教师:杨剑
1. 本章目标
熟练掌握函数的定义与调用方法 理解函数的定义、声明和调用的区别 理解函数原型、实参、形参和函数的返回值 了解函数的嵌套调用和递归调用的方法 掌握数组做为函数参数的使用方法 理解变量的作用域和存储方法
2. 函数机制的优点
~6~
C 语言程序设计知识点
主讲教师:杨剑
[练习]若各选项中所用变量已正确定义,函数 fun 中通过 return 语句返回一个函数值,
以下选项中错误的程序是( )
A.main()
{……x=fun(2,10); ……}
float fun(int a,int b){……}
B.float fun(int a,int b){……}
int data; scanf(“%d”,&data); printf(“%d”,add(data)); return 0;
~5~
C 语言程序设计知识点
主讲教师:杨剑
} int add(____②_____) {
int i,sum=0; for(i=1;i<=n;i++)
sum=sum+i; _______③__________ } 答案: ①int add(int); ②int n ③retrun sum;
{
printf(“%d\n”,F(3+5));
}
[练习]程序运行后的输出结果是( )
A.192 B.29
C.25
D.编译出错
答案:D
在 C 语言中,函数返回值的类型最终取决于( )
A.函数定义时在函数首部所说明函数类型
B.return 语句中表达式值的类型 C.调用函数时主调函数所传递的实参类型
C语言_7函数

2 必须有某个结束递归条件:这个结束条件是递归 分解的终止点。
例 1. 用递归法求 n! n! =n*(n-1)! n! =1 当n>1时 时 当n=0或n=1时 或 时
例 2.用递归函数计算Febonacci序列的第n项值 函数原形是:f(n)=f(n-1)+f(n-2)
例 3.用递归函数计算xn的值
§4 函数的调用 一、 函数调用的一般形式 函数名(实参表列) 函数名(实参表列) 说明 : 调用无参函数,虽然不需要实参,但括号不能省。 调用无参函数,虽然不需要实参,但括号不能省。
调用函数的方式有三种: 调用函数的方式有三种: 函数语句、函数表达式、函数参数。 函数语句、函数表达式、函数参数。 如: ShowInfor(); m=max(a,b)*20; cout<<max(a,b);
实验题 1.找出1000之内的所有“完数”,判一个数是否 为完数用函数实现 。 2 .编写程序,从键盘上读入一个整数m,然后输出 这个数的全部素数因子,其中判断是否为素数用函 数实现。
§7.5 函数的嵌套调用
函数的嵌套调用
main 函数 ① 调用 a 函数 ⑨ ⑧ 结束 函数不能嵌套定义函数 ②
main
a d e f e
b g h i g
c j
C 程序结构
§2 函数定义
无参函数 形式: 函数名() 形式:函数类型 函数名() { 函数体 } 注意: 注意: 如果一个函数不需要返回值, 如果一个函数不需要返回值,认为函数类型是void类 型 例如: 定义一个ShowInfor函数,显示如下信息: 函数, 例如: 定义一个 函数 显示如下信息: ********* int a,b,c; cin>>a>>b; c=max( a ,b ); cout<<c<<‘\n’; }
- 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( )
#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( )