* */
#include <stdio.h>//计算阶乘(递归)int jiecheng(int a)
{
if (a <= 0)
{
printf("参数错误.\n");
return -1;
}
//回归条件if (a == 1)
{
return1;
}
return a * jiecheng(a-1);
}
//递归解决求fibo数列某一项的值: 1 1 2 3 5 8 13 21 34 55int fibo(int num)
{
if (num > 0)
{
if (1 == num)
{
return1;
}
if (2 == num)
{
return1;
}
return fibo(num-1) + fibo(num-2);
}
}
int main(void)
{
// int arr[10000000000000000000000];// int ret = jiecheng(-1);// printf("ret = %d.\n", ret);int a = 0;
while (1)
{
printf("输入0表示推出.\n");
scanf("%d", &a);
if (0 == a)
{
break;
}
printf("%d项的fibo值:%d.\n", a, fibo(a));
}
return0;
}
迭代函数
/
#include <stdio.h>//计算从1开始到某个数据内所有的和intsum(int a)
{
int i = 1, sum = 0;
if (a > 0)
{
for (i=1; i<=a; i++)
{
//迭加//i值每变化一次就更新sum值sum += i;
}
}
//最终的结果,中间环节不需要returnsum;
}
int main(void)
{
int a = 100;
printf("%d内的和:%d.\n", a, sum(a));
int i = 1, sum;
for (i=1; i<10; i++)
{
// printf("sum = %d.\n", sum+=i);
printf("sum = %d", sum+=i);
sleep(1);
}
return0;
}
函数的声明
#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)
{
//用标准输入scanfprintf("从键盘输入两个数,以回车结束:\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);
*/return0;
}
//函数实现(定义)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;
}
void
/*
* void表示类型的一个关键字,空类型(暂时我们不知道该给他什么类型)
* void类型占1个字节,但是需要特定类型时,可以进行强制类型转换
*
* */
#include <stdio.h>
void func1(void)
{
printf("hello, world.\n");
}
//a就是子函数的形参,相当于子函数里的局部变量,函数结束,也就销毁了。
int func2(int a)
{
printf("a = %d.\n", a);
a = 23;
}
//交换a、b的值void func3(int a, int b)
{
int temp = 0;
temp = a;
a = b;
b = temp;
}
int main(void)
{
int x = 3, y = 4;
//分析:1、在子函数里是实参x值(3)、y值(4),进入子函数,分别赋值给了a、b。//子函数里,是发生了变化,但是main函数里的实参一点也没变
func3(x, y);
printf("x = %d, y = %d.\n", x, y);
/*
//函数调用
func1();
int val = 2;
//传值调用:1、val变量里面的值(2),进入了子函数里,并赋值给了a,所以val本身(真身)没有进去子函数
func2(val);
printf("val = %d.\n", val);
*/
/*
//不允许定义此类型变量// void a = 1;//error: variable or field ‘a’ declared void// int b = (int)a;// printf("b = %d.\n", b);
printf("sizeof(void) = %d.\n", sizeof(void));
*/
return0;
}
带参宏和普通函数
* 1、能完成相类似的功能
* 2、函数会检查你的参数列表和返回值类型,而宏定义没有类型,也就谈不上检查
* 3、宏定义只是替换,没有调用开销,函数有开销。
*
* 你的函数短小,但是还想利用检查参数的机制,要提高我的效率?
* 内联函数,处理这些问题.调用开销
*
* */#include <stdio.h>#define MAX 5#define S(x) ((x)*(x))#define MIN(a, b) (((a)<(b)) ? (a) : (b))#define STR "123456789"
//函数会检查你的参数类型
int func_min(int a, int b)
{
return (a < b ? a : b);
/*
if (a > b)
{
return b;
}
else
{
return a;
}
*/
}
//内联函数
inline void func1(void)
{
printf("hello.\n");
}
int main(void)
{
/*
unsigned a = -1;
float b = 0.1;
printf("数据:%f.\n", a);
printf("数据:%f", a + b);
printf("数据:%u.\n", a + b);
*/
/*
func1();
float f1 = 3.14;
float f2 = 3.15;
int ret = func_min('A', f2);
printf("ret = %d.\n", ret);
func_min(3.14, 3.15);
*/
/*
int ret = S(3);
printf("ret = %d.\n", ret);
ret = S(3+1);
printf("ret = %d.\n", ret);
float ret1 = MIN(3.14, 3.15);
ret = MIN(3, 4);
char *p = STR;
printf("字符串:%s.\n", STR);
*/return0;
}