본문 바로가기
책./C언어 콘서트

8장(함수) Programming #C언어 콘서트

by 낭람._. 2022. 8. 10.
반응형
1. f(x, y) = 1.5*x+3.0*y를 계산하는 함수를 작성하고 테스트 해본다.
x=1.0, y=1.0, f(x,y)=4.500000
x=2.0, y=1.0, f(x,y)=6.000000
x=1.0, y=2.0, f(x,y)=7.500000
#include<stdio.h>

double f(double x, double y) {
    return 1.5*x + 3.0*y;
}

int main() {
    printf("x=%0.1lf, y=%0.1lf, f(x,y)=%lf\n",1.0, 1.0, f(1.0, 1.0));
    printf("x=%0.1lf, y=%0.1lf, f(x,y)=%lf\n",2.0, 1.0, f(2.0, 1.0));
    printf("x=%0.1lf, y=%0.1lf, f(x,y)=%lf\n",1.0, 2.0, f(1.0, 2.0));
    return 0;
}

 

2. 두 수 중에서 더 큰 수를 반환하는 함수 get_bigger()를 다음과 같이 작성하고 이것을 이용해서 사용자로부터 받은 실수 두 개 중에서 더 큰 수를 출력하는 프로그램을 작성해본다.
실수를 입력하시오: 1.5
실수를 입력하시오: 2.5
더 큰수는 2.500000입니다.
#include<stdio.h>

double get_bigger(double x, double y) {
    return x >= y ? x : y;
}

int main() {
    double x, y;
    printf("실수를 입력하시오: ");
    scanf("%lf", &x);
    printf("실수를 입력하시오: ");
    scanf("%lf", &y);
    printf("더 큰수는 %lf입니다.\n", get_bigger(x, y));
    return 0;
}

 

3. 다음과 같이 화면에 *****************를 출력하는 함수를 작성하고 이것을 호출하여서 다음과 같은 출력을 만들어 보자.
void draw_starts(void)
{
    printf("*****************\n");
}
*****************
Hello World!
*****************
#include<stdio.h>

void draw_starts(void)
{
    printf("*****************\n");
}

int main() {
    draw_starts();
    printf("Hello World!\n");
    draw_starts();
    return 0;
}

 

4. 주어진 정수의 약수를 모두 찾아내는 함수 get_divisor()를 작성하여 보라. 만약 8이 주어지면 1, 2, 4, 8을 화면에 출력하여야 한다. 이 함수를 테스트하기 위한 main()를 작성하시오.
8의 약수=1 2 4 8
#include<stdio.h>

void get_divisor(int x) {
    for(int i=1; i<=x; i++) {
        if(x % i == 0) {
            printf("%d ", i);
        }
    }
}

int main() {
    printf("8의 약수=");
    get_divisor(8);
    return 0;
}

 

5. 주어진 정수가 소수(prime number)인지를 검사하는 함수 prime()을 작성하라. 이 함수를 이용하여 1부터 100사이에 존재하는 소수들을 모두 출력하라. 하나의 힌트는 소수라면 1과 자기 자신을 제외한 약수를 가지면 안 된다. 따라서 만약 정수 n이 소수인지를 검사하려면 2부터 n-1까지의 숫자로 n을 나누어서 나누어 떨어지지 않으면 소수이다.
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
#include<stdio.h>

int is_prime(int x) {
    for(int i=2; i<x; i++) {
        if(x % i == 0) 
            return 0;
    }
    return 1;
}

int main() {
    for(int i=2; i<=100; i++) {
        if(is_prime(i)) {
            printf("%d ", i);
        }
    }
    return 0;
}

 

6. 거듭제곱을 계산하는 함수를 작성하여 보자. 정수 n과 k를 받아서 n^k승을 계산하는 함수 ipower() 함수를 작성한다. 이 함수를 호출하여 3^0붙처 3^5까지의 값을 테이블의 형태로 출력하는 프로그램을 작성하시오.
1
3
9
27
81
243
#include<stdio.h>

