10.27 c语言复习之函数

c语言中的函数相当于其他高级语言的子程序。c语言不仅提供了极为丰富的库函数(如TurboC,MSC都提供了三百多个库函数),还允许用户建立自己定义的函数。

      函数相关:

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.继续完成几道趣味题。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值