当数组未满时,最小和最大函数返回乱码值



我需要创建一个程序,收集用户输入,直到用户按下0或输入了10个值。然后我需要创建一个函数,不使用内置来获得最小值和最大值。但是,当输入的值小于等于9时,最小值和最大值函数返回一个随机值。下面是我的代码:

#include <iostream>
using namespace std;
int getMin(int array[], int n);
int getMax(int array[], int n);
int main()
{
int array[10];
cout << "This program will ask the user to input various numbers (positive or negative but not zero) and perform basic statistics on these numbers.n";
for(int i=0; i<10; i++){
cout<<"nInput an integer: ";
cin>>array[i];
if(array[i]==0) {
break; 
}
}
int n = sizeof(array) / sizeof(array[0]);
cout << "Minimum element of array: " << getMin(array,n) << "n";
cout << "Maximum element of array: " << getMax(array,n);
return 0;
}
int getMin(int array[], int n)
{
int minimum = array[0];
for (int i = 1; i < n; i++)
if (minimum > array[i]) {
minimum=array[I];
}
return minimum;
}
int getMax(int array[], int n)
{
int maximum = array[0];
for (int i = 1; i < n; i++)
if (maximum < array[i]) {
maximum=array[I];
}
return maximum;
}

我如何使它,即使我输入少于10个值,它返回正确的最小值和最大值?

不存在不完整的数组当你像这样声明一个数组时:

int array[10];

它有10,int,永远都在里面,不管你喜欢与否。

你只是不知道它们是什么。最有可能的是,它们基本上是无意义的数字,一些来自系统的指针值转换为ints。如果你运气不好,你会得到零分。这是不幸的,而不是幸运的,因为你不会发现问题,下周老师评分时,他们可能不再是零了。

循环在读取0后停止。如果我输入5个数字1、2、3、4、5,那么数组就充满了

array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
array[4] = 5
array[5] = 0
array[6] = 2130374633
array[7] = -1845723111
array[8] = 346214765
array[9] = -678554534

例如。

当你的代码寻找最小值时,它会找到-1845723111,最大值是2130374633。

简单的解决方案是只看前5个数字。而不是int n = sizeof(array) / sizeof(array[0]);(它计算10,数组中整数的数量),您应该将n设置为用户输入的数字的数量。我不会为你写那个代码,因为它会做你的家庭作业,但它应该不会很难。

如果需要的话,您在少于10个值时中断循环,但仍然遍历整个数组。相反,你应该只迭代那些实际已经写入的值,读取其他值会导致未定义的行为,因为数组没有在这些位置初始化(因此包含你看到的'giberish'…)。

:

size_t n;
for(n = 0; n < sizeof(array)/sizeof(*array); ++n)
{
// use n instead of i
}
getMin(array, n);
getMax(array, n);

当用户输入0时,不存储该值,并停止读取任何其他值

if(array[i]==0) {
break; 
}

那么,在getMin和getMax函数中,你应该更新为

for (int i = 1; i < n; i++){
if(array[i] == 0)
break;
// your code to get min or max goes here
}

请注意,对于这种方法,数组不能为空(不能将第一个元素归零)