Untitled
unknown
plain_text
2 months ago
4.7 kB
1
Indexable
Never
#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; }