上一篇博客我们提到了关于C语言的分支与循环,这一篇我来分享一下C语言函数的相关知识,那就请睁大眼睛,好好看(哈哈)。
说到函数,首先我们想到的就是数学上的函数,这个在数学领域非常有趣且实用的知识,也可以说是工具吧。那它在编程界会有同样的效果吗,那答案当时是:是的。不仅在数学中,而且在编程方面也是非常好用的工具,那废话不多说,开始我们接下来的内容。
目录
一、在C语言中的函数是什么
二、C语言函数的分类
2.1 库函数
2.2 自定义函数
自定义函数与库函数不同的是,我们可以根据自己想要达成的效果,来自己设计函数。
#include <stdio.h>
int Find_Max(int x, int y)
{
if (x > y)
{
return x;
}
else
{
return y;
}
//还有一个更简单的写法,用三目操作符
//return x > y ? x : y;
}
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d %d", &num1, &num2);
int max = Find_Max(num1, num2);
printf("%d\n", max);
return 0;
}
三、函数的参数
3.1 实际参数(实参):
2.2 形式参数(形参):
四、函数的调用
4.1 传值调用
4.2传址调用
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
void Swap2(int* px, int* py) {
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:a=%d,b=%d\n", a, b);
//Swap1(a, b);
Swap2(&a, &b);
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
(1)
//打印100~200之间的素数
#include <stdio.h>
#include <math.h>
int is_prime(int n)
{
//2~n-1的数试除
//2~sqrt(n)的数试除
int j = 0;
for (j = 2; j <= sqrt(n); j++)
{
if (n % j == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
//判断是否为素数
//返回值为1,表示是素数
//返回值为0,表示不是素数
if (is_prime(i) == 1)
{
printf("%d ", i);
}
}
return 0;
}
(2)
//写一个函数判断是不是闰年
#include <stdio.h>
int Is_leap_year(int n)
{
//判断闰年的规则:
//(1)能被4整除,但不能被100整除
//(2)能被400整除
if (n % 4 == 0 && n % 100 != 0 || n % 400 == 0)
{
return 1;
}
return 0;
//简洁方法
//return (((n % 4 == 0) && (n % 100 != 0)) || (n % 400 == 0));
}
int main()
{
int y = 0;
scanf("%d", &y);
int ret = Is_leap_year(y);
//如果是闰年,就返回1
//如果不是闰年,就返回0
if (ret == 1)
{
printf("%d年是闰年\n", y);
}
else
{
printf("%d年不是闰年\n", y);
}
return 0;
}
(4)
//写一个函数,实现一个整形有序数组的二分查找
//找到了就返回下标
//找不到就返回-1
#include <stdio.h>
int binary_search(int arr[], int k, int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);//要查找的数
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr, k, sz);
if (-1 == ret)
{
printf("找不到了\n");
}
else
{
printf("找到了,下标为:%d\n", ret
);
}
return 0;
}
五、函数的嵌套调用和链式访问
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
5.1 函数的嵌套调用
#include <stdio.h>
void new_line()
{
printf("Hello\n");
}
void three_line()
{
int i = 0;
for (i = 0; i < 3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
注意: 函数可以嵌套调用,但不可以嵌套定义。
嵌套定义:
所以记住这样是错的。
5.2链式访问
这是正常的代码
这是链式访问的代码
有一个典型的链式访问的代码
屏幕上打出4321,那这个是为什么呢?
这是printf函数的返回值,意思是:这些函数中的每一个都返回打印的字符数,如果发生错误,则返回负值。所以从里向外,先打印43,43是两个字符数,下一个打印2,2是一个字符数,所以最后打印1,最后屏幕上打印4321。
六、函数的声明和定义
6.1 函数的声明
6.2 函数的定义
下面这段代码和上面的不同,上面的代码会把自定义函数放到main函数的上面,但这样写,就会报一个警告。
七、函数递归
7.1 递归的两个必要
举一个例子:
//接收一个整型值(无符号),按照顺序打印它的每一位
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0;
scanf("%d", &num);//1234
print(num);//print函数可以把num的每一位按照顺序打印出来
return 0;
}
画了一个简单的图,来熟悉一下这个递归过程:
7.2 递归和迭代
下面还是写出几个例子:
(1)
//用递归计算n的阶乘
int fac(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * fac(n - 1);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fac(n);
printf("%d\n", ret);
return 0;
}
(2)
//用递归求第n个斐波那契数。(不考虑溢出)
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
return 0;
}
int fib(int n)
{
int a = 1;
int b = 1;
int c = 0;
int i = 0;
if (n <= 2)
{
return 1;
}
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
return 0;
}
结语:
那关于C语言函数的相关知识就分享到这里,这一篇博客就写到这里了,回想一下写博客的感觉还是非常棒的,感觉每一天过的很充实,我很期待下一篇博客啊。(哈哈,完结撒花)