采用>的元素; 0从1阵列到另一个

时间:2014-11-23 12:27:20

标签: c++

我让用户输入最大元素,然后将这些元素输入到第一个数组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");
}

2 个答案:

答案 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];
}

Live demo

还要了解如何使用std::vectorstd::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");
}