C언어 실무 프로젝트
C언어 숫자야구 프로그램 ( 배열, 제어문, %연산자 활용) 1 ~ 9자리까지 입력이 가능
C's everything!
2022. 4. 22. 04:31
반응형
숫자의 값을 자릿수 단위로 보관해야 하는 프로그램이라, 많은 변수가 필요했습니다. 제어문이 핵심 기능을 하기 때문에 로직을 이해하려면 차근차근 뜯어보시는게 좋을 듯 싶습니다. 초보자분들이 이해하기에는 어려울 수 있지만, 최대한 주석을 달아보았습니다. 이해가 안되는 부분이 있다면 언제든지 질문해주세요.
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;
}
반응형