c语言函数PPT

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

函数名
标志符,用于标志这个函数,就是 函数的名字.
参数说明
参数说明(称为形参)是用来规定函数的调用者在调用该函数 时应提供的信息(通常是实在参数的个数与类型) 参数说明的三种常用形式:
1,关键字void或空(就是什么也没有):这时调用函数时不需要 任何实在参数;
2,类型1 参数名1, 类型2 参数名2...类型n 参数名n (所用类型确 定的参数)
前边还可以带有存储类说明符,但只能是 register。(函数前有register 表示编译系统 为参数变量分配尽可能快的存储单元)
{。。。}称为函数体,它在形式上是一个复合语 句(或分程序),包括说明部分和语句部分
注意:在c语言中不允许在函数体中再定义函数, 即函数定义不能嵌套。
函数体中包含若干个return(返回)语句, return语句两种形式:
一个子问题的接但对应一个模块,C语言一般用一个文件 来保存有关一个模块的源代码。用一个函数去解决一个小的子 问题,用头文件描述其他模块如何使用该模块提供的某些问题 的有关信息和其解答。
因为C语言支持各个源程序文件进行分别编译,方便程序 员分别关注问题的解答。因此对于大型的C语言程序,我们一 般选用模块设计方法去编写。
2、C语言的处理函数过程分析:程序执行到函数调用--->一个个 地计算实在参数的值(注意:计算实在参数的值的时候是无序 的。)--->相应地把实在参数的值传给形式参数--->控制转移到 被调用函数的第一句可执行语句。--->执行到return或者函数尾-->控制返回调用处。
我们解决比较复杂的问题常用的方法是分而治之。对于一 些大型的问题,我们可以把它分解成多个小问题,逐个解决, 再综合出远问题的解答。这运用到元件开发上称为:模块化设 计方法。
int i,j;
float f,g,q;
char c;
}s1={10,20,12.3,12.4,12.5,'A'} /*s1的值为值的组合*/
(4)uniotn utyre{
int i;
float f;
char c;
}u={100}
/*u的值为正在起作用的成员i的值100*/
函数调用与参数传递---3
这时调用函数时要提供这时调用函数时要提供nn个实在参数个实在参数并且是在参数类型与并且是在参数类型与相应的形式参数类型要相容相应的形式参数类型要相容一般是指实在参数的类型能一般是指实在参数的类型能转换成相应形式参数的类型转换成相应形式参数的类型3所用类型确定的参数书
函数定义的常用形式: 返回值的类型 函数名(参数说明)
特殊情况处理:
1、当实在参数为结构变量s1,而且s1的成员个数无限制,其中 有的成员为数组类型,那么当实在参数S1要传给形式参数的时 候,由于实在参数s1的数据量大,那么肯定要花费很多时间和 大量的空间开销。此时,我们可以考虑把s1改为&s1(此时传给 形式参数的不再是原来的一个值组合,而是s1的地址。)
:这时调用函数时要提供n个实在参数,并且是在参数类型与 相应的形式参数类型要相容(一般是指实在参数的类型能 转换成相应形式参数的类型) 3,所用类型确定的参数书,。。。(通常叫做变长参数表) 调用具有变长函数时,除了提供所有“类型确定的参数” 中所要求的是在参数外,还可以提供其它参数。
还有一点:形式参数可以带类型修饰符;其
程序运行结果是: 2.000000
在这个例子中,执行过程如下: (1)程序进入main函数并初始化变量f; (2)main函数的printf语句中调用了myfunc,将 实际参数0.5传递给myfunc的形式参数r; (3)程序进入myfunc函数;在myfunc里调用了 myfabs函数,将0.5传递给myfabs的形式参数x; (4)程序进入myfabs,计算x的绝对值,将return 值0.5返回; (5)程序继续计算2*myfabs(r)+1的值,结果 myfabs返回2.0; (6)main函数的printf打印myfunc的返回值2.0; 程序执行示意图如下:
{ 说明部分 语句部分
}
返回值类型
除了数组和函数类型之外的任何类型, 当然也包括值集合为空集的void类型. 1,当返回值类型是void时,函数不返回任
何值; 2,当返回值类型是int时,返回值类型可以
省略
(但为了和早期的c语言以省去返回值类 型表示函数不返回任何值的习惯相区 分;我们还是给出返回值类型比较好)
Hale Waihona Puke 员的值构成的组合。(4)单个联合类型变量的值:该变量正在起作用的那个成员的
值。(5)&i的值:变量i的地址。
例:自定义一个函数,函数名为power。
(1) int a,b; power(a+b);
(2)float a[5][3];
power(a);
/*表达式a的值为&a[0][0] */
(3)struct stype{
#include<stdio.h> float power (float m , int n) { int i ; float s=1.0; for (i=1;i<n;i++) s*=m; return s; } void main() { float a=3.5; int b=5; if (power(a,b)) ***; ************; printf("%d>%f",20,12.5); }
保证三个塔始终是大盘在下,小盘在上。
2021/9/24
17
华中科技大学计算机学院
将A塔n个盘子借助于B移至C:
(1) 先将A塔n –1个盘子借助于C移至B上
(2) 将A上剩下的一个移至C上.
(3) 将B上n –1个盘子借助于A移至C上.
递归结束条件:n=1
/* 将n个盘子从木桩a 移到木桩c,b为临时借用的木桩 */
void move(int n,int a,int b,int c)
{ if (n ==1) printf("%c -> %c\n",a,c);
else {
move (n-1,a,c,b);
printf("%c -> %c\n",a,c);
move (n-1,b,a,c);}
}
2021/9/24
fac(3) { 3fac(2); }
fac(2) { 2fac(1);
}
fac(1) { return 1; }
简化算法 不节省存储空间,运行效率也不高
2021/9/24
16
华中科技大学计算机学院
5.7.4 汉诺塔问题的递归求解(p152)
A
B
C
n个盘子
保证小(上),大(下) 问题: 将A塔上n个盘子移至C(借助于B)。 移动时,
n! =n*(n-1)! ; 0! =1。
f(n)=f(n-1)+f(n-2);
f(1)=1; f(2)=1。
(2)数据的结构形式是按递归定义的。如
树的遍历,图的搜索等。
(3)问题解法按递归算法实现。例如回溯 法
2021/9/24
14
华中科技大学计算机学院
5.7.2 递归的执行过程
以求n!为例 n!=
递归
递归调用:函数直接调用自己或通过另一函数 间接调用自己的函数调用方式 递归函数 :函数定义中含有递归调用的函数
2021/9/24
12
华中科技大学计算机学院
递归的两个要素
(1)递归结束条件。也就是所描述问题的 最简单情况,递归如果没有结束条件,递 归过程将永不终止,即无穷递归(和无限 循环类似)。
1 n(n–1)!
(n=0, 1) (n>1)
long fac(int n) { if (n==0||==1) return 1; else return (n*fac(n-1)); }
2021/9/24
15
华中科技大学计算机学院
main ( ) {
fac(4); }
fac(4) { 4fac(3); }
函数调用与参数传递---2
5、C语言中参数的传递只有一种形式:传值。
6、函数调用过程中,调用者会先把实在参数的表达式的值计算出来,然后赋给被调
用函数中与之对应的形式参数。
7、各种表达式的值:(1)浮点型,整形表达式的值:计算结果。(2)单个数组变
量名的值:数组第一个元素的地址。(3)单个结构变量名的值:该结构变量各个成
18
华中科技大学计算机学院
函数调用与参数传递---1
函数调用的形式: 函数名(实在参数表)
1、函数名意义:标识被调用函数。 2、实在参数表:想被调用函数传递信息。 3、实在参数表的形式:()||(表达式,表达式,...) 值得大家注意的是参数表不能出现(void)这样的形式。 每个表达式的值应当能转换成形式参数类型的值。 4、当被调用函数的形式参数表的形式是(n个所有类 型确定的形式参数,...)时,实在参数应该由n+m个表 达式组成(表达式间用“,”隔开),实在参数前n个表 达式与被调用函数前n个个数,类型都确定的形式参数 必须一一对应。m的类型与值由前n个表达式的值确定。
C语言不能嵌套定义函数,但可以嵌套调用 函数,也就是说,在调用一个函数的过程 中,又调用另一个函数。
下面是一个函数嵌套调用的例子: float myfabs(float x) { return x>0?x:-x; } float myfunc(float r) { return 2*myfabs(r)+1; } main() { float f=0.5; printf("%f",myfunc(f)); }
1,return;
用于返回值为void类型中,作用是把控制转移到 对该函数的调用处;
2,return 返回值表达式;
用于返回值类型为非void的函数中,作用是计算 出其中“返回表达式”的值,把该值返回给对 该函数的调用者,同时把控制转移到对该函数 的调用出。
函数的嵌套调用
C语言的函数定义是相互平行、独立的,也 就是说,在定义函数时,一个函数内不能 包含另一个函数,这是和pascal不同的。
(2)递归定义。为了描述问题的某一状态, 必须用到它的上一状态,而描述上一状态, 又必须用到它的上一状态,……,这种用自 已来定义自己的方法,称为递归定义。递 归定义必须能使问题越来越简单,使问题 向结束条件转化。
2021/9/24
13
华中科技大学计算机学院
递归算法解决三类问题
(1)数据的定义形式按递归定义。例如,
相关文档
最新文档