函数.docx
- 文档编号:13812656
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:7
- 大小:16.80KB
函数.docx
《函数.docx》由会员分享,可在线阅读,更多相关《函数.docx(7页珍藏版)》请在冰点文库上搜索。
函数
函数
1个C源程序=1个主函数+若干子函数
【引例】
任意读入2个数,输出较大数。
intmax(a,b)/*子函数-被调函数*/
inta,b;/*形式参数、形参*/
{intc;
if(a>b)c=a;
elsec=b;
return(c);
}
main()/*主调函数*/
{intx,y,z;
scanf("%d%d",&x,&y);
z=max(x,y);/*实际参数、实参*/
printf("MAX=%d\n",z);
}
一、程序设计的总体思想
“自上而下、逐步细化”的模块化
函数就是一个个功能相对独立的模块。
二、函数的定义
1、C中函数的定义是独立且平等的,即:
“主、子函数的定义不分前后,且不可以嵌套定义。
”
2、使用函数,是因为任务的功能比较复杂。
3、函数的分类:
(1)有参函数
【书写格式】
格式一:
函数返回类型函数名(形参1,形参2)
对形参进行说明;
{函数体
return语句;
}
格式二:
函数返回类型函数名(类型名形参1,类型名形参2)
{函数体
return语句;
}
(2)无参函数
函数返回类型函数名()
{函数体
return语句;
}
另外的划分:
系统函数(库函数)和自定义函数;有返回值的函数和无返回值的函数。
4、例题:
哥德巴赫猜想
任意一个大偶数(>=4)都可以拆成两个素数之和。
【题目:
任意读入一个大偶数>=6,然后输出被拆成的两个素数。
】
/*主函数拆分,子函数判断素数*/
intPDSS(x)
longx;/*与主函数的同名*/
{intflag=1;
longk;
for(k=3;k<=x-1;k=k+2)if(x%k==0){flag=0;break;}
return(flag);
}
main()
{longx;
longs1,s2;
do
scanf("%ld",&x);
while(x<6||x%2!
=0);
s1=3;s2=x-s1;
while(!
PDSS(s1)||!
PDSS(s2))
{s1=s1+2;s2=s2-2;}
printf("%ld=%ld+%ld\n",x,s1,s2);
}
三、自定义子函数的使用说明
1、主、子函数的书写不分前后,但是当被调函数书写在主调函数的后面且返回值不为整型int时,必须在主调函数的说明部分(或在函数体外加以说明)对被调函数加以说明:
【格式】
返回类型名函数名();
2、主函数一般做主调函数(即使带参数,也只能自己调用自己),子函数通常做被调函数,但也可以做主调函数,调用别的子函数或自己。
3、程序的执行总是从主函数到主函数结束,除非遇到exit函数语句。
4、return语句的格式:
格式一:
return(表达式);
格式二:
return表达式;
格式三:
return;
【功能】格式一与格式二的功能完全相同:
将表达式的值(一个值)带回到主调函数的调用点,且立即终止所在函数的执行。
格式三只能终止所在函数的执行并返回主调函数的调用点,但不带回值(因此很少用,通常可以省略)。
四、实参与形参之间的关系
1、实参和形参在个数、类型、顺序上一一对应一致。
2、实参总是单向地传值给形参:
传的值有两种(内容或地址),一般,传内容时常常简称“值传递”,传地址时简称“地址传递”。
3、实参可以是常量、变量(通常有值)、表达式;形参通常是变量。
五、参数的地址传递
例1:
任意读入两个数,调用函数求得二者的和与积。
main()
{floatx,y,h,j;
voidHJ();
scanf("%f%f",&x,&y);
HJ(x,y,&h,&j);
printf("%f,%f\n",h,j);
}
voidHJ(a,b,p,q)
floata,b,*p,*q;
{*p=a+b;
*q=a*b;
}
1、当被调函数没有返回值时,定义时函数名前加void,在主调函数中调用语句的格式:
被调函数名(参数系列);省略类型名时,默认int型。
2、当需要从被调方获得一个以上的值时,通常使用地址传递。
例2:
任意读入10个数,然后进行升序排列。
【分工:
】
main()
{inta[10],i;
voidPX();
for(i=0;i<10;i++)
scanf("%d",&a[i]);
PX(a,10);
for(i=0;i<10;i++)
printf("%d\n",a[i]);
}
voidPX(p,n)
int*p,n;
{inti,j;intt;
for(j=1;j<=n-1;j++)
for(i=0;i<=n-1-j;i++)
if(*(p+i)>*(p+i+1))
{t=*(p+i);*(p+i)=*(p+i+1);
*(p+i+1)=t;}
}
【说明】
(1)当需要将多个值传给被调函数时,通常使用数组名作为实参,同时为了增大被调函数的灵活性,将数组元素的个数也作为实参。
(2)与数组名这个实参对应的形参的格式有两种:
①指针变量;②通常省略了元素个数的数组。
系统会主动将第二种格式转换成相应的指针。
voidPX(intp[],intn)
(3)在形参中出现的一维数组,通常省略元素的个数,系统立刻将之转化成相应的指针变量,本例中即为:
int*p
(4)实参还可以是二维数组的名字,对应形参可以有两种格式:
①行指针变量;②通常省略了第一维的行数的二维数组。
系统会主动将第二种格式转换成相应的指针。
例3:
主函数生成如下5阶方阵,然后调用子函数求得副对角线上所有元素之积,以及方阵所有元素之和,再由主函数输出。
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
intfun(p,he)
int(*p)[5],*he;
{intji=1;
inti,j;
for(i=0;i<5;i++)
ji=ji*p[i][4-i];
*he=0;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
*he=*he+p[i][j];
returnji;
}
main()
{inta[5][5],i,j;
intji,he;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
a[i][j]=j+1;
ji=fun(a,&he);
printf("JI=%d,HE=%d\n",ji,he);
}
intfun(p,he)
intp[][5],*he;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数