Вот такой код. Проблемма в том, что например при введении числа E = 0,00003 (Что то типо). Функция зацикливается и выводит nah. Можно ли как то это исправить? #include <stdio.h> #include <locale> #include <math.h> double datas(double* a, double* b, double* h, double* E) { printf("Отрезок вида : [a, b]\n"); printf("Введите точку a (= (-1, 1] = "); while (true) { scanf_s("%lf", a); if (-1 < *a && *a <= 1) { printf("Введите точку b (= (-1, 1] = "); while (true) { scanf_s("%lf", b); if ((-1 < *b && *b <= 1) && (*a < *b)) break; else { if ((*a == 1) && (*b == 1)) return 0; else printf("попробуйте ввести еще раз\n"); } } break; } else printf("Попробуйте ввести еще раз\n"); } printf("Введите шаг функции = \n"); while (true) { scanf_s("%lf", h); if ((*b - *a) > *h && *h > 0) break; else printf("Попробуйте еще раз\n"); } printf("Введите число E > 0 (точность)\n"); while (true) { scanf_s("%lf", E); if (*E > 0) break; else printf("Попробуйте еще раз\n"); } return 0; } // Числитель int numerator(int n) { int f = 1; for (int i = 1; i < n + 1; i++) { f *= (3 * i - 2); } return f; } // Факториал числа int fact(int n) { int f = 1; for (int i = 1; i < n + 1; i++) { f *= i; } return f; } // обычная функция double funcX(double x) { return 1 / (pow(1 + pow(x, 3), (double)1 / 3)); } // основная функция double funcN(int n, double x) { double fn = 1.0; for (int i = 1; i < n+1; i++) { /*printf("%d ", i); printf("%f ", pow(-1, i + 1)); printf("%d ", numerator(i)); printf("%f ", pow(x, 3 * i)); printf("%f ", pow(3, i)); printf("%d ", fact(i)); */ fn -= pow(-1, i + 1) * (numerator(i)) * (pow(x, 3 * i)) / ((pow(3, i)) * (fact(i))); //printf("%lf\n", fn); } return fn; } // Фукнция вывода void Print_function() { double h, E, a, b, fx, fn; datas(&a, &b, &h, &E); printf(" x | fx | fn | (fx - fn)| N |\n"); printf("___________|__________|__________|__________|___________|\n"); for (double x = a; x < b; x+= h) { fx = funcX(x); int n = 1; while(true) { fn = funcN(n, x); if (x < 0) printf(" %.7lf|", x); else printf(" %.7f |", x); printf(" %.7lf|", fx); printf(" %.7lf|", fn); printf(" %.7lf|", abs(fx - fn)); printf(" %d |\n", n); if (abs(fx - fn) < E) { break; } n++; } } } printf("\n"); } int main() { setlocale(LC_ALL, "ru"); // Данные //double h, E, a, b; //datas(&a, &b, &h, &E); //printf("%lf\n", a); //printf("%lf\n", b); //printf("%lf\n", h); //printf("%lf\n", E); // Факториал //printf("%d", fact(30)); // Функция f(x) //Print_function(); //Числитель //printf("%d", numerator(3)); // Основная функция //printf("%lf\n", funcN(50, 1)); //printf("%lf", funcX(-0.9)); while (true) { Print_function(); } }
Хз насчёт кода, но вводить лучше вот так: 3E-5, ибо ты не будешь писать "0.0000000000000000000000000003", да и не примет это корректно
почему используешь поинтеры? и у тебя скорее всего где то в знаменателе получается 0 насчет ввода не вижу проблем, ибо везде даблы.
Muha665161, ну int n, int a[n] cin>>n - Тоже объявление нормальное, но с переполнением массива. рантайм будет большим. я просто предложил, в чем может проблема переполнения. дебаггером можешь пройтись по каждому значению. думаю ты нашел ответ на свой вопрос - можно и закрыть тему, чтобы не оффтопили)