Может ли кто-то критиковать мой код C за оценку определенного интеграла? - PullRequest
2 голосов
/ 01 марта 2020

Приведенный ниже код не имеет отношения к какой-либо числовой интеграции или ко всему, что с ней связано - только базовое правило c в оценке определенного интеграла вида Ax ^ 2 + Bx + C. Мне бы очень хотелось услышать от вас, ребята, так как я относительно новичок и все еще учусь.
Это упражнение по кодированию предназначено для проверки того, что мы узнали за последние несколько недель, поэтому что-либо более сложное, чем приведенные ниже ключевые слова, вероятно, не рекомендуется, так как а также другие стандартные функции библиотеки.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void inputDegree(int *deg) {
    printf("Enter the degree of the polynomial: ");
    scanf("%d", deg);
}

void inputCoeffs(int deg, double *coeffs) {
    printf("\nEnter the coefficients of the polynomial: \n\n");
    for(int i = 0; i <= deg; i++) {
        printf("Coefficient of degree %d: ", deg - i);
        scanf("%lf", &coeffs[i]);
    }
}

void inputLimits(double *lowerL, double *upperL) {
    printf("\nEnter the lower limit of integration: ");
    scanf("%lf", lowerL);
    printf("\nEnter the upper limit of integration: ");
    scanf("%lf", upperL);
}

void computeIntegralCoeffs(int deg, double *coeffs, double *integCoeffs) {
    for(int i = 0; i <= deg; i++) {
        integCoeffs[i] = coeffs[i] / (deg + 1 - i);
    }
}

double evaluateIntegral(int degree, double *integCoeffs, double lowerLimit, double upperLimit) {
    double lower = 1, upper = 1;
    for(int i = 0; i <= degree; i++) {
        lower += integCoeffs[i] * pow(lowerLimit, (degree + 1 - i));
    }
    for(int i = 0; i <= degree; i++) {
        upper += integCoeffs[i] * pow(upperLimit, (degree + 1 - i));
    }
    return upper - lower;
}

int main() {
    int degree;
    double lowerLimit;
    double upperLimit;
    double integral;
    double *coefficients = NULL;
    double *integralCoefficients = NULL;

    inputDegree(&degree);

    coefficients = (double *)malloc((degree + 1) * sizeof(double));
    integralCoefficients = (double *)malloc((degree + 1) * sizeof(double));

    inputCoeffs(degree, coefficients);

    inputLimits(&lowerLimit, &upperLimit);

    computeIntegralCoeffs(degree, coefficients, integralCoefficients);

    integral = evaluateIntegral(degree, integralCoefficients, lowerLimit, upperLimit);

    printf("\n\nEvaluating the definite integral gives us the following area: \t%lf\n", integral);

    free(coefficients);
    free(integralCoefficients);

    return 0;
}

1 Ответ

0 голосов
/ 01 марта 2020

В произвольном порядке:

  1. Не приводить возвращаемое значение из malloc.
  2. Не проверять возвращаемое значение из scanf просит проблемы.
  3. Это int main(void) в C.
  4. printf без завершающей новой строки может потребоваться fflush(stdout) для отображения вывода.
  5. Сделайте отступ в вашем коде, чтобы он оставался в пределах примерно 70 символов в строке. Это позволяет избежать уродливых переносов строк в редакторах и горизонтальных полос прокрутки на таких сайтах, как stackoverflow.
  6. Нет смысла присваивать указателям NULL, когда вы в следующий раз назначаете им значение от malloc.
  7. Возврат с основного с помощью EXIT_SUCCESS (или EXIT_FAILURE) из stdlib.h.
  8. Уменьшение ненужного многословия. us the following -> the.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...