自定义函数(精)

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

【例5.9】用选择法对数组中5个整数按由小到大排序
void sort(int arr[5]) { int i,j,k,t;
for(i=0;i<=3;i++) { for(j=i+1;j<=4;j++)
if(arr[j]<arr[i]) { t=arr[i]; arr[i]=arr[j]; arr[j]=t; }
递归函数:在函数体内调用该函数本身的函数。
例如: int sub(int x)
{ int y,z;
……
if( …… ) z=sub(y);
else { …… } return ; }
直接调用sub 函数本身
【例】函数递归调用的应用
main() { fun(5); getch(); } fun(int k) { if(k>0) fun(k-1);
形式参数(形参)
实际参数(实参)
x=20,y=10 a=10,b=20
5.2 形参与实参
有关形参和实参的说明:
① 当函数被调用时才给形参分配内存单元。调用结束, 所占内存被释放。
② 实参可以是常量、变量或表达式,但要求它们有确定 的值。
③ 实参与形参类型要一致,字符型与整型可以兼容。 ④ 实参与形参的个数必须相等。在函数调用时,实参的
printf("%d",k); }
012345
5.4 局部变量和全局变量
一个变量在程序的哪个函数中都能使用吗?
变量的作用域:变量在程序中可以被使用的范围。 根据变量的作用域可以将变量分为:局部变量 全局变量
5.4.1 局部变量
局部变量(内部变量):在函数内或复合语句内定义的 变量以及形参。 作用域:函数内或复合语句内。
a=9,b=5
【例5.8】输出给定的成绩数组中不及格(成 绩低于60)的人数
#include <stdio.h> #define N 10 int fun(int x); main() { int a[N],i,num=0;
printf(“Please input %d numbers:”,N); for(i=0;i<N;i++)
{ int i,a=0;
for (i=n; i>0; i--)
9
a+=sub2(i);
return a ;
}
sub2(int n) { return n+1; }
5.3 函数的嵌套调用和递归调用
5.3.2 函数的递归调用
1.递归的基本概念
递归调用:一个函数直接或间接地调用了它本身,就称为 函数的递归调用。
5.3 函数的嵌套调用和递归调用
5.3.1 函数的嵌套调用
main函数 { ……
函数 A { ……
函数 B { ……
调用函数 A; ……
}
调用函数 B; ……
……
……
}
}
【例】函数嵌套调用的应用
main( )
{ int n=3;
printf ("%d\n",sub1(n));
}
sub1(int n)
main() { printStar( );
printMessage( ); printStar( ); }
********* This is a C program! *********
printStar( ) { printf(“*********\n”); }
printMessage( ) { printf(“This is a C program!\n”); }
} }
main() { int a[5],i;
printf("input array:\n"); for(i=0;i<5;i++) scanf("%d",&a[i]); sort(a); printf(“new array:\n"); for(i=0;i<5;i++) printf("%d\t",a[i]); }
5.1.4 函数的声明(函数原型) 2.如果被调用函数在主函数之后,则应 在主调函数中对被调函数进行声明。
main( ) {void swap(int x, int y) { … swap(a,b); } } void swap(int x, int y) { …}
5.1 函数的定义和调用
5.1.4 函数的声明(函数原型) 3.允许整型函数(且参数也是整型) 的定义出现在主调函数之后。
C 语言程序设计
复习
引言
C语言程序通常由一个或多个函数 组成,函数是C程序的基本模块。每个函 数完成一定的功能。
标准函数 (库函数)
用户自定义 函数
项目十 自定义函数
任务:
自定义一个函数,用于判定一个数是否 是质数。如果是,则返回“1”,否则返回“0”。
5.1 函数的定义和调用
5.1.1 函数的定义
[例5.13]局部变量的应用实例。
main() { int i=2,j=3,k;
k=i+j; if(k!=5) printf("i=%d\tj=%d\tk=%d\n",i,j,k); else{
int i =-1,j= -4,k; /*在复合语句中定义局部变量*/ k=i-j; printf("i=%d\tj=%d\tk=i-j=%d\n", i , j , k); } printf("i=%d\tj=%d\tk=%d\n", i , j, k); }
3
说明: ①函数的类型决定 了函数返回值的类 型。若省略函数的 类型,系统默认其 为int型。 ②无返回值的函数 应将其类型定义为 void(空)类型。
【例】计算并输出圆的面积。
s(int r) { return 3.14*r*r;}
main( ) { int r;
scanf("%d",&r); printf("%d\n",s(r)); }
5.2 形参与实参
5.2.1 函数的形式参数与实际参数
【例】编一程序,将主函数中的两个变量的值传递给swap 函数中的两个形参,交换两个形参的值。
void swap(int x, int y) { int z; z=x; x=y; y=z; printf("\nx=%d,y=%d",x ,y); } main( ) { int a= 10,b=20; 单向值传递 swap(a,b); printf("\na=%d,b=%d\n",a,b); }
5.2 形参与实参
1.实参数组a的起始地 址传给形参数组,这 样a和arr两个数组就 共占同一段内存单元
实参数组
形参数组
a[0]
3
arr[0]
a[1]
6
arr[1]
a[2]
1
arr[2]
a[3]
9
arr[3]
a[4]
4
arr[4]
2.由于形参和实参数组共占同一段内存单元,因此形参 数组各元素的值如发生变化,就会使实参数组元素的值 同时发生变化,相当于“双向传送”。
{ [函数体;]}
{ …… }
5.1 函数的定义和调用
形参也可以这样定义
如下定义都是错误的
int max(x,y) int x,y; { int z;
z = x > y ? x : y; return( z ); }
int max(x,y) 或
{ int x,y;
int max(x,y)
……
int x,y,z;
main( ) { … c=max(a,b); } max(int x,int y) { …}
【例5.6】对被调函数作声明
main() { float add(float x, float y); /*对被调函数的声明*/
float a,b,result; scanf(“%f%f”,&a,&b); result=add(a,b); prinrf(“%f\n”,result); } float add(float x,float y) /*函数定义*/ { float z; z=x+y; return z; }
自动转换 为int型
2 12
思考: 若要得到单精度实型的圆面积,程序应如何修改?
5.1 函数的定义和调用
5.1.4 函数的声明(函数原型) 1.被调函数的定义要出现在主 调函数的定义之前
void swap(int x, int y) { … } main( ) { … swap(a,b); }
5.1 函数的定义和调用
}
5.1 函数的定义和调用
C函数定义的一般格式有两种:传统格式和现代格式
(1)传统格式的函数定义形式
数据类型 函数名([形式参数表]) float ff(x,y)
[形式参数类型说明;]
int x,float y ;
{ [ 函数体;] }
{………}
(2)现代格式的函数定义形式
数据类型 函数名([形式参数表])float ff(int x,float y)
5.1 函数的定义和调用
函数定义的一般形式
函数类型 函数名([类型名 形式参数1],… ) { 说明语句
执行语句
}
类型省略时 默认为int
类型
例如:求两个数的最大值
int max(int x,int y)
{ int z; z = x > y ? x : y; return( z );
没有形式参数为 无参函数
其中,实际参数(简称实参)是有确定值的变量或 表达式,若有多个参数,各参数间需要用逗号分开。
说明: (1)在实参表中,实参的个数与顺序必须和形参的个数与顺序相同,
实参的数据类型必须和对应的形参数据类型相同。 (2)若为无参数调用,调用时函数名后的括号不能省略。 (3)函数间可以互相调用,但不能调用main( )函数。
5050
int sum ( int x ) { int i,t=0;
for (i=1; i<=x; i++) t+=i; return (t);} main( ) { int s; s=sum (100); printf("%d\n", s); }
5050
5.1 函数的定义和调用
5.1.3 函数的返回值与函数的类型
果不一致,系统自动将表达式类型转换为函数类型。
5.1 函数的定义和调用
5.1.3 函数的返回值与函数的类型
(2)函数的类型:
【例5.5】输出两个数中的大数。
#include <stdio.h> max(float x,float y) { return x>y?x:y; /* 返回 */ } main( ) { printf("%d\n", max ( 2, 3.5 ) ); }
函数的调用
函数名(实参表列)
主函数中如何调用自定义函数?
【例】求1~100的累加和。
int sum( ) { int i,t=0;
for (i=1; i<=100; i++) t+=i; return (t);} main( ) { int s; s=sum( ); printf("%d\n", s); }
(1)函数的返回值: 函数的返回值是通过return语句带回到主调函数的。 return 语句格式: return (表达式); 或 return 表达式 ;或 return;
功能:终止函数的运行,返回主调函数,若有返回值,不可省略。 说明:
① 若函数没有返回值,return语句可以省略。 ② return语句中的表达式类型一般应和函数的类型一致,如
}
{ z = x > y ? x : y;

return( z );
int max(int x,y) }
{ …… }
函数的定义
数据类型 函数名([形式参数表]) { [函数体;]}
自定义一个判断是否为质数的函数
5.1 函数的定义和调用
5.1.2 函数的调用
函数调用的一般形式: 函数名(实参表列)
{ scanf(“%d”,&a[i]); num+=fun(a[i]); }
printf(“The number of no pass is:%d\n”,num); } int fun(int x) {
return(x<60?1:0); }
5.2 形参与实参
5.2.2 函数的参数
1. 简单变量作函数参数
值赋给与之相对应的形参,wenku.baidu.com不能由形参传给实参 。 “单向值传递”。
注意:在TC中,实参的求值顺序是从右到左。
【例】函数调用中实参的求值顺序。
void fun(int a,int b) { printf("a=%d,b=%d\n",a,b); }
main( ) { int m=5; fun(3+m, m++); }
2. 数组元素作函数参数
由于实参可以是表达式形式,表达式中可 以包含数组元素,因此数组元素当然可以作为 函数的实际参数,与用简单变量作实参一样, 是单向传递,即“传值”方式。
5.2 形参与实参
5.2.2 函数的参数
3.数组名作函数参数 当数组名作为形参时,其实参也应用数组名,且 实参数组必须与形参数组类型一致。 当函数参数是数组时,此时传递的是数组的地址 (首地址),而不是将整个数组元素都传递到函数 中去,使得形参数组与实参数组共占同一段内存单 元,这就是“传址”方式。
相关文档
最新文档