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

Ваш аккаунт

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

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

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

метод квадратичной интерполяции-экстраполяции (С++)

34K
27 июня 2008 года
Snowman
15 / / 23.06.2008
Требуется найти экстремум функции F(x). Предусмотреть ввод шага начального значения х1=, погрешности результата.
В сети по этому методу ничего не нашел . Подскажите, пожалуйста? Может у кого есть готовое решение, буду очень рад.
Заранее благодарен.
34K
08 октября 2008 года
Snowman
15 / / 23.06.2008
много времени прошло со времени последнего поста. Достал я все таки эту прогу, теперь другая проблема. Все работает но там есть штука можно выбирать пункты меню нажатием комбинации клавиш и вроде все нормально а не работает, посмотрите пожалуйста может чего подскажете и как убрать константы из define ?
Код:
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <errno.h>
#include <values.h>

//**************************************************
#define Exit     45
#define Enter    13
#define Up       72
#define Down     80
#define Left     75
#define Right    77
#define Escape   27
#define CallMenu 68
#define AltB     32
#define AltC     46
#define AltO     36
#define Alt1     120
#define Alt2     121
#define Alt3     122
#define Alt4     123
#define MAX_INPUT 20
//**************************************************
double Func(double x);                        // Функция
int input_double(double &,double,int);        // Ввод вещественных чисел
void Error_Win(int,char*,int f=1);            // Вывод окна с ошибкой
void Out_Status_Line();                       // Вывод строки состояния
void Window_Clear(int,int);                   // Очистка экрана
void Out_text(int,int,char *);                // Вывод экрана
void Window_Border(int,int,int,int,int,int,int V=0);// Рисование окна с границами
void About();                                 // О программе
void Input_Data(double&,double&,double&,int&);// Ввод данных
void Execute(double,double,double,int);       // Вычисление
void Out_Menu(int Def=0);                     // Вывод меню
void Event_Menu(double&,double&,double&,int&,int M=0);
                                              // Обработчик наж. клавиши в меню
