Составить алгоритм и программу на языке C для вычисления [n] значений функции

Условие:

составить алгоритм и программу для вычислений для СИ-программы

Условие: составить алгоритм и программу для вычислений для СИ-программы

Решение:

Предмет: Программирование и численные методы
Раздел: Алгоритмы и программирование на языке C (Си)


Постановка задачи

Нужно составить алгоритм и программу на языке C для вычисления [n] значений функции

Y = \frac{A + F(x)}{B}

где [x] равномерно распределены на интервале -1 \leq x \leq 1, а [n] определяется как суммарное количество букв в фамилии, имени и отчестве студента.

Функция [F(x)] задана кусочно:

 F(x) = \begin{cases} f_1(x), & x < k \ f_2(x), & k \leq x \leq H \ f_3(x), & x > H \end{cases} 

где

 \begin{cases} A = x^2 - 0.3x - 1.5 \ B = \ln |F(x)| \ f_1(x) = \sin^3 x \ f_2(x) = x^2 + \tan(x/2) \ f_3(x) = \cos x \ k = -0.8, \quad H = 0.2 \end{cases} 


Алгоритм решения

  1. Определить [n] — суммарное количество букв в фамилии, имени и отчестве студента (например, вручную или через ввод строки).
  2. Вычислить шаг h = \frac{1 - (-1)}{n-1} = \frac{2}{n-1} для равномерного распределения [x] на интервале [-1, 1].
  3. Для каждого [i] от 0 до [n-1]:
    • Вычислить x_i = -1 + i \cdot h.
    • Вычислить F(x_i) согласно кусочной функции.
    • Вычислить A = x_i^2 - 0.3 x_i - 1.5.
    • Вычислить B = \ln |F(x_i)| (обязательно проверить, что F(x_i) \neq 0).
    • Вычислить Y_i = \frac{A + F(x_i)}{B}.
  4. Вывести таблицу с колонками: x_i, A, B, F(x_i), Y_i с четырьмя знаками после запятой.

Программа на языке C

#include 
#include 
#include 

// Функция для вычисления F(x)
double F(double x, double k, double H) {
    if (x < k) {
        return pow(sin(x), 3);
    } else if (x <= H) {
        return pow(x, 2) + tan(x / 2.0);
    } else {
        return cos(x);
    }
}

// Подпрограмма для вычисления B = ln|F(x)|
double compute_B(double Fx) {
    if (Fx == 0) {
        // Обработка ошибки: логарифм от нуля не определен
        printf("Ошибка: F(x) = 0, логарифм не определен.\n");
        return NAN;
    }
    return log(fabs(Fx));
}

int main() {
    // Ввод фамилии, имени и отчества
    char surname[50], name[50], patronymic[50];
    printf("Введите фамилию: ");
    scanf("%49s", surname);
    printf("Введите имя: ");
    scanf("%49s", name);
    printf("Введите отчество: ");
    scanf("%49s", patronymic);

    // Подсчет количества букв (без учета пробелов и спецсимволов)
    int n = strlen(surname) + strlen(name) + strlen(patronymic);
    if (n < 2) {
        printf("Недостаточно символов для вычисления n.\n");
        return 1;
    }

    double k = -0.8, H = 0.2;
    double x, A, B, Fx, Y;
    double h = 2.0 / (n - 1); // шаг по x

    printf("  x       A        B        F(x)      Y\n");
    printf("---------------------------------------------\n");

    for (int i = 0; i < n; i++) {
        x = -1.0 + i * h;
        Fx = F(x, k, H);
        B = compute_B(Fx);
        if (isnan(B)) {
            printf("Пропуск значения при x = %.4f из-за ошибки.\n", x);
            continue;
        }
        A = x * x - 0.3 * x - 1.5;
        Y = (A + Fx) / B;

        printf("%6.4f %8.4f %8.4f %9.4f %9.4f\n", x, A, B, Fx, Y);
    }

    return 0;
}

Пояснения к программе

  • Вводится фамилия, имя и отчество, чтобы определить [n] — количество точек.
  • Для каждой точки [x] вычисляется функция [F(x)] согласно заданным условиям.
  • Вычисление [B] вынесено в отдельную функцию compute_B.
  • Проверяется, что [F(x)] не равен нулю, чтобы избежать ошибки вычисления логарифма.
  • Результаты выводятся в табличной форме с четырьмя знаками после запятой.

Если нужно, могу помочь с компиляцией, тестированием или адаптацией кода.

Не нашли нужного вам решения? Оставьте заявку и наши авторы быстро и качественно помогут вам с решением.
Оставить заявку
Работа вам нужна срочно. Не волнуйтесь, уложимся!
  • 22423 авторов готовы помочь тебе.
  • 2402 онлайн