嵌入式学习第九天!(函数)

1. 函数定义:

函数类型 函数名(数据类型1 形参1, 数据类型2 形参2, ...)
{
    函数体

    return 返回值;
}

2. 函数的调用

函数名(实参1, 实参2, ...);

3. 函数的声明

        如果被调函数的定义在主调函数的下方,需要对被调函数声明一下

4. 变量作用域和生存周期:

    1. 作用域:

        变量能够使用的范围

        变量作用域默认为离定义该变量最近的大括号内

        局部变量:变量作用域在某个大括号范围内

        全局变量:变量作用域在整个文件中

        全局变量都在所有函数的外面定义

    2. 生成周期:

        变量从空间被开辟到被回收的整个过程成为生存周期

        存储类型 数据类型 变量名;

        1. auto(默认)

                自动型变量、局部变量

                将变量存放在栈区:

                        1. 未经初始化值未随机值

                        2. 执行到变量定义时开辟空间

                        3. 执行到超过变量作用域范围回收变量空间

        2. register

                寄存器变量

                寄存器存满,会将变量存放到栈区(等价于auto类型)   

        3. extern

                外部变量

extern int a;

                声明一个变量未外部存储的变量

        4. static

                静态变量

                将变量存放在数据区中:

                        1. 未经初始化值为0值;

                        2. 编译时开辟空间,程序运行时加载该空间

                        3. 程序结束时回收空间

                static作用:

                        1. 将变量定义为静态变量

                        2. 可以将变量的作用域限定到本文件中

                        3. 可以防止多文件全局变量名冲突

        5. 递归函数:

                函数定义时调用函数本身

                        1. 递归一定要有结束条件

                        2. 避免深层次的递归

                练习:

                1. 从终端输入一个n,封装函数获得斐波那契数列第n项的值1 1 2 3 5 8 13 21 34 55 ...

#include 

int FeiBoNaQie(int N)
{
	if(N <= 2)
	{
		return 1;
	}
	else
	{
		return FeiBoNaQie(N-1) + FeiBoNaQie(N-2);
	}
}

int main(void)
{
	int	Num = 0;
	int Ret = 1;
	
	scanf("%d",&Num);
	
	Ret = FeiBoNaQie(Num);

	printf("Ret = %d\n",Ret);

}

嵌入式学习第九天!(函数)_第1张图片

                2. 利用递归函数实现Hanoi(汉诺)塔问题。

嵌入式学习第九天!(函数)_第2张图片

#include 

int HanNuoTa(int N,char src, char tmp,char dst)
{
	if(N == 1)
	{
		printf("%c -> %c\n",src, dst);
	}
	else
	{
		HanNuoTa(N-1, src, dst, tmp);
		printf("%c -> %c\n",src,dst);
		HanNuoTa(N-1,tmp,src,dst);
	}

	return 0;
}

int main(void)
{
	int Num = 0;
	scanf("%d",&Num);

	HanNuoTa(Num, 'A', 'B', 'C');

	return 0;

}

   嵌入式学习第九天!(函数)_第3张图片

        6.函数的传参:

                1. 赋值传递(复制传递)

                        实参将值拷贝一份给形参,形参是实参的副本,形参的值发生改变不会影响实参

                2. 全局变量传递 

        7. 数组传递:
int a[5];
//1. 形式1:
int Fun(int array[5]);
//2. 形式2:
int Fun(int array[], int len);

                注意:数组传递时,函数体内部形参操作的数组和实参操作的数组为同一数组

                练习:主函数中定义一个数组,并对元素初始化,封装一个函数完成获得数组中所有元素的平均值

#include 

double GetAvgNum(int ary[],int len)
{
	int i = 0;
	int sum = 0;
	double avg = 0;
	
	for(i = 0; i < len; i++)
	{
		sum += ary[i];
	}

	avg = (double)sum / (double)len;

	return avg;

}

int main(void)	
{
	int num[5] = {0};
	int i = 0;
	for(i = 0; i < 5; i++)
	{
		scanf("%d",&num[i]);
	}

	printf("average_num = %.2lf\n",GetAvgNum(num,5));

	return 0;
}

嵌入式学习第九天!(函数)_第4张图片

作业:

        1. 封装数组元素冒泡排序的函数、输入输出的函数;

#include 

int InputArray(int array[], int len)
{
	int i = 0;
	
	for(i = 0; i < len; i++)
	{
		scanf("%d",&array[i]);
	}
	
	return 0;
}

int OutputArray(int array[], int len)
{
	int i = 0;
	
	for(i = 0; i< len; i++)
	{
		printf("%d ",array[i]);
	}
	
	printf("\n");
	
	return 0;
}

int SortArray(int array[], int len)
{
	int i = 0;
	int j = 0;
	int tmp = 0;

	for(j = 0; j < len-1; j++)
	{
		for(i = 0; i < len-1-j; i++)
		{
			if(array[i] > array[i+1])
			{
				tmp = array[i];
				array[i] = array[i+1];
				array[i+1] = tmp;
			}
		}
	}

	return 0;
}

int main(void)
{
	int a[5] = {0};

	InputArray(a,5);
	SortArray(a,5);
	OutputArray(a,5);

	return 0;
}

嵌入式学习第九天!(函数)_第5张图片

        2. 封装一个函数实现获得一个数字每位数上的和值;例如输入12345,输出结果为15

#include 

int SumNum(int Num)
{
	int sum = 0;
	if(Num < 10)
	{
		sum = Num;
	}
	else
	{
		while(Num > 9)
		{
			sum += Num % 10;
			Num /= 10;
		}
		sum += Num;
	}
	return sum;
}

int main(void)
{
	int num = 0;
	int sum = 0;

	scanf("%d",&num);
	sum = SumNum(num);

	printf("sum = %d\n",sum);

}

嵌入式学习第九天!(函数)_第6张图片

        3. 封装一个函数判断给定的数字是否为素数

#include 

int Judge_Prime(int Num)
{
	int i = 0;
	for(i = 2; i < Num; i++)
	{
		if(Num % i == 0)
		{
			return 0;
		}
	}
	return 1;
}

int main(void)
{
	int a = 0;

	scanf("%d",&a);

	if(Judge_Prime(a))
	{
		printf("素数\n");
	}
	else
	{
		printf("不是素数\n");
	}

	return 0;
}


嵌入式学习第九天!(函数)_第7张图片

你可能感兴趣的:(学习)