c语言之函数

函数
1、函数的原型和调用(函数在使用前必须定义或者声明)
  #include<stdio.h>
  int max(int a,int b); //函数声明

  int main(void)
  {
    int a = 3;
    int b = 21;
    max_one = max(a,b);
    printf("%d\n",max_one);
    return 0;
  }

  int max(int a,int b)
  {
    int max;
    if (a>b)
  {
    max = a;
  }
  else{
    max = b;
    }
  return max;
  }  

2、函数的形参与实参
  形参:定义函数时,函数名后的括号内就是“形式参数”,简称形参。
  实参:在调用函数时,函数名后的括号中的变量或表达式称为“实际参数”,简称实参。
  1、实参可以是变量、常量,也可以是表达式。
  2、形参必须指定数据类型,实参和形参必须一一对应。
  3、如果一个函数没有明确地标明函数的返回类型,那么函数的返回类型就是int。
  4、如果一个函数没有返回值,那么函数的返回类型为void.
  5、c语言中,实参形参的数据传递是‘值传递’,即单向传递,只能由实参传给形参,
  而不能由形参传递给实参。
  如果函数的形参是一个数组,那么可以通过形参修改实参的值。
  如:void str(char s[])
  {  
    s[0] = 'a';
    s[1] = 'b';
  }
   int main(void)
   {
    char str1[100] = "hello world";
    str(str1);
    printf("%s\n",str1); //输出: abllo world
    return 0;
   }

3、函数的返回类型与返回值
  1、返回值通过return获得,返回值为void时可不需要return语句。
  如:void max(){
  语句;
  }
  2、return 语句中的返回值数据类型应与函数定义时相同。
  3、如果函数没有return语句,那么函数将返回一个不确定的值。

4、多个源代码文件程序的编译
  1、头文件的使用
    如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,
    那么就需要在第一文件中声明函数原型。
    如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了,把函数声明放入头文件是好习惯。
  2、#include与#define的意义
    #include 就是简单的文件内容替换
    #denfine就是简单的文本替换
  3、#ifndef 和 endif
    #ifndef __AH__//如果没有__AH__这个宏,那就编译#endif之间的代码,如果有的话,不再预编译
    #define __A__H__//具体宏的名字是自定义的
    在#ifndef中的宏,一定要大写和下划线,必要时加数字,避免和其他头文件中名字冲突。
    #endif //防止多次include的同一个文件的时候,重复预编译头文件内容。

5、函数递归
  递归给某些编程问题提供了最简单的方法。
  缺点:有缺陷的递归会耗尽计算机资源,递归程序难以理解和维护。  

    #include<stdio.h> 

    void test(int j)
    {
        while(j>0)
        {
            j--;
            printf("先序递归:%d\n",j);//先序递归,代码顺序执行 
            test(j); //自身调用自身
            printf("后序递归:%d\n",j);//后序递归,代码逆序执行 
        }
    }

  实例1:一个队列,前一个人 总是比后一个人大2岁 ,求第n个人的年龄

  实例1:求第n个人的年龄,前一个人 总是比后一个人大2岁 
    #include<stdio.h> 
    int age(int n);//函数声明
    int main(void)
    {
        int n=5;
        printf("age=%d\n",age(n));
        return 0;
    }

    int age(int n) 
    {
        if(n==1)
        {
            return 10;
        }
        else{
            return age(n-1)+2; //前一个人 总是比后一个人大2岁 
        }
        
    }
View Code

  实例2:10进制转2进制

    #include<stdio.h>

    void bin(int j)  //10进制转2进制 ,除2求余,倒序排列 
    {
        int n = j%2;
        if(j>0)
        {
            //printf("%d",n);//先序递归,顺序输出 
            bin(j/2);
            printf("2进制:%d",n); //后序递归,逆序输出 1101 

        }
    }

    int main(void)
    {
        int i = 13;
        bin(i);
        return 0;
    }
View Code

  实例3:求fib数列和自然数的和

    #include<stdio.h> 
    int fib(int n) //fib数列,1,1,2,3,5,8... 
    {
        if(n==1||n==2){
            return 1;
        }
        if(n>2)
        {
            return fib(n-2)+fib(n-1); //从第三个位置开始,等于前两个位置的数值和 
        }
    }
    
    int sum(int m) // 求自然数的和
    {
        if(m==1)
        {
            return 1;
        }
        else{
            return sum(m-1)+m;
        }
    }
    int main(void)
    {
        int i,res1,res2; //输入要求的第i个位置的数,res1和res2分别为fib函数和sum函数的返回值  
        scanf("%d",&i);
        res1=fib(i) ;
        res2=sum(i);
        printf("你要求的位置的数是:%d\t%d",res1,res2);
        return 0;
    }
View Code

  实例4:递归求字符串长度

    #include<stdio.h> 

    int sum_str(char s[],int i)
    {
        if(s[i])
        {
            return sum_str(s,i+1);
        }
        else{
            return i;
        }

    }
    int main(void)
    {
        char a[100];
        scanf("%s",a); 
        printf("%d\n",sum_str(a,0));
        return 0;
    }
View Code

 

转载于:https://www.cnblogs.com/schut/p/8570145.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值