Оценка полиномиальных выражений на C

CCBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии вы научитесь оценивать полиномиальные выражения на языке программирования C. Практическое занятие включает следующие этапы: чтение коэффициентов полинома и переменной x из ввода пользователя и использование метода Горнера для эффективной оценки полиномиального выражения. В конце этого практического занятия у вас будет лучше понимание работы с алгебраическими выражениями на C и реализации эффективного алгоритма оценки полинома.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c/BasicsGroup -.-> c/variables("Variables") c/ControlFlowGroup -.-> c/if_else("If...Else") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435177{{"Оценка полиномиальных выражений на C"}} c/if_else -.-> lab-435177{{"Оценка полиномиальных выражений на C"}} c/for_loop -.-> lab-435177{{"Оценка полиномиальных выражений на C"}} c/math_functions -.-> lab-435177{{"Оценка полиномиальных выражений на C"}} c/user_input -.-> lab-435177{{"Оценка полиномиальных выражений на C"}} c/output -.-> lab-435177{{"Оценка полиномиальных выражений на C"}} end

Чтение коэффициентов и переменной x

В этом этапе вы научитесь читать коэффициенты полинома и переменную x из ввода пользователя в программе на C. Это первая часть реализации алгоритма оценки полинома.

Сначала создайте новый файл 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("Enter the degree of the polynomial (0-10): ");
    scanf("%d", &degree);

    // Чтение коэффициентов
    printf("Enter coefficients from highest degree to constant term:\n");
    for (int i = degree; i >= 0; i--) {
        printf("Coefficient for x^%d: ", i);
        scanf("%lf", &coefficients[i]);
    }

    // Чтение значения x
    printf("Enter the value of x: ");
    scanf("%lf", &x);

    return 0;
}

Пример вывода:

Enter the degree of the polynomial (0-10): 3
Enter coefficients from highest degree to constant term:
Coefficient for x^3: 2
Coefficient for x^2: -3
Coefficient for x^1: 0
Coefficient for x^0: 5
Enter the value of 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("Enter the degree of the polynomial (0-10): ");
    scanf("%d", &degree);

    printf("Enter coefficients from highest degree to constant term:\n");
    for (int i = degree; i >= 0; i--) {
        printf("Coefficient for x^%d: ", i);
        scanf("%lf", &coefficients[i]);
    }

    printf("Enter the value of x: ");
    scanf("%lf", &x);

    // Оцениваем полином с использованием метода Горнера
    result = hornerMethod(degree, coefficients, x);

    printf("Polynomial value at x = %.2f is: %.2f\n", x, result);

    return 0;
}

Скомпилируйте и запустите обновленную программу:

gcc polynomial_eval.c -o polynomial_eval
./polynomial_eval

Пример вывода:

Enter the degree of the polynomial (0-10): 3
Enter coefficients from highest degree to constant term:
Coefficient for x^3: 2
Coefficient for x^2: -3
Coefficient for x^1: 0
Coefficient for x^0: 5
Enter the value of x: 2
Polynomial value at x = 2.00 is: 11.00

Разберём метод Горнера:

  • Функция hornerMethod() принимает степень, коэффициенты и x в качестве параметров
  • Она начинается с коэффициента самой высокой степени
  • Итеративно умножает текущий результат на x и добавляет следующий коэффициент
  • Снижает вычислительную сложность с O(n²) до O(n)

Метод эффективно оценивает полиномы, такие как 2x³ - 3x² + 0x + 5 при x = 2.

Вывести результат

В этом финальном этапе вы усовершенствуете программу оценки полинома, добавив форматированный вывод и обработку ошибок, чтобы улучшить пользовательский опыт.

Откройте предыдущий файл 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("Polynomial: ");
    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("Enter the degree of the polynomial (0-10): ");
        scanf("%d", &degree);
    } while (degree < 0 || degree > MAX_DEGREE);

    printf("Enter coefficients from highest degree to constant term:\n");
    for (int i = degree; i >= 0; i--) {
        printf("Coefficient for x^%d: ", i);
        scanf("%lf", &coefficients[i]);
    }

    printf("Enter the value of x: ");
    scanf("%lf", &x);

    // Вывести подробности полинома
    printPolynomial(degree, coefficients);

    // Оценить полином методом Горнера
    result = hornerMethod(degree, coefficients, x);

    // Форматированный вывод результата
    printf("Polynomial Evaluation:\n");
    printf("P(x) = f(%.2f) = %.2f\n", x, result);

    return 0;
}

Скомпилируйте и запустите обновленную программу:

gcc polynomial_eval.c -o polynomial_eval
./polynomial_eval

Пример вывода:

Enter the degree of the polynomial (0-10): 3
Enter coefficients from highest degree to constant term:
Coefficient for x^3: 2
Coefficient for x^2: -3
Coefficient for x^1: 0
Coefficient for x^0: 5
Enter the value of x: 2
Polynomial: 2.00x^3 -3.00x^2 +5.00
Polynomial Evaluation:
P(x) = f(2.00) = 11.00

Основные улучшения:

  • Добавлена функция printPolynomial(), чтобы отобразить полином
  • Реализована проверка ввода для степени полинома
  • Улучшен вывод результата с форматированным выводом
  • Показаны и полином, и его оценочное значение

Резюме

В этом практическом занятии вы сначала узнали, как читать коэффициенты полинома и переменную x из ввода пользователя в программе на C. Для этого нужно было определить максимальную степень полинома, создать массив для хранения коэффициентов и использовать scanf() для чтения ввода пользователя. Затем вы реализовали метод Горнера для эффективной оценки полиномиальных выражений, который уменьшает количество умножений, необходимых для вычисления значений полинома. Следуя этим шагам, вы можете реализовать надежный алгоритм оценки полинома на C.