반응형
프로그램 개요
- 설명:먼저 복권을 몇 장 추첨할 건지 입력하고 그 입력받은 값대로 복권을 추첨해서 당첨개수를 확인하는 프로그램이다
- 제작시간:3시간
- 제작환경:CLion 2024.1 / C17표준
- Sourse Cord:https://github.com/snowykte0426/Study-C/blob/main/ampersent_task3.c
Study-C/ampersent_task3.c at main · snowykte0426/Study-C
C언어 공부기록장. Contribute to snowykte0426/Study-C development by creating an account on GitHub.
github.com
코드
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "windows.h"
#define MAX_LOTTO_NUMBERS 6
void Press_key_l(int arr[][MAX_LOTTO_NUMBERS], int count) {
printf("현재 입력된 로또 번호들:\n");
for (int i = 0; i < count; i++) {
for (int j = 0; j < MAX_LOTTO_NUMBERS; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
printf("-------------------------\n");
}
void Press_key_f(int count, int arr[][6]) {
static short check = 0;
int winning_number[MAX_LOTTO_NUMBERS];
if (check == 0) {
for (int i = 0; i < MAX_LOTTO_NUMBERS; i++) {
int num;
do {
num = rand() % 45 + 1;
int duplicate = 0;
for (int j = 0; j < i; j++) {
if (winning_number[j] == num) {
duplicate = 1;
break;
}
}
if (!duplicate) {
winning_number[i] = num;
break;
}
} while (1);
}
check = 1;
}
printf("로또 당첨번호:\n");
for (int i = 0; i < MAX_LOTTO_NUMBERS; i++) {
printf("%d ", winning_number[i]);
}
printf("\n-------------------------\n입력한 번호:\n");
for (int i = 0; i < count; i++) {
for (int j = 0; j < MAX_LOTTO_NUMBERS; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
int matches = 0;
for (int i = 0; i < count; i++) {
int match_count = 0;
for (int k = 0; k < MAX_LOTTO_NUMBERS; k++) {
if (winning_number[k] == arr[i][k]) {
match_count++;
break;
}
}
if (match_count > 0)
match_count == 6 ? puts("당첨되었습니다!!") : printf("로또 %d: %d개 일치합니다!\n", i + 1, match_count);
else
printf("로또 %d: 낙첨입니다...\n", i + 1);
matches += match_count;
}
if (matches == count * MAX_LOTTO_NUMBERS) {
printf("전체 당첨입니다!!\n");
} else if (matches > 0) {
printf("총 %d개 일치합니다!\n", matches);
} else {
printf("전부 낙첨입니다...\n");
puts("당첨되지 않았습니다");
}
}
int main(void) {
while (1) {
srand(time(NULL));
int number;
printf("로또를 몇 번 뽑으시겠습니까?: ");
scanf("%d", &number);
while (getchar() != '\n');
int user_num[number][MAX_LOTTO_NUMBERS];
for (int j = 0; j < number; j++) {
int valid;
do {
valid = 1;
printf("로또번호나 l, f를 입력해주세요(ex/1 4 2 3 4 5)[1~45]\n");
char input[256];
fgets(input, sizeof(input), stdin);
if (input[0] == 'l') {
Press_key_l(user_num, j);
j--;
continue;
} else if (input[0] == 'f') {
Press_key_f(j, user_num);
j--;
continue;
}
char *token = strtok(input, " ");
int k = 0;
while (token != NULL && k < MAX_LOTTO_NUMBERS) {
int num = atoi(token);
if (num < 1 || num > 45) {
printf("잘못된 값입니다 (1~45 사이 입력): %d\n다시 로또번호 6개를 입력해주세요\n", num);
valid = 0;
break;
}
for (int i = 0; i < k; i++) {
if (user_num[j][i] == num) {
printf("중복된 번호가 있습니다: %d\n다시 로또번호 6개를 입력해주세요\n", num);
valid = 0;
break;
}
}
if (!valid) break;
user_num[j][k++] = num;
token = strtok(NULL, " ");
}
if (k < MAX_LOTTO_NUMBERS) valid = 0;
} while (!valid);
}
Press_key_f(number, user_num);
while (1) {
char check;
printf("게임이 끝났습니다\n다시 시작하시겠습니까?[r/x]: ");
while (1) {
scanf("%c", &check);
switch (check) {
case 'r':
break;
case 'x':
exit(1);
default:
printf("잘못된 값입니다\n다시 입력해주세요[r/x]: ");
continue;
}
break;
}
break;
}
continue;
}
return 0;
}
만들며 어려웠던 점
- 만들면서 여러번 goto문을 쓰고 지우고 쓰고 지우며 끝내 continue문과 break문만으로 작성했다
- 포인터에 대한 개념이 완벽히 자리 잡지도 못했고 fgets문 같은 완벽히 숙지하지도 못한 함수를 사용하려고 하다 보니 오류가 나고 이를 해결하지 못해서 오래 걸렸다
'C' 카테고리의 다른 글
[C] Backjoon 1002번,2525번,2563번,2884번 문제정답코드 (0) | 2024.04.22 |
---|---|
[C] 재귀함수를 이용한 피보나치 수열 출력 (0) | 2024.04.18 |