Avaliar Expressões Polinomiais em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a avaliar expressões polinomiais em programação C. O laboratório cobre os seguintes passos: leitura dos coeficientes do polinómio e da variável x a partir da entrada do utilizador, e utilização do método de Horner para avaliar eficientemente a expressão polinomial. No final deste laboratório, terá uma melhor compreensão de como trabalhar com expressões algébricas em C e implementar um algoritmo eficaz de avaliação polinomial.

Ler Coeficientes e a Variável x

Neste passo, aprenderá a ler os coeficientes do polinómio e a variável x a partir da entrada do utilizador num programa C. Esta é a primeira parte da implementação de um algoritmo de avaliação polinomial.

Primeiro, crie um novo ficheiro C para o programa de avaliação polinomial:

cd ~/project
nano polynomial_eval.c

Agora, adicione o seguinte código para ler os coeficientes e a variável x:

#include <stdio.h>

#define MAX_DEGREE 10

int main() {
    int grau;
    double coeficientes[MAX_DEGREE + 1];
    double x;

    // Ler o grau do polinómio
    printf("Introduza o grau do polinómio (0-10): ");
    scanf("%d", &grau);

    // Ler os coeficientes
    printf("Introduza os coeficientes do grau mais alto até ao termo constante:\n");
    for (int i = grau; i >= 0; i--) {
        printf("Coeficiente para x^%d: ", i);
        scanf("%lf", &coeficientes[i]);
    }

    // Ler o valor de x
    printf("Introduza o valor de x: ");
    scanf("%lf", &x);

    return 0;
}

Exemplo de saída:

Introduza o grau do polinómio (0-10): 3
Introduza os coeficientes do grau mais alto até ao termo constante:
Coeficiente para x^3: 2
Coeficiente para x^2: -3
Coeficiente para x^1: 0
Coeficiente para x^0: 5
Introduza o valor de x: 2

Vamos decompor o código:

  • Definimos um grau máximo para o polinómio para evitar estouro de buffer
  • grau armazena o grau do polinómio
  • O array coeficientes armazena os coeficientes do grau mais alto até ao termo constante
  • x armazena o valor em que avaliaremos o polinómio
  • Usamos scanf() para ler as entradas do utilizador para o grau, os coeficientes e o valor de x

Compile e execute o programa para testar a entrada:

gcc polynomial_eval.c -o polynomial_eval
./polynomial_eval

Utilizar o Método de Horner para Avaliação

Neste passo, implementará o método de Horner para avaliar eficientemente expressões polinomiais. O método de Horner reduz o número de multiplicações necessárias para calcular valores polinomiais.

Abra o ficheiro C anterior e modifique-o para incluir a avaliação pelo método de Horner:

cd ~/project
nano polynomial_eval.c

Atualize o código com a implementação do método de Horner:

#include <stdio.h>

#define MAX_DEGREE 10

double hornerMethod(int grau, double coeficientes[], double x) {
    double resultado = coeficientes[grau];

    for (int i = grau - 1; i >= 0; i--) {
        resultado = resultado * x + coeficientes[i];
    }

    return resultado;
}

int main() {
    int grau;
    double coeficientes[MAX_DEGREE + 1];
    double x, resultado;

    // O código de entrada anterior permanece o mesmo
    printf("Introduza o grau do polinómio (0-10): ");
    scanf("%d", &grau);

    printf("Introduza os coeficientes do grau mais alto até ao termo constante:\n");
    for (int i = grau; i >= 0; i--) {
        printf("Coeficiente para x^%d: ", i);
        scanf("%lf", &coeficientes[i]);
    }

    printf("Introduza o valor de x: ");
    scanf("%lf", &x);

    // Avaliar o polinómio usando o método de Horner
    resultado = hornerMethod(grau, coeficientes, x);

    printf("Valor do polinómio em x = %.2f é: %.2f\n", x, resultado);

    return 0;
}

Compile e execute o programa atualizado:

gcc polynomial_eval.c -o polynomial_eval
./polynomial_eval

Exemplo de saída:

Introduza o grau do polinómio (0-10): 3
Introduza os coeficientes do grau mais alto até ao termo constante:
Coeficiente para x^3: 2
Coeficiente para x^2: -3
Coeficiente para x^1: 0
Coeficiente para x^0: 5
Introduza o valor de x: 2
Valor do polinómio em x = 2.00 é: 11.00

Vamos decompor o método de Horner:

  • A função hornerMethod() recebe o grau, os coeficientes e x como parâmetros
  • Começa com o coeficiente do grau mais alto
  • Iterativamente multiplica o resultado atual por x e adiciona o próximo coeficiente
  • Reduz a complexidade computacional de O(n²) para O(n)

O método avalia eficientemente polinómios como 2x³ - 3x² + 0x + 5 em x = 2.

Imprimir o Resultado

Neste passo final, irá melhorar o programa de avaliação polinomial adicionando saída formatada e tratamento de erros para melhorar a experiência do utilizador.

Abra o ficheiro C anterior e atualize-o com a impressão de resultados melhorada:

cd ~/project
nano polynomial_eval.c

Atualize o código com a impressão de resultados formatada e validação de entrada:

#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("Polinómio: ");
    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;

    // Validação de entrada
    do {
        printf("Introduza o grau do polinómio (0-10): ");
        scanf("%d", &degree);
    } while (degree < 0 || degree > MAX_DEGREE);

    printf("Introduza os coeficientes do grau mais alto até ao termo constante:\n");
    for (int i = degree; i >= 0; i--) {
        printf("Coeficiente para x^%d: ", i);
        scanf("%lf", &coefficients[i]);
    }

    printf("Introduza o valor de x: ");
    scanf("%lf", &x);

    // Imprimir detalhes do polinómio
    printPolynomial(degree, coefficients);

    // Avaliar o polinómio usando o método de Horner
    result = hornerMethod(degree, coefficients, x);

    // Saída de resultado formatada
    printf("Avaliação do Polinómio:\n");
    printf("P(x) = f(%.2f) = %.2f\n", x, result);

    return 0;
}

Compile e execute o programa atualizado:

gcc polynomial_eval.c -o polynomial_eval
./polynomial_eval

Exemplo de saída:

Introduza o grau do polinómio (0-10): 3
Introduza os coeficientes do grau mais alto até ao termo constante:
Coeficiente para x^3: 2
Coeficiente para x^2: -3
Coeficiente para x^1: 0
Coeficiente para x^0: 5
Introduza o valor de x: 2
Polinómio: 2.00x^3 -3.00x^2 +5.00
Avaliação do Polinómio:
P(x) = f(2.00) = 11.00

Melhorias chave:

  • Adicionada a função printPolynomial() para exibir o polinómio
  • Implementada validação de entrada para o grau do polinómio
  • Saída de resultado melhorada com saída formatada
  • Mostra tanto o polinómio como o seu valor avaliado.

Resumo

Neste laboratório, aprendeu primeiro a ler os coeficientes polinomiais e a variável x a partir da entrada do utilizador num programa em C. Isto envolveu definir um grau máximo para o polinómio, criar um array para armazenar os coeficientes e utilizar scanf() para ler as entradas do utilizador. Em seguida, implementou o método de Horner para avaliar eficientemente expressões polinomiais, o que reduz o número de multiplicações necessárias para calcular os valores polinomiais. Seguindo estes passos, pode implementar um algoritmo de avaliação polinomial robusto em C.