函数类型 函数名(数据类型1 形参1, 数据类型2 形参2, ...)
{
函数体
return 返回值;
}
函数名(实参1, 实参2, ...);
????????如果被调函数的定义在主调函数的下方,需要对被调函数声明一下
????????变量能够使用的范围
????????变量作用域默认为离定义该变量最近的大括号内
????????局部变量:变量作用域在某个大括号范围内
????????全局变量:变量作用域在整个文件中
????????全局变量都在所有函数的外面定义
????????变量从空间被开辟到被回收的整个过程成为生存周期
????????存储类型 数据类型 变量名;
????????????????自动型变量、局部变量
????????????????将变量存放在栈区:
????????????????????????1. 未经初始化值未随机值
????????????????????????2. 执行到变量定义时开辟空间
????????????????????????3. 执行到超过变量作用域范围回收变量空间
????????????????寄存器变量
????????????????寄存器存满,会将变量存放到栈区(等价于auto类型)? ?
????????????????外部变量
extern int a;
????????????????声明一个变量未外部存储的变量
????????????????静态变量
????????????????将变量存放在数据区中:
????????????????????????1. 未经初始化值为0值;
????????????????????????2. 编译时开辟空间,程序运行时加载该空间
????????????????????????3. 程序结束时回收空间
????????????????static作用:
? ? ? ? ? ? ? ? ????????1. 将变量定义为静态变量
????????????????????????2. 可以将变量的作用域限定到本文件中
????????????????????????3. 可以防止多文件全局变量名冲突
????????????????函数定义时调用函数本身
????????????????????????1. 递归一定要有结束条件
????????????????????????2. 避免深层次的递归
????????????????练习:
????????????????1. 从终端输入一个n,封装函数获得斐波那契数列第n项的值1 1 2 3 5 8 13 21 34 55 ...
#include <stdio.h>
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);
}
????????????????2. 利用递归函数实现Hanoi(汉诺)塔问题。
#include <stdio.h>
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;
}
???
????????????????1. 赋值传递(复制传递)
????????????????????????实参将值拷贝一份给形参,形参是实参的副本,形参的值发生改变不会影响实参
????????????????2. 全局变量传递?
int a[5];
//1. 形式1:
int Fun(int array[5]);
//2. 形式2:
int Fun(int array[], int len);
? ? ? ? ? ? ? ? 注意:数组传递时,函数体内部形参操作的数组和实参操作的数组为同一数组
? ? ? ? ? ? ? ? 练习:主函数中定义一个数组,并对元素初始化,封装一个函数完成获得数组中所有元素的平均值
#include <stdio.h>
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;
}
? ? ? ? 1. 封装数组元素冒泡排序的函数、输入输出的函数;
#include <stdio.h>
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;
}
? ? ? ? 2.?封装一个函数实现获得一个数字每位数上的和值;例如输入12345,输出结果为15
#include <stdio.h>
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);
}
? ? ? ? 3.?封装一个函数判断给定的数字是否为素数
#include <stdio.h>
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;
}