Печать массива в определенном диапазоне - PullRequest
0 голосов
/ 07 февраля 2019

Я писал программу, которая говорит: читать с клавиатуры 20 цифр, каждая из которых должна быть от 10 до 100 включительно.Если пользователь вводит какое-либо число вне ожидаемого диапазона, вы должны повторно запрашивать новое значение, пока оно не станет приемлемым.Поскольку каждое число прочитано, распечатайте его, только если оно не является дубликатом уже прочитанного числа.Обратите внимание, что один и тот же номер может быть введен в 20 раз дольше, чем в нужном диапазоне.Однако, если это произойдет, номер будет напечатан только один раз, потому что остальные дубликаты.Часть, с которой у меня были проблемы, заключалась в печати числа только один раз, если многие из них были введены (в пределах диапазона, конечно).Это то, что у меня пока есть:

включает

int main()
{
    int SIZE{20};
    int myArray[SIZE]{0};

    for(int i{0}; i < SIZE; ++i)
    {
        while((myArray[i] < 10) || (myArray[i] > 100))
        {
            std::cout << "Enter a number: ";
            std::cin >> myArray[i];

            if(myArray[i] == myArray[i - 1])
            {
                std::cout << "Enter a number: ";
                std::cin >> myArray[i];
            }
        }
    }

    for(int i{0}; i < SIZE; ++i)
        std::cout << myArray[i] << " ";

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Краткий ответ - ваша проверка дубликатов сравнивает только myArray[i] и myArray[i - 1] (поэтому он будет замечать только последовательные дубликаты).Вам нужно сравнить myArray[i] со всем от myArray[0] до myArray[i - 1].Но есть и другие проблемы, поэтому я написал, как бы я решил эту проблему с нуля.

Давайте проанализируем проблему немного подробнее, чтобы мы могли определить, что именно должно включать в себя решение.Эта проблема состоит из 3 основных частей:

  1. Позвольте пользователю ввести 20 цифр
  2. Числа должны быть от 10 до 100 (включительно).Если они вводят недопустимый номер, не уменьшайте оставшиеся номера
  3. Когда у них осталось 0 номеров, напечатайте все введенные уникальные номера.

Сначала - мы повторяемпроцесс ввода, пока они не ввели 20 номеров.Это звучит как петля.

const int SIZE = 20;
int myArray[SIZE];
for (int i = 0; i < 20; ++i)
{
    std::cout << "\nEnter a number: ";
    std::cin >> myArray[i];
}

Во-вторых, число должно быть от 10 до 100 (включительно).Таким образом, мы увеличиваем индекс, только если их входные данные были действительными.Хм, сейчас у нас есть цикл for, который увеличивается на каждой итерации.Давайте изменим это на цикл while и будем увеличивать его, только если их ввод был действительным.

const int SIZE = 20;
int myArray[SIZE];
while (i < SIZE)
{
    std::cout << "\nEnter a number: ";
    std::cin >> myArray[i];
    if (myArray[i] >= 10 && myArray[i] <= 100)
        ++i;
}

Далее - когда у них заканчиваются числа, выведите все уникальные числа.Вот мое решение этого вопроса:

const int SIZE = 20;
int myArray[SIZE];
bool repeat = false;
int i = 0; //# of valid numbers entered so far
int j = 0; //array index
while (i < SIZE)
{
    std::cout << "\nEnter a number: ";
    std::cin >> myArray[j];
    //if the number was valid
    if (myArray[j] >= 10 && myArray[j] <= 100)
    {
        //check if it was unique.
        repeat = false;
        for (int k = 0; k < j; ++k)
        {
            if (myArray[k] == myArray[j])
            {
                repeat = true;
                break;
            }
        }
        //if the number was unique, increment the array index
        if (!repeat)
            ++j;
        ++i;
    }
}

//finally, print out every number in the array
for (int k = 0; k < j; ++k)
    std::cout << myArray[k] << std::endl;

Мы отслеживаем оставшиеся записи (i) и индекс массива (j) отдельно.Если их ввод действителен, увеличьте i.Затем проверьте правильность этого ввода, просматривая индексы от 0 до j - 1.Если мы найдем дубликат, установите флаг repeat в значение true и выйдите из цикла.После того, как мы проверили каждую запись, если repeat все еще равно false, это уникальное значение;приращение j.Когда у них закончились записи, выведите все от myArray[0] до myArray[j - 1].

0 голосов
/ 07 февраля 2019

Один из способов сделать это - создать набор со всеми значениями вашего массива, а затем распечатать только значения набора.std::set объект будет хранить только один уникальный экземпляр для каждого значения, как он предназначен для этого.

#include <cstdio>
#include <string>
#include <iostream>
#include <set>

int main() {

  int SIZE{20};
  int myArray[SIZE]{0};

  for(int i{0}; i < SIZE; ++i)
  {
      while((myArray[i] < 10) || (myArray[i] > 100))
      {
          std::cout << "Enter a number: ";
          std::cin >> myArray[i];

          if(myArray[i] == myArray[i - 1])
          {
              std::cout << "Enter a number: ";
              std::cin >> myArray[i];
          }
      }
  }

  // Set declaration
  std::set<int> uniqueValues;
  for(int i{0}; i < SIZE; ++i)
      uniqueValues.insert(myArray[i]);

  // Printing set values
  for(auto itr = uniqueValues.begin(); itr != uniqueValues.end(); ++itr)
      std::cout << *itr << " ";

  return 0;
}
...