#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
цикла, а не после первой итерации. Итак, переместите оператор returnreturn 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 (), тогда это даст вам идеальное количество.