函数及其应用 1 第 1 页,共 69 页,编辑于 2023 年星期五
10.1 功能的基本概念 一个较大的程序一般由若干个程序模块(子程序)组成,每个模块(子程序)完成一定的功能。 在C语言中,子程序的功能是通过函数来实现的。
AC程序可以由一个主函数和多个函数组成。 主函数调用其他函数,其他函数也可以互相调用。 同一个函数可以被一个或多个函数调用任意多次。下图是程序中函数调用的示意图: 2 第 2 页,共 69 页,2023 年星期五编辑 main()A()B( )C()D()E()F()G ()E()H()H()H()G() 函数调用图:Call 3 第 3 页,共 69 页,2023 年星期五编辑
(1).
源程序文件由一个或多个函数组成。 一个源程序
文件是一个编译单元,而不是以功能单元进行编译。 笔记2)。 AC程序可以由一个或多个源程序文件组成。
这样,编写、编译、调试就可以分开进行。 源文件可以是
多个 C 程序通用。 (3)。 所有功能都是并行的,一个功能不从属于另一功能。
数字和函数可以互相调用,但main()函数不能调用。 4 第4页,共69页,2023年星期五(4)编辑。从使用角度来看,函数可以分为:数学函数(#"math.h")
字符函数 (#"ctype.h")
库函数字符串函数(#".h")
输入和输出函数(#“stdio.h”)
动态存储分配函数(#".h")
……
自定义函数:5 第5页,共69页,2023年星期五编辑,从函数的形式上划分;
无参函数:调用函数没有数据传递给被调用函数
带参数的函数:主调用函数可以向被调用函数传递数据。 空功能:什么都不做,先占位置,后面再扩展功能。 6 第6页,共69页,2023年1月1日星期五编辑。 函数定义 一般形式:(自定义函数)
(1). 无参数函数的定义形式:
类型标识符函数名(){函数体}
函数定义总是
不能添加分号 (;)! 解释:
类型标识符指的是函数返回值的类型。
如果函数不想返回值,可以写 void.7 第 7 页,共 69 页,编辑于 (2), 2023。 带参数的函数定义:类型标识符函数名(形参列表){ 一些语句}形式参数示例: (intx,inty){intz;z=x+y;;} 注意:
返回值z的类型(int)
应与类型标识符统一。 8 第 8 页,共 69 页,2023 年星期五编辑 1. 函数参数和函数值; (1)形式参与及实参:例:main(){inta,b,c;
scanf(“%d,%d”,&a,&b);
c=max(a,b);("maxis%d",c);}(intx,inty)
/*定义参数化函数 max*/{intz;z=x>y?x:y;(z);}x、y 为形参 a,b 为实参 10.2 函数的参数 9 第 9 页共 6 页 十九页,于 2023 年星期五编辑实际参数可以是常量、变量或表达式,但要求有确定的值。
喜欢:
最大值(3,a+b);c. 实参和形参的类型应该一致,并且一一对应。 注:a. 形参变量(上例中的x、y)在不调用时不占用存储单元。 当函数被调用时,形参分配内存单元。 调用完成后,释放形参。 。 10 第 10 页,共 69 页,2023 年星期五编辑。实参到形式参数的数据传输是一种单向值传输。 只能从实参传递到形参,反之则不行。
实际参数和形式参数在内存中占用不同的单位。
b32
即使形参单元格中的值发生变化,也不会影响实参单元格的值。
函数调用后,形参单元被释放,但实参单元仍然保留。 11 第11页,共六十九页,2023年编辑,星期五 例10.9读取程序并写入程序执行结果 #(intx,inty){;temp=x;x=y;y=temp;; }(){inta,b;scanf("%d%d",&a,&b);
交换(a,b);("%d,%d\n",a,b);;}.c
即使形参单元格中的值发生变化,也不会影响实参单元格的值。
交换两个变量。 12 第 12 页,共 69 页,2023 年星期五编辑 2. 函数的返回值及语句:
执行C语言程序就是一一调用函数。 当函数被调用时,可以返回某个值作为函数的值(供主函数使用)。 当需要返回值时,请使用函数中返回值的语句:
(表达);
这里表达式的值就是函数的返回值。 13 第 13 页,共 69 页 2023 年星期五编辑 说明:
A。 语句后面的括号可以省略:
例如:(z);; 后面可以跟一个表达式。
14 第 14 页,共 69 页,2023 年星期五编辑
b. 当函数不需要带返回值时,C语言中有两种方法:
①. 使用不带表达式的语句,例如:; ②. 连都没用过。 这是因为在函数的末尾,有一个隐含的
语句,当遇到后面的大括号“}”时,控制权交给主调用者
功能。 15 第 15 页,共 69 页,2023 年星期五编辑。为了清楚地表明不会带回任何值,可以使用“void”定义。 例如: (); 这确保该函数不会返回任何值。 C。 如果函数没有指定返回值,并不意味着它不返回任何值,它可能返回一个不定值。
因为不考虑使用,所以即使返回值是不定值,也没有多大关系。
16 第 16 页,共 69 页,2023 年星期五编辑 #(intx,inty){intz;z=x+y;;}(){inta,b,c;scanf("%d% d",&a,&b) ;c=add(a,b);("c=%d\n",c);;} 示例: 10.1 函数值传递示例。 (P149) 该函数必须在定义或解释之前调用! .c17 第 17 页,共 69 页,于 2023 年星期五编辑 示例:10.2
函数地址传送示例。(P150)
输入由数字组成的字符串并将其转换为整数。 #(char*p){=0;while(*p){sum=sum*10;sum=sum+(*p-'0');p++;
};}(){[5];intx;
(":\n");scanf("%s",str);x=ctoi(str);
("%d\n",x);;} 数组名称作为函数参数
.c*p-'0'
将字符数转换为数字。 18 第 18 页,共 69 页,2023 年星期五编辑 3. 函数调用:(1)。 函数调用方法: 函数调用方法有以下三种: a . 语句: 作为语句,函数不需要函数带回值来完成某些功能和操作。 喜欢:
();b. 函数表达式:函数调用出现在表达式中。 喜欢:
c=z*max(a,b); 这时候就需要函数带回一定的值来参与运算。 19 第 19 页,共 69 页,2023 年星期五编辑功能参数:
例如:("%d",max(a,b));max(a,b)用作函数的参数。
20 第 20 页,共 69 页,2023 年星期五编辑 10.3 系统函数的应用 C 语言提供了非常丰富的库函数。 这些功能可以分为:
1.数学函数,例如:
sin()、sqrt() 函数等。它们的包含文件是:“math.h”。
2、字符串函数,如:gets()、()函数等,其包含文件为:“.h”。
3. 输入输出函数,其包含文件为:“stdio.h”。
21 第 21 页,共 69 页,于 2023 年 3 月 1 日星期五编辑。常用的数学函数有:
(1).sqrt():(); 计算; x 应该 >= 0
(2).fabs():(); 计算x的绝对值
x(3).pow():
(,);计算xy
价值
(4).exp():(); 计算前
值 22 第 22 页,共 69 页 于 2023 年星期五编辑 示例 10.3
求 z=xy+c
xy的值可以调用C语言的系统函数
pow() 函数来查找。 ##//必须添加数学库头文件(){,y,z,c;("\n");
scanf("%lf%lf%lf",&x,&y,&c);
z=pow(x,y)+c;("z=%lf\n",z);;} C++ 中的另一种注释方法 23 第 23 页,共 69 页,2023 年星期五编辑 例 10.4
使用循环方法生成1到100之间的10个随机数,并将它们显示在屏幕上。 关于 rand() 随机函数:
rand() 将返回一个从 0 到 0 之间的随机值。
24 第 24 页,共 69 页,2023 年星期五编辑##(){("=%ld\n",);}注意:
它是一个宏定义的值。 是系统中rand()返回的最大值。
它的值可以通过以下程序输出: 它取决于系统(32767)。 25 第 25 页,共 69 页,2023 年星期五编辑 2. srand(种子)函数:
srand() 用于设置 rand() 生成随机数时的随机数种子。 参数seed必须是整数,通常可以使用time(0)的返回值作为种子。
如果每次将种子设置为相同的值,则 rand() 生成的随机值每次都会相同。
3. time() 函数返回自 1970 年以来的秒数。 26 第 26 页(共 69 页)于 2023 年星期五编辑 示例 10.4
使用系统函数 rand(),该函数生成 1 到 100 之间的 10 个随机数。该函数在 .h.###(){ 中声明
因蒂,j;
srand(时间(0));
对于(i=0;i
j=1+(int)(100.0*rand()/(+1.0));
("%4d",j);}("\n");;}正在初始化随机数生成器。c27 第 27 页,共 69 页,于 2023 年星期五编辑
C语言提供的库函数中,有丰富的与字符串操作相关的函数。 它们的头文件有些是stdio.h,有些是.h。
1.puts(字符数组名)(头文件为stdio.h)
功能:向终端输出一个字符串。 如:[]=“中国”; 投入(str);
10.3.2 字符串处理函数将输出:China
注意:只能输出一个字符串,不能写成:puts(str1, str2); 28 第28页,共69页,2023年星期五编辑。 2. gets(字符数组名):(头文件为Stdio.h)
功能:从终端输入一串字符放入字符数组中。如:[10];gets(str);——输入一串字符
gets() 函数以回车符结束输入。 3. 其他常用的字符串操作函数有:
a.(s1,s2)函数:将字符串s2复制到s1,s1必须写成数组名的形式,s2可以是
数组名,也可以是字符串常量。 29第 29 页(共 69 页)于 2023 年星期五编辑
b.(S1,S2)函数:
将字符串 S2 连接到 S1 的末尾。 自动删除S1末尾的'\0',仅保留新字符串末尾的'\0'。
c.(S1)功能; 该函数返回S1的实际长度(不包括'\0')。
例如:[10]=“中国”;
(“%d”,(str));
输出不是 10,也不是 6,而是 5。
30 第 30 页,共 69 页,2023 年星期五编辑 d.(S1,S2) 函数;
要从左到右逐个字符地比较两个字符串,请按
ASCII 值比较。 直到出现不同的字符或遇到'\0'。
S1==S2
...该函数返回值 0
S1>S2
...函数的返回值>0
S1
...函数返回值
从键盘输入两个字符串,将两个字符串连接起来输出到屏幕##(){[80],s2[80];
获取(s1);获取(s2);
(s1,s2);puts(s1);;}gets() 以回车符结束输入..c32 第 32 页,共 69 页,于 2023 年星期五编辑 示例 10.6 从键盘输入一个字符串,求该字符串的长度字符串##(){intx;[80];获取(str);
x=(str);("字符串的长度: %d\n",x);;}.c33 第 33 页,共 69 页,于 2023 年星期五编辑 10.3.3 字符操作函数 带转换函数 1.() :函数原型:
(英寸); 检查 ch 是字母还是数字。 如果是字母或数字则返回1,否则返回0.2。():
函数原型:
(英寸); 检查 ch 是否是字母。 如果是字母,则返回 1,否则返回 0.34 第 34 页,共 69 页,编辑于 3, 2023。 ():函数原型:
(英寸); 检查ch是否为小写字母(a~z)。 如果是,则返回 1,否则返回 0.4。 ():函数原型:
(英寸); 检查ch是否为十六进制字符(0~9或a~f或A~F)。 如果是,则返回 1,否则返回 0.35。 第 35 页,共 69 页,编辑于 2023 年,星期五 5.atoi()
函数原型:
(字符*字符串)
功能功能:
将字符串(具有数字内容)转换为整数值。
头文件:
##
(){
国际;
[
]="12345.78";
n=atoi(str);
(“=%s
=%d\n",str,n);
;}36 第 36 页,共 69 页,2023 年编辑,星期五 示例 10.7
从键盘输入一些字符并输出大写字符和十六进制字符。 当输入字符@时,结束字符##(){;while((ch=())!='@'){
if((ch)||(ch))("%3c",ch);}("\n");;}.c37 第 37 页,共 69 页,于 2023 年星期五编辑 10.4 自定义函数 C 语言允许用户自定义功能。 例如:下面是一个自定义函数,其功能是求两个整数之和。
(intx,inty){intz;z=x+y;;}38 第 38 页,共 69 页,于 2023 年星期五编辑
关于被调用函数和函数原型的声明:
在一个函数内调用另一个函数(称为被调用函数)需要什么条件?
A。 该函数必须存在(库函数或自定义函数)。
此外:
b. 如果是库函数,一般应该在文件开头使用#命令。
包括有关相关功能的一些信息。
39 第 39 页,共 69 页,2023 年星期五编辑。 如果用户自己定义了一个函数,并且调用函数和被调用函数在同一个源文件中: 一般情况下,调用函数必须对被调用函数做出声明。
函数声明向编译系统声明该函数将被调用,并通知编译系统相关信息。 40 第 40 页,共 69 页,于 2023 年星期五编辑 示例:main(){,b,c;scanf (“”%f,%f”,&a,&b);c=add(a,b);(“sumis %f”,c);}
(,)
{;z=x+y;(z);}
被调用函数的声明(,);