当前位置:文档之家› C语言函数知识详解

C语言函数知识详解

函数<一>第一节函数的定义和返回值一、库函数1、一个C语言源程序无论包含了多少函数,C程序总是从main开始执行。

2、调用C语言标准库函数时要求的include命令。

1)用户在源程序include命令中应该包含头文件:#include<stdio.h>include命令必须用#开头,系统提供的头文件以.h作为文件的后缀,文件名用””或<>括起来,2)include命令不是C语句,因此不能在最后加分号。

3、标准库函数的调用:1)一般调用形式为:函数名(参数表)scanf(“%d”,&a);printf(“%d”,a);putchar(ch);ch=getchar();2)库函数的调用可以两种形式出现:1出现在表达式中:例:y=pow(x,2,5)+1.32作为独立语句完成某程操作:例:printf(“********\n”);常用函数:数学函数:调用数学函数时,要求在源文件中包含以下命令行:#include“math.h”例:int abs(int x)double cos(double x)字符函数和字符串函数调用字符函数时,要求在源文件中包含头文件”ctype.h”;调用字符串函数时,要求在源文件中包含头文件”string.h”如调用:int isalpha(int ch)检查ch是否为字母。

输入输出函数:调用输入输出函数时,要求在源文件中包含头文件”stdio.h”例:调用:putchar getchar gets puts二、函数的定义和返回值1、函数定义的语法函数首部(main())函数1C语定义说明部分言程函数体序执行语句部分函数22、C语言函数定义的一般形式如下1)函数返回值的类型名函数名(类型名形式参数1,类型名形式参数2………..)/*函数首部*/{说明部分/*函数体*/语句部分}例:int abs(int x)2)在老的C语言版本中,函数的首部用以下的形式:函数返回值的类型名函数名(形式参数1,形式参数2………..)形式参数类型说明;例:int abs(x)int;3)函数名和形式参数都是由用户命名的标识符。

在同一程序中,函数名必须唯一;形式参数名只要同一函数中唯一即可,可以与其它函数中的变量同名。

4)C语言规定,不能在同一个函数的内部再定义函数。

5)若在函数的首部省略了函数返回值的类型名,函数首部写成:函数名(类型名形式参数1,类型名形式参数2……..) C语言默认返回值类型为int型。

例:编写求两个双精度之和的函数。

double add(double a,double b){double s;s=a+b;return s;}6)函数体中,除形参外,用到的其它变量必须在说明部分进行定义,这些变量(包括形参),只在函数被调用时才临时开辟存储单元,当退出函数时,这些临时开辟的存储单元全被释放掉,因此,这种变量只在函数体内部起作用,与其它函数中的变量互不相关,它们可以和其它函数中的变量同名。

3、函数的返回值1)函数的值通过return语句返回,return语句的形式如下:return表达式;或return(表达式);或return2)说明①return语句中的表达式的值就是所求的函数值。

此表达式值的类型必须与函数首部所说明的类型一致。

若类型不一致,则以函数值的类型为准,由系统自动进行转换。

②当程序执行到return语句时,程序的流程式就返回到调用该函数的地方,并带回函数值。

在同一函数内,可以根据需要在多处出现return语句。

③return语句也可以不含表达式,这时它的作用只是使流程返回到调用函数,并没有确定的函数值。

④函数体内可没有return语句,程序的流程就一直执行到函数末尾的”}”,然后返回调用函数,这时也没有确定的函数值带回。

函数的调用和说明一、函数的两种调用方式:1、函数的一般调用形式为:函数名(实在参数表)实在参数(简称实参)的个数多于一个时,各实在参数之间用逗隔开。

若函数无形参,调用形式为:函数名()例:ch=getchar();函数名后的一对括号不可少。

例:fun(int x){int j,sum=0;for(j=1;j<=x;j++)sum+=j;return sum;}main(){int s,n;scanf(“%d”,&n);s=fum(int n);printf(“%d”,s);}可用两种方式调用函数1)作为表达式出现例:y=add(3.0,4.0)2)作为独立语句出现例:printf(“********”);二、函数调用时的语法要求1、调用函数时,函数名必须与所调用的函数名字完全一致。

2、实参的个数必须与形式参数的个数一致。

实参可以是表达式,在类型上应按位置与形参一一对应匹配。

如果类型不匹配,C编译程序按赋值兼容进行转换,若实参和形参的类型不赋值兼容,通常不给出出错信息,且程序仍然执行,只是不会得到正确的结果。

因此,应该特别注意实参和形参的类型匹配。

3、C语言规定:函数必须先定义,后调用(函数的返回值类型为int 或char时除外)。

