我的名字是马特。我是StackOverflow的新手,对C ++来说还是个新手。目前正在通过Lippman的C ++ Primer工作。
我正在书中练习,任务是读取向量中的整数,然后将这些整数乘以第一个,最后一个,第二个和第二个到最后一个,第三个和第三个等等。
我自己做了什么而没有找到任何东西,否则我几乎不知道我是否只是复制...我的程序编译并按预期行事。我的问题是:我做得对吗?有没有更有效的方法呢?
我不仅想学习如何制作工作代码,而且我想要正确地完成它。提前谢谢!
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using std::cout; using std::cin; using std::vector; using std::endl;
using std::string;
int main()
{
vector<int> numbers;
int usernum = 0;
cout << "Enter some numbers: ";
while (cin >> usernum)
{
numbers.push_back(usernum);
}
unsigned maxElement = numbers.size() - 1;
unsigned minElement = 0;
for (auto i : numbers)
{
cout << numbers[minElement] << " * " << numbers[maxElement] << " = " << numbers[minElement] * numbers[maxElement] << "\n";
++minElement;
--maxElement;
}
return 0;
}
答案 0 :(得分:1)
在评论中,你说:
我注意到它并没有像预期的那样实际工作。当maxElement一直到开始时,它通过向量并将所有内容相乘两次,并且minElement将结束。一旦它只进行了一次操作,就不知道如何阻止它。
如果您不想重复乘法,则需要稍微更改for
循环。
for ( ; minElement <= maxElement; ++minElement, --maxElement)
{
cout << numbers[minElement] << " * " << numbers[maxElement] << " = " << numbers[minElement] * numbers[maxElement] << "\n";
}
<强> PS 强>
使用此逻辑时,您需要确保minElement
和maxElement
具有签名类型。否则,如果numbers
只有一个元素,则会遇到问题。
答案 1 :(得分:0)
using namespace std::vector;
你可以公平地做using namespace std;
,因为你无论如何都要调用std :: vector:vector<int> numbers;
***。这适用于您使用的任何“已使用”命名空间。一劳永逸地做using namespace std;
。
***我不确定std :: vector / std :: cout / ...甚至是命名空间。 std - 是一个命名空间。 std :: vector应该是std命名空间下的一个类: namespace std
{
template<typename T> class vector<T> {...};
}
为什么它“按预期行事”。我不知道这个循环:while(cin >> usernum)
。你怎么知道用户输入何时完成?第一眼看到(我自己没有编译/运行)我期待它:
请改用:
for (int i = 0, end_of_vector = numbers.size(); i < end_of_vector/2; i++)
{
cout << numbers[i] << " * " << numbers[end_of_vector - 1 - i] << " = " << numbers[i] * numbers[end_of_vector - 1 - i] << "\n";
}
的理由:强>
for (auto i : numbers)
,预计会将i
用作numbers vector
的元素。但是你不这样做,而是按原样使用数字。因此,这个for循环是不明确的