반응형
[ 7 ~ 12번 ]
* 본문은 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)으로 인정해준다.
반응형
'C언어 > 쉽게 풀어쓴 C언어 EXPRESS 개정4판' 카테고리의 다른 글
[6上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 6장 PROGRAMMING (1~6번) (0) | 2023.06.18 |
---|---|
[5下] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 5장 PROGRAMMING (7~12번) (0) | 2023.06.18 |
[4下] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 4장 PROGRAMMING (7~12번) (1) | 2023.06.03 |
[4上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 4장 PROGRAMMING (1~6번) (0) | 2023.06.03 |
[3] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 3장 PROGRAMMING (1) | 2023.05.27 |