C 언어로 다항식 표현식 평가하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍에서 다항식 표현식을 평가하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다: 사용자 입력으로부터 다항식 계수와 변수 x 를 읽고, 호너 방법을 사용하여 다항식 표현식을 효율적으로 평가하는 것입니다. 이 실습을 마치면 C 에서 대수 표현식을 다루고 효과적인 다항식 평가 알고리즘을 구현하는 데 대한 이해도가 높아질 것입니다.

계수 및 변수 x 읽기

이 단계에서는 C 프로그램에서 사용자 입력으로부터 다항식 계수와 변수 x 를 읽는 방법을 배웁니다. 이는 다항식 평가 알고리즘을 구현하는 첫 번째 부분입니다.

먼저 다항식 평가 프로그램을 위한 새로운 C 파일을 만듭니다.

cd ~/project
nano polynomial_eval.c

이제 계수와 변수 x 를 읽는 다음 코드를 추가합니다.

#include <stdio.h>

#define MAX_DEGREE 10

int main() {
    int degree;
    double coefficients[MAX_DEGREE + 1];
    double x;

    // 다항식의 차수를 읽습니다.
    printf("다항식의 차수를 입력하세요 (0-10): ");
    scanf("%d", &degree);

    // 계수를 읽습니다.
    printf("최고차항부터 상수항까지 계수를 입력하세요:\n");
    for (int i = degree; i >= 0; i--) {
        printf("x^%d의 계수: ", i);
        scanf("%lf", &coefficients[i]);
    }

    // x 의 값을 읽습니다.
    printf("x 의 값을 입력하세요: ");
    scanf("%lf", &x);

    return 0;
}

예시 출력:

다항식의 차수를 입력하세요 (0-10): 3
최고차항부터 상수항까지 계수를 입력하세요:
x^3의 계수: 2
x^2의 계수: -3
x^1의 계수: 0
x^0의 계수: 5
x의 값을 입력하세요: 2

코드를 자세히 살펴보겠습니다.

  • 다항식의 최대 차수를 정의하여 버퍼 오버플로우를 방지합니다.
  • degree는 다항식의 차수를 저장합니다.
  • coefficients 배열은 최고차항부터 상수항까지 계수를 저장합니다.
  • x는 다항식을 평가할 값을 저장합니다.
  • scanf()를 사용하여 사용자 입력 (차수, 계수, x 값) 을 읽습니다.

컴파일하고 프로그램을 실행하여 입력을 테스트합니다.

gcc polynomial_eval.c -o polynomial_eval
./polynomial_eval

호너 방법을 이용한 평가

이 단계에서는 다항식 표현식을 효율적으로 평가하기 위해 호너 방법을 구현합니다. 호너 방법은 다항식 값을 계산하는 데 필요한 곱셈 횟수를 줄입니다.

이전 C 파일을 열고 호너 방법 평가를 포함하도록 수정합니다.

cd ~/project
nano polynomial_eval.c

호너 방법 구현을 포함하여 코드를 업데이트합니다.

#include <stdio.h>

#define MAX_DEGREE 10

double hornerMethod(int degree, double coefficients[], double x) {
    double result = coefficients[degree];

    for (int i = degree - 1; i >= 0; i--) {
        result = result * x + coefficients[i];
    }

    return result;
}

int main() {
    int degree;
    double coefficients[MAX_DEGREE + 1];
    double x, result;

    // 이전 입력 코드는 동일하게 유지
    printf("다항식의 차수를 입력하세요 (0-10): ");
    scanf("%d", &degree);

    printf("최고차항부터 상수항까지 계수를 입력하세요:\n");
    for (int i = degree; i >= 0; i--) {
        printf("x^%d의 계수: ", i);
        scanf("%lf", &coefficients[i]);
    }

    printf("x 의 값을 입력하세요: ");
    scanf("%lf", &x);

    // 호너 방법을 사용하여 다항식을 평가합니다.
    result = hornerMethod(degree, coefficients, x);

    printf("x = %.2f 에서 다항식의 값은: %.2f\n", x, result);

    return 0;
}

업데이트된 프로그램을 컴파일하고 실행합니다.

gcc polynomial_eval.c -o polynomial_eval
./polynomial_eval

예시 출력:

다항식의 차수를 입력하세요 (0-10): 3
최고차항부터 상수항까지 계수를 입력하세요:
x^3의 계수: 2
x^2의 계수: -3
x^1의 계수: 0
x^0의 계수: 5
x의 값을 입력하세요: 2
x = 2.00에서 다항식의 값은: 11.00

