_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
);
}
도움이 되셨다면 아래의 공감버튼 눌러주세요.
'C' 카테고리의 다른 글
C언어 Visual studio 에서 콘솔창 사라져요/유지하기 (4) | 2017.12.27 |
---|---|
C언어 조건 연산자(삼항 연산자) 사용법 (0) | 2017.04.12 |
C언어의 시작-최신버전 비주얼 스튜디오 무료로 설치하기(Visual Studio Community) (0) | 2017.03.27 |
C언어 입력한 정수의 자리 수 구하기 (0) | 2017.03.14 |
C언어 While반복문을 이용한 입력한 정수를 반대로 출력하기 (0) | 2017.03.14 |