¿Pasando matrices a funciones en C ++?

Estoy creando un juego de lotería en C ++. Creé una función llamada GetLottoPicks que le pide al usuario 7 números. Tengo otra función llamada GenWinNums que genera 7 números aleatorios.

El problema es para los GenWinNums que sigue generando esto 7 veces: -858993460

Creo que hice entradas en el argumento int WinningNums [] bu, aparentemente, ¿no?

Gracias.

int main() { string name; int choice; int user_picked[7]; int chosen_lotto[7]; cout << "LITTLETON CITY LOTTO MODEL:" << endl; cout << "---------------------------" << endl; cout << " 1) Play Lotto " << endl; cout << " Q) Quit Program " << endl; cout <> choice; if (choice == 1) { cout <> name; getLottoPicks(user_picked); GenWinNums(chosen_lotto); for(int i = 0; i < 7; i++) { cout << chosen_lotto[i]; } for(int i = 0; i < 7; i++) { cout << user_picked[i]; } } else if (choice == 'Q' || 'q') { exit(0); } else { cout << "That is not a valid choice." << endl; } system("PAUSE"); return 0; } int getLottoPicks(int UserTicket[]) { const int amount = 7; UserTicket[amount]; int ticket = UserTicket[amount]; for (int i = 0; i < amount; i++) { cout << "\n Please enter number " << i + 1 <> UserTicket[i]; while (UserTicket[i]  40) { cout << "Your selection cannot be less than 1 and/or greater than 40. Try Again." <> UserTicket[i]; } if(i > 0) { for(int check = 0; check < i; check++) { while(UserTicket[i] == UserTicket[check]) { cout << "You cannot use the same lotto number twice. Try again: " <> UserTicket[i]; } } } } return ticket; } int GenWinNums(int WinningNums[]) { const int amount = 7; int numbers[amount]; int ticket = WinningNums[amount]; for(int i = 0; i < amount; i++) { numbers[i] = (rand() % 40) + 1; while(numbers[i]  40) { numbers[i] = (rand() % 10) + 1; } if(i > 0) { for(int check = 0; check < i; check++) { while(numbers[i] == numbers[check]) { numbers[i] = (rand() % 10) + 1; } } } } return ticket; } 

Parece que nunca WinningNums ningún valor a la matriz de WinningNums en tu rutina, eso podría explicar por qué obtienes el mismo número todo el tiempo.

Sugiero eliminar la matriz de numbers y trabajar directamente con WinningNums para generar sus números aleatorios.

Solo por diversión, aquí hay un número bastante grande de correcciones. No voy a enumerarlos todos. básicamente:

  • pasar matrices de tamaño fijo por referencia, para evitar el uso inseguro
  • Verifique los errores de entrada rigurosamente y hágalo en un solo bucle.
  • varias asignaciones de matrices erróneas que no hicieron nada o impidieron que el llamante viera el resultado …
  • use char para el tipo de entrada (para que Q alguna vez coincida) y prefiera un conmutador sobre repetido ifs
  • Vea a continuación una solución de estilo C ++ más típica, que incluye una comprobación de GANAR o PERDER.

Ejercicio para el lector: siembra tu generador de rand() , o fue bastante simple ganar esta lotería (pegando en el boleto ganador anterior :))

Salida en una ejecución de demostración (muestra también el manejo de errores):

 LITTLETON CITY LOTTO MODEL: --------------------------- 1) Play Lotto Q) Quit Program Please make a selection: 1 Please enter your name: me Please enter number 1:34 Please enter number 2:7 Please enter number 3:16 Please enter number 4:18 Please enter number 5:24 Please enter number 6:24 Duplicate entry 24 Please enter number 6:7 Duplicate entry 7 Please enter number 6:37 Please enter number 7:whoops Bad input 'whoops' discarded Please enter number 7:what was the last number again? Bad input 'what' discarded Please enter number 7:Bad input 'was' discarded Please enter number 7:Bad input 'the' discarded Please enter number 7:Bad input 'last' discarded Please enter number 7:Bad input 'number' discarded Please enter number 7:Bad input 'again?' discarded Please enter number 7:27 User ticket: 7; 16; 18; 24; 27; 34; 37; Winning ticket: 7; 16; 18; 24; 27; 34; 36; Result of draw: WINNER 

