函数的初步

1,函数的基础

函数的别称:方法,接口,子例程,程序

函数的分类:有参函数。无参函数,库函数,自定义函数

1.1创建函数

//创建函数的语法
/*函数返回值类型 函数名(参数列表)
{
    函数体;
} */
int main()//无参函数
{
    return 0;
}

1.2函数的调用

void printf()//void 无返回值函数
{
    printf("yo~bro\n");
    printf("yo~bro\n");
    printf("yo~bro\n");
}
int main()
{
    printf();//调用函数:函数名(函数参数);
    return 0;
}

1.3设计函数的基本思想

一个函数一个功能,尽量别把多种内容糅合到一起

1.4函数的返回值

  • 函数返回值只要和return 后面表达式类型一致就OK了

int F1()
{
    return 1984;//返回整数类型
}
bool F2())
{
    return true; //返回bool类型
}
  • 函数返回值一般具有特定的含义(返回值代表什么含义由自己决定)

    • 代表操作成功与否

      int main()
      {
          return 0;//0返回值一般默认程序正常执行
      }
      int get_divided()
      {
          int a,b;
          scanf_s("%d%d",&a,&b);
          if(b==0)
          {
              return -1;//当b=0的时候返回的值为-1
          }
          return a/b;//当b不等于0的时候返回a/b的值
      }

    • 做加工数据的处理→函数调用的表达式就代表了函数返回值

      int sum()
      {
          return 1+2;//返回值给sum,sum的值就是3
      }
      int main()
      {
          sun();//调用表达式
          int a = sum();
          sum()=123;//这样的代码是错误的
          printf("%d",a);//打印的值就是3
          return 0;//函数遇到return就结束了
      }

    • return 可以结束函数

      void printf()
      {
          puts("A");
          puts("B");
          return;//void类型返回函数值 也存在return
          puts("c");//这行代码永远都不会实现
      }
      //应用过程中想要提早结束函数,通常结合if语句使用
      int main()
      {
          printf();
          return;
      }
    • scanf 和printf 函数的返回值

      int a,b,c;
      int result=scanf_s("%d%d%d",&a,&b,&c);
      printf("scanf_s的返回值:%d\n",result);//返回值是scanf函数输入数据的个数
      //scansf函数的一种特殊写法
      int num = 0 ;
      while(!scanf_s("%d",&num))//数据输入失败,scanf返回0(失败),!0 变成 1 
      {
           while(getchar()!='\n')//清空缓冲区
      }
      printf("%d\n",num);
      //printf返回值是打印字符的个数
      result = printf("%d\n",num);
      printf("%d\n",result);//打印的字符的个数
      return 0;

2, 函数的参数

2.1无参,无返回值→无返回值,一般做效果类的函数

//封装函数
//一个函数一个功能
//函数的模块化
void UI(void)//与void printf()功能相同
{
    puts("------------------------");//菜单功能
    puts("\t0.退出");
    puts("\t1.立刻关机");
    puts("\t2.定时关机");
    puts("------------------------");
}
void keydown()//按键交互
{
    int key = 0;
    scanf_s("%d",&key);
    switch(key)
    {
        case 1 :
            break;
        case 2:
            break;
        case 3
            break;
        case 4:
            break;
        case 5:
            break;
    }
}
int main()
{
    while(true)
    {
        UI(void);
        keydown();
        system("pause");
        system("cls");
    }
    return 0;
}

2.2加工数据→传参

(自己在设计函数的时候,解释不了参数的意思,就不要写参数)

double sum (double a , double b )
{
    return a + b ;
}
//实现函数的时候参数叫做形参(形式参数)
int main()
{
    sum(1,2);//调用的时候参数叫做实参
    return 0; 
}

传参规则

  • 形参实参类型必须一致

  • 允许转换的情况下,会强制转换

  • 传参本质就是赋值的操作

  • 传参的时候要注意作用域

  • 拷贝本

    #include<stdio.h>
    void modify()
    {
        int num = 999 ;
    }
    int main()
    {
        int number = 0;
        modify(number);//number把自己的值拷贝到modify函数中,使得函数中num的值由999变成了0
        printf("number=%d",number);//打印结果仍是0;
        return 0;
    }

2.3数组传参

数字类的必须传入数组长度

#include<stdio.h>
void print_array(int array[] ,int arraynum)//int arraynum是数组长度
{
     for(int i = 0; i<arraynum ; i++)
     {
         printf("%d\t",array[i]);//这个函数的功能是打印数组
     }
    printf("\n");
}
int main()
{
    int array[] = {1,2,3,4,5};
    int len = sizeof(array)/sizeof(int);
    print_array(array,len);
    return 0;
}

字符串不需要传入数组长度-->因为字符串有一个字符串结束标记

#include<stdio.h>
int str_len(char array[])
{
    int count = 0;
    while (array[count] != '\0')
    {
        count++;
    }
    return count;
}
int main()
{
    char arr[] = "I love you";
    printf("arr's len:%d\n", str_len(arr));
    return 0;
}

3,函数调用

程序是从上往下编译,函数在主函数下面的时候,调用函数可能会出现错误,可以用声明语法来避免

3.1函数调用的嵌套

#include <stdio.h>
//声明语法--->有作用域
//声明语法写在一起
int max(int a, int b);
//声明的时候形参的可以不写
int sum(int, int)
int main() 
{   
    //调用函数也可以进行嵌套操作
    //以自身的调用当作函数参数
    max(1,2);
    max(max(1,2),3);
    max(max(max(1,2),3);,4);
    //建议用中间变量解析
    return 0;
}
int max(int a, int b) 
{
    return a > b ? a : b;
}
​
int sum(int a, int b) 
{
    return a + b;
}

3.2递归

  • 以斐波那契数列为例,前6项是 1 1 2 3 5 8

  • 退出性条件:f1=1 f2=1

  • 推导公式:f(n)=f(n-1)+f(n-2)

    int F(int n)
    {
        if(n==1||n==2)
            return 1;
        //通常写递归,参数都会往结束条件靠拢
        return F(n-1)+F(n-2);
    }

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值