十天学会C语言(day 5)

自学总结

  • 一、函数的基本概念与设计思想
    • 1.函数的定义与作用
    • 2.函数的三要素
  • 二、函数的定义与调用
    • 1.函数定义的类型
    • 2.参数传递机制
  • 三、函数的高级应用
    • 1.练习示例
    • 2.作业练习

一、函数的基本概念与设计思想

1.函数的定义与作用

定义:函数是完成特定功能的独立代码模块,遵循 “输入 - 处理 - 输出” 的逻辑模型,类似数学中的函数概念y = f(x)。

作用:避免重复编写相同逻辑(如多次计算最大值时只需定义一次函数)。

2.函数的三要素

(1)函数名

与变量一致(字母、数字、下划线,不能以数字开头),需直观体现功能(如calculateAverage表示计算平均值)。

(2)参数列表

输入数据的载体,可包含 0 个或多个参数,每个参数需指定类型(如int a, float b)。

(3)返回值

函数执行后的输出结果,通过return语句返回,类型由函数定义时指定(如int、float、void)。

注意:返回值类型必须与函数定义一致,否则会强制转换(可能导致精度损失或警告)。

二、函数的定义与调用

1.函数定义的类型

(1)无参数无返回值函数
格式:void 函数名() { 函数体; }

(2)有参数有返回值函数
格式:返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2) { 函数体; return 表达式; }

(3)空函数(占位函数)
格式:void 函数名() { }
作用:在程序设计阶段为规划的功能预留位置,后续再填充代码(如void futureFunction() { })。

(4)函数调用的规则
调用格式:函数名(实参列表);
示例:int sum = add(5, 3);

2.参数传递机制

(1)值传递
本质:实参将值复制给形参,形参与实参占用不同内存空间,修改形参不影响实参。
(2)局部变量
作用域:仅在函数内部可见,函数调用结束后内存自动释放。
示例:void func() { int x = 10; }(x仅在func内有效)。

三、函数的高级应用

1.练习示例

(1)函数嵌套调用
定义:一个函数调用另一个函数,形成多层调用结构。
案例:四数最大值

#include 


int compare_2(int m,int n);

int compare_1(int data_1,int data_2,int data_3,int data_4)
{
	int big_1;
	big_1=compare_2(data_1,data_2);
	big_1=compare_2(big_1,data_3);
	big_1=compare_2(big_1,data_4);
	
	return big_1;
}

int compare_2(int m,int n)
{
	int big_2;
	big_2=m>n?m:n;

	return big_2;
}

int main()
{
	int a,b,c,d;
	int max;
	
	printf("请输入四个数:\n");
	scanf("%d%d%d%d",&a,&b,&c,&d);
	max=compare_1(a,b,c,d);
	printf("最大值为:%d\n",max);

	return 0;
}

(2)函数递归调用
定义:函数直接或间接调用自身,需设置终止条件避免无限递归。
案例:计算 n 的阶乘(n! = n×(n-1)!)

#include 

int jiecheng(int n)
{
	int ret;
	if(n==1)
		ret=1;
	else
		ret=jiecheng(n-1)*n;

	return ret;
}

int main()
{
	int num,jie;
	
	printf("请输入要算的阶数:\n");
	scanf("%d",&jie);
	num=jiecheng(jie);
	printf("阶乘大小为:%d\n",num);
	

	return 0;
}

(3)数组作为函数参数
本质:传递数组首元素地址(指针),函数可通过地址访问和修改数组元素(共享内存)。
案例:计算数组平均值

#include 

void initarry(int arry[][4],int line,int row)
{
	int i,j;
	for(i=0;i<line;i++)
	{
		for(j=0;j<row;j++)
		{
			printf("请输入第%d行,第%d列的数据:\n",i+1,j+1);
			scanf("%d",&arry[i][j]);
		}
	}
	printf("输入完毕!\n\n");
}

