我试图编写一个程序,以便从用户那里获得5个数字并输出第二个数字。
正如你所看到的,我调用一个函数来搜索max,然后我将每个等量设置为-999以在下一次搜索中省略它们,最后我们再次搜索剩余数字之间的最大数量。这将是第二大数字。
问题是,如果我不输出"最大值"变量(我称之为"第一个最大值"),然后最终输出为零!无论输入是什么!
我不知道为什么以及如何连接它们,但我们在这里!
#include <iostream>
using namespace std;
#include <conio.h>
int searching (int arrays [])
{
int max = 0;
for ( int i ; i < 5 ; i++ )
if ( arrays [i] > max )
max = arrays [i] ;
return max;
}
int main () {
int maximum;
int numbers [5];
for ( int i = 0 ; i < 5 ; i++ )
cin >> numbers [i];
maximum = searching (numbers);
cout << "First max : " << maximum << endl;
for ( int i ; i < 5 ; i++ )
if ( maximum == numbers [i] )
numbers [i] = -999 ;
cout << "Second max : " << searching (numbers);
getch();
return 0;
}
现在,如果我省略以下行,最终答案将为零:|
cout << "First max : " << maximum << endl;
令人困惑:|
(注意:我也非常感谢如何改进代码,无论如何都要感谢阅读。)
答案 0 :(得分:3)
你这样做了两次:
for ( int i ; i < 5 ; i++ )
// ^^^^^
您的i
未初始化。它可能不会从0开始。因此,您可以轻松地读取/写入不存在的数组元素。
这给你的程序未定义的行为 - 你违反了语言的合同和编译器的活动 - 无论是使用语言定义的合同执行优化,还是就一般的编译程序而言 - 已经导致你认为是一种奇怪的行为模式。
一般来说,这种模式 - 输入根据您是否在某个地方有std::cout
而神奇地改变 - 几乎总是表示未定义的行为。当你看到它时,检查你是否没有在某个地方溢出缓冲区或者读取未初始化的变量(包括验证你没有在没有任何错误检查的情况下输入用户输入失败)。
答案 1 :(得分:0)
实现这一目标的一种更简洁的方法是跟踪两个值:到目前为止看到的最大值,以及迄今为止看到的第二大值。当您完成循环时,如果arrays[i]
大于max
,请将max
复制到second_largest
,然后将arrays[i]
复制到max
;否则,如果arrays[i]
大于second_largest
,请将arrays[i]
复制到second_largest
。