int ipower(int n, int k) {
    int pow = 1;
    for(int i=0; i<k; i++) {
        pow *= n;
    }
    return pow;
}

int main() {
    for(int i=0; i<=5; i++) {
        printf("%d\n",ipower(3, i));
    }
    return 0;
}

 

7. 두 점사이의 거리를 계산하는 함수를 작성하여 보자. 2차원 공간에서 점 (x1, y1)와 (x2, y2) 사이의 거리를 계산하는 dist_2d()를 작성하시오. 다음과 같은 두 점 사이의 거리를 계산하는 공식을 사용하라.

첫번째 점의 좌표를 입력하시오:(x, y)1 1
두번째 점의 좌표를 입력하시오:(x, y)6 6
두 점 사이의 거리는 7.071068입니다.
#include<stdio.h>
#include<math.h>

double dist_2d(double x1, double y1, double x2, double y2) {
    return sqrt(pow(x1-x2, 2)+pow(y1-y2, 2));
}

int main() {
    double x1, y1, x2, y2;
    printf("첫번째 점의 좌표를 입력하시오:(x, y)");
    scanf("%lf %lf", &x1, &y1);
    printf("두번째 점의 좌표를 입력하시오:(x, y)");
    scanf("%lf %lf", &x2, &y2);

    printf("두 점 사이의 거리는 %lf입니다.\n", dist_2d(x1, y1, x2, y2));
    return 0;
}

 

8. 2차 방정식의 근을 게산하는 함수 quad_eqn()를 작성하시오. quad_eqn() 함수는 a, b, c를 나타내는 double형의 3개의 인수를 받는다. 판별식이 양수인 경우에만 근을 출력하시오. 만약 판별식의 값이 음수이면 근이 없다는 메시지를 출력하시오.

2차 방정식의 계수를 입력하시오:
a: 1
b: -5
c: 6
3.000000
2.000000
#include<stdio.h>
#include<math.h>

void quad_eqn(int a, int b, int c) {
    double x1 = (-b + sqrt(pow((double)b, 2) - 4*a*c)) / 2*a;
    
    double x2 = (-b - sqrt(pow((double)b, 2) - 4*a*c)) / 2*a;

    x1 > 0 ? printf("%lf\n",x1) : printf("근이 없습니다.\n");
    x2 > 0 ? printf("%lf\n",x2) : printf("근이 없습니다.\n");
}

int main(){
    int a, b, c;
    
    printf("2차 방정식의 계수를 입력하시오:\n");
    
    printf("a: ");
    scanf("%d", &a);
    printf("b: ");
    scanf("%d", &b);
    printf("c: ");
    scanf("%d", &c);

    quad_eqn(a, b, c);

    return 0;
}

 

9. 난수 생성 함수를 이용하여 컴퓨터로 여러 가지 문제를 시뮬레이션하는 것을 흔히 몬테 까를로(Monte Carlo) 시뮬레이션이라고 한다. 간단한 동전 던지기 게임을 시뮬레이션하여 보자. 컴퓨터가 동전을 던지고 사용자는 앞뒤를 말한다. 컴퓨터는 난수 생성 함수를 이용하여 난수를 생성한 후에 난수가 짝수이면 동전의 앞면으로 간주하고 홀수이면 동전의 뒷면으로 간주한다. 이것을 몇 번 반복하여 승패를 기록한다.
앞(0) 또는 뒤(1)를 선택하시오(종료는 -1):0
컴퓨터가 이겼습니다.
앞(0) 또는 뒤(1)를 선택하시오(종료는 -1):1
사용자가 이겼습니다.
앞(0) 또는 뒤(1)를 선택하시오(종료는 -1):-1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main() {
    int ans;
    srand(time(NULL));
    while(1) {
        printf("앞(0) 또는 뒤(1)를 선택하시오(종료는 -1):");
        scanf("%d", &ans);
        if(ans == -1)
            break;
        if(rand()%2 == 0 && ans == 0) {
            printf("사용자가 이겼습니다.\n");
        }else if(rand()%2 == 1 && ans == 1) {
            printf("사용자가 이겼습니다.\n");
        }else {
            printf("컴퓨터가 이겼습니다.\n");
        }
    }
    return 0;
}

 

