본문 바로가기

프로그래밍/코딩 첫 걸음

21-05-24

1. 행맨 게임 제작

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int check(char s[], char a[], char ch);

int main(void)
{
	char solution[10][100] = { "in car", "at noon", "a boy" }; // 문제
	int nstr = 3; // 문제 개수 
	char answer[10][100]; // 문제의 빈칸 표시 저장
	int k, i, t, ind;
	char op;


	// 문제를 빈칸으로 바꾸어 출력
	printf("문제:\n");
	while (1)
	{
		for (k = 0; k < nstr; k++)
		{
			strcpy(answer[k], solution[k]);
			i = 0;
			while (solution[k][i] != NULL)
			{
				if (isalpha(solution[k][i]) != 0)
				{
					answer[k][i] = '_';
				}
				else answer[k][i] = ' ';
				i++;
			}
			printf("%d. %s\n", k + 1, answer[k]);
		}
	Q:
		if (nstr < 10)
		{
			printf("문자열을 추가하시겠습니까? (y/n)");
			op = getchar();
			getchar(); // 엔터 제거

			if (op == 'y')
			{
				printf("정답 문자열을 입력하시오 (영문 100자 이내):");
				gets(solution[nstr]);
				strcpy(answer[nstr], solution[nstr]);
				nstr++;
			}
		}
		if (op == 'n' || nstr >= 10) break;
		if (op == '1') exit(0);
	}

	printf("풀고싶은 문제의 번호를 입력하세요 (1-%d):", nstr);
	scanf("%d", &ind); // 풀고 싶은 문제 번호를 ind에 저장
	getchar(); // 엔터 제거
	ind = ind - 1; // 배열 주소는 0부터 시작
	t = 0;
	int max = strlen(solution[ind]); // 문자열 길이를 최대 시도 횟수로 저장
	while (1)
	{
		printf("%s \n", answer[ind]); // 추측결과 출력
		printf("글자를 추측하시오:");
		char ch = getchar();
		getchar(); // 엔터 제거
		t++;

		if (t >= max)
		{
			printf("시도 횟수를 초과하였습니다.\n");
			goto Q;
		}
		if (check(solution[ind], answer[ind], ch) == 1)
		{
			printf("%s: 정답입니다!\n", answer[ind]);
			goto Q;
		}
	}
	return 0;
}

int check(char s[], char a[], char ch)
{
	int i;

	for (i = 0; s[i] != '\0'; i++) // s[i] == '\0'이면 break
	{
		if (s[i] == ch)
			a[i] = ch;
	}
	if (strcmp(s, a) == 0) return 1; // s[]와 a[]가 같으면 1을 반환
	else return 0;
}

 

 

  • 본인이 문제를 추가할 수 있다.
  • 1을 입력하면 게임이 종료된다.
  • 문자의 개수만큼 기회가 주어진다.

2. 포인터

#include <stdio.h>

int main()
{
	int i = 10;
	float f = 12.3;
	int* pi = NULL;  // 포인터의 타입을 변수와 일치시킨다.
	float* pf = NULL;
	// 포인터를 선언할 때, NULL로 초기화해 준다.

	pi = &i;  // 주솟값을 저장할 때, *가 붙지 않는다.
	pf = &f;


	printf("%u\t%u\n", &i, pi);
	printf("%u\t%u\n", &f, pf);
	// 같은 주솟값이 출력됨을 알 수 있다.

	return 0;
}

 

포인터는 주소를 저장하기 위한 용도의 변수이다. 즉, 포인터도 변수의 일종이다.

어째서인지 주솟값은 출력할 때마다 변한다.

 

int* p = NULL;  // 정수형 포인터의 선언, 포인터는 반드시 초기화
int* p = &i;  // 포인터에는 주소를 저장한다.
int* p = 4;  // 4는 값이 아니라 주소의 이름이다.
p = &i;  // p라는 변수에 i의 주솟값을 저장한다.
*p = 4;  // 포인터 앞에 *를 붙이면 주소가 아닌 주소 내부의 값을 받는다.

'프로그래밍 > 코딩 첫 걸음' 카테고리의 다른 글

값에 의한 호출(call-by-value)과 참조에 의한 호출(call-by-reference)  (0) 2021.06.29
21-05-18  (0) 2021.05.18
21-05-17  (0) 2021.05.17
21-05-15  (0) 2021.05.15
21-05-07  (0) 2021.05.07