Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

не выводится значение

87K
13 июня 2013 года
tequiero
5 / / 11.06.2013
Добрый вечер. Есть некоторая функция, для которой рассчитываются определенные значения, по пунктам. Пункты 1-2 работают, а пункты 3-4 нет. То есть при запуске программы вбиваю значения и ничего не происходит. В чем проблема?

Код:
#include <iostream>
#include <stdio.h>
#include <math.h>
        static int N=1;//ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
        static int m;
        static double var1;
        static double var2;
        static double var3;
        static double var4;
        static double var5;
 
        static double func(double x)
        {
            return sin(N * pow(x, 3.0 / 4.0) +
                        4 * pow(x, 2)) + 2 * pow(x, 3.0 / 4.0) - 2;
        }
        static double antiderivative(double x,  double h, double y0, double eps = 0.01)
        {
            int it = 0;
            double y;
            double y_previous=y0;
            while (true)
            {
                y = y_previous - h * func(x-h);
                double delta = abs(y - y_previous);
                if (delta < eps) break;
                else y_previous = y;
                ++it;    
            }
            return 0;
        }
        static double derivative(double x, double h=0.1)
        //для точности 1% нужен шаг h=0.1, тогда т.к. точность метода o(h^2), точность будет 1% (0.01)
        {
            double y = (func(x + h) - func(x-h)) / (2.0*h);
           
            return y;
        }
        static double dichotomy(double a,double b,double eps=0.0001)
        {
            double c;
            while (abs(a - b) > eps)
            {
                c = (a + b) / 2.0;
                if (func(c) >= 0) b = c;
                else a = c;
            }
            double r = (a + b) / 2.0;
            return r;
        }
        static int extrem(double a, double b, double h/*шаг табулирования*/)
        {
            int count = 0;
            for (double x = a+h; abs(x + h - b) > DBL_EPSILON; x += h)
            {
                double x_prev = x - h;
                double x_next = x + h;
                if (func(x_prev) <= func(x) && func(x) <= func(x_next) || func(x_prev) >= func(x) && func(x) >= func(x_next)) continue;//функция не изменяет свой характер ПОВЕДЕНИЕ
//(т.е. она либо монотонно возрастает, либо убывает)
                else ++count; //ЭКСТРЕМУМ
            }
            return count;
        }
int main()  {
    printf("Insert 1-4\n");
    scanf_s("%d", &m);
    if (m==1) {
        printf("1. Insert x,h\n");
        scanf_s("%lf%lf\n", &var1,&var2);
        printf("%4.2f\n", func(var1));
        printf("%4.2f\n", derivative(var1, var2));
        printf("%4.2f\n", antiderivative(var1, var2, 0));
    } else if (m==2){
        printf("2. Insert a,b\n");
        scanf_s("%lf%lf\n", &var1,&var2);
        printf("%f\n", dichotomy(var1, var2));

    } else if (m==3) {
        printf("3. Insert a,b,h\n");
        scanf_s("%lf%f%lf\n", &var1,&var2,&var3);
        int printf(extrem(var1, var2, var3));

    }else if (m==4) {
                printf("4. Insert a,b,h\n");
        scanf_s("%lf%f%lf\n", &var1,&var2,&var3);
        int printf(extrem(var1, var2, var3));
    };
    system("pause");
}
326
13 июня 2013 года
sadovoya
757 / / 19.11.2005
Для начала, printf("%d\n",extrem(var1, var2, var3)), а не int printf(extrem(var1, var2, var3));
Ну и в scanf_s вместо "%lf%f%lf все-таки "%lf%lf%lf

Зачем вообще пункт 4, если 3 такой-же?

Условие надо с учетом приоритетов операций писать:

 
Код:
if (
      ((func(x_prev) <= func(x)) && (func(x) <= func(x_next)))
      ||
      ((func(x_prev) >= func(x)) && (func(x) >= func(x_next)))
) continue;
Можно и через обычный scanf:

 
Код:
else if (m==3) {
         printf("3. Insert a,b,h\n");
         scanf("%lf%lf%lf", &var1,&var2,&var3);
         printf("%d\n",extrem(var1, var2, var3));
Всего не смотрел, может есть еще ошибки.
87K
13 июня 2013 года
tequiero
5 / / 11.06.2013
Цитата: sadovoya
Для начала, printf("%d\n",extrem(var1, var2, var3)), а не int printf(extrem(var1, var2, var3));
Ну и в scanf_s вместо "%lf%f%lf все-таки "%lf%lf%lf

Зачем вообще пункт 4, если 3 такой-же?

Условие надо с учетом приоритетов операций писать:

 
Код:
if (
      ((func(x_prev) <= func(x)) && (func(x) <= func(x_next)))
      ||
      ((func(x_prev) >= func(x)) && (func(x) >= func(x_next)))
) continue;
Можно и через обычный scanf:

 
Код:
else if (m==3) {
         printf("3. Insert a,b,h\n");
         scanf("%lf%lf%lf", &var1,&var2,&var3);
         printf("%d\n",extrem(var1, var2, var3));
Всего не смотрел, может есть еще ошибки.



Исправил, но все равно при запуске выводится консоль, выбираем 4 пункт, предлагает вбить a b h, что мы и делаем, жмем энтер. и на этом всё. значение экстремума не выводится, ничего не происходит

326
13 июня 2013 года
sadovoya
757 / / 19.11.2005
А вы задумайтесь над условием вашего цикла:

 
Код:
abs(x + h - b) > DBL_EPSILON
И, не значение экстремума вы ищете, а число экстремумов на интервале. Ну, это, я думаю, вы просто описались. Надеюсь :)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог