ps:想直接看代码的可以移步到文章最下面
1.我们要得到一组同类型的数,首先想到的是用数组来存放。
2.实现从数组中找到这个最大值,并最终输出它。
1.初始化数组。任意-->自主输入-->scanf;
连续输入多个数据--> for循环语句
2.取到最大值。比较--> 判断语句if
取到最大值--> 设置中间变量max(用来寄存最大值)
遍历整个数组-->循环语句for
代码实现
首先我们要访问数组中的每一个元素,也就是要遍历数组
下面这个for循环是常用的遍历数组循环
#include
int main()
{
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]); //计算数组元素个数
for (i = 0; i < sz; i++) //通过数组元素下标的遍历来访问整个数组
{
scanf("%d",&arr[i]);
}
return 0;
}
tips:(解释数组元素个数计算的实现)
这里用到操作符sizeof来计算数组元素个数
sizeof是计算类型或者变量所占空间的大小
sizeof(arr)是计算整个数组所占空间大小,这里arr代表整个数组,注意和一般数组名代表首元素地址区分开。
sizeof(arr[0])计算数组中第一个元素所占空间大小。因为数组存放的都是同类型元素,所以计算其中的任意一个元素的大小都是一样的。
整个数组的数据所占空间的大小 ➗ 数组中单个元素所占空间大小 = 数组中包含的元素个数
这么写的好处是当你要输入其他数量的数字的数组的时候,不用挨个变更后续有关数组遍历的循环判断条件。比如要找到20个整数中的最大值是什么,只要变更初始化arr[20] = { 0 };即可
这里我们依旧要遍历整个数组,并在每一次循环中进行大小比较
#include
int main()
{
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
int max = 0; //放在外边,以保证存储的最大值不会被销毁
for (i = 1; i < sz; i++)
{
if (arr[i] > max) //如果遇到更大的数,将其赋值给max,更新最大值
{
max = arr[i];
}
}
printf("%d", max);
return 0;
}
这里要注意max的初始化要在使用它的for函数外部,这样max变量在一次循环结束后就不会被销毁,能接着与数组的下一个元素进行比较
我们运行下代码
欸嘿,代码运行成功!
但是!如果我将输入值换成{-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 } 阁下该如何应对?
运行代码后我们会发现坏事了,这里面有bug,得到的值并不是数组里面的最大值
其实问题就出在max的初始化上
Attention:
这里的max初始化不能赋值为0
举个简单的例子
从一组数据中选个最大值就好比从一个班级的人选出个最能打的,这时就要让班里的每两个人都切磋一下,能打的站在擂台上,和下一个人pk,这样一直下去到最后,最终站在擂台上的人就是最能打的。
但是这个时候如果不讲武德,直接找了个叶问过来站擂台,咔咔把上来的人全打趴下了。这时候最能打的是叶问,但是叶问不是这个班的啊。这就不符合我们最开始的目的了。
你看,我们将max初始化为0,比输入的每一个数都大,但得出的0并不是这个数组中的最大值。
虽然这样写在正整数范围内是可以正常运行并解决问题的,但是这样的代码在逻辑上存在漏洞。我们要做的是尽可能考虑到问题存在的情况,并在设计之初就解决,这样以后bug少了,也省事很多。
所以我们假设数组的第一个元素为最大值,就好比先让班长站在擂台上。这样一来比较的就都是数组内部自己的元素大小了。
#include
int main()
{
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
int max = arr[0];
for (i = 1; i < sz; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
printf("%d", max);
return 0;
}
这下不管是负数还是正数阁下都能正确得出结论啦
感谢您的阅读,若这篇文章能帮到您,那将是我莫大的幸福 。
当然,文章若有任何不足,欢迎批评指正。