c语言中的函数相当于其他高级语言的子程序。c语言不仅提供了极为丰富的库函数(如TurboC,MS,C都提供了三百多个库函数),还允许用户建立自己定义的函数。
函数相关:
(1)函数的概念及种类:
从定义的角度来看,函数可分为库函数和用户定义函数两种。
1.库函数(又称系统函数)
由c系统提供,用户无需定义或者类型说明,只需要在程序前包 含有该函数原型的头文件即可在程序中直接调用。
例如:printf,scanf,getchar等等。 在使用这些函数时通常都要嵌套一些头文件。
例:利用库函数rectangle()画一个矩形程序:(在Turbo C 2.0环境下运行)
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int gdriver=DETECT,gmode,errorcode;
int left,top,right,bottom;
initgraph(&gdriver,&gmode,""); //初始化图模式
errorcode=graphresult(); //读取初始化数值
if(errorcode!=gr0k) //错误处理
{
printf("Graphics error:%s\n",grapherrormsg(errorcode));
printf("press any key to halt:");
getch();
exit(1); //返回终端错误代码
left=getmaxx()/2-50;
top=getmaxy()/2-50;
right=getmaxx/2+50;
bottom=getmaxy()/2+50; //矩形大小设置
rectangle(left,top,right,bottom);
getch();
closegraph();
return 0;
}
}
2. 用户定义函数
由用户按需要所写的函数,对于用户自定义函数,不仅要在程序中定义函数自身,而且有时在主调函数模块中还必 须对该被调函数进行类型说明,然后才能使用。
(2)函数的定义和调用:
定义函数格式:1.无参函数的一般形式:
类型说明符 函数名()
{
类型说明
语句
}
2.有参函数的一般形式:
类型说明符 函数名(形式参数表)
{
类型说明
语句
}
注意:在c语言中,所有的函数定义包括主函数main在内,都是平行的。也就是说,在一个函数体内不能再定义另一个函数,即不能嵌套定义。
3.函数的调用:
从主函数main开始执行,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后将返回主函数,然后从原来暂停的位置继续执行。
调用形式:
函数名(【实际参数表】)
例如:编写程序:已知三角形的三边长a,b,c求面积:
#include<stdio.h>
#include<math.h>
float area(float a,float b,float c)
{
float s,l;
if(a+b>c&&a+c>b&&b+c>a) //判断是否能构成三角形
{
l=(a+b+c)/2.0;
s=sqrt(l*(1-a)*(1-b)*(1-c));
return(s);
}
else
{
printf("不能构成三角形\n");
return(0);
}
}
int main()
{
float x,y,z,s;
printf("请输入三角形的边长:\n");
scanf("%f%f%f",&x,&y,&z);
s=area(x,y,z);
if(s)
printf("三角形的面积是:%.2f\n",s);
return(0);
}
4.函数参数之间的关系
函数的参数分为形参和实参两种。上面定义函数area中的a,b,c就是形参,而函数调用中的s=area(x,y,z),中的x,y,z就是实参。实参和形参的功能是数据传送。
(3)函数的形参类型:1.从数据类型角度分有整型,实型,字符型等
2.从形参功能上又可以分为:数值型和地址型参数
例如:数组名作为函数形参:
#include<stdio.h>
void input(int a[],int n) //定义函数输入n个整数
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
void output(int a[],int n) //定义函数输出n个整数
{
int i;
for(i=0;i<n;i++)
printf("%d",&a[i]);
}
void sort(int a[],int n) //选择法排序
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])
k=j;
a[k]=a[i];
a[i]=t;
}
}
int main()
{
int x[5];
printf("请输入5个数:\n");
input(x,5);
printf("5个数排序前:\n");
output(x,5);
sort(x,5);
printf("5个数排序后:\n");
output(x,5);
return(0);
}
(40函数的递归调用;一个函数自己调用自己,此时主调函数就是被调函数。(如果一个函数通过其他函数调用自己则称简介递归函数。
#include<stdio.h>
int f1(int x)
{
int y,z;
z=f2(x);
return(2*z);
}
int f2(int x)
{
int a,c;
c=f1(a);
return(3+c);
}
main()
{
}
编递归程序把一个字符串逆置:
#include<stdio.h>
void converstr(char str[],int start,int end)
{
char ch;
if(end-start<1) //str的串长<=1
return;
else
{
ch=str[start];
str[start]=str[end];
str[end]=ch; //将字符首尾交换
converstr(str,start+1,end-1); //字符串的首尾元素互换后再去掉首尾元素再调换
}
}
int main()
{
char x[]="abcde";
converstr(x,0,4); //0,4为字符数组的开始和结束下标
printf("字符串逆转后为:%s\n",x);
return(0);
}
(5)变量作用域:
1.局部变量(内部变量):在一个函数内部定义,只在本函数范围内有效的变量;
2.全局变量(外部变量):在函数外定义,可为本文件所有函数公用,有效范围:从定义变量的位置开始到本文件结束,以及有extern说明的其他源文件;
若想在定义点之前的函数引用外部变量,则应该在函数中用关键字extern做“外部变量”说明。如:
int max(int x,int y)
{
int z;
z=x>y?x:y;
return(z);
}
int main()
{
extern int a,b;
printf("%d\n",max(a,b));
return(0);
}
int a=13,b=-8;
注意:若在同一源文件种外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用。如:
#include<stdio.h>
int a=3,b=5;
int max(int a,int b)
{
int c;
c=a>b?a:b;
return(c);
}
int main()
{
int a=8;
printf("max=%d",max(a,b));
return(0);
}
输出结果为: max=8;而不是5;
(6)内部函数和外部函数:
内部函数(静态函数):只能被文件中的其他函数调用。定义时加static说明。一般形式为;
static 类型标识符 函数名(形参表)
如:static int fun(a,b)
外部函数:可被其他源文件中的函数引用。定义时加static 说明,省略extern则隐含为外部函数。
2.继续完成几道趣味题。