10. 덧셈, 뺄셈, 곱셈, 나눗셈을 지원하는 계산기 프로그램을 작성하여 보자. 이번에는 각 연산들이 몇 번씩 계산되었는지를 기억하게 하자. 각 연산을 지원하는 함수들은 자신이 호출된 횟수를 화면에 출력한다.
(a) 정적 지역 변수를 사용하여 프로그램을 작성하라.
(b) 전역 변수를 사용하여 프로그램을 작성하라.
연산을 입력하시오(종료는 Ctrl+C): 1+2
덧셈은 총 1번 호출되었습니다.
연산 결과:1+2=3
연산을 입력하시오(종료는 Ctrl+C): 2+3
덧셈은 총 2번 호출되었습니다.
연산 결과:2+3=5
연산을 입력하시오(종료는 Ctrl+C):
#include<stdio.h>

int sum(int x, int y) {
    static int sum_cnt = 1;
    printf("덧셈은 총 %d번 호출되었습니다.\n", sum_cnt++);
    return x+y;
}
int sub(int x, int y) {
    static int sub_cnt = 1;
    printf("뺄셈은 총 %d번 호출되었습니다.\n", sub_cnt++);
    return x-y;
}
int mul(int x, int y) {
    static int mul_cnt = 1;
    printf("곱셈은 총 %d번 호출되었습니다.\n", mul_cnt++);
    return x*y;
}
double div(int x, int y) {
    static int div_cnt = 1;
    printf("나눗셈은 총 %d번 호출되었습니다.\n", div_cnt++);
    if(y==0)
        return 0;
    return (double)x/y;
}

int main() {
    int x, y, result;
    char op;
    while(1) {
        printf("연산을 입력하시오(종료는 Ctrl+C): ");
        scanf("%d%c%d", &x, &op, &y);
        switch(op) {
            case '+' :
                printf("연산 결과:%d%c%d=%d\n", x, op, y, sum(x, y));
                break;
            case '-' :
                printf("연산 결과:%d%c%d=%d\n", x, op, y, sub(x, y));
                break;
            case '*' :
                printf("연산 결과:%d%c%d=%d\n", x, op, y, mul(x, y));
                break;
            case '/' :
                printf("연산 결과:%d%c%d=%lf\n", x, op, y, div(x, y));
                break;
            default :
                printf("[usage] x op y\n");
        }
    }
}
#include<stdio.h>

int sum_cnt = 1;
int sub_cnt = 1;
int mul_cnt = 1;
int div_cnt = 1;

int sum(int x, int y) {
    printf("덧셈은 총 %d번 호출되었습니다.\n", sum_cnt++);
    return x+y;
}
int sub(int x, int y) {
    printf("뺄셈은 총 %d번 호출되었습니다.\n", sub_cnt++);
    return x-y;
}
int mul(int x, int y) {
    printf("곱셈은 총 %d번 호출되었습니다.\n", mul_cnt++);
    return x*y;
}
double div(int x, int y) {
    printf("나눗셈은 총 %d번 호출되었습니다.\n", div_cnt++);
    if(y==0)
        return 0;
    return (double)x/y;
}

int main() {
    int x, y, result;
    char op;
    while(1) {
        printf("연산을 입력하시오(종료는 Ctrl+C): ");
        scanf("%d%c%d", &x, &op, &y);
        switch(op) {
            case '+' :
                printf("연산 결과:%d%c%d=%d\n", x, op, y, sum(x, y));
                break;
            case '-' :
                printf("연산 결과:%d%c%d=%d\n", x, op, y, sub(x, y));
                break;
            case '*' :
                printf("연산 결과:%d%c%d=%d\n", x, op, y, mul(x, y));
                break;
            case '/' :
                printf("연산 결과:%d%c%d=%lf\n", x, op, y, div(x, y));
                break;
            default :
                printf("[usage] x op y\n");
        }
    }
}

 

