POST

C언어 로또번호 생성하기 (당첨확률높이기)

_C언어 로또번호 생성하기





핵심요소

  • 조건문, 반복문, 함수, 배열, 포인터, 구조체 사용
  • 정렬, 짝수&홀수 판별
  • 라이브러리 함수


이번 포스팅에서 로또 번호를 출력을 해보려 합니다.

일반적인 1~45 사이의 숫자 6개를 랜덤하게 뽑아내는 것이 아니라 조건을 넣어 출력을 해봅시다.

해당 조건을 넣음으로써 다양하게 프로그래밍을 연습 할 수 있습니다.

(극악의 번호들이 나올 경우를 줄여 당첨 확률을 높일 수 있습니다.)


조건1) 원하는 만큼 출력 할 수 있어야 한다.

조건2) 같은 줄에 중복된 숫자가 없어야 한다.

조건3) 같은 줄에 숫자가 모두 홀수가 아니어야 한다.

조건4) 같은 줄에 숫자가 모두 짝수가 아니어야 한다.

조건5) "1-2-3-4-5-6" 과 같은 수열이 아니어야 한다.



- 헤더 파일, 함수를 우선 선언 하여 준다.

  이후 메인 함수에서는 출력될 로또번호들의 수를 입력받고(조건1) 로또번호를 생성&출력할 함수만을 호출 할 수 있도록 한다.



- 위는 랜덤한 로또번호의 생성과 출력을 하는 함수이다.

  해당함수에서는 로또번호를 생성후 한줄에 중복된 수가 있는지 검사한다.(조건2)

  그리고 조건3~5와 맞는지 판별하는 함수를 호출하여 출력하도록 만든다.



- 위의 함수는 생성된 로또 번호를 내림차순으로 정렬한다.

  가장 기본적인 버블정렬을 이용하였다.



- 위처럼 로또 번호들이 모두 홀수 또는 짝수인지 판별하는 각각의 함수를 만든다. (조건3~4)



- 위의 함수는 등차수열공식을 이용하여 수열인지 아닌지 판별하는 것이다. (조건5)



- 언제 번호를 생성하였는지 알 수 있게 현재시간을 출력하는 함수 이다.



#include<stdio.h>

#include<stdlib.h> 

#include<time.h>

#pragma warning(disable:4996)


/* 함수 선언 */

void rand_num(int n);

void sortloto(int *snum, int size);

int odd_check(int *snum, int size);

int even_check(int *snum, int size);

int arr_check(int *snum, int size);

void getISOTime(char* buffer, size_t bufferSize);


/* 메인 함수 */

int main(void) {

int n=1;

char buf[80];

while (n != 0) {

/* 현재시간/날짜 출력 */

getISOTime(buf, sizeof(buf));

printf("%s\n", buf);


printf("번호를 몇 줄 생성할까요? ");

scanf("%d", &n);

rand_num(n); // 번호 생성과 출력 함수 호출

}

return 0;

}


/* 번호 생성과 검사/출력 함수 */

void rand_num(int n)

{

int odd, even, arr;

int num[6]; // 랜덤 생성된 로또번호

int loto[6] = { 0 }; // 비교될 로또 번호


srand((unsigned)time(NULL));


for (int j = 0; j<n; j++) {

odd = 0; // 홀수판별용 변수

even = 0; // 짝수 판별용 변수

arr = 0; // 순열


for (int i = 0; i <= 5; i++) {

num[i] = 1 + (rand() % 45); // 45까지의 번호 생성

/* if문은 같은 줄에 같은 숫자가 잇는지 배열전체와 비교한다*/

if (num[i] != loto[0] && num[i] != loto[1] && num[i] != loto[2] && num[i] != loto[3] && num[i] != loto[4] && num[i] != loto[5]) {

loto[i] = num[i]; // 일치하지 않는다면 대입 한다.

}

else

i--;

}


sortloto(loto, 6); // 번호 내림차순 정렬 함수 호출

odd = odd_check(loto, 6); // 홀수 검사 함수 호출

even = even_check(loto, 6); // 짝수 검사 함수 호출

arr = arr_check(loto, 6); // 수열 검사 함수 호출


/* 검사결과 비교 */

if (odd == 1 || even == 1 || arr == 1) //결과중 하나라도 1이 나올경우 번호 재생성

j--;

else {

printf("%2d || ", j+1);

for (int i = 0; i < 6; i++) // 번호 출력

printf("%2d  ", loto[i]);

printf("\n");

}

for (int i = 0; i < 6; i++) // 기존 생성된 번호 초기화

loto[i] = 0;

}

return;

}


/* 생성된 번호 내림차순으로 정렬 */

/* 버블 정렬 사용 */

void sortloto(int snum[], int size) {

int temp = 0; // 수가 임시로 저장 될 변수 

for (int i = 0; i < size; i++) {

for (int j = 0; j < size; j++) {

if (snum[i] < snum[j]) {

temp = snum[j];

snum[j] = snum[i];

snum[i] = temp;

}

}

}


}


/* 모두 홀수인지 판별하는 함수 */

/* 수를 2로 나누었을때 나머지가 "1"이라면 홀수로 판별 */

int odd_check(int snum[], int size) {

int check[6];

for (int i = 0; i < size; i++) {

check[i] = snum[i] % 2;

}

if (check[0] == 1 && check[1] == 1 && check[2] == 1 && check[3] == 1 && check[4] == 1 && check[5] == 1)

return 1;

else

return 0;

}


/* 모두 짝수인지 판별하는 함수 */

/* 수를 2로 나누었을때 나머지가 "0"이라면 짝수로 판별 */

int even_check(int snum[], int size) {

int check[6];

for (int i = 0; i < size; i++) {

check[i] = snum[i] % 2;

}

if (check[0] == 0 && check[1] == 0 && check[2] == 0 && check[3] == 0 && check[4] == 0 && check[5] == 0)

return 1;

else

return 0;

}


/* 수열인지 판별하는 함수 */

int arr_check(int snum[], int size) {

int sum = 0;

int check = 0;


for (int i = 0; i < size; i++) {

sum = sum + snum[i]; // 첫째 자리부터 여섯번째 자리까지의 합

}

if (snum[0] == 1) // 첫번째 수가 1일 경우

check = snum[5] * (snum[5] + 1) / 2; // 등차수열 공식을 이용한 합계(첫번째~여섯번째)

else                    // 첫번째 수가 1이 아닐경우

check = (snum[5] * (snum[5] + 1) / 2) - ((snum[0] - 1)*(snum[0]) / 2); // 등차수열 공식을 이용한 합계(첫번째~여섯번째)

if (check == sum) // 조건에 만족한다면 수열로 판단

return 1;

else

return 0;

}


/* 현재시간 출력 */

void getISOTime(char* buffer, size_t bufferSize) {

struct tm t;

time_t timer;


timer = time(NULL);    // 현재 시각을 초 단위로 얻기

localtime_s(&t, &timer); // 초 단위의 시간을 분리하여 구조체에 넣기



sprintf_s(buffer, bufferSize, "%04d-%02d-%02d %02d:%02d:%02d",

t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,

t.tm_hour, t.tm_min, t.tm_sec

);

}



도움이 되셨다면 아래의 공감버튼 눌러주세요.