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;
}

 

 

반응형