产生数组最大值

@[TOC]

今日风和日丽,是个写( )博客的绝佳时机

和大家分享一串C语言中产生数组中的元素的最大值的代码

实现方式很简单,我们需要用到for循环和if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//数组初始化
int max = 0;//设置一个最大值
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
for (i = 0; i < sz; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
printf("max = %d\n", max);
return 0;
}

当我们运行代码的时候,输出的结果是10

image-20210827081954964

看样子我们成功输出了数组的最大值,这串代码已经完成了,对不对?

但实际上这串代码是有问题的

先别往下滑,想想它的问题出在那里了呢?

——————————————————

正负性

当我们把数组里面的数字全部改成负数的时候

你会发现输出的结果等于0,并不是数组内的最大值-1

image-20210827082631299

出现这个情况的原理十分简单,我们设定的int max = 0,而0>-1,输出的结果也自然是0了

解决这个问题的方法也非常简单

如果我们数组内的数全部小于0,那我们就设定MAX=数组内的某个数字,然后再进行比较,输出最大值不就行了?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
int arr[] = { -1,-2,-3,-4,-5,-6,-7,-8,-9,-10 };
int max = arr[0];//arr[0]对应数组中第一个数的下标
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
printf("max = %d\n", max);
return 0;
}
  • 避免不同数组的元素个数不同,max应该设置为arr[0]而不是arr[3]或者arr[5]

这时候再次运行我们的代码,可以看到结果已经正确的显示为-1了

image-20210827083256743

进阶玩法

以自定义函数的形式实现此功能

使用自定义函数的时候,我们需要注意一个问题

那就是我博客之前写到过的 《传址调用和传值调用》

先把我们的主函数改造一番

1
2
3
4
5
6
7
8
9
int main()
{
int arr[] ={ -1,-2,-3,-4,-5,-6,-7,-8,-9,-10 };
int max = arr[0];
int sz = sizeof(arr) / sizeof(arr[0]);
sp(arr, sz,&max);
printf("max = %d\n", max);
return 0;
}

其中sp就是我们要编写的自定义函数

因为自定义函数中的步骤需要改变我们主函数中的max,这里我们需要用取地址符,也就是传址调用

1
sp(arr, sz,&max);//&max是传址调用

同样的,我们的自定义函数也需要使用int*来接收max的地址

1
2
3
4
5
6
7
8
9
10
11
void sp(int arr[], int sz,int* pm)
{
int i = 0;
for (i = 0; i < sz; i++)
{
if (arr[i] > *pm)
{
*pm = arr[i];
}
}
}

运行结果正确

image-20210827084737437

结语

在制作自定义函数的时候,需要注意传调用和传调用的区别。具体介绍参考我之前的博客 [链接]

感谢你看到最后,如果对你有帮助的话,点个赞再走呗!

(没有帮助也可以点点赞~)