#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;
}