11. 돈만 생기면 저금하는 사람을 가정하자. 이 사람을 위한 함수 save(int amount)를 작성하여 보자. 이 함수는 저금할 금액을 나타내는 하나의 인수 amount만을 받으며 save(100)과 같이 호출된다. save()는 현재까지 저축된 총액을 기억하고 있으며 한 번 호출될 때마다 총 저축액을 화면에 출력한다.
(a) 전역 변수를 사용하여 구현하라.
(b) 정적 지역 변수를 사용하여 구현하라.
(c) 예금 인출을 나타내는 함수 draw(int amount)도 작성하여 보자. save()와 draw()를 동시에 사용하려면 저금액은 어떤 종류의 변수로 표현하여야 하는가? - 전역 변수
얼마를 저축하시겠습니까?(종료는 -1): 200
지금까지의 저축액은 200입니다.
얼마를 저축하시겠습니까?(종료는 -1): 300
지금까지의 저축액은 500입니다.
얼마를 저축하시겠습니까?(종료는 -1): -1
#include<stdio.h>

int save(int amount) {
    static int money = 0;
    money += amount;
    return money;
}

int main() {
    int amount;
    while(1) {
        printf("얼마를 저축하시겠습니까?(종료는 -1): ");
        scanf("%d", &amount);
        if(amount == -1)
            break;
        printf("지금까지의 저축액은 %d입니다.\n", save(amount));
    }
    return 0;
}
#include<stdio.h>

int money = 0;

void save(int amount) {
    money += amount;
}

int main() {
    int amount;
    while(1) {
        printf("얼마를 저축하시겠습니까?(종료는 -1): ");
        scanf("%d", &amount);
        if(amount == -1)
            break;
        save(amount);
        printf("지금까지의 저축액은 %d입니다.\n", money);
    }
    return 0;
}
#include<stdio.h>

int money = 0;

void save(int amount) {
    money += amount;
}
void draw(int amount) {
    if(money+amount < 0) {
        printf("인출할 수 없습니다.\n");
        return;
    }
    money += amount;
}

int main() {
    int amount;
    while(1) {
        printf("얼마를 저축하시겠습니까?(종료는 -1): ");
        scanf("%d", &amount);
        if(amount == -1)
            break;
        else if(amount < 0)
            draw(amount);
        else
            save(amount);
        printf("지금까지의 저축액은 %d입니다.\n", money);
    }
    return 0;
}

 

12. 재귀 호출을 이용하여 정수의 각 자리수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하라. 즉 정수가 1234이면 화면에 1 2 3 4와 같이 출력한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 재귀 호출한다. 예를 들어서 1234의 4를 출력하고 나머지 123을 가지고 다시 같은 함수를 재귀 호출한다. 1234를 10으로 나누면 123이 되고 4는 1234를 10으로 나눈 나머지이다.
정수를 입력하시오: 1234
1 2 3 4
#include<stdio.h>

void show_digit(int x) {
    if(x > 0) {
        show_digit(x / 10);    
        printf("%d ", x % 10);
    }
    
}

int main() {
    int a;
    printf("정수를 입력하시오: ");
    scanf("%d", &a);
    show_digit(a);
    return 0;
}

 

13. 다음을 계산하는 재귀적인 프로그램을 작성하시오.

정수를 입력하시오: 10
3025
#include<stdio.h>

int n_cubed(int n) {
    if(n == 1)
        return 1;
    return (n*n*n) + n_cubed(n-1);
}

int main() {
    int n;
    printf("정수를 입력하시오: ");
    scanf("%d", &n);
    printf("%d\n", n_cubed(n));
    return 0;
}

 

반응형

댓글