我应该用C ++编写一个程序,它将以下列方式找到最多和最少n组数字:
第一个输入是正整数n = 5个元素的数字组。也就是说,我们希望每行有n行数字,5(实数)。
每组数字由5个数字组成,用空格键分隔。
因此,我们希望为n组中的每一组找到其最大值,最小值和算术平均值。
这是我的尝试:
<a class="accordion__title no-underline collapsed" data-toggle="collapse" data-parent="#accordion" href="uw-invloed/#collapse6" aria-expanded="false" aria-controls="collapse6">
Informerende / opiniërende bijeenkomsten
<svg class="shape shape--plus">
<use xlink:href="#shape--plus"></use>
</svg>
</a>
以下是将i,j = 1,i,j ++校正为i,j = 0并更改min和max的算法后发生的情况:
如您所见,此次计算正确完成,但循环仍存在问题。
你能告诉我我的解决方案有什么问题吗?我该如何解决?
确定!它的工作现在很精细!非常感谢你的帮助和耐心!
答案 0 :(得分:4)
如上所述,您的代码会导致未定义的行为,因为它会破坏堆栈内存。
float T[5];
for(i = 1; i <= 5; i++)
{
cin >> T[i];
}
这显然会导致未定义的行为。这可能是您的实际错误,也可能不是,但在修复此错误之前(此错误会重复多次,在以下代码中),您不能指望程序中存在任何已定义的行为。
答案 1 :(得分:1)
如果您为<a class="button" href="#openModal">SEND ▸</a>
输入2
,那么外部循环(n
)将运行两次,让您输入五个数字进行两次计算。那是你如何编码的。如果不应该那样,那么你需要重新思考一下你试图解决的问题的解决方案。
答案 2 :(得分:1)
float T[5];
for(i = 1; i <= 5; i++)
{
cin >> T[i];
}
每个数组都以索引0开头。
例如,如果声明一个整数数组,则说int a[10]
;
它的起始地址是1000。
然后内存位置如下:
对于第一个元素a[0] 1000+0*size of int
对于第二个元素a[1] 1000+1*size of int
对于第三个元素a[2] 1000+2*size of int
.......依此类推。
在这个示例中,您已经开始使用T[1]
,它正在启动address+1*size of float
,这在逻辑上是第二个元素
答案 3 :(得分:1)
根据您的代码,您必须在获得最大值,最小值和平均值后输入另一组数字。
答案 4 :(得分:1)
您目前有超出限制的访问权限(T[i + 2] > T[i + 3]
其中i == 3
)。
拆分子功能可能会有所帮助:
void max_min_mean_5()
{
float values[5];
for (auto& value : values) {
std::cin >> value;
}
const auto p = std::minmax_element(std::begin(values), std::end(values));
const auto mean = std::accumulate(std::begin(values), std::end(values), 0.f) / 5.f;
std::cout << *p.second << std::endl;
std::cout << *p.first << std::endl;
std::cout << mean << std::endl;
}
int main()
{
int n;
std::cin >> n;
for (int i = 0; i != n; ++i) {
max_min_mean_5();
}
}
答案 5 :(得分:-6)
变化
for(j=1; j<=n; j++)
到
for(j=1; j<=n; ++j)
由于j++
评估为之前的j
值,++j
会计算为刚增加的值。