728x90

26-1

문제1) 세 개의 정수를 인자로 받아서 이 세 정수의 덧셈겨로가와 곱셈결과를 반환하는 매크로 함수를 각각 정의해보자.

#include <stdio.h>
#define ADD(x,y,z) ((x)+(y)+(z))
#define MUL(x,y,z) ((x)*(y)*(z))

int main(void){
    printf("3+4+5=%d\n", ADD(3,4,5));
    printf("3*4*5=%d\n", MUL(3,4,5));
    return 0;
}

이것은 크게 어렵지 않았다. 일단 모든 것의 시작인 printf를 해주는 stdio.h를 선언해주고 정의를 더하기와 곱하기를 해준다. 그리고 한칸 띄워서 x,y,z를 더해주고 곱하는 식을 작성한다. 이때 잘못 계산되지 않도록 괄호를 최대한 해준다.

출력 식을 적을 때 나는 약간의 실수를 하였는데 x,y,z로 호출식을 작성한 것이다. 여기서는 반드시 숫자를 써주도록 하자. 그래야 알아서 x,y,z에 자리별로 맞추어 넣어준다.


문제2) 원주율 PI를 매크로 상수로 정의하고 이를 이용해서 원의 넓이를 구하는 매크로 함수 AREA를 정의해보자

#include <stdio.h>
#define PI 3.1415
#define AREA(r) ((r)*(r)*PI)

int main(void){
    double rad;
    scanf("%lf", &rad);
    printf("원의 넓이는: %g", AREA(rad));
}

이번 문제는 문제를 절반만 읽고 해서 틀렸었다. 두개 다 매크로 상수 정의하는 건데.... 그리고 값을 가져올 때는 괄호를 이용해 새로운 변수를 넣어주자. 그리고 double은 소수점까지 나올 수 있는 것이기 때문에 실수로 선언을 해주어야 하고 실수 저장 타입인 %lf를 이용해서 해주어야 한다. 그리고 내가 잘 몰랐던 부분이 있었는데 바로 원 넓이 출력부분이다. 평소에 %c와 %d만 써서 잘 몰랐는데 %g는 실수형 자동 출력 형태라고 한다. 이런 경우를 대비해서 잘 알아놓아야 겠다. 코드가 다들 짧고 복습 차원인것 같다.


문제3) 두 값의 크기를 비교하여 큰 값을 반환하는 매크로 함수 MAX를 정의해보자. 참고로 이는 조건 연산자를 이용해서 정의하는 것이 바람직하다.

#include <stdio.h>
#define MAX(x,y) ((x>y)? (x):(y))

int main(void){
    int a,b;
    scanf("%d %d", &a, &b);
    printf("%d", MAX(a,b));
    return 0;
}

이 문제는 앞에서 배웠던 조건 연산자를 생각해내는 것이 필요한 것이었다. 조건 연산자로 x, y를 만들어준다. 그리고 입력을 받아야 하므로 int 와 scanf를 통해 값을 저장해서 a, b를 x,y로 전달해주었다. 이렇게 값이 저장되어 있다면 얼마든지 호출시에 변수를 숫자 쓰지 않아도 된다. 크게 어렵지 않은 문제였다.

 

 

열혈 C의 단원별 문제는 이제 끝!

728x90

'C language > 열혈C 문제풀이' 카테고리의 다른 글

[C] 열혈 C 문제풀이 25  (0) 2021.08.12
[C] 열혈C 문제풀이 24  (0) 2021.08.12
[C] 열혈C 문제풀이 17-1  (0) 2021.08.12
[C] 열혈C 문제풀이 16-1  (0) 2021.08.12
[C] 열혈C 문제풀이 14-1  (0) 2021.08.12

+ Recent posts