我让用户输入最大元素,然后将这些元素输入到第一个数组p
中,然后我想只获取大于0的元素并将它们传递给新数组w
。这是代码,我错误地在哪里:
void main(){
int p[10], w[10], n,i,j;
cout << "Maximum elements: "; cin >> n;
for (i = 0; i < n; i++){
cout << "Enter " << i << "-nd element"; cin >> p[i];
}
j = 0;
for (i = 0; i < n; i++){
if (p[i] > 0){
w[j] = p[i];
j++;
}
for (j = 0; j < n; j++){
cout << w[j];
}
}
system("pause");
}
答案 0 :(得分:1)
在:
for (i = 0; i < n; i++){
if (p[i] > 0){
w[j] = p[i];
j++;
}
for (j = 0; j < n; j++){
cout << w[j];
}
}
内部循环正在打印数组w
的每个元素。该循环是针对p
的每个元素执行的(在外部for
循环内)。
这意味着,例如,第一次访问p
以检查第一个元素是否为0
时,它可能会分配w[0]
然后继续打印所有元素w
。问题是w
在那时没有初始化,所以你看到的是随机垃圾(可能)。
只需将循环移到外面并使其只显示填充的数组部分:
for (i = 0; i < n; i++){
if (p[i] > 0){
w[j] = p[i];
j++;
}
}
for (int k = 0; k < j; k++){
cout << w[k];
}
还要了解如何使用std::vector
或std::array
以及<algorithm>
中的算法。
另请注意,main
的回复类型为int
。
答案 1 :(得分:0)
使用std::copy_if
中的<algorithm>
执行您想要的工作,如http://www.cplusplus.com/reference/algorithm/copy_if/中提供的示例所示:
// copy_if example
#include <iostream> // std::cout
#include <algorithm> // std::copy_if, std::distance
#include <vector> // std::vector
int main () {
std::vector<int> foo = {25,15,5,-5,-15};
std::vector<int> bar (foo.size());
// copy only positive numbers:
auto it = std::copy_if (foo.begin(), foo.end(), bar.begin(), [](int i){return !(i<0);} );
bar.resize(std::distance(bar.begin(),it)); // shrink container to new size
std::cout << "bar contains:";
for (int& x: bar) std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
对于您的代码,问题是您在打印循环中修改j
,而它主要用作输出索引。尝试减少局部变量的范围以找出那些问题,创建子函数也可能有所帮助。
Finnaly,您的固定代码可能类似于:
void main(){
std::cout << "Maximum elements: ";
int n;
std::cin >> n;
int p[10];
for (int i = 0; i < n; i++){
std::cout << "Enter " << i << "-nd element";
std::cin >> p[i];
}
int w[10];
int w_size = 0;
for (int i = 0; i < n; i++){
if (p[i] > 0){
w[w_size] = p[i];
w_size++;
}
}
for (int i = 0; i < w_size; i++){
std::cout << w[i];
}
system("pause");
}