1. 函数

作用:对某一个具体功能的过程进行封装,对细节进行隐藏

基本形式:

返回类型  函数名(参数类型 参数名1,参数类型 参数名2 . ....){
    //主要功能
    ....
        
    return 返回值;
}

分类:

  • 库函数:比如printf,scanf等
  • 自定义函数

可以在memset - C++ Reference (cplusplus.com)

查找自己自己需要的库函数,及对应的头文件。

例如,math.h中提供了一系列数学计算函数:

image-20220702174736297

2. 函数的调用

函数调用自身称为递归。

递归的==两个必要条件==:

  1. 存在限制条件,当满足这个条件时,递归便不再继续。
  2. 每次递归调用之后越来越接近这个限制条件。

1. 传值调用

函数的形参和实参分别占有不同的内存块,对形参修改==不会==影响实参。

  • 代码示例
#include<stdio.h>
//交换函数
void swap(int x, int y)//x,y是形参 
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a, b, c;
	printf("请输入任意三个数\n");
	scanf("%d %d %d", &a, &b, &c);
	if (a > b)
	{
		swap(a, b); // 实参
	}

	if (b > c)
	{
		swap(b, c);
	}

	if (a > b)
	{
		swap(a, b);
	}
	printf("这三个数从小到大依次为%d %d %d:\n", a, b, c);

	return 0;
}

image-20220702175503628

2. 传址调用

  • 传址调用是把函数外部所创建的==变量的内存地址==传递给函数参数的一种调用方式;

  • 这种方式可以让函数和外部变量建立真正的联系,也就是函数内部就可以直接操作外部变量。

  • 代码示例

#include<stdio.h>
void swap(int* px, int* py) // 参数变为指针
{
	int tmp = *px;
	*px = *py;
	*py = tmp;
}

int main()
{
	int a, b, c;
	printf("请输入任意三个数\n");
	scanf("%d %d %d", &a, &b, &c);
	if (a > b)
	{
		swap(&a, &b); // 传入参数为变量地址
	}

	if (b > c)
	{
		swap(&b, &c);
	}

	if (a > b)
	{
		swap(&a, &b);
	}
	printf("这三个数从小到大依次为%d %d %d:\n", a, b, c);

	return 0;
}

image-20220702175848717

  • ==注意:==
  1. ==函数的定义时:参数类型变为指针类型,操作时也是直接操作指针,也就是带*==
  2. ==函数使用时,传入的参数名前加上取地址符&==

3. 递归调用

1.直接递归

image-20220702180846975


#include <stdio.h>
void Add(int b,int sum) {
	sum += b;
    //设定一个结束递归的条件,否则陷入死循环
	if (sum < 50) {
		printf("%d\n", sum);
		Add(b,sum);//函数定义的内部调用本身
	}
	
}
int main() {
	int b;
	int sum =0;
	scanf("%d",&b);
	Add(b,sum);
	return 0;
}

image-20220702181319452

2.间接递归

image-20220702181602668

  • 示例程序:输入两个参数a,b。结果如果不等于50,则从0开始一直加上a,减去b。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Add(int a, int b, int res);
void Subtract(int a, int b, int res);
void Add(int a,int b,int res) {
	res += a;
	if (res !=50) {
		printf("%d\n", res);
		Subtract(a,b,res);
	}
	else {
		printf("sum=50!\n");
	}
	
}
void Subtract(int a,int b,int res) {
	res -= b;
	if (res !=50) {
		printf("%d\n", res);
		Add(a,b, res);
	}
	else {
		printf("sum=50!\n");
	}
}
int main() {
	int a,b;
	int sum =0;
	scanf("%d %d",&a,&b);
	Add(a,b,sum);
	return 0;
}

image-20220702183748103

练习题

判断素数

思路:素数的定义:不能被除1和本身以外的任何数字整除。

  • 代码
//判断质数
#include <stdio.h>
int Prime_Num(int num) {
	
	if (num==2||num==3) {
		return 1;
	}
	else if (num > 3) {
		int i = 2;
		while (i<num) {
			if (num % i == 0) {
				return -1;
			}
			i++;
		}
		return 1;
	}
	else {
		return -1;
	}
	
}
int main() {
	int num;
	scanf("%d",&num);
	int flag=Prime_Num(num);
	if (flag == 1) {
		printf("%d是素数!\n",num);
	}
	else {
		printf("%d不是素数!\n", num);
	}
	return 0;
}
  • 运行效果

image-20220702190119621

image-20220702190144379