我正在编写代码并在Codecademy上学习一些C ++。我已经编写了以下代码作为使用向量的练习的一部分,我必须编写一个程序,在向量中找到偶数和和奇数的乘积
#include <iostream>
#include <vector>
int main() {
//Declaring variables
int i, sum = 0;
int product = 1;
std::vector<int> example = {2,4,3,6,1,8};
//Loop for calculations
for (i = 0; i <= example.size(); i++)
{
if (example[i] % 2 == 0)
{
sum = sum + example[i];
}
else
{
product = product * example[i];
}
}
std::cout << "Sum of even numbers: " << sum << "\n";
std::cout << "Product of odd numbers: "<< product << "\n";
}
关于这段小代码的事情是,奇数乘积的输出是396147。
删除第6个元素会产生正确的结果,因为我看到的输出是3(这是我应该得到的输出,因为我没有更改向量中的奇数的数量)。
类似地,ADDING元素也可以让程序打印出正确的数字,这让我觉得只要我有6个元素就可以计算出向量中奇数的乘积。
请注意,无论元素的数量如何,计算向量中偶数的总和都是合适的。
不同载体的输出示例:
具有6个元素的向量:std :: vector example = {2,4,3,6,1,9}; - >奇数乘积的输出为3565323。
std :: vector example = {2,4,3,6,1,5}; - >奇数乘积的输出是1980735。
带有5个元素的向量:std :: vector example = {2,4,3,6,1}; - >奇数乘积的输出为3。
向量与7个元素:std :: vector example = {2,4,3,6,1,4,8}; - >奇数乘积的输出是1980735。
知道为什么会这样吗?谢谢。
你的循环中有一个越界访问:
for (i = 0; i <= example.size(); i++)
// ^^ this is the bug
因为这是索引的工作原理:
std::vector<int> example = {2, 4, 3, 6, 1, 8};
// indices: 0 1 2 3 4 5
很明显example.size()
,在这个例子中是6
,在容器之外。循环应该更改为
for (std::size_t i = 0; i < example.size(); i++)
好像i = example.size()
,example[i]
产生不确定的行为。还要注意,我已经缩小了循环计数器i
的范围,它可以在for循环的init-part中声明,并将其类型更改为std::size_t
,这是用于索引标准库容器的实际类型。
它应该是for (i = 0; i < example.size(); i++)
,因为数组/向量索引从0
开始,最后一个条目有索引size()-1
。
使用向量循环中的问题,因此任何数组或向量都是从第0个索引分配并移动到(n-1)最后一个索引
#include <vector>
int main() {
//Declaring variables
int i, sum = 0;
int product = 1;
std::vector<int> example = {2,4,3,6,1,8};
//Loop for calculations
for (i = 0; i < example.size(); i++)
{
if (example[i] % 2 == 0)
{
sum = sum + example[i];
}
else
{
product = product * example[i];
}
}
std::cout << "Sum of even numbers: " << sum << "\n";
std::cout << "Product of odd numbers: "<< product << "\n";
}