void Exec();                                  // Запуск программы
//**************************************************
// Функция для вычисления указана в скобках
double Func(double x)
{ return (x*x*x);
}
//**************************************************
int input_double(double &Result,double Hi_Range,int Flag_Signed)
{int    Simbol = 0,      // код символа
        Signed = 1,      // флаг знака мантиссы
        Point  = 0,      // флаг точки мантиссы
        Sig    = 0,      // флаг знака порядка
        fE     = 0,      // флаг ввода e
        num    = 0;      // вводимый символ
 char  * str;
 str=(char*)calloc(MAX_INPUT+1,sizeof(char));
                         // выделяем память для массива
 for (num=0;num<=MAX_INPUT;num++) str[num]='\0';
                         // обнуляем его
 _setcursortype(_NORMALCURSOR);
                         // покажем курсор
 num=0;
 for (;(Simbol!=13)||(fabs(atof(str))>Hi_Range);)
  { Simbol=getch();
    if (fE==0)            // ввод мантиссы
    { if (Point==0)       // ввод целой части мантиссы
      { if ((Simbol==45)&&// вводим знак
       (Signed!=-1)&&(Flag_Signed==1)&&(num==0))
    { Signed=-1;          // устанавливаем флаг знака
      str[num]=Simbol;    // запомнили символ
      num++;
      putch(Simbol);
    }
    if ((num<MAX_INPUT)&&(Simbol > 47) && (Simbol < 58))
    {                     // вводим только цифры
      { str[num]=Simbol;  // запомнили символ
        num++;
        str[num]=0;
        if (fabs(atof(str))>Hi_Range)
        { num--;          // превысили диапазон
          str[num]=0;
        }                 // вывод символа
        else putch(Simbol);
      }
    }
    if ((Simbol == 46)&&(Point != 1)&&(num<MAX_INPUT))
                          // если ввели "точку"
    { Point = 1;          // устанавливаем флаг дробной части
      str[num]=Simbol;
      num++;
      str[num]=0;
      if (fabs(atof(str))>Hi_Range)
      { num--;            // превысили диапазон
        str[num]=0;
      }                   // вывод символа
      else putch(Simbol);
    }
      }                   // конец ввода целой части
      else
      { if ((num<MAX_INPUT)&&(Simbol > 47) && (Simbol < 58))
                          // вводим дробную часть
    { str[num]=Simbol;
      num++;
      str[num]=0;
      if (fabs(atof(str))>Hi_Range)
      { num--;            // превысили диапазон
        str[num]=0;
      }                   // вывод символа
      else putch(Simbol);
    }
      }
      if ((num<MAX_INPUT)&&((Simbol=='e')||(Simbol=='E')))
      { fE=1;
    str[num]=Simbol;
    num++;
    putch(Simbol);
      }
    }                     // конец ввода мантиссы
    else
    { if ((Simbol==45)&&  // вводим знак '-'
          (Sig!=1)&&(num<MAX_INPUT))
      { Sig=1;            // флаг знака
        str[num]=Simbol;  // запомнили символ
        num++;
        str[num]=0;
        if (fabs(atof(str))>Hi_Range)
        { num--;          // превысили диапазон
          str[num]=0;
        }                 // вывод символа
        else putch(Simbol);
      }
      if ((num<MAX_INPUT)&&(Simbol > 47) && (Simbol < 58))
      {                   // вводим только цифры
        Sig=1;            // флаг установки знака
        str[num]=Simbol;  // запомнили символ
        num++;
        str[num]=0;
        if (fabs(atof(str))>Hi_Range)
        { num--;          // превысили диапазон
          str[num]=0;
          if (((str[num-1]=='e')||(str[num-1]=='E'))&&(num>1)) Sig=0;
        }                 // вывод символа
        else putch(Simbol);
      }
    }                     // конец ввода порядка
    if ((Simbol == 8)&&(num>0))
                          // при BackSpace
    { num--;              // сбрасываем все установленные флаги
      if (fE==1)          // в обратном порядке
       if (str[num]=='-')
        Sig=0;
      if (fE==0)
       if (str[num]=='-')
        Signed=1;
      if ((str[num]=='e')||(str[num]=='E'))
      { fE=0;
        Sig=0;
      }
      if (((str[num-1]=='e')||(str[num]=='E'))&&(num>1))
       Sig=0;
      if (str[num]=='.') Point=0;
      putch(Simbol);      // удаляем введенный символ с экрана
      putch(32);
      putch(Simbol);
      str[num]=0;
    }
  }
 if (num==0)                  // если ничего не ввели -> рез-т функции=0
 { _setcursortype(_NOCURSOR); // скроем курсор
    return 0;
 }
_setcursortype(_NOCURSOR);// скроем курсор
 Result=atof(str);        // результат
 return 1;
}
//**************************************************
void Error_Win(int x,char* Mes,int f)
{ Window_Border(10,8,70,12,WHITE,RED,1); // Рисуем окно
  Out_text(27,1,"Ошибка !");             // Выводим заголовок
  Out_text(x,2,Mes);                     // Выводим сообщение
  if (f==1)
  { textcolor(LIGHTGRAY);
    Out_text(20,4,"Нажмите любую клавишу...");
    if (getch()==0) getch();
  }
}
//**************************************************
void Out_Status_Line()     // выводим строку статуса
{ Window_Border(1,25,80,25,BLACK,LIGHTGRAY);
  Out_text(2,1,"Alt-X - Выход из программы; F10 - вход в основное меню; Esc - выход");
  textcolor(RED);
  Out_text( 2,1,"Alt-X");
  Out_text(30,1,"F10");
  Out_text(58,1,"Esc");
}
//**************************************************
void Window_Clear( int TextColor, int BakColor)
{ textbackground(BakColor);
  textcolor(TextColor);// очистка окна
  clrscr();
}
//**************************************************
void Out_text(int x, int y, char *Value)
{ gotoxy(x,y);  // вывод текста по координатам
  cprintf("%s",Value);
}
//**************************************************
void Window_Border(int _Left, int _Up, int _Right, int _Bottom, int TextColor, int BakColor, int Variant)
{ int i;
  if (Variant == 1)  // Рисуем окно с рамкой по координатам
  { textbackground(BakColor);
    textcolor(TextColor);
    window(_Left,_Up,_Right+1,_Bottom+1);
    for(i=2; i<_Right-_Left+1;i++)
    { Out_text(i,1,"-");
      Out_text(i,_Bottom-_Up+1,"-");
    }
    for(i=2;i<_Bottom-_Up+1;i++)
    { Out_text(1,i,"¦");
      Out_text(_Right-_Left+1,i,"¦");
    }
    Out_text(_Right-_Left+1,1,"¬");
    Out_text(1,1,"-");
    Out_text(1,_Bottom-_Up+1,"L");
    Out_text(_Right-_Left+1,_Bottom-_Up+1,"-");
    window(_Left+1,_Up+1,_Right-1,_Bottom-1);
    Window_Clear(TextColor,BakColor);
  }
  if (Variant == 0)  // Рисуем окно без рамки по координатам
  {  window(_Left,_Up,_Right,_Bottom);
     Window_Clear(TextColor,BakColor);
  }
  window(_Left,_Up,_Right,_Bottom);
}
//**************************************************
void About()
{ Window_Border(10,8,70,18,RED,LIGHTGRAY,1);
                                   // Рисуем окно
  Out_text(26,1,"О программе");    // Выводим заголовок
  window(11,9,69,17);
  textcolor(BLACK);
  Out_text(19,1,"Курсовая работа на тему:");
  Out_text(12,2,"Разработка программы, реализующей метод");
  Out_text(12,3,"квадратичной интерполяции-экстраполяции");
  Out_text(21,5,"Выполнил:ст.гр.СК-01");
  Out_text(26,6,"Губин Р.В.");
  Out_text(25,7,"Киров 2002");
  textcolor(RED);
  Out_text(20,9,"Нажмите любую клавишу...");
  if (getch()==0) getch();
}

