본문 바로가기
알고리즘 문제 & 프로그래밍/C++

[C++] 로또 번호 생성 프로그램 제작기 #1

by 달슬 2021. 1. 19.
반응형

C++로 여러 방법으로 로또 번호를 생성하는 프로그램을 만드는 과정을 적어보려 한다.

 

로또 번호 생성 방법으로

1. 랜덤으로 번호 6개 모두 생성하는 방법
2. 사용자가 번호를 1~ 5개 지정하면 나머지는 랜덤으로 생성하는 방법
3. 생년월일을 입력하면 이를 조합하여 번호를 생성하는 방법
4. 역대 1위 당첨번호 기반 생성하는 방법

총 4가지를 선정하였다.

 

다 만들 수 있을지는 모르겠지만 도전해본다.


먼저 1 ~ 45 사이의 숫자 중에서 랜덤으로 6개를 고르는 클래스(randomGenerator)를 만들었다.

 

1. #include <random>random_device를 이용하여 랜덤 숫자를 만든다.

2. 이를 45로 나눈 나머지를 구하면 0 ~ 44 사이의 숫자가 나오고, 이에 1을 더해준 값을 로또 번호로 채택한다.

3. 중복 확인을 위해 랜덤으로 나온 숫자를 우선 temp 변수에 넣고, 앞선 추출에서 중복 값이 있는지 확인한다. 중복 값이 있으면 다시 계산!

class randomGenerator
{
public:
    randomGenerator()
    {
        int lotto[6];

        random_device rd;
        mt19937 gen(rd());

        for (int i = 0; i < 6; i++)
        {
            int temp = gen() % 45 + 1;
            lotto[i] = temp;
            for (int j = 0; j < i; j++)
            {
                if (lotto[j] == temp)
                {
                    i--;
                }
            }
        }

        sort(lotto, lotto + 6);

        for (int i = 0; i < 6; i++)
        {
            cout << lotto[i] << "\t";
        }
        cout << endl;
    }
};

다음으로 메인메뉴를 구성하였다.

 

위 4가지 옵션 중에 원하는 메뉴를 입력하면(1~4번 입력) 해당 페이지로 이동하도록 하였다.

그 외의 숫자를 입력하면 try / catch / throw 를 이용해 잡아낸다.

mainMenu 클래스와 choiceMenu() 함수를 이용하여 구현하였다.

 

페이지 이동시 Sleep(1000)을 사용하여 1초 딜레이를 주었고, 메뉴 이동 시 system("cls")를 이용하여 콘솔 창을 초기화하고 넘어 갈 수 있도록 했다.

void choiceMenu()
{
    int num;
    cin >> num;

    try
    {
        if (num <= 0 || num > 4) throw string("잘 못 입력하셨습니다. 1 ~ 4 사이의 숫자를 입력하세요");

        cout << num << "번을 선택하셨습니다." << endl;

        Sleep(1000);
        system("cls");

        if (num == 1)
        {
            menu_1();
        }
    }
    catch (string(error_message))
    {
        cout << error_message << endl;
        choiceMenu();
    }
}

class mainMenu
{
public:
    mainMenu()
    {
        system("cls");

        cout << "\n";
        cout << "=============================" << endl;
        cout << "\n";
        cout << "  로또 번호 생성 프로그램" << endl;
        cout << "\n";
        cout << "< LOTTO NUMBER GENERATOR >" << endl;
        cout << "\n";
        cout << "=============================" << endl;
        cout << "\n\n";
        cout << "\t" << "< MENU >" << endl;
        cout << "\n";
        cout << "1. 랜덤 번호 생성" << endl;
        cout << "2. 특정 숫자 포함 생성" << endl;
        cout << "3. 생일 관련 생성" << endl;
        cout << "4. 역대 1위 당첨번호 기반 생성" << endl;
        cout << "\n\n";
        cout << "-------------------------------------------------------------------------------" << endl;
        cout << "※ 이 프로그램은 단순 참고용으로만 활용하시기 바랍니다." << endl;
        cout << "   지나친 로또 구매는 심신에 악영향을 끼칠 수 있습니다." << endl;

        cout << "\n\n\n";
        cout << "원하시는 로또 번호 생성 방법을 아래 메뉴에서 골라 다음과 같이 입력해주세요." << endl;
        cout << "('1. 랜덤 번호 생성'을 원할 경우 '1' 입력 후 엔터)" << endl;

        choiceMenu();
    }
};

 

메뉴 1번 (랜덤으로 번호 6개 모두 생성하는 방법) 클래스

 

사용자에게 번호를 몇개 생성하고 싶은지를 입력받아 그 숫자만큼 randomGenerator 클래스를 반복 실행하였다.

1 이상의 숫자를 입력해야 클래스가 제대로 실행이 되도록 했다.

0을 입력하면 메인메뉴로 다시 돌아가게 하고 싶은데 어떻게 하는지 아직 모르겠다.

(mainMenu에서 menu_1으로 이동하는 것은 위에 구현되어 있는데, menu_1에서 mainMenu로 다시 돌아가는 것은 어떻게 해야 할지.... 전방 선언을 시도해봤으나 실패했다.)

class menu_1
{
public:
    menu_1()
    {
        system("cls");
        cout << "\n";
        cout << "=================" << endl;
        cout << "1. 랜덤 번호 생성" << endl;
        cout << "=================" << endl;
        cout << "\n\n\n";
        cout << "몇 개를 생성할까요? 원하시는 개수를 다음과 같이입력해주세요." << endl;
        cout << "(1개를 생성하고 싶으시면 '1' 입력 후 엔터, 5개를 생성하고 싶으시면 '5' 입력 후 엔터)" << endl;
        cout << "\n";
        //cout << "※ 메인 메뉴로 돌아가기를 원하시면 '0'을 입력해주세요." << endl;

        int num;
        cin >> num;

        try
        {
            if (num <= 0) throw string("잘 못 입력하셨습니다. 0보다 큰 숫자를 입력하세요");
            //else if (num == 0) mainMenu(); // 메인메뉴로 돌아가기
            else
            {
                cout << num << "개를 생성하겠습니다." << endl;
                cout << "\n\n";
                cout << "행운의 번호는?" << endl;
                cout << "\n";
                for (int n = 0; n < num; n++)
                {
                    cout << n + 1 << "번 번호 :\t";
                    randomGenerator();
                }
                cout << "\n\n";
                cout << "-------------------------------------------------------------------------------" << endl;
                cout << "\n";
                cout << "♥1등 당첨을 기원합니다♥" << endl;
                cout << "\n";
            }
        }
        catch (string(error_message))
        {
            cout << error_message << endl;
            menu_1();
        }
    }
};

 


현재까지 작업한 전체 코드(따로 헤더 파일을 만들지 않고 하나에 전부 작업했다.)

 

남은 작업

1. menu_1 클래스에서 mainMenu 클래스로 다시 돌아가는 것 구현

2. (2번 메뉴) 사용자가 번호를 1~ 5개 지정하면 나머지는 랜덤으로 생성하는 방법 구현

3. (3번 메뉴) 생년월일을 입력하면 이를 조합하여 번호를 생성하는 방법 구현

4. (4번 메뉴) 역대 1위 당첨번호 기반 생성하는 방법 구현

#include <iostream>
#include <string>
#include <windows.h>
#include <algorithm>
#include <random>

using namespace std;

class randomGenerator
{
public:
    randomGenerator()
    {
        int lotto[6];

        random_device rd;
        mt19937 gen(rd());

        for (int i = 0; i < 6; i++)
        {
            int temp = gen() % 45 + 1;
            lotto[i] = temp;
            for (int j = 0; j < i; j++)
            {
                if (lotto[j] == temp)
                {
                    i--;
                }
            }
        }

        sort(lotto, lotto + 6);

        for (int i = 0; i < 6; i++)
        {
            cout << lotto[i] << "\t";
        }
        cout << endl;
    }
};

