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

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

by EATSTAR 2023. 6. 3.
반응형

[ 7 ~ 12번 ]

 

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

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

eatstar.tistory.com

 

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

1. 사용자로부터 2개의 정수를 입력받아서 첫 번째 정수를 두 번째 정수로 나누었을 때 얻게 되는 몫과 나머지를 출력하는 프로그램을 작성하시오.  (나머지 연산자 / MEDIUM)

정수 2개를 입력하시오: 10 3

몫: 3
나머지: 1
문제 의도
/ 와 %를 적절히 사용할 수 있는가?

 

#include <stdio.h>

int main(void) {
	// portion은 몫, rest는 나머지
	int num1, num2, portion, rest;

	printf("정수 2개를 입력하시오: ");
	scanf_s("%d %d", &num1, &num2);

	portion = num1 / num2;
	rest = num1 % num2;

	printf("\n몫: %d\n", portion);
	printf("나머지: %d", rest);

	return 0;
}
코드 설명
portion(몫), num1, num2는 모두 정수이므로 나누기를 하면 소수점은 절삭된다.
반면, %연산자를 사용하면, 그 절삭된 부분이 출력된다.

 

 


2. 2개의 double 형의 실수를 읽어서 합, 차, 곱, 몫을 구하는 프로그램을 작성하라. (실수 계산, 실수 출력 / MEDIUM)

실수를 입력하시오: 2.0 3.0
5.00 -1.00 6.00 0.67
문제 의도
합(+), 차(-), 곱(*), 몫(/) 등의 실수 연산과 출력을 적절히 할 수 있는가?

 

#include <stdio.h>

int main(void) {
	// add~portion은 각각 덧셈, 뺄셈, 곱셈, 몫
	double num1, num2, add, subtract, multiply, portion;

	printf("실수를 입력하시오: ");
	scanf_s("%lf %lf", &num1, &num2);

	add = num1 + num2;
	subtract = num1 - num2;
	multiply = num1 * num2;
	portion = num1 / num2;

	printf("%.2lf ", add);
	printf("%.2lf ", subtract);
	printf("%.2lf ", multiply);
	printf("%.2lf", portion);

	return 0;
}
코드 설명
add, substract, multiply같은 사칙연산 함수와 portion의 몫 변수를 설계한다. 연산자를 써서 변수를 설계하면 간단하다.
물론, printf("%.2lf", add);에서 add를 바로 변수 선언 없이 num1+num2로 해줄 수도 있으나, 필자는 이게 더 깔끔하다고 생각한다. 스타일의 차이다.

 

 


3. 3개의 정수값을 입력받아서, 3개의 정수값 중에서 최대값을 출력하는 프로그램을 작성하라 (조건 연산자 / MEDIUM)

정수 3개를 입력하시오: 2 3 4
최대값은 4입니다.
문제 의도
두 수를 우선 비교하고, 그 중 큰 수를 나머지 수와 비교하도록 설계할 수 있는가?
이 과정에서 조건 연산자를 활용 가능한가?

 

#include <stdio.h>

int main(void) {
	int x, y, z, max_xy, max_value;

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

	// 조건연산자, x와 y 중 큰 값을 z와 비교한다.
	max_xy = (x > y) ? x : y;
	max_value = (max_xy > z) ? max_xy : z;

	printf("최대값은 %d입니다.", max_value);

	return 0;
}
코드 설명
조건 연산자를 활용해서 x와 y 중 큰 변수를 max_xy에 저장한다. 마찬가지로, max_xy와 z를 비교하여 최종적으로 x, y, z 중 가장 큰 변수를 찾아내 출력한다.

 


4. cm로 표현된 키를 입력하여 피트와 인치로 변환하는 프로그램을 작성하시오. 1피트는 12인치이고 1인치는 2.54cm이다. (나머지 연산자 / MEDIUM)

키를 입력하십시오(cm): 163
163cm는 5피트 4.17인치입니다.
문제 의도
더 높은 수준의 %연산자를 활용할 수 있는가?

 

#include <stdio.h>

