Загрузка...

Помогите с кодом c++

Тема в разделе C/C++ создана пользователем Muha665161 18 ноя 2022. 264 просмотра

  1. Muha665161
    Muha665161 Автор темы 18 ноя 2022 67 3 дек 2019
    Вот такой код. Проблемма в том, что например при введении числа 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();
    }
    }
     
  2. Whales_Nik
    Whales_Nik 18 ноя 2022 50 27 мар 2022
    nan - not a number, у тебя где-то деление на ноль
     
  3. Celeste
    Celeste 18 ноя 2022 ♕Climbing for strawberries and finding myself...♕ 9694 26 окт 2021
    Хз насчёт кода, но вводить лучше вот так: 3E-5, ибо ты не будешь писать "0.0000000000000000000000000003", да и не примет это корректно
     
  4. LVV
    почему используешь поинтеры?
    и у тебя скорее всего где то в знаменателе получается 0
    насчет ввода не вижу проблем, ибо везде даблы.
     
    1. Посмотреть предыдущие комментарии (1)
    2. LVV
      Muha665161, понял, тогда просто перепроверить порядок объявления/ввода если переполняется
    3. Muha665161 Автор темы
      LVV, все объявляется и вводится нормально, скорее всего числа получаются слишком большие
    4. LVV
      Muha665161, ну int n, int a[n] cin>>n - Тоже объявление нормальное, но с переполнением массива. рантайм будет большим.

      я просто предложил, в чем может проблема переполнения. дебаггером можешь пройтись по каждому значению.
      думаю ты нашел ответ на свой вопрос - можно и закрыть тему, чтобы не оффтопили)
  5. KupalniK
    KupalniK 18 ноя 2022 Заблокирован(а) 4 3 ноя 2022
    [IMG] кажись тут что-то не так
     
Top
Загрузка...