[C语言]菜鸟的一些理解-函数

函数(模块化编程)

 

函数是程序实现模块化编程的基本单元,一般函数是某一中特定功能的语句集合。

 

如果说工厂是一个程序,那么函数就是该工厂的部门。

每个部门都有它特定的工序(功能)。

 

1.一个程序中是由一个或多个源文件组成。

好比编写一个大型网络游戏,代码不是1001000行,那是上万,上亿行,那就不可能靠一个源文件来储存,而是分成若干个源文件,在由若干个源文件组成一个C程序。

这样便于分别编辑,分别编译,提高调试效率。一个源文件可以被多个C语言共用。

 

2.一个源文件是由一个或多个函数组成。一个源文件是一个编译单位,在编译时是一个源文件作为单位来编译,而不是以函数作为编译单位。

 

3.C程序是从main函数开始的,main函数以后可以调用函数,而函数不可调用main函数,因为mian函数是系统调用的。

 

4.所有的函数都平行,平等的,定义是分别定义的,是互相独立,函数不能嵌套定义(就是在例外的函数内定义)。但是可以相互调用。但不调用main函数。

 

从我们的角度来看有两种函数

 

1.标准函数(库函数),由系统提供。

如果把系统看社会,那么人就是一个程序,而库函数就社会提供给我们的一些服务。如:银行,派出所。

 

2.自定义函数。

就是我们自己定义的函数,也就是你自己开福利店(自定义函数)了,为别人(程序)服务。(不过是要钱的,呵呵)

 

从函数的角度来看有四种。

有返回值    无返回值

有形参      无形参

 

有返回值,有参数:int a(int x,int y);

无返回值,无参数:void a(void);

 

函数的作用:

1.代码优化,防止重复代码。提高开发效率。

2、实现模块编程

什么是模块化编程?就像我们写一篇文章一样,要分大段落,小段落。编程也一样。

 

 

函数的声明与定义

函数是声明确定了一个函数的接口(入口),告诉编译器该函数的函数名,返回类型,以及形参列表中的形参个数和顺序。

 

函数的定义则是建立了一个函数的功能,包含了声明的所以信息。

 

函数的声明是由:返回值类型   函数名  形参列表组成。

int max(int x,int y);//声明一个返回值为int型的函数

 

函数的定义是由:函数的声明  返回值类型 函数名 (形参列表) 函数体(函数操作)组成。

int max(int x, int y)//可以理解为函数头

{

/*函数体*/

函数操作;

return 语句;

}

 

int 函数的返回类型,也是函数的出口。

 

max 函数名,也是函数的标识符,其命名规则与变量一样。

 

(int x, int y);  小括号内是形参列表,

int x, int y    形参,表示该函数有两个为int型的形参。也是函数的入口。

 

 

函数与模块化编程

 

函数名对应模块名。

返回值对应模块出口。

形参对应模块入口。

函数操作对应模块功能。

 

函数的调用

跟库函数的调用方式是大致相同的。

函数的标准调用如下:

函数名(实参列表);

1.函数名指的的被调用的函数的名称。

2.实参要和形参对应,如:形参有两个,那么实参必须也是两个

3.无参函数调用不可省略小括号。如:print();

4.调用时确保形参和实参的类型是一类的,否则编译器会自动进行强制转换,如果转换失败,那么,这个函数调用就是错误的。

举例:

#include <stdio.h>
 
int max(int x,int y)
{
	if(x > y)
		return x;
	else
	return y;
}
 
int main(void)
{
	int i = 10;
	double f = 9.2;
	int z[3] = {0};
	max(i,f);//正确。double 类型可以转换成功 
	max(i);//错误,实参只有一个,而max函数声明的形参是两个。实参和形参不匹配。 
	max(i,z);//错误,z是数组,转换失败。 
	max(i,f,z);//错误,实参有三个,而max函数声明的形参是两个,多出一个,不匹配。 
	return 0;
}

嵌套调用

就是在一个函数中调用另一个函数

#include <stdio.h>
 
void func_1(int i)
{
	printf("———————\n");
	printf("开始-func_1\n");
	printf("操作-func_1\n");
	printf("结束-func_1\n");
	printf("———————\n");
}
 
void func_2(int i)
{
	printf("************\n");
	printf("开始-func_2\n");
	printf("操作-func_2\n");
	func_1(i);//在func_2函数中调用func_1函数
	printf("结束-func_2\n");
	printf("************\n");
}
 
int main(void)
{
	int i = 0;
	printf("+++++++++++++\n");
	printf("开始-mian\n");
	printf("操作-mian\n");
	func_2(i);//在main函数中调用func_2函数.
	printf("结束-mian\n");
	printf("+++++++++++++\n");
	return 0;
}

函数的递归

 

