본문 바로가기
C언어/쉽게 풀어쓴 C언어 EXPRESS 개정4판

[6上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 6장 PROGRAMMING (1~6번)

by EATSTAR 2023. 6. 18.
반응형

[ 7 ~ 12번 ]

 

[6下] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 6장 PROGRAMMING (下)

이 페이지는 6장 7~12번 문제에 대해 서술하므로 1~6번의 문제는 아래의 링크를 참조하세요. [6上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 6장 PROGRAMMING (上) 하 편은 준비중입니닷! * 본문은 Microsoft Visual S

eatstar.tistory.com

 

* 본문은 Microsoft Visual Studio 2022 버전 17.6.3를 사용하였으므로 다른 버전의 비쥬얼 스튜디오나 다른 C언어 작동 프로그램으로 작동할 경우 오류가 생길 수 있음을 양지해주세요.

1. 사용자로부터 2개의 정수를 받아서 첫 번째 정수가 두 번째 정수로 나누어 떨어지는 지를 검사하는 프로그램을 작성하라. 즉 약수인지를 검사한다.  (if 선택 구조 / MEDIUM)

정수를 입력하시오: 32
정수를 입력하시오: 8
약수입니다.
문제 의도
%연산자를 사용해서 나누어 떨어지는지 판단하여 그 여부에 따라 if문으로 출력을 다르게 할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int d1;
	int d2;

	printf("정수를 입력하시오: ");
	scanf_s("%d", &d1);
	printf("정수를 입력하시오: ");
	scanf_s("%d", &d2);

	if (d1 % d2 == 0)
		printf("약수입니다.");
	else
		printf("약수가 아닙니다.");

	return 0;
}
코드 설명
큰 수 % 작은수가 0이면 나누어 떨어지는 것이라고 판단할 수 있다. 이것을 if-else문으로 설계한다.
단, 교재에는 if 선택 구조 유형이라고 되어 있으므로 else 약수가 아닙니다는 제거해도 된다.

 

 


2. 사용자로부터 3개의 정수를 읽어 들인 후에 if-else 문을 사용하여 가장 작은 값을 결정하는 프로그램을 작성하라.  (if-else 선택 구조 / MEDIUM)

정수 3개를 입력하시오: 30 20 10
제일 작은 정수는 10입니다.
문제 의도
정수를 3개 한꺼번에 받고, if-else문을 설계할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int x, y, z;
	int min;

	printf("정수 3개를 입력하시오: ");
	scanf_s("%d %d %d", &x, &y, &z);

	if (x < y)
		min = x;
	else
		min = y;

	if (z < min)
		min = z;

	printf("제일 작은 정수는 %d입니다.", min);

	return 0;
}
코드 설명
일단 x,y를 비교하여 더 작은 것을 min에 대입하고, 또 그 min과 z를 비교하여 작은 것을 최종 min에 대입한다.
조건 연산자를 통해서도 구할 수 있을 것이다.

 

 


3. 컴퓨터와 가위, 바위, 보 게임을 하는 프로그램을 작성하라. 컴퓨터는 사용자에게 알리지 않고 가위, 바위, 보 중에서 임의로 하나를 선택한다. 사용자는 프로그램의 입력 안내 메시지에 따라서, 3개 중에서 하나를 선택하게 된다. 사용자의 선택이 끝나면 컴퓨터는 누가 무엇을 선택하였고 누가 이겼는지, 비겼는지를 알려준다.  (if-else 선택 구조 / HARD)

(1:가위 2:바위 3:보) 중에서 하나를 선택하시오: 1
컴퓨터는 보를 선택하였습니다.

사용자가 이겼습니다.
문제 의도
rand()%3+1을 통해 1~3의 난수를 추출하고, 사용자가 입력한 수에 따라 승패 여부를 가위바위보의 규칙에 따라 if-else문으로 복잡하게 설계할 수 있는가?

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
	int player, computer;

	printf("(1:가위 2:바위 3:보) 중에서 하나를 선택하시오: ");
	scanf_s("%d", &player);

	srand((unsigned int)time(NULL));
	computer = (rand() % 3 + 1);

	if (computer == 1)
		printf("컴퓨터는 가위를 선택하였습니다.\n");
	else if (computer == 2)
		printf("컴퓨터는 바위를 선택했습니다.\n");
	else if (computer == 3)
		printf("컴퓨터는 보를 선택했습니다.\n");

	if (player == 1)
		if (computer == 1)
			printf("비겼습니다.");
		else if (computer == 2)
			printf("사용자가 졌습니다.");
		else if (computer == 3)
			printf("사용자가 이겼습니다.");

	if (player == 2)
		if (computer == 1)
			printf("사용자가 이겼습니다.");
		else if (computer == 2)
			printf("비겼습니다.");
		else if (computer == 3)
			printf("사용자가 졌습니다.");

	if (player == 3)
		if (computer == 1)
			printf("사용자가 졌습니다.");
		else if (computer == 2)
			printf("사용자가 이겼습니다.");
		else if (computer == 3)
			printf("비겼습니다.");

	return 0;
}
코드 설명
<stdlib.h>, <time.h> 헤더 파일은 난수를 매번 다르게 하는 srand 함수를 호출하기 위해 필요하다.
rand()%3 함수는 0~2 중에서 난수를 추출하고, 여기에 +1을 해서 1~3을 추출한다.
첫 번째 if-else문으로 컴퓨터가 선택한 수를 출력하고, player(사용자)가 뭐를 냈는지에 따라 컴퓨터의 수의 조합에 따라 승패 여부를 판단한다. 또 이중 스위치 문으로도 봐보자.

 

이중 스위치 문으로도 정리해보자!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
	int player, computer;

	printf("(1:가위 2:바위 3:보) 중에서 하나를 선택하시오: ");
	scanf_s("%d", &player);

	srand((unsigned int)time(NULL));
	computer = (rand() % 3 + 1);

	switch (computer) {
	case 1:
		printf("컴퓨터는 가위를 선택하였습니다.\n");
		break;
	case 2:
		printf("컴퓨터는 바위를 선택했습니다.\n");
		break;
	case 3:
		printf("컴퓨터는 보를 선택했습니다.\n");
		break;
	}

	switch (player) {
	case 1:
		switch (computer) {
		case 1:
			printf("비겼습니다.\n");
			break;
		case 2:
			printf("사용자가 졌습니다.\n");
			break;
		case 3:
			printf("사용자가 이겼습니다.\n");
			break;
		}
		break;
	case 2:
		switch (computer) {
		case 1:
			printf("사용자가 이겼습니다.\n");
			break;
		case 2:
			printf("비겼습니다.\n");
			break;
		case 3:
			printf("사용자가 졌습니다.\n");
			break;
		}
		break;
	case 3:
		switch (computer) {
		case 1:
			printf("사용자가 졌습니다.\n");
			break;
		case 2:
			printf("사용자가 이겼습니다.\n");
			break;
		case 3:
			printf("비겼습니다.\n");
			break;
		}
		break;
	}

	return 0;
}
이중 스위치 문을 쓰는 것이 코드 자체는 길지만 내용 구성은 단조로워진다. (또한 직관적이다.)

 

 


4. 놀이 공원에서 롤러코스터에 타려면 키가 140cm 이상이고 나이가 10살 이상이어야 한다고 가정하자. 사용자에게 키와 나이를 질문한 후에 "타도 좋습니다" 또는 "죄송합니다"를 출력하는 프로그램을 작성하여보자.  (논리 연산자와 선택 구조 / MEDIUM)

키를 입력하시오(cm): 145
나이를 입력하시오: 11

타고 좋습니다.
문제 의도
논리 연산자 &&가 포함된 if-else 조건식을 설계할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int tall, age;

	printf("키를 입력하시오(cm): ");
	scanf_s("%d", &tall);
	printf("나이를 입력하시오: ");
	scanf_s("%d", &age);

	if (tall >= 145 && age >= 10)
		printf("타도 좋습니다.");
	else
		printf("죄송합니다");

	return 0;
}
코드 설명
두 조건을 다 만족하는지 알기 위해 && 연산자를 사용한다.

 

 


5. 사용자로부터 몇 월인지를 정수로 입력받아서 Jan와 같은 영어단어로 출력하는 프로그램을 작성하라. (switch 선택 구조 / MEDIUM)

월 번호를 입력하시오: 10
Oct
문제 의도
switch 문을 잘 활용할 수 있는가? break;를 적절히 사용할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int month = 0;

	printf("월 번호를 입력하시오: ");
	scanf_s("%d", &month);

	switch (month) {
	case 1:
		printf("JAN");
		break;
	case 2:
		printf("FEB");
		break;
	case 3:
		printf("MAR");
		break;
	case 4:
		printf("APR");
		break;
	case 5:
		printf("MAY");
		break;
	case 6:
		printf("JUN");
		break;
	case 7:
		printf("JUL");
		break;
	case 8:
		printf("AUG");
		break;
	case 9:
		printf("SEP");
		break;
	case 10:
		printf("OCT");
		break;
	case 11:
		printf("DEC");
		break;
	case 12:
		printf("NOV");
		break;
	default:
		printf("잘못된 입력입니다.\n");
		break;
	}

	return 0;
}
코드 설명
switch 문을 활용해서 case의 해당 month 변수에 따라 영어 이니셜 3자리를 배정한다.
노가다성 코드다.

 

 


6. 키보드에서 하나의 문자를 읽어서 모음과 자음을 구분하는 프로그램을 작성하여보자. 단 switch 문을 사용한다. (switch 선택 구조 / MEDIUM)

문자를 입력하시오: o
모음입니다.
문제 의도
switch문에서 문자에 따라 case를 분류할 수 있는가?

 

#include <stdio.h>

int main(void) {
	char character;
	printf("문자를 입력하시오: ");
	scanf_s("%c", &character);

	switch (character) {
	case 'a':
	case 'e':
	case 'u':
	case 'o':
	case 'i':
		printf("모음입니다.");
		break;
	default:
		printf("자음입니다.");
	}
	return 0;
}
코드 설명
case를 문자에 따라서 분류하기 때문에 case 'a'와 같이 적는다.
a,e,u,o,i 모두 모음의 case이기 때문에, break;없이 연달아 나열한다.
character = getchar();
교재의 hint에 따르면 getchar()을 사용하라고 하니 위 코드에서 scanf를 대체하면 된다.

 

반응형