函数


一、函数概念
结构化程序设计的思想:把大问题分解成若干个小问题,每个小问题就是一个独立的子模块,以实现特定的功能、在C程序中,子模块的作用是由函数完成的.
(1)一个c源程序可以由多个文件构成(c文件的后缀名.c)
(2)一个源文件是一个编译单位
(3)一个源文件可以由若干个函数组成(函数是c程序的基本组成单位)
(4)一个c程序只能有一个main函数,其他都是子函数。
(5)主函数可以调用子函数,子函数可以相互多次调用。

include

void printstar() // 自定义函数 printstar() 输出*
{
printf("****");
}
int sum(int a,int b) // 自定义函数sum 计算a+b的值
{
return a+b; // 通过return返回函数
}
void main() // 主函数 唯一 程序入口
{
int x=2,y=3,z;
printstar(); // 调用函数
z=sum(x,y);
printf("\n%d+%d=%d\n",x,y,z);
printstar();
}
二、函数的分类
1.按函数的定义分类
(1)标准函数
标准函数又称为库函数,由c系统提供,无需程序员定义,可直接使用,但需要在程序开头包含原型声明的头文件。如scanf()
(2)自定义函数
由程序员根据自己的需求编写,自定义函数不仅要在程序中定义函数本身,必须还要在主函数中调用该函数
2.按有无返回值的分类
(1)有返回值函数
该类函数被调用执行完毕,将向调用者返回一个执行结果,称为函数的返回值
int send( int a,int b)
{
return a+b;
}

void main()
{
z=send(a,b);
printf("%d\n",z);

}
(2)无返回值的函数
无返回值函数不需要向主调函数提供返回值
void printstar()
{
printf("****");
}
void main()
{

printsar();
}
3.按函数的形式分类
(1)无参函数
在函数的声明、定义和调用中均不带参数,特点:在调用无参函数主调函数并不将数据传输给被调用函数,此类函数通常被用来完成指定的功能,可以返回或不返回函数值
/*
格式:
类型说明 函数名()
{
// 函数体
}
*/
int max()
{
// 函数体
}

空函数 无函数体
类型说明 函数名()
{
//无函数体 因程序设计需要,确定模块需求 先占位置 后在补上
}

int max()
{

}
(2)有参函数
在函数定义、声明都都有参数。特点:主调函数调用被调函数时,主调函数必须把值传输给形参,以供被调函数使用

int max(int a,int b) // 有参函数
{
函数体
}
三、函数的参数及传递方式
1.函数的参数
函数的参数有两类:形参和实参
函数定义时的参数称为形参,参数在函数未被调用时是没有确定值的,只是形式上的参数。
函数调用时使用的参数称为实参。
2.函数参数的传递方式
c语言规定,实参对形参的数据传递是“值传递”,即单向传递,只是把实参的值传递给形参,而不能把实参的值再传递给实参。再内存当中,实参与形参是不同的单元,不管名字是否相同,因此函数中对形参值的任何改变都不会影响到实参的值。
四、函数调用
C程序是从主函数main()开始执行的,以main()函数体结束为止在函数体的执行过程中,通过不断地对函数的调用来执行的。
调用者 被称为主调函数一般为main()函数,
被调用者 称为被调函数一般为自定义函数或者库函数。
被调函数执行结束,从被调函数结束的位置再返回主调函数当中,继续执行主调函数后面的语句。
1.函数的调用方式
(1)(函数语句)第一种调用方式
函数名(实参列表);
函数名();
(2)(函数表达式)第二种调用方式
m=max(x,y); // 将max()函数的返回值赋值给变量m
m=3max(x,y); // 将max()函数的返回值乘3赋值给变量m
printf("Max is %d,max(x,y)"); // 输出max()函数的返回值
/求两个数的最小公倍数*/

include "stdio.h"

int sec(int m,int n) // 自定义函数 int返回值类型 无参数
{
int temp,a,b; // 定义变量temp,a,b
if(m {

 temp =m;

m=n;
n=temp;
}
a=m;b=n;
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return(m*n/a);
}

void main() // 主函数c程序的入口
{
int x,y,g;
printf("请输入两个整数:");
scanf("%d%d",&x,&y);
g=sec(x,y);
printf("最小公倍数为:%d\n",g);
}
2.函数的声明
使用原则:先定义后使用
(1)有参函数的声明形式
函数类型 函数名(形参列表);
int tian(int a,int b);
(2(无参函数的声明形式:
函数类型 函数名();
int tain();
3.函数的嵌套调用
在c语言中,函数的关系是平行的,是独立的即函数的不能嵌套定义。
c语言中函数的嵌套调用即在调用一个函数的过程中可以调用另外一个函数。

include "stdio.h"

fun2(int x,int y)
{
int z;
z=2*x-y;
return z;
}

fun1(int x,int y)
{
int z;
z=fun2(x,x+y);
return z;
}

void main()
{
int a,b,c;
printf("请输入两个整数: \n");
scanf("%d%d",&a,&b);
c=fun1(a,b); // 调用fun1()函数
printf("%d\n",c);
}
五、黑盒视角
黑盒方法的核心部分是:ch、num、count都是text()的私有的局部变量。如果在main()中使用同名变量,那么它们相互独立,互不影响。
六、函数的递归
如果在调用一个函数的过程中,有直接或间接的调用了该函数本身,这种形式称为函数的递归调用,这个函数就称递归调用。
int func(int a)
{
int b,c;
c=func(b);
}