可分直接递归和间接递归

直接递归:

就是调用自己本身,函数A  调用  函数A

 

间接递归

函数调用 函数调用 函数A

 

我能理解他的概念(其实跟循环差不多)

但是我就是不理解他的执行方式和控制递归的结束。

菜鸟请求指点。或推荐点资料给我。谢谢

 

函数的应用

 

 

1.使用函数实现打印数组和转置数组。

#include <stdio.h>
#define N 3
 
void print(int array_1[N][N])
{
	int i = 0;
	int j = 0;
	for(i = 0;i < N;++i)
	{
		for(j = 0;j < N;++j)
			printf("%d\t",array_1[i][j]);
		printf("\n");
	}
}
 
void turn(int array_2[N][N])
{
	int i = 0;
	int j = 0;
	int t = 0;
	for(i = 0;i < N;++i)
	{
		for(j = i + 1;j < N;++j)
		{
			t = array_2[j][i];
			array_2[j][i] = array_2[i][j];
			array_2[i][j] = t;
		}
	}
}
 
int main(void)
{
	int array[N][N] = {1,2,3,4,5,6,7,8,9};
	printf("翻转前:\n");
	print(array);
	printf("翻转后:\n");
	turn(array);
	print(array); 
	return 0;
}

 

2.验证形参和实参的关系。

#include <stdio.h>
 
int a(int x,int y)
{
	int t = 0;
	t = x;
	x = y;
	y = t;
	printf("a\n");
	printf("x = %d\ny = %d\n",x,y);
}
 
int main(void)
{
	int i = 10;
	int j = 8;
	a(i,j);
	printf("main\n");
	printf("i = %d\nj = %d\n",i,j);
	return 0;
}

运行结果:

 

a

x = 8

y = 10

main

i = 10

j = 8

请按任意键继续. . .

 

为什么没有转换i 和 j的值呢?

因为形参跟实参是不相等的,不是同一个存储空间,

当程序执行函数时程序会为函数中的变量分配存储空间。

当函数结束时,这些变量也不存在了。

 

3.使用函数实现在数组中查找一个数。查找成功返回该数的位置,失败返回0

#include <stdio.h>
 
int a(int x,int y)
{
	int t = 0;
	t = x;
	x = y;
	y = t;
	printf("a\n");
	printf("x = %d\ny = %d\n",x,y);
}
 
int main(void)
{
	int i = 10;
	int j = 8;
	a(i,j);
	printf("main\n");
	printf("i = %d\nj = %d\n",i,j);
	return 0;
}

 

 

4.使用函数实现删除字符串的一个元素。

#include <stdio.h>
#include <string.h>
#define N 100
 
int Delete(char str1[N],int Dec,int len1)
{
	int i = 0;
	int head = 0;
	for(i = 0;i < len1;++i)
	{
		if(Dec == str1[i])
 				break;
	}
	head = i;
	while(str1[head] != '\0')
	{
		str1[head] = str1[head + 1];
		++head;
	}
}
int main(void)
{
	int i = 0;
	int len = 0;
	char c = 0;
	char str[N];
	len = strlen(str);
	printf("请输入一个字符串:");
	gets(str);
	printf("请输入你删除的字符:");
	scanf("%c",&c); 
 		Delete(str,c,len);
 
	printf("输出删除后的字符串:\n");
	puts(str);
	return 0;
}

5.编写一个函数,要求输入一个判断是否为质数(只可以跟1和自身整除)。

#include <stdio.h>
 
int judge(int num)//判断
{
	int i = 0;
	for(i = 2;i < num;++i)
	{
		if(0 == num % i)//可以被>num 的整除,证明不是质数
			return 0;
	}
	if(i == num)
		return 1;
}
int main(void)
{
	int i = 0;
	int num_1 = 0;
	printf("请输入一个数:\n");
	scanf("%d",&num_1);
	if( 0 == judge(num_1) )
		printf("N0!\n");
	else
		printf("YES!\n");
	return 0;
}

 

6.编写一个函数,判断一个字符在字符串出现的次数,如果不出现,则返回0.

#include <stdio.h>
#include <string.h>
#define N 100
 
int inquiry(char str_1[N],char c1,int len_1)
{
	int i = 0;
	int count = 0;
	for(i = 0;i < len_1;++i)
{
	if( c1 == str_1[i] )
		++count;
}
	return count;
}
int main(void)
{
	 char c = 0;
 	char str[N];
	 int t = 0;
	int len  = 0;
 
 	printf("请输入一个字符串:");
 	gets(str);
 
 	len = strlen(str);
	 printf("请输入你要查询的字符:"); 
 	scanf("%c",&c);
 
 	printf( "出现的次数为[%d].\n",inquiry(str,c,len) );
 	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值