1.函数是什么

大型程序中的某一部分代码,负责完成某项特定的任务

2.函数分类

2.1 库函数

IO函数(输入输出函数) 字符串操作函数 字符操作函数 时间/日期函数 数学函数 其他库函数

2.2 自定义函数

  • 例1. 求最大值函数
//函数
int get_max(int a, int b)
{
	int z = 0;
	if(a>b)
	{
		z = ;
	}
	else{
		z = b;
	}
	return z; // 返回z
}

int main()
{
	int a = 10;
	int b = 20;
	
	//函数的调用
	int max = get_max(a, b);
	
	printf('max = %d\n', max); 
	return 0;
}

3.形参与实参

函数定义中的参数为形式参数,形式参数只在函数内部有效

函数调用时的参数为真实参数,可以是常量、也可以是变量,也可以是表达式,但必须能够可以求出确定的值

函数的调用分为:传值调用与 传址调用

  • 例2. 交换两个整形的内容
//交换两个整形的内容
//函数 前面是void时表示不需要返回值
//correct
void swap1(int* pa, int* pb)
{
	int c = 0;
	c = *pa;
	*pa = *pb;
	*pb = c;
}

//wrong
void swap2()
{
	int c = 0;
	c = a;
	a = b;
	b = c;
}
//这里没有交换的原因是因为形参是实参的一份临时拷贝,故直接改变形参不会影响实参,所以需要通过指针变量来操作实现


//要通过交换地址来实现值的交换
int main()
{
	int a = 10;
	int b = 20;
	//传值调用
	swap2(a, b);
	printf("交换前:a=%d, b=%d", a, b);
	//传址调用
	swap1(&a, &b);
	printf("交换后:a=%d, b=%d", a, b);
	return 0;
}

4.函数实例

  1. 例3. 判断100以内的素数并打印

//思路:2 -> n-1 之间两个数相乘可以得到 n
int is_prime(int i)
{
	int n = 0;
	for (n = 2; n < i; n++)
	{
		if (i % n == 0)
			return 0;
	}
	return 1;
}

int main()
{
	int i = 0;
	for (i = 1; i <= 100; i++)
	{
		if (is_prime(i) == 1)
			//if(i%2==0)
		{
			printf("%d是素数\n", i);
		}
	}
	return 0;
}

例4. 打印2000-2022年间的闰年

int is_leap_year(int year)
{
	if ((year%400 == 0) ||(year%100 != 0 && year%4 == 0))
	{
		return 1;
	}
	return 0;
}

int main()
{
	int year = 0;
	for (year=2000; year <= 2022; year++)
	{
		if (is_leap_year(year) == 1)
		{
			printf("%d 是闰年\n", year);
		}
		else
			printf("%d 不是闰年\n", year);
	}
	return 0;
}
  1. 例5. 二分查找
//整形有序数组的二分查找
int binary_search(int arr[], int key, int sz)
{

	int left = 0;
	int right = sz - 1;
	while (left <= right) //表明中间还存在元素未被查找到
	{
		int mid = (left + right) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if(arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9};
	int key = 7;
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[0]);  //函数调用传递数组是之传递数组的第一个元素的地址,所应该先求出数组个数再传入
	int rst = binary_search(arr, key, sz);
	if (rst != -1)
	{
		printf("找到了,下标记是:%d\n", rst);
	}
	else
	{
		printf("没找到");
	}
	return 0;
}
  1. 例6. 每次调用该函数就使得 num 值 +1
void Add(int *p)
{
	(*p)++;
}

int main()
{
	int num = 0;
	Add(&num);
	printf("%d\n", num);

	Add(&num);
	printf("%d\n", num);

	Add(&num);
	printf("%d\n", num);
	return 0;
}

4.函数的嵌套调用和链式访问

函数可以嵌套调用但是不能嵌套定义 把一个函数的返回值作为另一个函数的参数

5.函数的声明和定义

//函数的定义和声明
int main()
{
	int num1 = 10;
	int num2 = 20;
	//声明函数 -- 告知 1.函数返回类型、2.参数个数、3.参数类型 (一般放在头文件中)
	int Add(int, int);
	Add(num1, num2);
	return 0;
}

//函数的定义
int Add()
{
	return 0;
}