C语言-函数实现

函数的定义

1.逻辑上:能够完成特定功能的独立的代码块。

2.物理上:能够接收数据【也可以不接收数据】,能够对接收的数据进行处理【也可以不对数据进行处理】,能够将数据处理的结果返【也可以没有返回值】。

3.函数定义的本质:详细描述函数之所以能够实现某个特定功能的具体方法。

语法

返回值类型 函数名(形式参数列表)
{
	函数体;
}

返回值类型:用户需要函数返回的数据类型。
函数名:代表的是函数的入口地址。
形式参数列表:就是用户将函数外部数据传入函数内部的 局部变量。
函数体:函数的具体功能代码。

代码示例

void max()
{
    printf("最大值是:%d\n")
}

形式参数列表(形参)

形参在函数定义的时候没有空间,只有在调用函数的时候形参才有空间。函数调用完形参自动释放。

代码示例

void max(int a, int b)

注意:在定义函数的时候,不要给形参赋值

函数存在的意义

  • 避免了重复性操作。
  • 有利于程序的模块化

代码实现

# include <stdio.h>

// 函数声明
void max(int i, int j)
{
    //max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
    if (i > j){
       printf("%d\n", i);
    }else{
      printf("%d\n", j);  
    }
}

int main(void)
{	
    // 1.定义变量
    int a, b, c, d, e, f;

    a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
    // 调用函数
    max(a, b);
    max(c, d);
    max(e, f);
    /*
    if (a > b)
    printf("%d\n", a);
    else
    printf("%d\n", b);

    if (c > d)
    printf("%d\n", c);
    else
    printf("%d\n", d);

    if (e > f)
    printf("%d\n", e);
    else
    printf("%d\n", f);
    */
    return 0;
}

return 表达式含义

return是终止被调函数,向主调函数返回表达式的值,如果表达式为空,则只终止函数,不向被主函数返回任何值。

代码示例

# include <stdio.h>

int f()
{
    //因为函数的返回值类型是int  所以最终f返回的是10而不是10.5
    return 10.5;  
}

int main(void)
{
	int i = 99;
	double x = 6.6;
	
	x = f();
	printf("%lf\n", x);

	return 0;
}

Break语句

是用来终止(就近的)循环和switch语句。而return是用来终止被调函数的。

# include <stdio.h>

void fmin(void)
{
	int i;

	for (i=0; i<5; ++i)
	{
		printf("大家辛苦了!\n");
		return;   //return是终止函数的
	}
	printf("同志们好!\n");
}

int main(void)
{
	fmin();
	return 0;
}

函数的分类

  • 有参函数和无参函数。
  • 有返回值和无返回值。
  • 库函数和用户自定义函数。
  • 普通函数和主函数(main函数)

注意事项

1.一个程序有且只有一个主函数。
2.主函数可以调用普通函数,普通不能调用主函数。
3.普通函数可以相互调用。
4.主函数是程序的入口,也是函数的出口。值传递函数和地址传递函数。

代码示例

# include <stdio.h>

//max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
void max1(int i, int j)
{
	if (i > j)
		printf("%d\n", i);
	else
		printf("%d\n", j);
}

int max2(int i, int j)
{
	if (i > j)
		return i;
	else
		return j;
}

int main(void)
{
	int a, b, c, d, e, f;
	a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;

	printf("%d\n", max2(a, b));
	printf("%d\n", max2(c, d));
	printf("%d\n", max2(e, f));

/*
	max1(a, b);
	max1(c, d);
	max1(e, f);
*/
	return 0;
}

例子声明

//判断一个数是否素数,该数只能被1和本身整除
# include <stdio.h>
bool IsPrime(int val)
{
    // 1.定义变量
	int i;
    // 2.变量循环
	for (i=2; i<val; ++i)
	{
		if (val%i == 0)
			break;
	}
	if (i == val)
		return true;
	else
		return false;
}

int main(void)
{
	int m;
	scanf("%d", &m);
	
	if ( IsPrime(m) )
		printf("Yes!\n");
	else
		printf("No!\n");

	return 0;
}

函数的声明

# include <stdio.h>

void fmax(void); //函数声明, 分号不能丢掉

int main(void)
{
	fmax();

	return 0;
}

void fmax(void)
{
	printf("哈哈!\n");
}

注意

当函数没有返回值时,那么规范的写法是要在函数中写明void的。如果函数调用写在了函数定义的前面,则必须加函数前置声明。