class menu_1
{
public:
    menu_1()
    {
        system("cls");
        cout << "\n";
        cout << "=================" << endl;
        cout << "1. 랜덤 번호 생성" << endl;
        cout << "=================" << endl;
        cout << "\n\n\n";
        cout << "몇 개를 생성할까요? 원하시는 개수를 다음과 같이입력해주세요." << endl;
        cout << "(1개를 생성하고 싶으시면 '1' 입력 후 엔터, 5개를 생성하고 싶으시면 '5' 입력 후 엔터)" << endl;
        cout << "\n";
        //cout << "※ 메인 메뉴로 돌아가기를 원하시면 '0'을 입력해주세요." << endl;

        int num;
        cin >> num;

        try
        {
            if (num <= 0) throw string("잘 못 입력하셨습니다. 0보다 큰 숫자를 입력하세요");
            //else if (num == 0) mainMenu(); // 메인메뉴로 돌아가기
            else
            {
                cout << num << "개를 생성하겠습니다." << endl;
                cout << "\n\n";
                cout << "행운의 번호는?" << endl;
                cout << "\n";
                for (int n = 0; n < num; n++)
                {
                    cout << n + 1 << "번 번호 :\t";
                    randomGenerator();
                }
                cout << "\n\n";
                cout << "-------------------------------------------------------------------------------" << endl;
                cout << "\n";
                cout << "♥1등 당첨을 기원합니다♥" << endl;
                cout << "\n";
            }
        }
        catch (string(error_message))
        {
            cout << error_message << endl;
            menu_1();
        }
    }
};

void choiceMenu()
{
    int num;
    cin >> num;

    try
    {
        if (num <= 0 || num > 4) throw string("잘 못 입력하셨습니다. 1 ~ 4 사이의 숫자를 입력하세요");

        cout << num << "번을 선택하셨습니다." << endl;

        Sleep(1000);
        system("cls");

        if (num == 1)
        {
            menu_1();
        }
    }
    catch (string(error_message))
    {
        cout << error_message << endl;
        choiceMenu();
    }
}

class mainMenu
{
public:
    mainMenu()
    {
        system("cls");

        cout << "\n";
        cout << "=============================" << endl;
        cout << "\n";
        cout << "  로또 번호 생성 프로그램" << endl;
        cout << "\n";
        cout << "< LOTTO NUMBER GENERATOR >" << endl;
        cout << "\n";
        cout << "=============================" << endl;
        cout << "\n\n";
        cout << "\t" << "< MENU >" << endl;
        cout << "\n";
        cout << "1. 랜덤 번호 생성" << endl;
        cout << "2. 특정 숫자 포함 생성" << endl;
        cout << "3. 생일 관련 생성" << endl;
        cout << "4. 역대 1위 당첨번호 기반 생성" << endl;
        cout << "\n\n";
        cout << "-------------------------------------------------------------------------------" << endl;
        cout << "※ 이 프로그램은 단순 참고용으로만 활용하시기 바랍니다." << endl;
        cout << "   지나친 로또 구매는 심신에 악영향을 끼칠 수 있습니다." << endl;

        cout << "\n\n\n";
        cout << "원하시는 로또 번호 생성 방법을 아래 메뉴에서 골라 다음과 같이 입력해주세요." << endl;
        cout << "('1. 랜덤 번호 생성'을 원할 경우 '1' 입력 후 엔터)" << endl;

        choiceMenu();
    }
};

int main()
{
    mainMenu();
    
    return 0;
}

 

참고

github.com/mannlim

 

mannlim - Overview

mannlim has 6 repositories available. Follow their code on GitHub.

github.com

 

반응형

댓글