#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();
}
метод квадратичной интерполяции-экстраполяции (С++)
В сети по этому методу ничего не нашел . Подскажите, пожалуйста? Может у кого есть готовое решение, буду очень рад.
Заранее благодарен.
много времени прошло со времени последнего поста. Достал я все таки эту прогу, теперь другая проблема. Все работает но там есть штука можно выбирать пункты меню нажатием комбинации клавиш и вроде все нормально а не работает, посмотрите пожалуйста может чего подскажете и как убрать константы из define ?
Код:
//**************************************************
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); // Показ курсора
}
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); // Показ курсора
}
закачал в исходники
мош дать ссылку на теорию и алгоритм по этому методу? плз очень нужно