일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- scanf
- 구현
- string
- 문자열
- 커서
- C
- 버블
- 삽입
- 3차원 배열
- 알고리즘
- 구조체
- Windows API
- C언어
- 선택
- 연결리스트
- 함수
- 셀
- 콘솔
- 배열
- 테트리스
- 포인터
- 공백
- 파일입출력
- 오목#함수#gotoxy#금수#알고리즘#2차원#배열#실무#프로젝트
- 이진탐색#binary_search
- crud
- 정렬
- 난수
- Time
Archives
- Today
- Total
C언어 알고리즘 정리 및 실무 프로젝트
C언어 숫자야구 프로그램 ( 배열, 제어문, %연산자 활용) 1 ~ 9자리까지 입력이 가능 본문
반응형
숫자의 값을 자릿수 단위로 보관해야 하는 프로그램이라, 많은 변수가 필요했습니다. 제어문이 핵심 기능을 하기 때문에 로직을 이해하려면 차근차근 뜯어보시는게 좋을 듯 싶습니다. 초보자분들이 이해하기에는 어려울 수 있지만, 최대한 주석을 달아보았습니다. 이해가 안되는 부분이 있다면 언제든지 질문해주세요.
numBaseball.exe
0.01MB
#include <stdio.h>
#include <stdlib.h> // Sleep()
#include <windows.h>
#include <conio.h> // _getch()
int main() {
int number; // 원본 숫자(최대 9자리) --> 문제 출제자
int store[9]; // 원본 숫자를 자릿수만큼 저장할 배열
int predict[9]; // 예상되는 원본 숫자(최대 9자리) --> 문제 응시자
int digit = 1; // 각 자릿수의 값을 얻기 위해 10씩 곱해질 값
int digit2; // 예상 숫자에서도 쓰기 위한 digit의 복사본
int num = 1; // 원본 숫자의 자릿수
int number_copy; // 원본 숫자의 자릿수를 구하기 위한 복사본
int i, j; // 반복문 변수
int strike, ball; // strike와 ball 개수 저장
printf("1 ~ 9자리 숫자중 아무거나 입력하세요. ");
scanf(" %d", &number);
number_copy = number; // 자릿수를 구하기 위해 원본 숫자를 복사한다.
system("cls"); // 맞춰야 할 숫자를 비밀로 하기 위해 콘솔에서 지웁니다.
while ((number_copy / 10) > 0) {// 자릿수를 구하기 위한 while문
number_copy /= 10;
digit *= 10;
num++;
}
printf("\n %d자리의 숫자를 입력하셨습니다.\n\n", num);
digit2 = digit;
// 예상 숫자에서도 써야 하므로, digit이 0이 되기 전에 미리 저장
for (i = 0; i < num; i++) { // 자릿수만큼 반복한다.
store[i] = number / digit;
// 해당 자릿수의 값을 구해서 원본 숫자를 위한 배열에 저장
number %= digit;
digit /= 10; // 마지막에는 digit이 0으로 변함.
}
while (1) // e가 입력되지 않으면 무한 반복
{
digit = digit2;
// 예상 숫자 입력을 반복하면서 digit이 계속 0이 됩니다.
// 기존에 저장해두었던 10의 배수 값(한 자리면 1)을 계속 저장
printf("\n %d자리의 숫자를 맞춰 보세요! ", num); // 예상 숫자 입력
scanf(" %d", &number);
if (number / digit >= 10)
{
printf("\n\n %d자릿수보다 더 큰 자릿수를 입력했단다... 다시 입력하렴. \n\n", num);
continue;
}
else if (number / digit == 0)
{
printf("\n\n %d자릿수보다 더 작은 자릿수를 입력했단다... 다시 입력하렴. \n\n", num);
continue;
}
for (i = 0; i < num; i++) {
// 해당 자릿수의 값을 구해서 예상 숫자를 위한 배열에 저장하는 식
predict[i] = number / digit;
// ex( 백의 자릿수 값: 3 , 십의 자릿수 값: 5 )
number %= digit;
digit /= 10;
}
strike = 0;
ball = 0;
for (i = 0; i < num; i++)
{
if (store[i] == predict[i]) //strike면 continue문을 실행해서 위로 올라간다.
{
strike++;
continue;
}
for (j = 0; j < num; j++) {
if (store[i] == predict[j]) // ball면 break문을 실행해서 위로 올라간다.
{
ball++;
break;
}
}
}
if (strike == num) // 모든 자릿수가 strike면 while문 탈출!!
{
printf("\n\n %d strike입니다. 정답 축하드립니다!!!\n", strike);
break;
}
else
printf("\t %d strike, %d ball\n\n", strike, ball);
printf("\n 강제로 종료하시려면 e, 계속하시려면 아무 키나 누르세요.\n");
/*
_getch()함수는 콘솔 입력을 사용하고 입력된 값을 화면에 보여주지 않는다.
표준 입력 버퍼에 저장되지 않기 때문에, scanf와의 버퍼 충돌을 방지할 수 있다.
Enter키를 누르지 않고도 입력된 키 값을 즉시 반환한다. ( 빠른 반응이 필요한 프로그램에 좋다.)
*/
if (_getch() == 'e') // e를 누른 후 즉시 반복문 탈출
break;
printf("\n\n");
}
Sleep(2000); // 2초후 종료
return 0;
}
반응형
'C언어 실무 프로젝트' 카테고리의 다른 글
C언어 콘솔 테트리스 프로그램(사용자 정의 함수 , 3차원 배열, 제어문 로직 활용) Windows API , 표준 라이브러리 활용 ( x86 버전) (4) | 2023.06.12 |
---|---|
C언어 컴소과 학생 관리[CRUD] 프로그램(구조체, 연결리스트(포인터), 함수 활용) x86 버전 (4) | 2022.05.28 |
C언어 오목 프로그램(2인용, 2차원 배열과 심화된 제어문 로직 활용) Windows API 및, 표준 라이브러리 사용 (x86 버전) (4) | 2022.05.28 |
C언어 Up Down 콘솔 게임 (2) | 2022.05.18 |
C언어 성적 처리 프로그램 (파일 입출력, 함수, 구조체, 포인터 이용) (0) | 2022.04.23 |
Comments