Как проверить два массива, случайно сгенерированный и введенный пользователем массив в c

#c #algorithm

#c #алгоритм

Вопрос:

Я пытаюсь проверить каждое значение двух массивов, которые содержат 5 значений, чтобы увидеть, есть ли совпадения.

Например, случайный массив из {3,5,2,6,8} и сгенерированный пользователем массив из {3,2,2,5,9}. В этом случае было бы два совпадения.

Цель этой программы — проверить случайный массив, сравнить его с пользовательским массивом и вернуть количество совпадений.

Проблема: я могу сгенерировать случайный массив, но я застрял, пытаясь проверить наличие любых совпадающих чисел и вывести это число в функции main

Вот мой код на данный момент:

 #include <iostream>
#include <ctime> //for time() function
using namespace std;

void generateNumbers(int arrLotto[], int arrSize) {
srand(static_cast<unsigned int>(time(0)));

for (int i = 0; i < arrSize; i  ) {
    int rnum = (rand() % (10));
    arrLotto[i] = rnum;
    cout << arrLotto[i] << " ";
}
}

int findMatches(const int arrLotto[], const int arrUser[], int arrSize) 
{
int matchCount = 0;

for (int i = 0; i < arrSize; i  ) {
    if (arrLotto[i] == arrUser[i]) {
        matchCount  ;
    }
    return matchCount;
}
}


int main() {

int rnum;
int arrLotto[5];
int arrUser[5];
int arrSize = 5;
int matchCount = findMatches(arrLotto, arrUser, arrSize);

//prompt user for lotto numbers
cout << "Enter your 5 lottery number picks (0-9)n" << endl;
for (int i = 0; i < 5; i  ) {
    cout << "Number " << i 1 << ": ";
    cin >> arrUser[i];
}

//display Lotto numbers
cout << "nLottery Numbers" << endl;
generateNumbers(arrLotto, arrSize);


//display array user numbers
cout << "nYour Numbers" << endl;
for (int i = 0; i < 5; i  ) {
    cout << arrUser[i] << " ";
}
cout << endl;

//display matches
    cout << "nYou matched " << matchCount << " numbers" << endl;

    if(matchCount == 5)
    cout << "You are a grand winner" << endl;


return EXIT_SUCCESS;
}
  

Комментарии:

1. Почему совпадений всего два? Оба массива имеют по 3 одинаковых значения.

2. @NathanOliver ??? В этом моя проблема, я не могу проверить, есть ли какие-либо совпадения, а затем вывести это количество совпадений

3. Это не ваша проблема, я просто пытаюсь определить логику. Вы указываете , например, случайный массив из {3,5,2,6,8} и сгенерированный пользователем массив из {3,2,2,5,9}. В этом случае было бы два совпадения , и я хотел бы знать, почему совпадений всего 2, когда оба массива содержат 3,5 и 2, поэтому должно быть 3 совпадения. Я просто пытаюсь понять, как должен вести себя код.

4. @NathanOliver для того, чтобы произошло совпадение, имеет значение местоположение. Несмотря на то, что 3,5,2 оба содержатся в каждом массиве, только 3 и 2 встречаются в одном и том же месте в обоих массивах. Надеюсь, это прояснит ситуацию.

Ответ №1:

Несколько проблем с кодом:

  • Вы вызываете findMatches функцию перед заполнением введенного пользователем массива и заполнением случайно сгенерированного массива.

    Таким образом, совпадения (если таковые имеются) будут случайными и непредсказуемыми. Не говоря уже о том, что ваша программа имеет неопределенное поведение из-за доступа к неинициализированным переменным.

    Вызовите findMatches после заполнения введенного пользователем массива и случайно сгенерированного массива.

    Приведенное ниже утверждение:

    int matchCount = findMatches(arrLotto, arrUser, arrSize);

    должно быть после второго for цикла в main .

  • Вы также должны передать ссылку на array вместо самого массива, чтобы сохранить случайно сгенерированные числа в массиве после возврата функции. Итак, вам нужно изменить прототип generateNumbers функции на этот:

    void generateNumbers(int (amp;arrLotto)[5], int arrSize)

  • И внутри функции вы должны возвращаться после завершения for цикла, а не после первой итерации. Итак, переместите оператор return

    return matchCount;

    после закрывающей фигурной скобки for цикла.

Ответ №2:

Преобразуйте каждый из входных массивов в std::set (или отсортируйте их через std::sort ). Затем вы можете использовать алгоритм set intersection. https://en.cppreference.com/w/cpp/algorithm/set_intersection Если выходные данные пусты, совпадений нет, а размер выходных данных указывает на количество совпадений.

Ответ №3:

Вы вызываете метод findMatches() перед заполнением массива, поэтому он всегда возвращает 0 bcz при вызове метода findMatches(), в то время как оба массива пусты.

Итак, решение состоит в том, чтобы сначала заполнить пользовательский доступ, затем вызвать generateNumbers () для заполнения случайного массива, затем вызвать findMatches (), тогда это даст вам идеальное количество.