Untitled

 avatar
unknown
plain_text
a year ago
4.7 kB
4
Indexable
#include <stdio.h>
#include <math.h>

int factorial(int n) {
    if (n == 0)
        return 1; // Если n равно 0, то факториал равен 1 (базовый случай).

    return n * factorial(n - 1); // Иначе, факториал числа n вычисляется как произведение n и факториала (n - 1).
}
int main() {
    double x;
    int n;

    while (1) {
        // Шаг 1: Запросить пользователя ввести x и n
        printf("Введите значение x: ");
        if (scanf("%lf", &x) != 1) {
        // 1: Считать значение `x` с клавиатуры. Если ввод не успешен (например, некорректный формат),
        // то функция scanf возвращает значение, отличное от 1.
        printf("Ошибка: введите корректное значение для x.\n");
        while (getchar() != '\n'); // 2: Очистить ввод, считав и отбросив все символы до конца строки.
        continue; // 3: Вернуться к началу цикла для повторной попытки ввода.
}

        printf("Введите значение n: ");
        if (scanf("%d", &n) != 1 || n < 0) {
            // 1: Считать значение `n` с клавиатуры. Если ввод не успешен (например, некорректный формат или n меньше 0),
            // то функция scanf возвращает значение, отличное от 1, или значение `n` меньше 0.
            printf("Ошибка: введите корректное неотрицательное значение для n.\n");
            while (getchar() != '\n'); //  2: Очистить ввод, считав и отбросив все символы до конца строки.
            continue; // 3: Вернуться к началу цикла для повторной попытки ввода.
        }

        // Вычислить значение cos(x) с использованием ряда
        double result = 0.0;
        for (int k = 0; k <= n; k++) { // От k=0 до n 
            int sign = (k % 2 == 0) ? 1 : -1;// Определяем знак (Если k четное, то знак "+")
            double factorial_k = factorial(2 * k);// Факториал 2k
            double pow_x = pow(x, 2 * k); //x в степени 2k

            // Проверки на NaN и нулевой факториал
            if (!isnan(factorial_k) && factorial_k != 0 && !isnan(pow_x)) { // Если факториал не NaN, не нулевой и x^2k не NaN, то продолжаем вычислять
                double term = sign * pow_x / factorial_k; // знак(+/-) * x^2k / 2k!
                result += term; // С каждой итерацией суммирует выражение
            } else {
                printf("Встречена ошибка при вычислении. Левая часть содержит NaN.\n");
                return 1; // Выход из программы с ошибкой
            }
        }

        // Шаг 3: Вывести левую и правую части и сравнить их
        double cos_x = cos(x); // Вычисление cos(x)
        printf("Левая часть: %lf\n", result);// result это наше левое выражение, сумма ряда
        printf("Правая часть (cos(%lf)): %lf\n", x, cos_x);

        if (fabs(result - cos_x) < 1e-6) {// Если разница между левой и правой меньше 0.000001 то они приближенно равны
            printf("Левая и правая части приближенно равны.\n");
        } else {
            printf("Левая и правая части не совпадают.\n");
        }

        // Шаг 4: Запросить пользователя о выходе
        char choice;
        while (1) {
            printf("Желаете выйти? (y/n): ");
            scanf(" %c", &choice);
            if (choice == 'y' || choice == 'Y') {
                return 0; // Выход из программы
            } else if (choice == 'n' || choice == 'N') {
                break; // Продолжить выполнение программы
            } else {
                printf("Ошибка: введите 'y' или 'n'.\n");
            }
        }
    }

    return 0;
}