函数:它是完成特定功能的代码段,也是构成我们c语言源程序的基本单位;
如果函数类型是整形的话int可以省略 例如 max(){}它表示默认是一个整型的函数 只是省略了max前面的int;一般不建议省略;
优点:1>提高程序的可读性;
2>提高开发的效率;
3>提高代码的重用性;
函数使用的流程:都是 先声明--》定义--》调用;
无参无返回值函数:void 函数名(参数){函数体} 因为是无参无返回值函数所以括号内没有参数 void就表示无返回值的意思因为它是空类型;
#include <stdio.h>
int main()
{ void print_line();
print_line();
return 0;
}
void print_line(){
printf("--------------\n");
}
无参有返回值函数:我们平时写main函数时就是没写参数的 下面再来一个例子;
#include<stdio.h>
int sum(){
int num1,num2;
int result = 0;
printf("请输入两个数用\",\"分隔\n");(这里要想打出双引号必须用转义字符的输入方法就是写成\"。)
scanf("%d%d",&num1,&num2);
result = num1 +num2;
return result;(这里返回值就是num1和num2的和 而不是以前的0)
}
int main(){
int s = sum();
printf("%d\n",s);
return 0 ;
}
(这里如果想调用sum()这个自定义函数 我们必须在main函数下面在重新定义一个 int s = sum()然后再打印出来 而不能想空函数一样直接写上sum();)
有参无返回值:因为无返回值 所以是void空类型 然后括号类必须有参数 ;那么参数的定义方法是void(数据类型1 变量1,数据类型2,变量2)
下面这个函数的实现功能是打印n条线
#include<stdio.h>
void print_line_n(int n){ (这里面的int n是形参)
for (i=0;i<n;i++){
printf("-------------")
}
}
int main(){
print_line_n(5) (这里数字为5表示打印五条线)
return 0 ;
}
有参有返回值:表示既有返回值 括号内又有参数;
求两个数的最大值:
#include<stdio.h>
int max(int x,int y){
if (x>y){
return x;
}else{
return y;
}
}
int main(){
int max(int x,int y); (这一部分是对被调用函数的声明,因为是int类型的函数,可以不声明;)
int m =max(345,344); ( 在这里的两个数字 是实际参数;在max函数里面的括号内 是形式参数 )
printf("%d",m)
return 0;
}
形式参数:表示在函数的定义中,函数名后面的小括号中的参数就叫形参;
1.形参在定义以后,并不会立即分配存储空间;只有在函数调用的时候才会正真的分配存储空间;
2.如果有多个形参,可以用逗号分隔;
3.形参的数据类型,可以不相同;
4.在函数中不可以定义和形参同名的变量;例如上个例子中 如果我在int max(int x,int y){int x}这样就会报错;
实际参数:表示在调用函数时传递的参数;
实参可以是变量如max(34,45),可以是常量如在主调函数内先int a=34,b=45 然后max(a,b)也可以是表达式max(a+3,b+5) ;
还可以是函数;例如计算三个数的最大值 在main函数内 m=max(max(34,45),120);前面这个m不能和max这个函数名一样;就是说不能让max作为变量名;
主调函数和被调函数:用例子来说明
void test1(){
}
void test2(){
test1()
}
这两个函数中 test2调用了函数test1 所以我们称test1是被调函数 而test2是主调函数 因为是test1被test2调用;
实参和形参之间的值的传递过程:
1.调用函数的时候,实参的值是一个已经确定的值;
2.把实参的值,赋值给形参;
3.实参和形参的个数、类型要一致,如果类型不一致,会造成精度的缺失;
函数的返回值:是指被调函数返回给主调函数的值;也可以理解为这个函数的值;
1>函数返回值,用到一个关键之 return;
2>return 常量 ;return 0
return 表达式;return a=5; return a>5;return a+b;return a;
return(常量/变量/表达式)这里可以加上括号也可以省略;
如果return 的值和函数定义的返回值类型不一致,以函数逇返回值类型为准 例如下面例子中 return返回值是实数型 而函数定义的是整型
就会以整型来返回;
int max(){
float b = 3.4f;
return b;
}
函数的声明:告诉编译器这个函数已经存在了,告诉编译器被调函数的返回值类型,以便在主调函数中处理被调函数返回的数据;
函数声明的格式:将被调函数的头部拷贝一份加上一个分号;头部指的是函数的大括号以前的部分例如 int max(int x,int y)这一部分;
函数声明的注意事项:1.如果被调函数写在主调函数之前 这是在主调函数里面就可以不用声明;
2.我们可以将函数的声明放到main函数之前,这就是一个全局声明,这样就不用每次调用函数的时候都声明一次;
函数应用:1.利用函数求三个数的和 ;
#include<stdio.h>
int sum(int x,int y,int z){
return x+y+z;
}
int main(){
int sum(int x,int y,int z);(这部分是声明)
int s = sum(12,234,45);
printf("%d",s)
return 0;
}
2.利用函数求三个数的平均值;
#include<stdio.h>
float avg(int x,int y, int z){
return (x+y+z)/3.0f;(写成3.0f的目的是因为平均数有小数这里一个整型的数除以一个实数就会有小数)
}
int main(){
float avg(int x,int y, int z);(声明部分)
float a =avg(12,234,45)
printf("%.2f",a);
return 0;
}
(这里可以优化一下 因为在上一个例子中已经计算了x+y+z的值 所以这里可以用嵌套函数的方式
这里可以将 return (x+y+z)/3.0f;改为return sum(x,y,z)/3.0f
递归函数:一个函数在它的函数体内调用它自身称为递归调用;这种函数就叫递归函数;
它既是主调函数又是被调函数;
在递归函数中应该存在能够让递归结束的条件;
构成递归的条件:
1.存在自己调用自己;
2.存在一个条件,能够让递归结束;
3.问题的规模能够缩小;
例子如下 实现五个人猜年龄得出第五个人的年龄
#include<stdio.h>
int getAge(int n){
int age;
if(n==1){
age = 10;
}else{
age = getAge(n-1)+2;
}
return age;
}
int main(){
int getAge(int n);
int age=getAge(5);
printf("%d",m);
return 0;
}
用递归法求n的阶乘:
分析 n!=(n-1)!*n 1!=1作为结束这个递归的条件;
#include<stdio.h>
int jiecheng(int n){
int ji;
if(n==1){
ji = 1;
}else{
ji = jiecheng(n-1)*n;
}
return ji;
}
int main(){
int jie=jiecheng(5);
printf("%d",jie);
return 0;
}
用递归法实现x的y次方,比如2的3次方=8 3的4次方=81;
分析:x^y=x*x^(y-1)
#include<stdio.h>
int xy(int x,int y){
int ji;
if(y==1){
ji = x;
}else{
ji = xy(x,y-1)*x;
}
return ji;
}
int main(){
int ji=xy(5,6);
printf("%d",ji);
return 0;
}
手动编译的步骤,第一步先打开你写的源文件里面是你的源代码 直接在xcode里面将它拖进终端;
第二步使用命令cc -c 你的文件名;生成一个.o的文件
第三步使用命令cc test.o 这个文件名test是你自己写的
第四步 ./a.out |
|