C函数

C函数

  1. 关键字return
  2. 运算符---*&
  3. 如何把指针变量用作函数参数
  4. 函数类型
  5. 递归

return的使用

示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 4:07:12 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 4:07:12 PM
 * Description: 两数比较大小,返回更小的.使用return
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
int imin(int, int);

int main(void)
{
    int numberOne, numberTwo;

    printf("输入两个整数,或者按q退出: \n");
    while (scanf("%d %d", &numberOne, &numberTwo) == 2)
    {
        printf("%d 和 %d 当中更小的是 %d. \n", numberOne, numberTwo, imin(numberOne, numberTwo));
        printf("输入两个整数,或者按q退出: \n");
    }
    printf("结束!");

    return 0;
}
/** 比较两数大小,返回最小的 */
int imin(int n, int m)
{
    int min;

    if (n < m)
        min = n;
    else
        min = m;

    return min;
}

函数原型

使用函数原型的目的:

为了让编译器第一次调用该函数的时候就知道如何使用它

示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 4:14:40 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 4:14:40 PM
 * Description: 函数原型的使用
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
int imax(int a, int b); // 不可以在声明中既是函数定义也是函数原型,会导致重定义错误

int main(void)
{
    int n, m, z;
    printf("输入两个数(或按q退出):\n");
    while (scanf("%d %d", &n, &m) == 2)
    {
        z = imax(n, m);
        printf("%d 和 %d 中更大的是 %d.\n", n, m, z);
        printf("输入两个数(或按q退出):\n");
    }
    printf("结束");

    return 0;
}

int imax(int a, int b)
{
    return a > b ? a : b;
}

递归

什么是递归?

函数自己调用自己的过程叫做递归

难点:

结束递归

递归示例:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 4:33:07 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 4:33:07 PM
 * Description: 递归的示例和递归的使用
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
void up_and_down(int);

int main(void)
{
    up_and_down(1);

    getchar();

    return 0;
}

void up_and_down(int n)
{
    printf("数 %d: n 在计算机中的存储地址是 %p \n", n, &n); // &取址符号
    if (n < 4)
        up_and_down(n + 1);
    printf("数 %d: n 在计算机中的存储地址是 %p \n", n, &n);
}

难点:

递归次数(递归结束条件)

分析:

上述代码当中一共有八段输出,up_and_down函数被调用了四次,最后一次 调用结束以后打印了四次.函数开始返回,继续打印四次.所以一共输出八段

尾递归

尾递归计算阶乘示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 5:00:01 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 5:00:01 PM
 * Description: 分别使用循环和递归计算阶乘(主要介绍尾递归)
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
long fact(int);
long rfact(int);

int main(void)
{
    int num;

    printf("这是一个计算阶乘的程序.\n");
    printf("输入0 - 12 内的整数, 按q退出.\n");
    while (scanf("%d", &num) == 1)
    {
        if (num < 0 || num > 12)
        {
            printf("重新输入!\n");
            continue;
        }
        else
        {
            printf("循环: %d 的阶乘是 %ld.\n", num, fact((long) num));
            printf("递归: %d 的阶乘是 %ld.\n", num, rfact((long) num));
        }
        printf("输入0 - 12 内的整数, 按q退出.\n");
    }

    printf("结束!");

    return 0;
}

long fact(int n)
{
    long ans;

    for (ans = 1; n > 1; n--)
        ans *= n;
    
    return ans;
}

long rfact(int n)
{
    long ans;

    if (n > 0)
        ans = n * rfact(n - 1);
    else
        ans = 1;

    return ans;
}

递归和倒序计算

一个以二进制形式表示输入数的算法:

思路:

  1. 十进制转二进制中,十进制奇数的末尾是1,偶数的末尾是0 ---> 所以通过%2来确定末尾值
  2. 如何十进制数的下一位二进制数(十进制数/2结果在%2)
  3. 结束条件,/2结果<2

示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 5:33:11 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 5:33:11 PM
 * Description: 进制转换问题,主要是解决十进制转二进制
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
void to_binary(unsigned long);

int main(void)
{
    unsigned long number;
    
    printf("输入一个正整数,q退出!.\n");
    while (scanf("%lu", &number) == 1)
    {
        printf("该数的二进制数是:\n");
        to_binary(number);
        putchar('\n');
        printf("输入一个正整数,q退出!.\n");
    }

    printf("Done!");

    return 0;
}

// 递归
void to_binary(unsigned long n)
{
    int r;

    r = n % 2; // 记录余数
    if (n >= 2) 
        to_binary(n / 2);
    putchar(r == 0 ? '0': '1');

    return;
}

双递归

示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 5:40:35 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 5:40:35 PM
 * Description: 通过斐波那契数列展示双递归使用
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
unsigned long Fibonacci(unsigned n);

int main(void)
{
    Fibonacci(10);

    return 0;
}

unsigned long Fibonacci(unsigned n)
{
    if (n > 2)
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    else
        return 1;
}

递归的缺点:

对于计算机内存资源的消耗是巨大的

头文件的使用

  • 把函数原型放在头文件中
  • 把函数定义放在第二个文件中

这样就可以不需要每次都声明函数原型了

示例程序:

posted @   俊king  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示