:confused:
34K
08 октября 2008 года
Snowman
15 / / 23.06.2008
Код:
//**************************************************
void Input_Data(double &H,double &X1,double &E,int &flag)
{ double tmp;
  Window_Border(2,3,79,23,RED,WHITE,1);
  Out_text(33,1,"Ввод данных");     // Выводим заголовок
  window(3,4,78,22);
  textcolor(BLACK);
  gotoxy(1,1);
  cprintf("Введите следующие параметры:\n\r");
  gotoxy(1,2);
  do                  // Ввод шага
  { cprintf("Введите шаг H (0<H<1e38,Enter=%11.4e): ",H);
    if (input_double(tmp,1e38,0)!=0) H=tmp;
     else cprintf("%11.4e",H);
    cprintf("\n\r");
  } while (H<=0||H>=1e38);
                      // Ввод нач.значения
  cprintf("Введите нач.зн. X (-1e38<X1<1e38,Enter=%11.4e): ",X1);
  if (input_double(tmp,1e38,1)!=0) X1=tmp;
   else cprintf("%11.4e",X1);
  cprintf("\n\r");
  do                  // Ввод погрешности
  { cprintf("Введите погрешность E (0<E<1,Enter=%11.4e): ",E);
    if (input_double(tmp,1,0)!=0) E=tmp;
     else cprintf("%11.4e",E);
    cprintf("\n\r");
  } while ((E<=0)||(E>=1));
  textcolor(RED);
  Out_text(29,19,"Нажмите любую клавишу...");
  if (getch()==0) getch();
  flag=1;
}
//**************************************************
void Execute(double H,double X1,double E,int flag)
{ if (flag==0)                    // Проверка на компиляцию
  { Error_Win(16,"Надо обязательно ввести данные!");
    return;
  }
  double w,t,v,u;
  unsigned int Step=0;
// Начало метода
  t=X1;
  do
  { X1=t;
    v=Func(X1);
    w=Func(X1-H);
    u=Func(X1+H);
    if (w-2*v+u!=0)
     t=(w*(2*X1+H)-4*v*X1+u*(2*X1-H))/(w-2*v+u)/2;
    else {t=1e39;break;}
    Step++;
    if (t<-1e38||t>1e38||Step==MAXINT) break;
  }while (fabs(t-X1)>E);
// Конец метода
  Window_Border(20,8,60,14,RED,WHITE,1); // Рисуем окно
  Out_text(18,1,"Решение");     // Выводим заголовок
  window(21,9,59,14);
  textcolor(BLACK);
  Out_text(1,1,"В процессе вычислений было получено:\n\r");
  if (t<-1e38||t>1e38||Step==MAXINT)
   {cprintf("Решение получить невозможно:\n\r");
    if (Step==MAXINT)
      cprintf("     экстремум функции отсутствует\n\r");
    else
      cprintf("     вышли из предела поиска\n\r");
   }
  else
  { cprintf("Экстремум функции F=%11.4e\n\r",Func(t));
    cprintf("          в точке X=%11.4e\n\r",t);
  }
  textcolor(RED);
  Out_text(10,5,"Нажмите любую клавишу...");
  if (getch()==0) getch();
}
//**************************************************
void Out_Menu(int HightLight) // рисуем меню
{ Window_Border(1,1,80,1,BLACK,LIGHTGRAY);
  Out_text( 1,1," Ввод данных ");
  Out_text(14,1," Вычисление ");
  Out_text(26,1," О программе ");
  Out_text(39,1," Выход ");

  textcolor(RED);
  Out_text( 2,1,"В");
  Out_text(19,1,"с");
  Out_text(27,1,"О");
  Out_text(42,1,"х");

  textcolor(BLACK);
  textbackground(LIGHTGREEN);
  if (HightLight == 1)
    Out_text( 1,1," Ввод данных ");
  if (HightLight == 2)
    Out_text(14,1," Вычисление");
  if (HightLight == 3)
    Out_text(26,1," О программе ");
  if (HightLight == 4)
    Out_text(39,1," Выход ");

  textcolor(RED);
  if (HightLight == 1)
    Out_text( 2,1,"В");
  if (HightLight == 2)
    Out_text(19,1,"с");
  if (HightLight == 3)
    Out_text(27,1,"О");
  if (HightLight == 4)
    Out_text(42,1,"x");

  textcolor(BLACK);
  textbackground(LIGHTGRAY);
 }
