Краткий ответ - ваша проверка дубликатов сравнивает только myArray[i]
и myArray[i - 1]
(поэтому он будет замечать только последовательные дубликаты).Вам нужно сравнить myArray[i]
со всем от myArray[0]
до myArray[i - 1]
.Но есть и другие проблемы, поэтому я написал, как бы я решил эту проблему с нуля.
Давайте проанализируем проблему немного подробнее, чтобы мы могли определить, что именно должно включать в себя решение.Эта проблема состоит из 3 основных частей:
- Позвольте пользователю ввести 20 цифр
- Числа должны быть от 10 до 100 (включительно).Если они вводят недопустимый номер, не уменьшайте оставшиеся номера
- Когда у них осталось 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]
.