Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2013, 12:33   #1
CCDD
 
Регистрация: 06.01.2013
Сообщений: 3
Сообщение Определить является ли монотонной функция (Си)

Задание:
Вычислить и напечатать таблицу значений функции

_____ /arctg(x) при x<0
f(x)= {cos(x) при 0=<x<1
_____ \min{arctg(x),cos(x)} при x>1

и определить, является ли она монотонной на интервале [a, b] при дискретном увеличении аргумента от x=a с шагом h. Вычисление f(x) для одного значения аргумента определить в отдельной функции.
Проблема:
Таблицу я вывел и напечатал.... PS. В программе нельзя использовать Math.h но все функции я сам написал из рядов Тейлера. Не совсем понятно как нужно конструировать программу и как проверять монотонность. по каким значениям? .
Код начальной работы имеется:
Код:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
/*--------------------------- Функция степени -----------------------------*/
double stepen(double a,double b)
{
double res=1;int i;
for(i=0;i<b;i++)
res*=a;
return res;
}

/*--------------------------- функция факториал ----------------------------*/
double factorial(int n)
{
double res=1;int i;
for(i=1;i<n+1;++i)
{
res*=n;
}
return res;
}
/*--------------------------- Функция артангенса ---------------------------*/
double arctg(double sum)
{
double res=0,a,b,c,d;int n;
for(n=0;n<10;n++)
{
a=stepen(-1,n);
b=stepen(sum,(2*n+1));
c=2*n+1;
d=(a*b)/c;
res+=d;} /*формула по ряду Тейлора-Макларена(для арктангенса)*/
return res;
}
/*--------------------------- Функция косинуса -----------------------------*/
double cos(double sum)
{
double cosx=0,a,b,c,d;int n;
for(n=0;n<10;n++)
{
a=stepen(-1,n);
b=stepen(sum,(2*n));
c=factorial(2*n);
d=(a*b)/c;
cosx+=d;
}
return cosx;
}
float b,pf;
double result, cosx, x;
int cr,cr2,cr3,N, i=0, aa, bb;
long int *a, *a_ptr, *ab, *ab_ptr;
/*--------------------------- Функция Главная ---------------------------*/
int main()
{
 printf("go\n");
    getchar();
printf("Input couter of elements: ");
    cr = scanf("%d", &N);
     for(;;)
    {
        if(N > 10 || cr != 1)
        {
            fflush(stdin);
            printf("Error! Input again:");
            cr = scanf("%d", &N);
        getchar();
        getchar();

        }
         if((a = (int *)malloc(N * sizeof(long int))) == NULL)
        {
            printf("Memory Error!\n");
            cr = 0;
        }
        else break;
    }
        if((ab = (int *)malloc(N * sizeof(long int))) == NULL)
        {
            printf("Memory Error!\n");
        }
    srand(time(NULL));
    printf("Input [a;b] for analysing function(-10;10) \n");
cr2 = scanf("Input a:(-10;9) %d \n", &aa);
     for(;;)
    {
        if(aa > 10 || aa < -10 || cr2 != 1)
        {
            fflush(stdin);
            printf("Error! Input again:");
            cr2 = scanf("%d", &aa);
        getchar();
        getchar();

        }
        else break;
    }

cr3 = scanf("Input b:(-10;9) %d", &bb);
     for(;;)
    {
        if(bb > 10 || bb < aa || cr2 != 1)
        {
            fflush(stdin);
            printf("Error! Input again:");
            cr3 = scanf("%d", &bb);
        getchar();
        getchar();

        }
        else break;
    }


    for(i = 0; i < N; i++)
    {

        b = (rand() % 100);
        b=b/100;
        pf=cos(b);
printf(" %.2f\n",pf);

    }
   return 0;
 }
И да зачем-то нужно использовать выделение памяти, тоже не понимаю зачем!

Просьба:

Помогите дописать, или обьясните человеческим языком что делать дальше???
CCDD вне форума Ответить с цитированием
Старый 06.01.2013, 14:57   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от CCDD Посмотреть сообщение
...как проверять монотонность. по каким значениям?
Код:
#include <stdio.h>

#define N_TESTS  5 

// Простенькая тестовая линейно-непрерывная ф-я из трёх участков
double f( double x ) {
   
   double y ;

   if ( x < -1. )
      y = -(x+1) ;
   else if ( x <= 1. )
      y = 0. ;
   else
      y = x-1 ;

   return y ;

}



int main() {
  
   double   deX = 0.1,
            x0, xF,
            xPrev, xNext,
            yPrev, yNext ;
   // Набор тестовых интервалов
   double   xMargin[N_TESTS][2] = { -4. , -2.,
                                    -0.8,  0.8,
                                     0.,   2.,
                                     2.,   4.,
                                    -4.,   4. } ;
   int      isMonotonic,
            jTest,
            trend ;  // +1, если ф-я на отрезке - неубывающая
                     // -1, если ф-я на отрезке - невозрастающая
                     //  0, если ф-я на отрезке - константна

   for ( jTest = 0; jTest < N_TESTS; jTest++ ) {
      x0 = xMargin[jTest][0] ;   // левая граница интервала
      xF = xMargin[jTest][1] ;   // правая граница интервала
      xPrev = x0 ; yPrev = f( xPrev ) ;
      xNext = xPrev + deX ; yNext = f( xNext ) ;
      trend = 0 ;
      // ищем первую пару соседних точек ([x, x+deX]) с различными значениями ф-ии в них
      while ( yNext == yPrev) {
         if (xNext > xF ) break ;      // Константная ф-я на всём [x0,xF]
         xPrev = xNext ; yPrev = yNext ;
         xNext += deX ; yNext = f( xNext ) ;
      }
      // Определяем "тенденцию"
      if ( yNext > yPrev )       // Неубывающая
         trend = +1 ;     
      else if ( yNext < yPrev )  // Невозрастающая
         trend = -1 ;
    
      // Проверяем на монотонность на остатке интервала
      isMonotonic = 1 ;
      while ( xNext <= xF ) {
         if ( trend == +1 && yNext < yPrev ) {          // Неубывающая до сих пор ф-я "скакнула" вниз
            isMonotonic = 0 ;
            break ;
         } else if ( trend == -1 && yNext > yPrev ) {   // Невозрастающая до сих пор ф-я "скакнула" вверх
            isMonotonic = 0 ;
            break ;
         } 
         // Берём следующую пару точек
         xPrev = xNext ; yPrev = yNext ;
         xNext += deX ; yNext = f( xNext ) ;
      }      
      printf( "%7.2f %7.2f %2d %2d\n", x0, xF, trend, isMonotonic ) ;

   }

   return 0 ;

}

Последний раз редактировалось Vago; 06.01.2013 в 17:34. Причина: Ошибся в одном из комментариев.
Vago вне форума Ответить с цитированием
Старый 09.01.2013, 20:29   #3
CCDD
 
Регистрация: 06.01.2013
Сообщений: 3
По умолчанию

Зачем тогда выделять память???
printf( "%7.2f %7.2f %2d %2d\n", x0, xF, trend, isMonotonic ) ;
Где именно монотонность в 3ем стобце???
CCDD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ : Определить является ли число простым harvey Помощь студентам 1 02.10.2012 16:40
Определить, является ли приложение полноэкранным (игрой)? TwiX Общие вопросы Delphi 4 16.06.2010 15:40
Определить является ли фигура равносторонним треугольником? Alexsssandr Помощь студентам 2 04.11.2009 17:24
Определить, является ли число палиндромом Princesse JavaScript, Ajax 9 02.10.2009 00:23
определить является ли четырехугольник квадратом Ntfser Общие вопросы Delphi 2 18.10.2008 16:48