黑马程序员-----C语言学习之函数

函数的概念    :

            它是完成特定功能的代码段,也是构成我们c语言源程序的基本单位;

优点:1>提高程序的可读性;
            2>提高开发的效率;
            3>提高代码的重用性;

函数使用的流程:都是  先声明--》定义--》调用;

如果函数类型是整形的话int可以省略 例如 max(){}它表示默认是一个整型的函数 只是省略了max前面的int;一般不建议省略;

函数的分类及实例介绍:

无参无返回值函数:void 函数名(参数){函数体} 因为是无参无返回值函数所以括号内没有参数 void就表示无返回值的意思因为它是空类型;
#include 
   
   
    
    
int main()
{ void print_line();
  print_line();
  return 0;
}
void print_line(){
  printf("--------------\n");
}

   
   
无参有返回值函数:我们平时写main函数时就是没写参数的 下面再来一个例子;            
  #include
   
   
    
    
                     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
   
   
    
    
                   void print_line_n(int n){          //(这里面的int n是形参)
                   for (i=0;i
    
    
   
   
有参有返回值:表示既有返回值 括号内又有参数;        
   //求两个数的最大值:
              #include
    
    
     
     
              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 
    
    
     
     

int main(int argc, const char * argv[]) {
    
    //定义变量
    char direction;
    printf("请控制小人移动: w.上  s.下  a.左  d.右  q.退出\n");
    //写一个死循环
    int flag = 1;
    while (flag) {
    
    
    //     让玩家输入方法,如果玩家不输入方向系统会一直等待
        scanf("%c",&direction);
    
    //     w 上    s 下   a 左   d 右  q退出
        // W       S     A      D
        switch (direction) {
            case 'w':
            case 'W':
                printf("上\n");
                break;
            case 's':
            case 'S':
                printf("下\n");
                break;
            case 'a':
            case 'A':
                printf("左\n");
                break;
            case 'd':
            case 'D':
                printf("右\n");
                break;
            case 'q':
            case 'Q':
                printf("程序正在退出...\n");
                printf("程序已经退出.\n");
                flag = 0;
                break;
            default:
                break;
        }
        
        
    }
    
    
    
    return 0;
}

    
    
2.利用函数求三个数的平均值;
#include
    
    
     
     
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
    
    
     
     
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
    
    
     
     
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
    
    
     
     
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值