void printfarry(int arry[][4],int line,int row)
{
	int i,j;
	for(i=0;i<line;i++)
	{
		for(j=0;j<row;j++)
		{
			printf("%d ",arry[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int getmax(int arry[][4],int line,int row)
{
	int i,j;
	int max;
	for(i=0;i<line;i++)
	{
		for(j=0;j<row;j++)
		{
			if(max<arry[i][j])
				max=arry[i][j];
		}
	}

	return max;
}


int main()
{
	int max;
	int arry[3][4];
	
	initarry(arry,3,4);
	printf("二维数组为:\n");
	printfarry(arry,3,4);
	max=getmax(arry,3,4);
	printf("最大值为:%d\n",max);

	return 0;
}

(4)两数最大值函数

#include 

int compare(int m,int n)
{
	int big;
	if(m>n)
		big=m;
	else
		big=n;
		
	return big;
}

int main()
{
	int x,y,z;
	
	printf("请输入两个数:\n");
	scanf("%d%d",&x,&y);
	z=compare(x,y);
	printf("两个数为:%d,%d,较大的数为:%d\n",x,y,z);

	return 0;
}

(5)班级平均分计算(数组传参)

#include 

void initclass(int arry[],int len)
{
	int i;
	for(i=0;i<len;i++)
	{
		printf("学生%d:\n",i+1);
		scanf("%d",&arry[i]);
	}
	printf("输入完毕!\n");

}

void outputclass(int arry[],int len)
{
	int i;
	printf("总人数有%d人!\n分数分别为:",len);
	for(i=0;i<len;i++)
	{
		printf("%d ",arry[i]);
		
	}
	printf("\n\n");
}

float getaverage(int arry[],int len)
{
	float average=0.0;
	int i,sum=0;
	for(i=0;i<len;i++)
	{
		sum=sum+arry[i];

	}
	average=(float)sum/len;
	
}

int main()
{
	int class_1[5];
	int class_2[8];
	int len_1,len_2;
	float average_1,average_2;
	
	len_1=sizeof(class_1)/sizeof(class_1[0]);
	len_2=sizeof(class_2)/sizeof(class_2[0]);
	
	printf("请输入一班学生的成绩!\n");
	initclass(class_1,len_1);
	outputclass(class_1,len_1);
	printf("请输入二班学生的成绩!\n");
	initclass(class_2,len_2);
	outputclass(class_2,len_2);
	
	average_1=getaverage(class_1,len_1);
	average_2=getaverage(class_2,len_2);
	
	printf("一班学生平均分为:%.2f\n",average_1);
	printf("二班学生平均分为:%.2f\n",average_2);
	

	return 0;
}

2.作业练习

找 10 个数的最大值及下标、封装冒泡排序函数

#include 

void initnum(int arry[],int len)
{
	int i;
	
	printf("请输入10个数:\n");
	for(i=0;i<len;i++)
	{
		scanf("%d",&arry[i]);
	}
	
}

void sortnum(int arry[],int len)
{
	int i,j,temp;
	for(i=0;i<len-1;i++)
	{
		for(j=0;j<len-1-i;j++)
		{
			if(arry[j]>arry[j+1])
			{
				temp=arry[j];
				arry[j]=arry[j+1];
				arry[j+1]=temp;
			}

		}
		
	}
	
}

int getmax(int arry[],int len)
{
	int i,max,grid;
	max=arry[0];
	
	for(i=0;i<len;i++)
	{
		if(max<arry[i])
		{
			max=arry[i];
			grid=i+1;
		}
		
	}
	printf("\n最大值为:%d,排在第%d个",max,grid);
	
	return max;
}

int main()
{
	int i;
	int max;
	int arry[10];

	initnum(arry,10);
	
	printf("排序前为:\n");
	for(i=0;i<10;i++)
	{
		printf("%d ",arry[i]);

	}
	
	max=getmax(arry,10);
	
	sortnum(arry,10);
	printf("\n排序后为:\n");
	for(i=0;i<10;i++)
	{
		printf("%d ",arry[i]);

	}	
		
	return 0;
}

你可能感兴趣的:(c语言,算法,开发语言)