호너 방법을 자세히 살펴보겠습니다.

  • 함수 hornerMethod()는 차수, 계수, x 를 매개변수로 받습니다.
  • 최고차항 계수로 시작합니다.
  • 반복적으로 현재 결과에 x 를 곱하고 다음 계수를 더합니다.
  • 계산 복잡도를 O(n²) 에서 O(n) 으로 줄입니다.

이 방법은 x = 2 에서 2x³ - 3x² + 0x + 5 와 같은 다항식을 효율적으로 평가합니다.

결과 출력

이 마지막 단계에서는 사용자 경험을 개선하기 위해 다항식 평가 프로그램에 서식화된 출력과 오류 처리를 추가합니다.

이전 C 파일을 열고 개선된 결과 출력으로 업데이트합니다.

cd ~/project
nano polynomial_eval.c

서식화된 결과 출력 및 입력 유효성 검사를 포함하여 코드를 업데이트합니다.

#include <stdio.h>

#define MAX_DEGREE 10

double hornerMethod(int degree, double coefficients[], double x) {
    double result = coefficients[degree];

    for (int i = degree - 1; i >= 0; i--) {
        result = result * x + coefficients[i];
    }

    return result;
}

void printPolynomial(int degree, double coefficients[]) {
    printf("다항식: ");
    for (int i = degree; i >= 0; i--) {
        if (coefficients[i] != 0) {
            if (i == degree) {
                printf("%.2fx^%d ", coefficients[i], i);
            } else if (i > 1) {
                printf("%+.2fx^%d ", coefficients[i], i);
            } else if (i == 1) {
                printf("%+.2fx ", coefficients[i]);
            } else {
                printf("%+.2f", coefficients[i]);
            }
        }
    }
    printf("\n");
}

int main() {
    int degree;
    double coefficients[MAX_DEGREE + 1];
    double x, result;

    // 입력 유효성 검사
    do {
        printf("다항식의 차수를 입력하세요 (0-10): ");
        scanf("%d", &degree);
    } while (degree < 0 || degree > MAX_DEGREE);

    printf("최고차항부터 상수항까지 계수를 입력하세요:\n");
    for (int i = degree; i >= 0; i--) {
        printf("x^%d의 계수: ", i);
        scanf("%lf", &coefficients[i]);
    }

    printf("x 의 값을 입력하세요: ");
    scanf("%lf", &x);

    // 다항식 정보 출력
    printPolynomial(degree, coefficients);

    // 호너 방법을 사용하여 다항식을 평가합니다.
    result = hornerMethod(degree, coefficients, x);

    // 서식화된 결과 출력
    printf("다항식 평가:\n");
    printf("P(x) = f(%.2f) = %.2f\n", x, result);

    return 0;
}

업데이트된 프로그램을 컴파일하고 실행합니다.

gcc polynomial_eval.c -o polynomial_eval
./polynomial_eval

예시 출력:

다항식의 차수를 입력하세요 (0-10): 3
최고차항부터 상수항까지 계수를 입력하세요:
x^3의 계수: 2
x^2의 계수: -3
x^1의 계수: 0
x^0의 계수: 5
x의 값을 입력하세요: 2
다항식: 2.00x^3 -3.00x^2 +5.00
다항식 평가:
P(x) = f(2.00) = 11.00

주요 개선 사항:

  • 다항식을 표시하는 printPolynomial() 함수를 추가했습니다.
  • 다항식 차수에 대한 입력 유효성 검사를 구현했습니다.
  • 서식화된 출력으로 결과 출력을 개선했습니다.
  • 다항식과 그 평가된 값을 모두 보여줍니다.

요약

이 실험에서는 먼저 C 프로그램에서 사용자 입력으로 다항식 계수와 변수 x 를 읽는 방법을 배웠습니다. 이는 다항식의 최대 차수를 정의하고 계수를 저장할 배열을 생성하며 scanf()를 사용하여 사용자 입력을 읽는 것을 포함합니다. 그런 다음, 다항식 값을 계산하는 데 필요한 곱셈 횟수를 줄이는 효율적인 다항식 표현식 평가를 위해 호너 방법을 구현했습니다. 이러한 단계를 따르면 C 에서 강력한 다항식 평가 알고리즘을 구현할 수 있습니다.