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");
}