• C语言的函数


    目录

    函数的定义

    基本语法

    函数-递归调用

     函数的练习

    斐波那契数

     猴子吃桃子问题

    函数注意事项

    编写一个函数 swap(int *n1, int *n2) 可以交换 n1 和 n2的值

    函数参数的传递方式

    函数的定义

    • 为完成某一功能的程序指令(语句)的集合,称为函数
    • 在C语言中,函数分为:自定义函数、系统函数

    基本语法

    返回类型 函数名(形参列表){

                    执行语句……;//函数体

                    return 返回值;//可选

    }

     ①形参列表:表示函数的输入

    ②函数中的语句:表示为了实现某一功能代码块

    ③函数可以有返回值,也可以没有,如果没有返回值,返回类型类型为void

    1. #include
    2. //说明
    3. //1. 函数名 cal
    4. //2. 有返回值 double
    5. //3. 形参列表为 (int n1, int n2, char oper)
    6. //4. 在函数中,我们使用的变量名需要和形参列表中的变量名一样
    7. double cal(int n1, int n2, char oper) {
    8. //定义一个变量 res ,保存运算的结果
    9. double res = 0.0;
    10. switch(oper) {
    11. case '+' :
    12. res = n1 + n2;
    13. break;
    14. case '-':
    15. res = n1 - n2;
    16. break;
    17. case '*':
    18. res = n1 * n2;
    19. break;
    20. case '/':
    21. res = n1 / n2;
    22. break;
    23. default :
    24. printf("你的运算符有误~");
    25. }
    26. printf("\n%d %c %d = %.2f\n", n1, oper, n2, res);
    27. return res;
    28. }
    29. void main() {
    30. int num1 = 10; //第一个数
    31. int num2 = 20;//第二个数
    32. double res = 0.0;//结果
    33. char oper = '-'; //运算符
    34. //我们又要接收两个数和一个运算符
    35. int num3 = 60;
    36. int num4 = 80;
    37. double res2 = 0.0;
    38. char oper2 = '*';
    39. printf("使用函数来解决计算任务~~");
    40. //使用函数来完成两个计算任务
    41. res = cal(num1, num2, oper); //调用函数,使用函数
    42. printf("cal 函数返回的结果 res = %.2f\n", res);
    43. //使用函数完成第二个计算任务
    44. res2 = cal(num3, num4, oper2); //调用函数,使用函数
    45. printf("cal 函数返回的结果 res2 = %.2f", res2);
    46. }

    函数-递归调用

    • 函数递归需要遵守的重要原则

            ①执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)

            ②函数的局部变量是独立的,不会相互影响

            ③递归必须向推出递归的条件逼近,否则就是无限递归

            ④当一个函数执行完毕,或者遇到return,就会返回

    • 函数调用的规则

    ①当调用(执行)一个函数时,就会开辟一个独立的空间(栈)

    ②每个栈空间是相互独立

    ③当函数执行完毕后(或者执行到return),会返回到调用函数位置,继续执行

    ④如果函数有返回值,则将返回值赋给接收的变量

    ⑤当一个函数返回后,该函数对应的栈空间也就销毁

    1. void test(int n) {
    2. int n2 = n + 1;
    3. printf("n2=%d", n2);
    4. }
    5. void main() {
    6. int num = 6;
    7. test(num);
    8. getchar();
    9. }

    1. void test(int n) {
    2. if(n > 2) {
    3. test(n -1);
    4. }
    5. printf("\nn=%d", n);
    6. }
    7. void main() {
    8. test(4); //输出2

    调用函数时,开辟的函数栈,都会完整的执行函数代码

     函数的练习

    斐波那契数

    1. //题1:斐波那契数请使用递归的方式,
    2. //求出斐波那契数1,1,2,3,5,8,13...给你一个整数n,求出它的斐波那契数是多少?
    3. #include
    4. int fbn(int n) {
    5. if (n == 1 || n == 2) {
    6. return 1;
    7. }
    8. else {
    9. return fbn(n - 1) + fbn(n - 2);
    10. }
    11. }
    12. void main() {
    13. int res = fbn(7); // res = 13
    14. printf("\nres=%d", res);
    15. getchar();
    16. }
    1. /*题2:求函数值已知 f(1)=3; f(n) = 2*f(n-1)+1;
    2. 请使用递归的思想编程,求出 f(n)的值?
    3. 分析:因为该题的公式已经给出,所以直接使用即可
    4. */
    5. //f(1)=3; f(n) = 2*f(n-1)+1
    6. int f(int n) {
    7. if(n==1) {
    8. return 3;
    9. } else {
    10. return 2*f(n-1)+1;
    11. }
    12. }
    13. void main(){
    14. int res2 = f(30);
    15. printf("\nres2=%d", res2);
    16. getchar();
    17. }

     猴子吃桃子问题

    1. /*题3:猴子吃桃子问题有一堆桃子,猴子第一天吃了其中的一半,
    2. 并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。
    3. 当到第十天时,想再吃时(还没吃),发现只有1个桃子了。问题:最初共多少个桃子?
    4. 分析:
    5. 1. day=10 有 1个桃子
    6. 2. day=9 有 (day10 + 1) * 2 = (1+1) * 2 = 4
    7. 3. day=8 有 (day9 + 1) * 2 = (4+1) * 2 = 10
    8. */
    9. int peach(int day) {
    10. if(day == 10) {
    11. return 1;
    12. } else {
    13. return (peach(day+1) + 1) * 2;
    14. }
    15. }
    16. void main(){
    17. int peachNum = peach(1);
    18. printf("\n 第一天有%d个桃子", peachNum);
    19. getchar();
    20. }

    函数注意事项

    • 函数的形参列表可以是多个 

    • C语言传递参数可以是值传递,也可以传递指针,也叫引用传递

    • 函数的明明遵循标识符命名规范,首字母不能是数字,可以采用驼峰法或下划线法

    • 函数中的变量是局部的,函数外不生效

    • 基本数据类型默认是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值

    如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内用指针的方式操作变量。从效果上看类似引用(即传递指针)

    1. void f2(int n) {
    2. n++;
    3. printf("f2中n的值是%d\n", n);//10
    4. }
    5. void f3(int* p) {
    6. (*p)++;//修改会对函数外的变量有影响
    7. //main函数中的n变量也发生改变
    8. printf("f3中n的值是%d\n", *p);//
    9. }
    10. void main() {
    11. int n = 9;
    12. f2(n);
    13. f3(&n);
    14. printf("main函数中的n = %d", n);//f2之后仍是9,但f3之后成为10
    15. }

    • C语言不支持函数重载

    • C语言支持可变参数函数

    编写一个函数 swap(int *n1, int *n2) 可以交换 n1 和 n2的值

    1. #include
    2. //请编写一个函数swap(int* n1,int* n2)可以交换n1和n2的值
    3. //形参是两个指针类型int*
    4. void swap(int* n1, int* n2) {
    5. int temp = *n1;//表示将n1指针指向的变量的值赋给temp
    6. *n1 = *n2;//表示将n2指针指向的变量的值赋给n1指针指向的变量
    7. *n2 = temp;//表示将temp的值赋给n1指针指向的变量
    8. }
    9. void main() {
    10. int n1 = 1;
    11. int n2 = 2;
    12. swap(&n1, &n2);
    13. printf("main n1 = %d n2 = %d", n1, n2);//n1 = 2 n2 = 1
    14. getchar();
    15. }

    函数参数的传递方式 

  • 相关阅读:
    ChatGPT AIGC 非常实用的AI工具集合大全
    计算机视觉中的细节问题(二)
    4.5 final修饰符
    五、Docker仓库之https的registry搭建(二)
    2023 年KPI (KPI:Key Performance Indicator) review
    【vscode】vscode在离线环境下配置远程服务器客户端
    dubbo 支持的7种协议
    t检验(连续变量)和卡方检验(分类变量)
    文献学习(part103)--Inductive Representation Learning on Large Graphs
    分销商城小程序开发怎么选择开发方式?
  • 原文地址:https://blog.csdn.net/qq_47896523/article/details/126282242