简体   繁体   中英

Passing Arrays into Functions in C++? [Lottery Numbers]

I am creating a lottery game in C++. I created a function called GetLottoPicks which asks the user for 7 numbers. I have another function called GenWinNums that generates 7 random numbers.

The problem is for the GenWinNums it keeps generating this 7 times: -858993460

I believe I made inputs into the argument int WinningNums[] bu apparently not?

Thank you.

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 << " Please make a selection: ";
cin >> choice;

if (choice == 1)
{
    cout << "\n Please enter your name: ";
    cin >> 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 << ":";
    cin >> UserTicket[i];

    while (UserTicket[i] < 1 || UserTicket[i] > 40)

    {
        cout << "Your selection cannot be less than 1 and/or greater than 40. Try Again." << endl;
        cin >> 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: " << endl;
                cin >> 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] < 1 || 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;
 }

Just for fun, here's a fairly big number of fixes. I'm not going to enumerate them all. basically:

  • pass fixed size arrays by reference, to avoid unsafe usage
  • check input errors rigorously, and do it in a single loop
  • several misguided array assignments that either did nothing or prevented the result being seen by the caller...
  • use char for the input type (so Q would ever get matched) and prefer aa switch over repeated ifs
  • See below for a more typical C++ style solution, including a check for WIN or LOSE

Exercise for the reader: seed your rand() generator , or it was pretty simple to win this lottery (pasting in the previous winning ticket :))

Output on a demo run (shows error handling as well):

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 <string>
#include <iostream>

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;
}

More typical C++ solution

#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>

const size_t amount = 7;

typedef std::set<int> 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<int>(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);
}

Looks like you are never assigning any values to the WinningNums array in your routine, that might explain why you get the same number all the time.

I'd suggest removing the numbers array and working directly with WinningNums to generate your random numbers.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM