본문 바로가기
문제풀이/문제풀이 중심의 C 언어 연습

[C] [문제풀이 중심의 C 언어 연습] 5장 실습 문제

by 민됴리 2020. 8. 11.
반응형

1999년 9월 1일에 발행된

김용일, 강문설 저자의

문제풀이 중심의 C언어 연습

5장 실습 문제입니다.

 

책에 오타나 오류가 있는 문제가 적지 않게 있는데

그런 부분에 대해서는 언급해 드리겠습니다.

 

궁금한 점은 댓글로 남겨주세요.

 


 

5-1. 여러 가지 수식 작성 (if문 사용)

(1) if((number > 1) || (number < 10)) 

(2) if((ch != 'q') && (ch != 'z')) 

(3) if((no >= 1) && (no <= 10) && (no != 5)) 

(4) if((no < 1) && (no > 10)) 

(5) if((ch == ' ') || (ch == '\n'))

 

5-2. 틀린 부분 고치기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int score;
	char grade; 

	scanf(" %d", &score);
	if (score >= 90)
		grade = 'A';
	else if (score >= 80) //여기서부터 if앞에 else가 있어야함
		grade = 'B';
	else if (score >= 70)
		grade = 'C';
	else if (score < 70)
		grade = 'F';
	printf("%c\n", grade);

	return 0;
}

상단의 코드는 교재의 코드에서 필요한 부분은 추가하고 틀린 부분은 수정한 코드입니다. 수정해야 할 부분은 12, 14, 16번째 줄로, if 앞에 else를 붙여주면 됩니다.

 

5-3. 틀린 부분 고치기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int no;
	scanf(" %d", &no);	//no앞에 &가 없음
	if ((no >= 1) || (no <= 10))	//나눠서 작성
		printf("%d\n", no * 2);

	return 0;
}

상단의 코드는 교재의 코드에서 필요한 부분은 추가하고 틀린 부분은 수정한 코드입니다. 교재에서는 6번째 줄에서 no앞에 &가 없는데 이건 문제에서 의도했다기보다는 저자의 실수로 보입니다. 수정해야 할 부분은 7번째 줄로 교재에서는 if(1 <= no <= 10)으로 적혀있는데, 이 수식은 수학에서는 문제가 없지만, C에서는 if안에 상단의 코드와 같이 나눠준 후 논리 연산자를 이용하여 연결해야 합니다.

 

5-4. 틀린 부분 고치기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int score;
	char grade;

	score = 85;
	switch (score / 10) {
	case 10:
	case 9: 
		'A';
		break;
	case 8:
		grade = 'B';
		break;
	case 7:
		grade = 'C';
		break;
	case 6:
		grade = 'D';
		break;
	default:
		grade = 'F';
	}
	printf("%c\n", grade);

	return 0;
}

상단의 코드는 교재의 코드에서 필요한 부분은 추가하고 틀린 부분은 수정한 코드입니다. 교재에서는 switch문 안의 case안에 break가 없는데, 그럴 경우 score가 100이면 출력이 ABCDF가 됩니다. 따라서 원하는 결과를 얻기 위해서는 case안에 break를 추가해줘야 합니다.

 

5-5. 양수인지 음수인지 판별

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int num;

	scanf(" %d", &num);
	if (num >= 0)
		printf("%d는 양의 값입니다.", num);
	else
		printf("%d는 음의 값입니다.", num);

	return 0;
}

 

5-6. 대문자인지 소문자인지 판별

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	char ch;

	scanf(" %c", &ch);
	if ((ch >= 'A') && (ch <= 'Z'))
		printf("대문자 %c입니다.", ch);
	else if ((ch >= 'a') && (ch <= 'z'))
		printf("소문자 %c입니다.", ch);

	return 0;
}

 

5-7. 두 수의 차 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int no1, no2, diff;
	printf("두 수 입력: ");
	scanf(" %d %d", &no1, &no2);
	if (no1 > no2)
		diff = no1 - no2;
	else
		diff = no2 - no1;
	printf("두 수의 차 : %d", diff);

	return 0;
}

 

5-8. 시간을 입력받아 오전인지 오후인지 구분해서 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int time;

	printf("시간(1~24): ");
	scanf(" %d", &time);
	
	if (time <= 12)
		printf("오전 %d시", time);
	else
		printf("오후 %d시", time - 12);

	return 0;
}

이 코드를 실행한 후 12를 입력하면 오전 12시, 24를 입력하면 오후 12시라고 나옵니다.

현실에서는 12시는 오후 12시, 24시는 오전 12시이지만, 교재의 요구조건은 위와 같으므로 이 점 유의해주셨으면 합니다.

 

5-9. 임의의 영문자를 대문자로 변환

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	char ch;

	printf("영문자를 입력하세요: ");
	scanf(" %c", &ch);
	if ((ch >= 'a') && (ch <= 'z'))
		printf("결과: %c", ch - 'a' + 'A');
	else
		printf("결과: %c", ch);

	return 0;
}

 

5-10. 두 정수의 절대값의 합 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int num1, num2;

	printf("두 수를 입력하세요: ");
	scanf(" %d %d", &num1, &num2);
	if (num1 * num2 >= 0)
		printf("결과: %d", num1 * num2);
	else
		printf("결과: %d", num1 * num2 * -1);

	return 0;
}

 

5-11. 정수가 짝수인지 홀수인지를 판별

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int num;
	printf("정수를 입력하세요: ");
	scanf(" %d", &num);
	
	switch (num % 2) {
	case 0:
		printf("%d는 짝수입니다.", num);
		break;
	case 1:
		printf("%d는 홀수입니다.", num);	
		break;
	}

	return 0;
}

교재의 문제에서는 첫 줄에 "~ 짝수인지 홀수이지를 판별하는 ~"이라고 나와있습니다. 이런 사소한 오타는 교재 곳곳에서 찾아볼 수 있지만 앞으로는 언급하지 않고 넘어가겠습니다.

 

5-12. 영문자 3개를 입력받아서 가장 먼저 오는 영문자 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	char ch1, ch2, ch3;
	
	printf("영문자를 입력하세요: ");
	scanf(" %c %c %c", &ch1, &ch2, &ch3);

	if (ch1 < ch2) {
		if (ch3 < ch1)
			printf("결과: %c", ch3);
		else
			printf("결과: %c", ch1);
	}
	else {
		if(ch3 < ch2)
			printf("결과: %c", ch3);
		else
			printf("결과: %c", ch2);
	}

	return 0;
}

 

5-13. 입력받은 등급에 대응하는 조언 및 칭찬 출력 (if문 사용)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int grade;
	printf("등급 입력(1~8): ");
	scanf(" %d", &grade);

	if ((grade == 8) || (grade == 7))
		printf("아주 많이 노력해야 겠어요.");
	else if ((grade == 6) || (grade == 5))
		printf("노력해야 겠어요.");
	else if ((grade == 4) || (grade == 3))
		printf("잘했어요");
	else if ((grade == 2) || (grade == 1))
		printf("아주 잘했어요.");

	return 0;
}

 

5-14. 입력받은 성적에 대응하는 등급 출력 (if문 사용)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	
	int grade;

	printf("성적 입력: ");
	scanf(" %d", &grade);

	if (grade > 100 || grade < 0)
		printf("잘못된 입력");
	else if (grade >= 90)
		printf("A");
	else if (grade >= 80)
		printf("B");
	else if (grade >= 70)
		printf("C");
	else if (grade >= 60)
		printf("D");
	else
		printf("F");

	return 0;
}

 

5-15. 입력받은 등급에 대응하는 조언 및 칭찬 출력 (switch문 사용)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int grade;

	printf("등급: ");
	scanf(" %d", &grade);

	switch (grade) {
	case 1:
		printf("아주 잘했어요");
		break;
	case 2:
	case 3:
		printf("잘했어요");
		break;
	case 4:
	case 5:
		printf("노력해야겠어요");
		break;
	case 6:
	case 7:
		printf("아주 많이 노력해야 겠어요");
		break;
	default:
		printf("잘못된 입력");
	}

	return 0;
}

 

5-16. 입력받은 영문자로 시작하는 프로그래밍 언어명 출력 (switch문 사용)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	char ch;

	printf("영문자 입력: ");
	scanf(" %c", &ch);

	switch (ch) {
	case 'b':
	case 'B':
		printf("BASIC");
		break;
	case 'c':
	case 'C':
		printf("COBOL");
		break;
	case 'f':
	case 'F':
		printf("FORTRAN");
		break;
	case 'l':
	case 'L':
		printf("LISP");
		break;
	case 'p':
	case 'P':
		printf("PASCAL"); //Pascal만 소문자로 나와서 대문자로 고침
		break;
	default:
		printf("잘못된 입력");
	}

	return 0;
}

교재에는 PASCAL만 "Pascal"과 같이 대문자와 소문자가 혼용된 형태로 표기됐는데, 통일성을 위해서 "PASCAL"로 수정했습니다.

 

5-17. 입력받은 등수에 대응하는 상품 출력 (switch문 사용)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int rank;

	printf("등수: ");
	scanf(" %d", &rank);

	printf("상품: \n");
	switch (rank) {
	case 1:
		printf("  프린터\n");
	case 2:
		printf("  컴퓨터\n");
	case 3:
		printf("  상금\n");
	case 4:
		printf("  상패\n");
		break;
	default:
		printf("잘못된 입력");
	}

	return 0;
}

 

5-18. 입력받은 성적에 대응하는 등급 출력 (switch문 사용)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int grade;
	
	printf("성적: ");
	scanf(" %d", &grade);
	if (grade > 100 || grade < 0) {
		printf("잘못된 입력");
		return 0;
	}

	switch(grade / 10) {
	case 10:
	case 9:
		printf("등급 : A");
		break;
	case 8:
		printf("등급 : B");
		break;
	case 7:
		printf("등급 : C");
		break;
	case 6:
		printf("등급 : D");
		break;
	default:
		printf("등급: F");
		break;
	}

	return 0;
}

 

5-19. 두 숫자와 연산기호를 입력받아서 연산 결과 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int num1, num2;
	char oper; //연산자

	printf("입력(연산기호, 숫자, 숫자): ");
	scanf(" %c %d %d", &oper, &num1, &num2);

	printf("연산 결과: ");
	switch (oper) {
	case '+':
		printf("%d", num1 + num2);
		break;
	case '-':
		printf("%d", num1 - num2);
		break;
	case '*':
		printf("%d", num1 * num2);
		break;
	case '/':
		printf("%d", num1 / num2);
		break;
	default:
		printf("ERROR");
		break;
	}

	return 0;
}

 

5-20. 지불금액 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int price;
	int num; //개수

	printf("물건값: ");
	scanf(" %d", &price);
	printf("개  수: ");
	scanf(" %d", &num);
	printf("금  액: ");
	if (price * num <= 5000)
		printf("%d", price * num);
	else
		printf("%d", price * num - (int)(price * num * 0.1));

	return 0;
}

 

5-21. 잔금의 동전별 개수 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int deposit; //입금액
	int price; //물건값
	int change; //잔금

	printf("입금액: ");
	scanf(" %d", &deposit);
	printf("물건값: ");
	scanf(" %d", &price);

	change = deposit - price;
	printf("잔  금: %d원 {", change);
	if (change >= 500) {
		printf(" 500원(%d)", change / 500);
		change = change - 500 * (change / 500);
	}
	if (change >= 100) {
		printf(" 100원(%d)", change / 100);
		change = change - 100 * (change / 100);
	}
	if (change >= 50) {
		printf(" 50원(%d)", change / 50);
		change = change - 50 * (change / 50);
	}
	if (change >= 10) {
		printf(" 10원(%d)", change / 10);
		change = change - 10 * (change / 10);
	}
	printf(" }");

	return 0;
}

 

반응형