//**************************************************
void Event_Menu(double &H,double &X1,double &E,int &flag,int MenuOpen)
{ int KeyPressed,          // Код нажатой клавиши
      HightLight=1;        // Какой выбрали пункт меню

  if (MenuOpen) HightLight = MenuOpen;
                           // показываем выбранный пункт меню

  for (;;)                 // обработка нажатия клавиш
  { Out_Menu(HightLight);  // рисуем меню
    KeyPressed=getch();
    if (KeyPressed==0)
    { KeyPressed=getch();
      switch(KeyPressed)
      {   case AltB:KeyPressed = Enter; // выбрали 1 пункт меню
                    HightLight = 1;
                    break;
          case AltC:KeyPressed = Enter; // выбрали 2 пункт меню
                    HightLight = 2;
                    break;
          case AltO:KeyPressed = Enter; // выбрали 3 пункт меню
                    HightLight = 3;
                    break;
          case Exit:exit(0);            // выбрали Alt-X
                    break;
          case Left:HightLight  -= 1;   // нажали влево
                    break;
          case Right:HightLight += 1;   // нажали вправо
                    break;
      }
    }
    Out_Menu(HightLight);  // рисуем меню
    if (KeyPressed == Enter)
    { switch(HightLight)
      { case 1:Input_Data(H,X1,E,flag);
               Window_Border(1,2,80,24,YELLOW,BLUE);
               break;         // выбрали 1 пункт меню
        case 2:Execute(H,X1,E,flag);
               Window_Border(1,2,80,24,YELLOW,BLUE);
               break;         // выбрали 2 пункт меню
        case 3:About();
               Window_Border(1,2,80,24,YELLOW,BLUE);
               break;         // выбрали 3 пункт меню
        case 4:window(1,1,80,25);
               textcolor(WHITE);
               textbackground(BLACK);
               clrscr();
               exit(0);
               break;         // выбрали 4 пункт меню
      }
    }
    if (HightLight > 4) HightLight = 1; //проверка на рисование по кругу
    if (HightLight < 1) HightLight = 4;
    if (KeyPressed == Escape) break;
  }
  Out_Menu();  // рисуем меню
}
//**************************************************
void Exec()
{ double H,X1,E;      // Объявили переменные
  int flag,           // Флаг для проверки на введенные данные
      KeyPressed=0;   // Код нажатой клавиши

  H=1;X1=10;E=1e-5;   // Начальные данные
  flag=0;
  Out_Menu();         // Рисуем меню
  Out_Status_Line();  // Рисуем строку статуса

  for (;;)            // пока не нажали Enter
    {KeyPressed = getch(); // код нажатой клавиши
     switch(KeyPressed)
      { case CallMenu:Event_Menu(H,X1,E,flag);
             break;
        case AltB    :Event_Menu(H,X1,E,flag,1);
             break;
        case AltC    :Event_Menu(H,X1,E,flag,2);
             break;
        case AltO    :Event_Menu(H,X1,E,flag,3);
             break;
      }
     if (KeyPressed == Exit)
      break;
    }
}
//**************************************************
void main()
{ _setcursortype(_NOCURSOR);            // Скрытие курсора
  Window_Border(1,1,80,25,YELLOW,BLUE); // Очистка экрана с цветами
  Exec();                               // Запуск основного обработчика
  _setcursortype(_NORMALCURSOR);        // Показ курсора
}
34K
08 октября 2008 года
Snowman
15 / / 23.06.2008
закачал в исходники http://sources.codenet.ru/download/2177/Kurs_cpp.html
73K
15 июня 2011 года
AxEJL
1 / / 15.06.2011
мош дать ссылку на теорию и алгоритм по этому методу? плз очень нужно
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог