C语言实战练习:函数

1,计算器

  • 函数一般包含三个部分:函数的声明(有时可省略),函数的调用和函数的定义

  • 在除法部分用到了_exit(0)跳出程序,需要加上头文件unistd.h

  • 整个程序的设计思路是使用switch,case条件语句从四个函数里选择一个

  • 注意:在输入符号时候要使用do,while循环来避免回车\n的asc码给了ch

#include <stdio.h>
#include <unistd.h>


//函数的声明
float add(float a, float b);
float sub(float a, float b);
float mul(float a, float b);
float div(float a, float b);

int main(void)
{
    //用标准输入scanf
    printf("从键盘输入两个数,以回车结束:\n");
    float a, b, ret;
    //默认是行缓冲。留在了你的输入的缓冲区,留下了一个'\n'
    scanf("%f %f", &a, &b);

    char ch = 0;

    printf("从键盘输入你要计算的运算符:+ - * /:\n");
/*  scanf("%c", &ch);
    //ch = 10.对应‘\n’的asc码值:
    printf("ch = %d.\n", ch);
*/
    do 
    {
        scanf("%c", &ch);
    }while (ch == '\n');

    switch (ch)
    {
        case '+':
        ret = add(a, b);
        break;

        case '-':
        ret = sub(a, b);
        break;

        case '*':
        ret = mul(a, b);
        break;

        case '/':
        ret = div(a, b);
        break;

        default:
        printf("error.\n");
        break;
    }

    printf("%.2f %c %.2f = %.2f.\n", a, ch, b, ret);
/*
    //调用函数
    float ret = add(a, b);
    //float类型默认精度小数点后6位
    printf("ret = %.2f.\n", ret);
*/
    return 0;
}


//函数实现(定义)
float add(float a, float b)
{
    float c = a + b;

    return c;
//  return a + b;
}

float sub(float a, float b)
{
    return a - b;
}

float mul(float a, float b)
{
    return a * b;
}

float div(float a, float b)
{
    if (b == 0)
    {
        printf("除数不能是0.\n");
        //高精度向低精度隐式转换,会丢掉数据。低精度向高精度隐式转换,结果更精确。
//      return -1;
//      结束整个程序
        _exit(0);
    }

    return a / b;
}

2,递归:阶乘

  • 递归就像一层层进去,再从最上面一层开始运算,直到运算到最底层退出

  • 任何递归都要设置回归条件

  • 相当于一次次调用此函数

int jiecheng(int a)
{
    if (a <= 0)
    {
        printf("参数错误.\n");
        return -1;
    }
    //回归条件
    if (a == 1)
    {
        return 1;
    }

    return a * jiecheng(a-1);
}

递归:fibo数列

  • 在此递归中,(1==num)(2==num)就是回归条件
int fibo(int num)
{
    if (num > 0)
    {
        if (1 == num)
        {
            return 1;
        }

        if (2 == num)
        {
            return 1;
        }

        return fibo(num-1) + fibo(num-2);
    }
}

3,多个参数时的入参顺序

  • 这个程序输出就是14 4 9;因为先从最右边开始计算
void func(int a, int b, int c)
{
    printf("%d %d %d.\n", a+b+c, b*=2, c*=3);   
}

int main()
{

    //14 4 9
    //入参的时候,由右向左
    func(1, 2, 3);
}

4,带参宏与内联函数

带参宏和普通函数
 *  1、能完成相类似的功能
 *  2、函数会检查你的参数列表和返回值类型,而宏定义没有类型,也就谈不上检查
 *  3、宏定义只是替换,没有调用开销,函数有开销。
 *
 *  你的函数短小,但是还想利用检查参数的机制,怎么提高我的效率?
 *  这就要用到内联函数,处理这些问题.调用开销
带参宏
  • 只是对应替换

  • 例如:

#define MAX 5

#define S(x) ((x)*(x))

#define MIN(a, b) (((a)<(b)) ? (a) : (b))

#define STR "123456789"
内联函数
  • 一般是两三句话简单的代码

  • 内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名

  • 如下例就是一个内联函数:

inline void func1(void)
{
    printf("hello.\n");
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于C语言一些简单的实例,里面有些思想值得借鉴 1 一个价值“三天”的BUG  2 灵活使用递增(递减)操作符  3 算术运算符计算器  4 逻辑运算符计算器 5 IP地址解析  6 用if…else语句解决奖金发放问题  7 用for循环模拟自由落体  8 用while语句求n!  9 模拟银行常用打印程序  10 使用一维数组统计选票  11 使用二维数组统计学生成绩  12 简单的计算器  13 时钟程序  14 华氏温度和摄氏温度的相互转换  15 SimpleDebug函数应用  16 常用的几种排序方法  17 广度优先搜索及深度优先搜索  18 实现基本的串操作  19 计算各点到源点的最短距离  20 储油问题  21 中奖彩球问题  22 0-1背包问题  24 二叉树算法集  25 模拟LRU页面置换算法  26 大整数阶乘新思路  27 银行事件驱动模拟程序  28 模拟迷宫探路  29 实现高随机度随机序列  30 停车场管理系统 31 菜单实现 32 窗口制作  33 模拟屏幕保护程序  34 文件读写基本操作  35 格式化读写文件  36 成块读写操作  37 随机读写文件  38 文件的加密和解密  39 实现两个文件的连接  40 实现两个文件信息的合并  41 文件信息统计  42 文件分割   43 同时显示两个文件的内容  44 模拟Linux环境下的vi编辑器  45 文件操作综合应用——银行账户管理  46 实用内存清理程序  47 如何检测Sniffer   48 加密DOS批处理程序  49 使用栈实现密码设置  50 远程缓冲区溢出漏洞利用程序  51 简易漏洞扫描器  52 文件病毒检测程序  53 监测内存泄露与溢出  54 实现traceroute命令  55 实现ping程序功能  56 获取Linux本机IP地址  57 实现扩展内存的访问  58 随机加密程序  59 MD5加密程序  60 RSA加密   61 制作表格  62 用画线函数作出的图案  63 多样的椭圆  64 多变的立方体 65 简易时钟  66 跳动的小球  67 用柱状图表示学生成绩各分数段比率  68 EGA/VGA屏幕存储  69 按钮制作  70 三维视图制作  71 红旗图案制作  72 火焰动画制作  73 模拟水纹扩散  74 彩色的Photo Frame   75 火箭发射演示  76 恢复内存文本 77 挽救磁盘数据 78 建立和隐藏多个PRI DOS分区 79 简单的DOS下的中断服务程序 80 文件名分析程序  81 鼠标中断处理  82 实现磁盘数据的整体加密  83 揭开CMOS密码  84 获取网卡信息  85 创建自己的设备  86 设置应用程序启动密码  87 获取系统配置信息  88 硬件检测  89 管道通信  90 程序自杀技术实现  91 连续击键游戏  92 掷骰子游戏  93 弹力球  94 俄罗斯方块  95 24点扑克牌游戏  96 贪吃蛇  97 潜水艇大战  98 机器人大战  99 图形模式下的搬运工  100 十全十美游戏  101 强大的通信录  102 模拟Windows下UltraEdit程序  103 轻松实现个人理财  104 竞技比赛打分系统  105 火车订票系统 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值