第9讲-C课件函数
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
float sum ( float x , float y ) { int z ;
z=x+y; return z ;
}
函数名:
通常是一个标识符, 在一个程序中除了主函 数外其余函数的名字可 以任意取,但应有意义 。
"()" 函数标志。
函数的分类与定义
float sum ( float x , float y ) { …… }
或 函数名( );
函数类型
作用:告诉编译系统函数类型、参数个数及 类型,以便检验
函数定义与函数说明不同
内或外)
函数说明位置:程序的数据说明部分(函数
下列情况下,可不作函数说明
若函数返值是char或int型,系统自
# include <stdio.h> void main() { float add(float x, float y);
{ printf("Wuhan University\n"); } main() { psch( ); }
对被调用函数的说明
对被调用函数要求:
必须是已存在的函数
库函数: #include <*.h>
用户自定义函数: 函数类型说明
函数声明
一般形式: 函数类型 型 [形参名],….. );
函数名(形参类
第9讲 C课件函数
2023年5月31日星期三
C程序的模块化结构
模块化程序设计方法:
人们在求解某个复杂问题时,通常采用逐步分解、分而治 之的方法,也就是将一个大问题分解成若干个比较容易求解 的小问题,然后分别求解。程序员在设计一个复杂的应用程 序时,往往也是把整个程序划分成若干个功能较为单一的程 序模块,然后分别予以实现,最后再把所有的程序模块象达 积木一样装配起来,这种在程序设计中分而治之的策略,被 称为模块化程序设计方法。
函数中最外层一对花括 弧"{ ······· }"括
z
=
x
+
y
;
起来的内容,它由若干个数 据说明语句和可执行语句组
return z ;
成,决定函数要实现的功能
、完成的任务。
}
函数体内若无任何语句时
,为空函数。
形式参数和实际参数
实参可以是常量、变量、表达式、函数等,无论实参是何 种类型的量,在进行函数调用时,它们都必须具有确定的 值,以便把这些值传送给形参。因此应预先用赋值、输入 等办法使实参获得确定值。
{ int z ;
{ int z ;
z=x+y; return z ;
z=x+y; return z ;
}
}
函数的分类与定义
函数定义的一般形式说明:
float sum (float x , float y ) { int z ;
z=x+y; return z ;
}
类型说明符: 指明函数的类型,函数的 类型是指函数的返回值的类 型,函数返回值所具有的数 据类型的种类与变量相同。 省略时则默认为int型。若明 确表示函数 "不带回值",可 以用 " void " 作类型符,称" 无类型"或称"空类型"。
函数调用
函数名( 实参1,实参2,……,实参n ); 或
变量名 = 函数名( 实参1,实参2,……,实参n );
•说明: – 实参与形参的个数相等、类型相同、顺序一致, 呈一一对应的关系。 – 实参的求值顺序不确定,与所用系统有关。 – 实参应有确定的值。
函数调用的方式
函数语句: (函数调用的一般形式加 上分号即构成函数语句)
}
main ( )
{ int x=11, y=19 ;
printf("%d\n", fun1( x, y) );
}
函数的返回值 •函数的返回值:当被调用函数在完成一定的 功能后,可以将处理的结果返回到调用函数。
返回语句
形式: return(表达式);或
或
return;
return 表达式;
功能:计算表达式的值,并返回给主调函数。
a7
b 11
③ swap
x7
y 11
a 171
b 171
temp 7
④ 调用结束
x7
y 11
2、地址传递方式 ➢ 方式: 函数调用时,将数据的存储地址作为参数传递给形参 ➢ 特点: ① 形参与实参占用同样的存储单元 ② 双向传递 ③ 实参和形参必须是地址常量或变量
用数组名作为函数参数时还应注意以下几点: ✓ 形参数组和实参数组的类型必须一致,否则将引起错误。 ✓ 形参数组和实参数组的长度可以不相同,因为在调用时, 只传送首地址而不检查形参数组的长度。 ✓ 多维数组也可以作为函数的参数。在函数定义时对形参数 组可以指定每一维的长度,也可省去第一维的长度。
函数概述
函数的概念
函数其实就是一段可以重复调用的、功能相对独 立完整的程序段。
C是函数式语言 必须有且只能有一个名为main的主函数 C程序的执行总是从main函数开始,在main中结束 函数不能嵌套定义,可以嵌套调用
函数必须先定义,后使用。
函数的分类
从用户的观点分为:C编译系统提供的标准库 函数和用户自定义函数;
程序:float ftoc(float temp ) { float c ; c =(5./9.)*( temp – 32 ); return c ; }
#include <stdio.h> int max (in t a, int b); //函数的原型声明 void main ( ) { int a, b, c; scanf ("%d%d", &a, &b); c = max (a, b); //函数调用(a、b为实参) printf ("the biggest number is : %d\n", c); } int max (int a, int b) //函数定义(a、b为形参) { return (a > b ? a : b); }
。
函数定义的一般形式 一般格式
无参函数:
函数类型
函数名(
)
{
说明部分
语句部分
}
例 无参函数 void printstar( )
{ printf(“**********\n”); }
<
函数的分类与定义
函数定义的一般形式举例:
(1)
(2)
float sum (float x,float y) float sum (float x, float y )
说明:
函数中可有多个return语句,但每次调用只能有一个 return 语句被执行,因此只能返回一个函数值。
若无return语句,遇}时,自动返回调用函数。
函数的返回值
void函数
对于不需要提供返回值的函数可以直接用 void作为函数类型定义,以表明此函数返回值 为”无类型”或”空类型”。 void psch()
}
void swap (int a, int b)
Why?
{
int temp;
temp = a; a = b; b = temp; }
运行结果: before swapped: x = 7, y = 11 after swapped: x = 7, y = 11
① 调用前
x7
y 11
② 调用
x7
y 11
void main ( )
{
char str1[ ] = {"Hello "};
char str2[ ] = {"china!"};
char str3[40];
mergestr (str1, str2, str3);
运行情况如下: 3.6, 6.5↙
被调用函数add的声明*/
float a,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);
printf("sum is %f \n“,c);
}
float add(float x,float y) /*函数首部*/
参数表( 形参表 ) :
➢ 函数定义时的参数称为 形式参数,形式参数彼 此间用逗号分隔。
➢ 形式参数省略时称无参 函数,但此时函数名后 的圆括号不能省。
➢ 形参说明是用来指明各 个形式参数的类型,它 随形参的存在而存在。
float sum ( float x , float y ) 函数体:
{ int z ;
例 pr函int数st表ar(达); 式
printf(“Hello,World!\n”);
函数参数
例 m=max(a,b)*2; 例 printf(“%d”,max(a,b));
m=max(a,max(b,c));
函数调用的一般形式 例 调用自定义函数求 n!
自定义函数: int jiechen( int n ) int x, y ;
函数调用的一般形式
例:说出下列程序的运行结果
fun2( int a, int b ) { int c ; c=a*b%3 ; return c ; 程序运行结果:
}
4
fun1( int a, int b )
{ int c ; a+=a ; b+=b ;
c = fun2( a, b ) ; return c*c ;
除了用数组名作为函数参数来实现参数的地址传递以外,其 实还有一种应用更广的地址传递方法,那就是用指针变量来 作为函数的形参,
例: 将任意两个字符串连接成一个字符串 (数组名作为函 数参数实现地址传递方式)
#include <stdio.h>
void mergestr (char s1[ ], char s2[ ], char s3[ ]);
{ float z;
/* 函数体 */
z=x+y;
return(z);
}
对被调用函数的说明
例 判定素数。
#include "math.h"
int isprime( int );
/* 函数原型声明
*/
main( )
{ int x=35;
if ( isprime(x)) printf("%d 是素数。\n", x );
实参和形参在数量上,类型上,顺序上应严格一致,否则
会发生类型不匹配”的错误。
int func ( )
若形参与实参{ 类型不一致,自动按形参类型转换———函
数调用转换。float f = 5;
f = f / 2;
函数将返回2,而不是2.5
return ( f );
}
例 编写自定义函数计算:
分析: • 确定形参:求 c 必须知道 f 的大小,设形参为temp 。 • 确定函数:函数的返回值即为 c 的值,设为实型。
else printf("%d 不是素数。\n", x );
}
isprime( int a )
{ int i;
for ( i=2 ; i<=sqrt((double)a); i++ )
if ( a%i == 0) return 0 ;
函数参数的传递方式
根据实参传递给形参值的不同,通常有值传递方式和地 址传递方式两种。
使用函数,不仅可以实现程序的模块化,程序设计得简单和 直观,提高了程序的易读性和可维护性。
一个较大的程序可分为若干个程序模块,每一个模块用来 实现一个特定的功能。在高级语言中用子程序实现模块的 功能。子程序由函数来完成。
函数间的调用关系:由主函数调用其他函数,其他函数也可 以互相调用。同一个函数可以被一个或多个函数调用任意 多次。
for( x=y=1; x<=n; x++) y *= x ;
return y ; }
调用: void main( ) { int n;
int f ; printf(“Please input n:”); scanf(“%d”,&n); f=jiechen (n); printf(“n!=%d”,f); }
从函数间数据传送的关系分为:有参函数、无 参函数、有返回值函数、无返回值函数;
从函数的调用分为:内部函数和外部函数。
函数的定义 一般格式
函数返回值类型 缺省int型
无返回值void
合法标识符
有参函数:
函数类型
函数名(形参类型说明表)
{ 声明部分
函数体
语句部分
}
各参数之间用逗号间隔;在进行函 数调用时,主调函数将赋予这些形 式参数实际的值;形参是变量,必 须在形参表中给出形参的类型说明
void main ( )
{
int x = 7, y = 11;
printf ("before swapped: ");
printf ("x=%d, y=%d\n", x, y);
swap (x, y);
printf ("after swapped: ");
printf ("x=%d, y=%d\n", x, y);
1、值传递方式
➢ 方式: 函数调用时,为形参分配单元,并将实参的值复制到形
参中;调用结束,形参单元被释放,实参单元仍保留 并维持原值。 ➢ 特点:
① 形参与实参占用不同的内存单元 ② 单向传递
例: 交换两个数(值传递方式)
#include <stdio.h>
void swap (int a, int b);