728x90

문제1) 변수 num에 저장된 값의 제곱을 계산하는 함수를 정의하고, 이를 호출하는 main함수를 작성해보자. 단, 여기서는 다음 두가지 형태로 함수를 정의해야한다.

* Call-by-value 기반의 SquareByValue 함수

* Call-by-reference 기반의 SquareByReference함수

 

SquareByValue함수는 인자로 전달된 갑의 제곱을 반환해야하며, SquareByReference 함수는 정수가 저장되어있는 변수의 주소값을 인자로 받아서 해당 변수에 저장된 값의 제곱을 그 변수에 다시 저장해야 한다.

#include <stdio.h>
void number(int num1){
    printf("%d", num1*num1);
}
int main(void){
    int num;
    scanf("%d", &num);
    number(num);
    return 0;
}
#include <stdio.h>
void number(int *num1){
    printf("%d", *num1 * *num1 );
}
int main(void){
    int num;
    scanf("%d", &num);
    number(&num);
    return 0;
}

음. 이건 내가 하는 방식이 맞는지는 잘 모르겠다. 첫번째 것은 호출하는데 단순히 number()형태로 호출하는 방식을 구현하였고 두번째는 포인터를 써보았다. 처음엔 main에서 출력할 수 있도록 하려했는데 잘안돼서 그냥 함수에서 출력을 넣어버리기. *가 많이 들어가니 이상해 보인다. 위에거랑 다른점은 함수 호출할 때 부르는게 다르다는 것? 첫번째것은 그냥 변수를 호출한다고 하면 아래 것은 주소값을 넘기는 것이라고 볼 수 있다.

 


문제2) 세 변수에 저장된 값을 서로 뒤바꾸는 함수를 정의해보자. 예를 들어서 함수의 이름이 Swap3라 하면 다음의 형태로 함수가 호출되어야 한다.

Swap3(&num1, &num2, &num3);

그리고 함수호출의 결과로 num1에 저장된 값은 num2에, num2에 저장된 값은 num3에, 그리고 num3에 저장된 값은 num1에 저장되어야 한다.

#include <stdio.h>
int temp;
void Swap3(int *num11, int *num12, int *num13){
    temp=*num13;
    *num13=*num12;
    *num12=*num11;
    *num11=temp;
}
int main(void){
    int num1, num2, num3;
    scanf("%d %d %d", &num1, &num2, &num3);
    Swap3(&num1, &num2, &num3);
    printf("%d %d %d", num1, num2, num3);
}

위에 것을 연습했고 이 단원을 제대로 봤다면 비슷한 문제이기에 캐치하기 쉬운 것 같다. temp를 이용해서 하는 것은 익숙하고 이를 함수안에 넣어주는 것, 그리고 포인터 변수를 이용한다는 것이 핵심인 것 같다. 함수 호출 방식이 &변수 였기 때문이다. 이외에는 입력받고 return없이 main에서 바로 숫자를 호출하면 제대로 나온다는 것만 확인을 하면 될 것 같다.

 

728x90

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

[C] 열혈C 문제풀이 17-1  (0) 2021.08.12
[C] 열혈C 문제풀이 16-1  (0) 2021.08.12
[C] 열혈C 문제풀이 13-1 1번,3번  (0) 2021.08.12
[C]열혈C 문제풀이 12-1 2번  (0) 2021.08.12
[C] 열혈C 문제풀이 11-2  (0) 2021.08.12

+ Recent posts