.

 #include  #include  const size_t amount = 7; void getLottoPicks(int (&ticket)[amount]) { for(int i = 0; i < amount; i++) { do { std::cout << "\n Please enter number " << i + 1 << ":"; if(std::cin >> ticket[i]) { if(ticket[i] >= 1 && ticket[i] <= 40) { bool ok = true; for(int check = 0; ok && check < i; check++) { ok &= (ticket[i] != ticket[check]); } if(ok) { break; } else { std::cout << "You cannot use the same lotto number twice. Try again." << std::endl; } } else { std::cout << "Your selection cannot be less than 1 and/or greater than 40. Try Again." << std::endl; } } else { std::cin.clear(); std::string discard; std::cin >> discard; std::cout << "Bad input '" << discard << "' discarded"; } } while(true); } } void GenWinNums(int (&winningNumbers)[amount]) { for(int i = 0; i < amount; i++) { winningNumbers[i] = (rand() % 40) + 1; while(winningNumbers[i] < 1 || winningNumbers[i] > 40) { winningNumbers[i] = (rand() % 10) + 1; } if(i > 0) { for(int check = 0; check < i; check++) { while(winningNumbers[i] == winningNumbers[check]) { winningNumbers[i] = (rand() % 10) + 1; } } } } } int main() { std::string name; char choice; std::cout << "LITTLETON CITY LOTTO MODEL:" << std::endl; std::cout << "---------------------------" << std::endl; std::cout << " 1) Play Lotto " << std::endl; std::cout << " Q) Quit Program " << std::endl; std::cout << " Please make a selection: "; std::cin >> choice; switch(choice) { case '1': { std::cout << "\n Please enter your name: "; std::cin >> name; int user_picked[amount]; int chosen_lotto[amount]; getLottoPicks(user_picked); GenWinNums(chosen_lotto); std::cout << "\n"; for(int i = 0; i < amount; i++) { std::cout << user_picked[i] << "; "; } std::cout << "\n"; for(int i = 0; i < amount; i++) { std::cout << chosen_lotto[i] << "; "; } } case 'Q': case 'q': return 0; default: std::cout << "\n That is not a valid choice." << std::endl; } std::cout << "\n Press enter..."; std::cin >> choice; } 

Solución más típica de C ++

 #include  #include  #include  #include  #include  const size_t amount = 7; typedef std::set ticket_t; ticket_t getLottoPicks() { ticket_t ticket; while (ticket.size() < amount) { std::cout << "\n Please enter number " << (ticket.size()+1) << ":"; int entry; if(std::cin >> entry) { if(entry >= 1 && entry <= 40) { if (ticket.end() != ticket.find(entry)) std::cout << "Duplicate entry " << entry; else ticket.insert(entry); } else std::cout << "Entry out of range [1..40]: " << entry; continue; } std::cin.clear(); std::string discard; std::cin >> discard; std::cout << "Bad input '" << discard << "' discarded"; } return ticket; } ticket_t genWinNums() { ticket_t ticket; while (ticket.size() < amount) ticket.insert(rand() % 40 + 1); return ticket; } std::ostream& operator<<(std::ostream& os, ticket_t const& t) { std::copy(t.begin(), t.end(), std::ostream_iterator(os, "; ")); return os; } int main() { std::cout << "LITTLETON CITY LOTTO MODEL:" << std::endl; std::cout << "---------------------------" << std::endl; std::cout << " 1) Play Lotto " << std::endl; std::cout << " Q) Quit Program " << std::endl; std::cout << "Please make a selection: "; char choice; std::cin >> choice; switch(choice) { case '1': { std::cout << "\n Please enter your name: "; std::string name; std::cin >> name; const ticket_t user = getLottoPicks(); const ticket_t winning = genWinNums(); std::cout << "User ticket: " << user << "\n"; std::cout << "Winning ticket: " << winning << "\n"; // check win? bool ok = 0 == std::lexicographical_compare( user.begin(), user.end(), winning.begin(), winning.end()); std::cout << "Result of draw: " << (ok? "WINNER":"No luck") << "\n"; } case 'Q': case 'q': return 0; default: std::cout << "\n That is not a valid choice." << std::endl; } std::cin.ignore(1<<24,'\n'); std::cout << "\n Press enter..."; std::string dummy; std::getline(std::cin, dummy); }