第三节调用函数和被调用函数之间数据的传递fun(int x)//被调用函数{……….}main(){int s,n;scanf(“%d”,&n);s=fun(n);Printf(“%d”,s);}C语言中,调用函数被调用函数之间数据可以通过三种方式进行传递1.实在参数和形式参数之间进行数据传递2.通过return语句把函数值返回调用函数3.通过全局变量。

二、在C语言中,数据只能从实参单向按值传递。

也就是说,当简单变量作为实参时,用户不可能在函数中改变对应实参值。

三、例题:例1:以下程序例示了函数参数之间的单向传递,请观察程序的执行结果。

main(){int x=2,y=3,z=0;printf(“(1)x=%d y=%d)z=%d\n”,x,y,z);try(x,y,z);printf(“(4)x=%d y=%d z=%d\n”,x,y,z); }try(int x,int y,int z){printf(“(2)x=%d y=%d z=%d\n”,x,y,z); z=x+y;/*5=2+3x=x*x;/*4=2*2y=y*y;/*9=3*3printf(“(3)x=%d y=%d z=%d\n”,x,y,z); }两个数交换int a,b;main(){int a,b,t;scanf(“%d%d”,&a,&b);printf(“a=%d,b=%d”,a,b);t=a;a=b;b=t;printf(“a=%d,b=%d”,a,b);}例2:用函数方法main(){int a,b;scanf(“%d%d”,&a,&b);printf(“a=%d,b=%d”,a,b);twr(a,b);printf(“a=%d,b=%d”,a,b);}twr(int a,int b){int t;printf(“a=%d,b=%d”,a,b);t=a;a=b;b=t;printf(“a=%d,b=%d”,a,b);}函数程序举例例1:编写函数isprime(int a)用来判断自变量a是否为素数,若是素数,函数返回1,否则返回0。

素数:只能被1和本身整除的数。

main(){int x,i;scanf(“%d”,&x);for(i=2;i<x;i++)if(x%i==0)break;//x能被当前的数整除,就跳出循环。

因为它肯定就不是素数,没有必要往要继续判断。

if(i>=x)printf(“YES”);//始终没有跳出循环,说明它是素数。

else printf(“NO”);}函数方法:main(){int a;scanf(“%d”,&a);if(isprme(a))printf(“YES”);else printf(“NO”);}isprime(int a){int i;for(i=2;i<a;i++)if(a%i==0)return0;return1;}例2:编写函数,验证任意偶数为两个素数之和并输出这两个素数。

分析:任意输入一个数:如1212的因子:234567891011 2+10=12(2,10不是素数)3+9=12(3,9不是素数)4+8=12(4,8不是素数)5+7=126+6=12(6不是素数)超过一半就不用判断了,因为重复。

int isprime(int a){int i;for(i=2;i<a;i++)if(a%i==0)retrurn0;return1;}void even(int x){int i;for(i=2;i<=x/2;i++)if(isprime(i))if(isprime(x-i))printf(“%d=%d+%d”,x,i,x-i); }main(){int x;/*当前要判断的偶数*/scanf(“%d”,&x);if(x%2==0)/*如果为偶数*/even(x);/*函数为独立语句调用,没有返回值*/else printf(“NO”);}例3:编写函数myupper(ch),把ch中的小写字母转换成大写字母作为函数值返回,其它字符不变。

用字符@结束输入。

分析;dsdDSFDF@#include“ctype.h”#include“stdio.h”char myupper(char ch){if(islower(ch))ch=ch-32;else;return ch;}main(){char ch;while((ch=getchar())!=’@’){ch=myupper(ch);putchar(ch);}}例4:编写函数统计输入字符的个数分析:如输入dkjfkd5456遇到非法字符结束。

如ctrl+z#include“stdio.h”int fun(){char ch;int x=0;while((ch=getchar())!=EOF)x++;return x;}main(){int n=0;/*n用来统计输入的个数*/n=fun();printf(“%d”,n);}例5:编写函数统计输入文本中单词的个数,单词之间用空格符、换行符、跳格符隔开。

分析:my name is jinwen以name为例:name前一个字符必须是间隔符,当前字符必须为字母,说明n是首字母。

int countword(){int x=0,state=0;/*state为标志位。

char ch;while((ch=getchar())!=EOF){if(isspace(ch))state=0;/*0位于单词的外部,1位于单词的内部else if(state==0){x++;state=1;}}return x;}main(){int n;n=countword();printf(“%d”,n);}例6:编写函数用以求表达式x2-5x+4,x作为参数传递给函数。

相关主题