用函数实现模块化程序设计(七)--数组作为函数参数(排序算法)
调用有参函数时,需要实参,实参可以是常量,变量,表达式,数组元素的作用与变量相当,凡是变量出现的地方都可用数组代替,数组元素可以用作函数实参,数组名可以作实参和形参,传递的是一个元素的地址。
文章目录
- 一、数组元素作为函数参数
- 二、数组名作为函数参数
- 选择排序算法
- 步骤分析
- 选择排序算法
- 总结
一、数组元素作为函数参数
数组元素可以用作函数实参,不能用于函数形参。
代码如下:
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;
}
再举个例子 :
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;
}
二、数组名作为函数参数
除了数组元素作为函数实参外,数组名不仅能够作为函数实参,也能做函数形参
代码如下:
//求学生的平均成绩
//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个整数按从小到大排序
代码如下(示例):
//对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元素并打印出来;
总结
主要学习了数组作为函数参数,数组名可以作为函数实参和形参,数组元素只能做函数实参,在数组名做函数参数时,传递的是数组第一个元素的地址。
学习了选择排序,拿一个数跟其它剩余的数比较,找到最大或最小。(选择排序比较绕,自己也理解代码理解了好久,分析出来了一些步骤,仅供参考。