int main(void) {
	//int랑 double 둘 중 하나
	int tall, feet;
	double inch;

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

	feet = tall / (12*2.54);
	inch = (tall - feet*12*2.54) / 2.54;

	printf("%dcm는 %d피트 %.2lf인치입니다.", tall, feet, inch);

	return 0;
}
코드 설명
직관적인 계산 방식을 택했다.
물론, 이 문제의 의도에 따르면 나머지 연산자를 써야 한다. 그러나 나머지 연산자를 쓰기에 좋지 않은 환경이다.
아래의 코드를 보여주겠다.

 

inch에 %연산자를 사용하고 싶지만..

#include <stdio.h>

int main(void) {
    int tall, feet;
    double inch;

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

    feet = tall / (12 * 2.54);
    inch = (tall % (12 * 2.54)) / 2.54;

    printf("%dcm는 %d피트 %.2lf인치입니다.", tall, feet, inch);

    return 0;
}
tall은 int 형이기 때문에 %연산자 계산에 문제가 없지만, 뒤에 해당하는 수가 double 형이여서 %연산자에 맞지 않는 오류가 발생한다. 그렇다고 막 (int) 형변환을 계산식에 해버리면 계산 결과가 엉망이 된다.

 

좀 더 체계적으로 정리해서도 해보자!

#include <stdio.h>

int main(void) {
    int tall, feet;
    double inch, inch_total;

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

    inch_total = tall / 2.54;
    feet = inch_total / 12;
    inch = inch_total - feet * 12;

    printf("%dcm는 %d피트 %.2lf인치입니다.", tall, feet, inch);

    return 0;
}
한편, 이런 식으로 체계적으로 코드를 진행하는 것도 괜찮다. (나중에 사람이 이해하기 편하다)
총 몇인치인지 구하고, 그걸로 몇 피트인지 구하고, 전체에서 해당 피트만큼의 인치를 빼줘서 나머지 인치를 구해준다.

 

 


5. 100보다 작은 정수를 입력받아서 이것을 십의 자리, 일의 자리로 분리하여 출력하는 프로그램을 작성하시오. 즉 사용자가 정수 23을 입력하면 2, 3을 차례로 출력하면 된다. (나머지 연산자 / HARD)

정수를 입력하시오: 23

십의 자리: 2
일의 자리: 3
문제 의도
/와 %를 이용해서 십의 자리와 일의 자리를 분리하여 출력할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int x, ten, one;

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

	ten = x / 10;
	one = x % 10;

	printf("십의 자리: %d\n", ten);
	printf("일의 자리: %d", one);

	return 0;
}
코드 설명
다사다난했던 4번 문제에 비해, 비교적 쉽다. 모두 정수이기 때문에 간단하게 %연산자를 사용하면 끝.
/로 몫도 구해주자.

 

 


6. (1.0-0.9)==0.1의 값은 당연히 1이어야 한다. 하지만 0이 출력된다. 출력값이 1이 나오도록 코드를 작성해보자. 부동소수점수를 비교할 때는 어떻게 하여야 하는가? (부동소수점 비교 / MEDIUM)

(1.0-0.9)==0.1 은 1 입니다.
문제 의도
fab(x,y)를 통해 부동소수점을 구할 수 있는가?

 

#include <stdio.h>
#include <math.h>

int main(void) {
	int turefalse;

	// 계산 결과의 참거짓 판별
	turefalse = (1.0 - 0.9 == 0.1);
	printf("(1.0-0.9)==0.1은 %d입니다.", turefalse);

	return 0;
}
코드 설명
<math.h>는 fab 함수를 사용하기 위해 불러온다.
일단 위와 같은 코드를 작성해보자.

 

위와 같이 0(거짓)으로 나온다. 그렇다면 어떤 함수를 활용해야 할까?
그렇다. fab다.

 

#include <stdio.h>
#include <math.h>

int main(void) {
	int turefalse;

	// 계산 결과의 참거짓 판별
	turefalse = fabs((1.0 - 0.9 == 0.1) < 0.000001);
	printf("(1.0-0.9)==0.1은 %d입니다.", turefalse);

	return 0;
}
이렇게 써주게 되면 0.000001(1e-6) 오차 안에서는 참(1)으로 인정해준다.

 

반응형