好的我对编程非常陌生,我正在学习c ++课程。基本上对于当前项目,我必须采用未知大小的数组,调整大小,并输出一组统计数据,如平均值,Q1,Q3等。我无法从用户那里获取数组。一旦他们输入0,我就需要退出变量。这就是我所拥有的:
int i = 1; //When I first posted this I didn't mean to comment out the '= 1' part
do {
cin >> array[i];
if (array[i] != 0)
return true;
} while (true);
我做错了什么?无论我输入什么号码,每次输入1个号码后程序都会停止。
我正在使用矢量类btw。
答案 0 :(得分:2)
执行以下操作:
// change int to your type
int val;
std::vector<int> vec;
while(std::cin >> val) {
if(val == 0) break;
vec.push_back(val);
}
原因:声明一个return子句导致退出循环。
使用std::vector
可确保任意大小条件。
@ nonsensickle的建设性评论后更新:
以下代码也确保仅0终止输入过程条件:
// change int to your type
int val;
std::vector<int> vec;
do {
if(std::cin >> val) {
if(val == 0) break;
vec.push_back(val);
} else { // fix broken input stream in case of bad input
std::cin.clear();
std::cin.ignore(1,'\n');
}
} while(true);
和更复杂的方式,虽然矫枉过正,但到底是什么:),模板和类型特征:
template <typename T>
struct zero_traits
{
static T getzero() { return T(0); }
};
template <>
struct zero_traits<std::string>
{
static std::string getzero() { return "0"; }
};
template <>
struct zero_traits<char>
{
static char getzero() { return '0'; }
};
template <typename T>
std::vector<T> read_values()
{
T val;
std::vector<T> vec;
do {
if(std::cin >> val) {
if(val == zero_traits<T>::getzero()) break;
vec.push_back(val);
} else {
std::cin.clear();
std::cin.ignore(1,'\n');
}
} while(true);
return vec;
}
int main()
{
// change int to your type
std::vector<int> vec = read_values<int>();
for(auto i : vec) std::cout << i << std::endl;
}
答案 1 :(得分:1)
首先i
永远不会增加。
其次,如果该数组的值不等于0,if (array[i] != 0)
将return
。
您需要了解do { ... } while()
循环的工作方式以及return
语句的工作方式。当你在它的时候,还可以投入如何增加数组。
答案 2 :(得分:1)
在回答你的问题之前。
int i=0;
。您将i
指定为零,因为数组零索引。i
。如果不增加它,i
将始终指向数组中的第一个“桶”。在 do while 循环的每次迭代后使用i++
或i = i + 1
在阵列中向前移动。if (array[i] == 0) return true;
的条件。当输入的最后一个数字为零并且它将导致您的方法返回时,此条件为真。在while
子句中检查它会更优雅。总而言之,您的代码应如下所示
int i=0;
do {
cin >> array[i];
if (array[i] != 0) break;
i++;
} while (i < maxSize);
//do stuff with filled array
答案 3 :(得分:1)
我不会试图直接回答你的问题。你所拥有的是一个小的逻辑错误和对do {...} while ()
循环结构的误解。您需要学习如何逐步完成代码。
让我们逐行浏览你的代码(这里只有6行,所以它应该非常简单):
int i;
- 好的,我们在这里声明一个整数i
,但没有给它一个值。因此,i
可以具有随机值。do {
- 在我们评估while
子句时,我们将回到这里。但只有while子句的结果是true
。cin >> array[i]
- 存储用户在位置array
的{{1}}中输入的值。在这里,我们问自己一个问题,什么是i
?我们应该知道它的价值,而不必运行程序。 提示:由于i
i
- 如果用户输入的数字不为零 if (array[i] != 0)
(退出此功能并显示结果return true
)。true
- 返回} while (true);
行并重做所有步骤,直至到达此处。 这里没有任何条件,所以它会一直发生,直到我们退出此功能。提示:循环的唯一退出点是步骤4。
有了这个,你应该能够找出问题所在。试图为自己解决问题应该是你迈出的第一步。
我建议在调试小程序时阅读this blog post。它应该是提供信息。
虽然其他人(特别是@DimitriosBouzas)发布的代码可以使用,并且是更好的选择,但我强烈建议修复代码并了解失败的原因。从长远来看,这将比@DimitriosBouzas的优雅解决方案更有帮助。