C언어

[TDD] 로또 프로그램 다음 단계 : 6개 숫자 중 5개 숫자 같은지 확인

mcdn 2020. 8. 8. 18:26
반응형
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_NUM 6

int is_first(int mach[7], int user[7])
{
    int visit[6] = {0};
    int cnt = 0;

    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j< 6;j++)
        {
            if (mach[j] == user[i])
            {
                if (visit[j] == 0)
                {
                    visit[j] = 1;
                    cnt++;
                }
            }
        }
    }
    if (cnt == 6)
        return (1);
    else
        return (0);
}

int is_second(int mach[7], int user[7])
{
    int cnt = 0;
    int i;

    for (i = 0; i < 6; i++)
    {
        if (user[i] == mach[i])
            cnt++;
    }
    if (user[i] == mach[i])
        cnt++;
    if (cnt == 6)
        return (1);
    else
        return (0);
}

int main(void)
{
    int user[7];
    int mach[7]; 
    printf("\n        <<lotto>>\n");
    printf("the number is from 1 to 45.\n");
    printf("put in your number : ");
    for (int i=0; i< MAX_NUM + 1; i++)
    {
        scanf("%d", &user[i]);
    }
    // lotto number generator 
    srand(time(NULL));
    int i;
    for (i =0; i< MAX_NUM; i++)
    {
        mach[i] = rand() % 45 + 1;
    }
    mach[i] = rand() % 45 + 1; // 추가 뽑기 

    if (is_first(mach, user))
        printf("1등\n");
    else if (is_second(mach, user))
        printf("2등\n");
    else
    {
        printf("Try next time!\n");
        printf("the number was : ");
        for (int i=0; i<7;i++)
            printf("%d ", mach[i]);
        printf("\n");
        main();
    }
    return 0;
}

처음에 짠 코드 

 

second 코드 처럼 완전히 순서도 같아야 된다고 생각했는데 그게 아니라 6개 숫자 중 5개 숫자가 같은지만 확인하는 거였던 것... 즉 순서 상관없이 있는지 여부를 판단하는게 더 중요 

 

그래서 first코드처럼 다시 짜봄. 

 

 

int is_second(int mach[7], int user[7])
{
    int visit[6] = {0};
    int cnt = 0;

    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j< 6;j++)
        {
            if (mach[j] == user[i])
            {
                if (visit[j] == 0)
                {
                    visit[j] = 1;
                    cnt++;
                }
            }
        }
    }
    if (mach[6] == user[6])
        cnt++;
    if (cnt == 6)
        return (1);
    else
        return (0);
}

 결과 second도 고칠 수 있었음 

결과 성공 !

 

순서가 달라도 1등 판별 가능 :D 

 

https://blockdmask.tistory.com/368

참고한 블로그에서는 로또 프로그램 규칙 버그까지 고려 

 

그래서 다시 고침 

 

https://bymakers.tistory.com/30

 

scanf 숫자이외의 입력이 있으면 다시 입력받게

#include int main() { int a, num= 0; while (1) { printf("숫자를 입력하세요"); num= scanf_s("%d", &num); //반환값이 1이어야하는 숫자 이외는 0 //while (getchar() != '\n'); //버퍼를 비움:scanf의 경우..

bymakers.tistory.com

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_NUM 6

int is_first(int mach[8], int user[8])
{
    int visit[6] = {0};
    int cnt = 0;

    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j< 6;j++)
        {
            if (mach[j] == user[i])
            {
                if (visit[j] == 0)
                {
                    visit[j] = 1;
                    cnt++;
                }
            }
        }
    }
    if (cnt == 6)
        return (1);
    else
        return (0);
}

int is_second(int *mach, int *user)
{
    int visit[6] = {0};
    int cnt = 0;

    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j< 6;j++)
        {
            if (mach[j] == user[i])
            {
                if (visit[j] == 0)
                {
                    visit[j] = 1;
                    cnt++;
                }
            }
        }
    }
    if (mach[6] == user[6])
        cnt++;
    if (cnt == 6)
        return (1);
    else
        return (0);
}

int fill_usernum(int *user)
{
    int temp;

    printf("put in your number : ");
    for (int i=0; i< MAX_NUM + 1; i++)
    {
        int bufflag = scanf("%d", &user[i]);
        while (bufflag != 1)
            bufflag = scanf("%d", &user[i]);
    }
    for (int i=0; i< MAX_NUM + 1; i++)
    {
        if (user[i] < 1 || user[i] > 45)
        {
            printf("\n the number is out of range.\n");
            return (0);
        }
    }
    return (1);
}

void fill_machnum(int *mach)
{
    int i;
    for (i =0; i< MAX_NUM + 1; i++)
    {
        int number;
        while (1)
        {
            int flag = 0;
            number = rand() % 45 + 1;
            for (int j =0; j< i; j++)
            {
                if (number == mach[j])
                {
                    flag = 1; 
                    break;
                }
            }
            if (flag == 0)
                break;
        }
        mach[i] = number;
    }
    /*
    for (int i=0; i<7;i++)
        printf("%d ", mach[i]);
    printf("\n"); 확인용 프린트 구문 
    */ 
}

int main(void)
{
    int user[8];
    int mach[8]; 
    srand(time(NULL));
    
    printf("<<<<<<<<<lotto>>>>>>>>>>\n");
    printf("the number is from 1 to 45.\n");
    fill_machnum(mach);
    if (!(fill_usernum(user)))
        fill_usernum(user);
    if (is_first(mach, user))
        printf("1등\n");
    else if (is_second(mach, user))
        printf("2등\n");
    else
    {
        printf("Try next time!\n");
        printf("lotto number was : ");
        for (int i=0; i<7;i++)
            printf("%d ", mach[i]);
        printf("\n");
        main();
    }
    return 0;
}

아쉬운 점 

int 형 %d로 받아서 %c같은 문자가 들어가면 무한루프 에러가 생긴다... 

이거 어케 하지 

 

%c로 받아야 하나?

 

반응형