0
点赞
收藏
分享

微信扫一扫

C语言初阶——2.函数

gy2006_sw 2022-01-20 阅读 83

        上一篇博客我们提到了关于C语言的分支与循环,这一篇我来分享一下C语言函数的相关知识,那就请睁大眼睛,好好看(哈哈)。

preview

        说到函数,首先我们想到的就是数学上的函数,这个在数学领域非常有趣且实用的知识,也可以说是工具吧。那它在编程界会有同样的效果吗,那答案当时是:是的。不仅在数学中,而且在编程方面也是非常好用的工具,那废话不多说,开始我们接下来的内容。


目录

一、在C语言中的函数是什么

二、C语言函数的分类

        2.1 库函数

        2.2 自定义函数

三、函数的参数

        3.1 实际参数(实参):

        2.2 形式参数(形参):

四、函数的调用

        4.1 传值调用

        4.2传址调用

五、函数的嵌套调用和链式访问

        5.1 函数的嵌套调用

        5.2链式访问

六、函数的声明和定义

        6.1 函数的声明

        6.2 函数的定义

 七、函数递归

                  7.1 递归的两个必要

         7.2 递归和迭代

结语:


一、在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语言函数的相关知识就分享到这里,这一篇博客就写到这里了,回想一下写博客的感觉还是非常棒的,感觉每一天过的很充实,我很期待下一篇博客啊。(哈哈,完结撒花)

 

 

举报

相关推荐

0 条评论