-1

我正在尝试为 C++ 程序编写代码,该程序将获取一些数字(整数)并将它们放入一个 100 大小的数组中,并在用户之后开始搜索可能给定的负数(给定正数的负数)输入哨兵编号(101)。例如; 当我们将整数 1、45、12、-32、103、2015 和 32 给程序时,它应该给我们整数 32(因为它的负数形式存在),如果这个语句没有数字,那么它什么也不打印。我写了如下内容;但我不知道如何做其余的......任何帮助或建议表示赞赏。

我忘了说我使用 CodeBlocks 13.12 。

#include <iostream>

using namespace std;

int number = 0, nCounter = 0, sentinel = 101, i;
int myArray[100];

int main (){

cout << "Please enter your numbers: " << endl;

while ( number != 101 ){

  cin >> number;
  myArray[0]= number;
  nCounter += 1;

}

for ( i = 0; i <= nCounter; i++ ){
  if (myArray[i] > 0) // I'm stuck at here!
}

return 0;
}

谢谢,请为可能的英语错误道歉。

4

6 回答 6

2

以下是代码中的一些错误:

  1. 首先,您将所有输入元素分配给数组的第 0 个索引元素。

  2. 用户可以很好地给出 200 个元素而无需输入 101,在这种情况下,您将超出数组大小。

一个简单的算法应该是这样的:

  1. 选择第 i 个正元素并在整个数组中搜索其负元素。

  2. 对数组中每个可能的正元素重复 1。

是一个工作示例。

输入应该是这样的:

while ( (nCounter < 100) && (number != sentinel) ) {
    std::cin >> number;
    myArray[nCounter]= number;
    nCounter += 1;
}

和检查条件:

for ( i = 0; i < nCounter; i++ ){
    if (myArray[i] > 0) {
        for( j = 0; j < nCounter; j++) {
            if(myArray[i] + myArray[j] == 0) // positive and negative add up to 0
                std::cout << myArray[i] << std::endl ;
        }
    }
}
于 2015-03-07T16:04:52.873 回答
0

您没有对代码的逻辑给予足够的关注。我假设您对此很陌生,但是没有人会想在看到您的程序做什么之前输入 100 个输入。这是您的代码有什么问题:

#include <iostream>

using namespace std;

int number = 0, nCounter = 0, sentinel = 101, i; // OK
int myArray[100]; // OK, an array with 100 elements

int main (){

cout << "Please enter your numbers: " << endl;

while ( number != 101 ){  //this is where you got it wrong
        // this should have been nCounter instead of number
        // If you are looking at 100 elements then the condition 
        // should be "nCounter != 100"

  cin >> number;
  myArray[0]= number; // this should have been "myArray [nCounter]=number;"
  nCounter += 1;

}

for ( i = 0; i <= nCounter; i++ ){ // defining i from outer scope is unnecessary
                                            // since it is only used in the for loop
  if (myArray[i] > 0) // I'm stuck at here! // Put a semicolon here
// the remainder of the code probably here 
} 

return 0;
}
于 2015-03-07T16:39:45.693 回答
0

如果我理解正确,您想打印负数但带有正号。有了这个简单的代码,你就可以做到!

#include <iostream>

using namespace std;

int number = 0, nCounter = 0, sentinel = 101;
int myArray[100];

int main (){

    cout << "Please enter your numbers: " << endl;

    while ( (nCounter < 100) && (number != sentinel) ) {
        std::cin >> number;
        myArray[nCounter]= number;
        nCounter += 1;
    }

    for (int i = 0; i < nCounter; i++ ){
        if (myArray[i] < 0) {
            std::cout << (myArray[i] * -1) << std::endl ;
        }
    }

    return 0;
}

降低计算成本的简单更改如下:您可以尝试从阅读时给出的数字中获取信息

#include <iostream>
#include <vector>

using namespace std;

int number = 0, sentinel = 101;

int main (){

    cout << "Please enter your numbers: " << endl;

    vector<int> array;

    while (number != sentinel) {
        std::cin >> number;
        if(number < 0)
            array.push_back(number);
    }

    for (int i = 0; i < array.size(); i++ )
        std::cout << (array[i] * -1) << std::endl ;

    return 0;
}
于 2015-03-07T16:30:46.570 回答
0
#include<iostream>

using namespace std;


int main()
{
    //initialize size and empty array
    int size = 10, x;
    int myArray[10] = {};

    //enter integers into array
    for (int i = 0; i < size; i++)
    {
        cin >> myArray[i];
    }

    //search array for negative numbers
    for (int i = 0; i < size; i++)
    {
        if (myArray[i] < 0)
        {
            x = (myArray[i] * (-1));        //multiply by -1 to get (+)
            cout << x << ' ';
        }
    } 
    return 0;       
}
于 2015-03-07T16:47:21.697 回答
0

我建议在数组的开头写正数,在数组的末尾写负数。

这是一个演示程序

#include <iostream>

int main() 
{
    const size_t N = 100;
    const int SENTINEL = 101;
    int a[N];

    int number;
    size_t positive_end   = 0;
    size_t negative_begin = N;

    for ( size_t i = 0; i < N && std::cin >> number && number != SENTINEL; i++ )
    {
        if ( number < 0 )
        {
            a[--negative_begin] = number;
        }
        else
        {
            a[positive_end++] = number;
        }
    }

    if ( positive_end != 0 && negative_begin != N )
    {
        for ( size_t i = 0; i < positive_end; i++ )
        {
            size_t j = negative_begin;
            while ( j != N && a[i] + a[j] != 0 ) ++j;

            if ( j != N ) std::cout << a[i] << '\t' << a[j] << std::endl;
        }
    }

    return 0;
}

如果例如输入以下数字序列

1 2 -3 4 -5 6 7 3 -9 9 101

那么输出将是

3   -3
9   -9

您也可以对数组的每个部分(正数部分和负数部分)进行排序并应用标准算法std::set_intersection。在这种情况下,您可以排除一个负数对应多个正数的情况。:)

于 2015-03-07T16:25:48.847 回答
0

这是对您的代码的轻微修改,它将为您提供所需的东西

#include <iostream>

using namespace std;

int number = 0, nCounter = 0, sentinel = 101, i, negMatch;
int myArray[100];

int main (){

cout << "Please enter your numbers: " << endl;

while ( number != 101 ){

  cin >> number;
  myArray[nCounter]= number;
  nCounter += 1;

}

cout << "Enter the number to negative match";
cin >> negMatch;

for ( i = 0; i < nCounter; i++ ){
  if ( (myArray[i] + negMatch) == 0) {
    cout << myArray[i];
    return 0;
  }
}

return 0;
}

请注意以下更改:

  1. 您将所有元素插入到第一个插槽中,我对其进行了更改,以便您将它们输入到正确的位置
  2. 获取要匹配的数字作为输入(在您的问题中,negMatch 为“32”)
  3. 修改循环以检查数字

但是,这个程序并不理想。理想情况下,您会使用可以动态增长的 Vectors 之类的东西。此外,让用户输入数字的计数可能会更好,而不是使用他可能想要作为输入的哨兵数字。

于 2015-03-07T16:11:04.657 回答