用函数实现模块化程序设计(七)--数组作为函数参数(排序算法)

调用有参函数时,需要实参,实参可以是常量,变量,表达式,数组元素的作用与变量相当,凡是变量出现的地方都可用数组代替数组元素 可以用作函数实参 ,数组名可以作实参和形参,传递的是一个元素的地址。

文章目录


一、数组元素作为函数参数

数组元素可以用作函数实参,不能用于函数形参。


代码如下:

cs 复制代码
int main() 
{
	int i = 0;
	int arr[8] = { 1,2,8,9,19,2,98,1 };
	for (i = 0; i < 8; i++)
	{
		printf("%d ", arr[i]);//数组元素作为函数参数传递
	}
	return 0;
}

再举个例子 :

cs 复制代码
void print(int n)
{
	printf("%d ", n);//打印的n就是数组元素
}

int main()
{
	int i = 0;
	int arr[8] = { 1,2,8,9,19,2,98,1 };
	for (i = 0; i < 8; i++)
	{
		print(arr[i]);//这个地方把数组元素传给print
	}
	
	return 0;
}

二、数组名作为函数参数

除了数组元素作为函数实参外,数组名不仅能够作为函数实参,也能做函数形参


代码如下:

cs 复制代码
//求学生的平均成绩
//n是学生总人数
double score(int arr[],int n)
{
	int sum = 0;
	int i = 0;
	for (i = 0; i < n; i++)
	{
		sum += arr[i];//注意这个加的是每个元素的值而不是"i"的值
	}
	return (sum /1.0/n);
}
int main()
{
	double avg = 0;
	int arr[10] = { 1,4,8,20,18,11,20,18,0,48 };
	avg=score(arr, 10);
	printf("%lf", avg);
	return 0;
}
**注意:**sum在加的时候是arr[i]的值,不是i的值,i是元素标号

数组名作参数时,应该在被调用函数和主调函数中分别定义数组

数组名是数组中首元素的地址,传参时,也是传递的首元素地址,两个数组共占同一段内存单元

实参数组和形参数组类型应一致

形参中不用表明传几个元素,C语言编译系统不检查形参数组大小,只是将函数首地址传给了形参数组名

2.选择排序算法

对10个整数按从小到大排序


代码如下(示例):

cs 复制代码
//对10个整数从小到大排序
void paixu(int arr[], int n)//n代表元素个数
{
	int i = 0;
	for (i = 0; i <= n - 1; i++)
		//选择排序的次数(元素需要n-1次比较,同时元素下标最大也是n-1)
	{
		//在所有排序元素中找一个最小的和下标为i的元素进行交换
		int j = 0;
		int min = j;//min的起点是0

		for (j = i; j < n; j++)//元素个数
		{
			if (arr[j] < arr[min])
			{
				min = j;

			}
		}
		int tmp = arr[i];
		arr[i] = arr[min];
		arr[min] = tmp;
		printf("%d ", arr[i]);
	}
}
int main()
{
	int min = 0;
	int arr[10] = { 21,33,22,10,20,1,3,13,24,50 };
	paixu(arr, 10);
	return 0;

}

先使用for循环使元素标号一次一次的++,再for循环从剩下的元素里面找一个最小值的下标与下标为i的元素进行交换,最终输出数组i的下标


步骤分析:

j先从i开始,j刚开始为0,min的起点也为0;

j循环一直不停的执行找到最小值然后赋给外面的i元素;

给到i元素了之后最外层的循环才能再一次执行,不然就一直是j循环在执行找最小值;

把每一次执行得到的最小值传给min;

相当于min这个下标永远是剩下的元素中值最小的那个;

然后再把每一次执行得到的最小值传给i元素并打印出来;

总结

主要学习了数组作为函数参数,数组名可以作为函数实参和形参,数组元素只能做函数实参,在数组名做函数参数时,传递的是数组第一个元素的地址。

学习了选择排序,拿一个数跟其它剩余的数比较,找到最大或最小。(选择排序比较绕,自己也理解代码理解了好久,分析出来了一些步骤,仅供参考。

相关推荐
Lbs_gemini060328 分钟前
C++研发笔记14——C语言程序设计初阶学习笔记12
c语言·开发语言·c++·笔记·学习
霖大侠2 小时前
Adversarial Learning forSemi-Supervised Semantic Segmentation
人工智能·算法·机器学习
阿华的代码王国3 小时前
【算法】——前缀和(矩阵区域和详解,文末附)
java·开发语言·算法·前缀和
Sunyanhui13 小时前
力扣 LCR训练计划2(剑指 Offer 22. 链表中倒数第k个节点)-140
算法·leetcode·链表
yours_Gabriel3 小时前
【力扣】3274. 检查棋盘方格颜色是否相同
算法·leetcode
Chandler243 小时前
蓝桥杯经验分享
经验分享·算法·蓝桥杯
是老余3 小时前
算法基础之链表:移除链表元素leetcode203
数据结构·算法·链表
lzm159984955813 小时前
C# 多线程
c#
CQU_JIAKE3 小时前
3.29【机器学习】第五章作业&实现
人工智能·算法·机器学习
CQU_JIAKE4 小时前
3.27【机器学习】第五章作业&代码实现
人工智能·算法