代码示例

# include <stdio.h>

//void fmin(void);  //9行

void gmin(void)
{
	fmin();  //因为函数f的定义放在了调用f语句的后面,所有语法出错
}

void fmin(void)
{
	printf("哈哈!\n");
}

int main(void)
{
	gmin();

	return 0;
}

形参和实参的关系

  • 形参和实参个数是一一对应的。
  • 形参和实参的位置也是一一对应的。
  • 形参和实参的数据类型需要相互兼容。
# include <stdio.h>
void f(int i, float x)  //形参
{
	printf("%d\n", i);
}
int main(void)
{
	f(9.9, 6.6); //实际参数

	return 0;
}

案列1

判断一个数是否是素数

代码示例

# include <stdio.h>

//  判断一个数是否是素数
int main(void)
{
	int val;
	int i;

	scanf("%d", &val);
	for (i=2; i<val; ++i)
	{
		if (0 == val%i)
			break;
	}
	if (i == val)
		printf("Yes!\n");
	else
		printf("No!\n");

	return 0;
}

函数版代码示例

# include <stdio.h>
//  判断一个数是否是素数,函数实现

bool IsPrime(int val)
{
	int i;

	for (i=2; i<val; ++i)
	{
		if (0 == val%i)
			break;
	}
	if (i == val)
		return true;
	else
		return false;
}

int main(void)
{
	int val;
	int i;

	scanf("%d", &val);
    
	if ( IsPrime(val) )
		printf("Yes!\n");
	else
		printf("No!\n");

	return 0;
}

案例2

求1到某个数字之间(包括该数字)所有的素数。

代码示例

/*
求1到某个数字之间(包括该数字)所有的素数,并将其输出
只用main函数实现,有局限性:
	1. 代码的重用性不高
	2. 代码不容易理解		
*/
# include <stdio.h>
int main(void)
{
	int val;
	int i;
	int j;

	scanf("%d", &val);
	for (i=2; i<=val; ++i)
	{
		//判断i是否是素数,是输出,不是不输出
		for (j=2; j<i; ++j)
		{
			if (0 == i%j)
				break;
		}
		if (j == i)
			printf("%d\n", i);
	}
	return 0;
}

函数代码示例

/*
	用两个函数来实现求1到某个数字之间所有的素数,并将其输出
	代码量更少,可重用性更高
*/
# include <stdio.h>

//本函数的功能是: 判断m是否是素数,是返回true,不是返回false
bool IsPrime(int m)
{
	int i;
		
	for (i=2; i<m; ++i)
	{
		if (0 == m%i)
			break;
	}
	if (i == m)
		return true;
	else
		return false;

}

//本函数的功能是把1到n之间所有的素数在显示器上输出
void TraverseVal(int n)
{
	int i;

	for (i=2; i<=n; ++i)
	{
		if ( IsPrime(i) )
			printf("%d\n", i);
	}
}

int main(void)
{
	int val;
 
	scanf("%d", &val);
	TraverseVal(val);

	return 0;
}

变量的作用域

局部变量

局部变量
在一个函数内部定义的变量或者函数的形参,都统称为局部变量。
void f(int i)
{
    int j = 20;
}
i和j都是局部变量

局部变量的使用范围只能在本函数内部使用

全局变量

在所有函数外部定义的变量叫做全局变量。
全局变量使用范围:从定义位置开始到整个程序结束。

代码示例

# include <stdio.h>

/*
	一定要明白该程序为什么是错的,
	也要明白把9到12行代码放在14行后面,为什么程序就OK了
*/

void gmin()  //9
{
	printf("k = %d\n", k);
} //12

int k = 1000;  //14行

void fmax(void)
{
	gmin();
	printf("k = %d\n", k);
}

int main(void)
{
	fmax();
	return 0;
}

变量命名冲突

在同一个范围之内不能定义两个一样的局部变量

/*
在一个函数内部,如果定义的局部函数的名字和全局变量名一样时,
局部变量会屏蔽掉全局变量,上例中最终的输出结果是8。
因为局部变量把全局变量给屏蔽掉了
*/
# include <stdio.h>
int i = 99;

void fmax(int i)
{
	printf("i = %d\n", i);
}

int main(void)
{
	fmax(8);

	return 0;
}
posted @ 2020-05-17 14:18  guardwhy  阅读(668)  评论(0编辑  收藏  举报