Программа на C++, которая получает 100 целых чисел и находит возможные отрицательные

Я пытаюсь написать код для программы на 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;
}

Спасибо и прошу прощения за возможные ошибки на английском языке.

6 ответов

Вот некоторые ошибки в коде:

  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 ;
        }
    }
}

Я предлагаю писать положительные числа в начале массива и отрицательные числа в конце массива.

Вот демонстрационная программа

#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, В этом случае вы можете исключить ситуации, когда одно отрицательное число соответствует нескольким положительным числам.:)

Вот небольшая модификация вашего кода, которая даст вам то, что вам нужно

#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. Модифицированный цикл для проверки номеров

Однако эта программа не идеальна. В идеале вы должны использовать что-то вроде Векторов, которые могут динамически расти. Кроме того, может быть лучше, чтобы пользователь ввел счетчик чисел, а не использовал дозорный номер, который он мог бы ввести в качестве ввода.

#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;       
}

Вы не уделяли достаточного внимания логике вашего кода. Я предполагаю, что вы новичок в этом, но никто не захочет ввести 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;
}

Если я правильно понимаю, вы хотите напечатать отрицательные, но с положительным знаком. С помощью этого простого кода вы можете сделать это!

#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;
}
Другие вопросы по тегам