|
Основной форум Сюда все проблемы связанные с программированием. |
22.12.2006, 19:39
|
#1
|
AnyKey`щик
Регистрация: 22.12.2006
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
График и ввод функции
Привет программисты!
Помогите Рисую график, но нужно вводить функцию. Т.е. она не должна быть задана в коде, а юзер должен сам её вводить. Покажите как?! И ещё.. посмотрите чуть чуть на код проги, подправьте, а то я ньюби совсем. Вот смотрел на прогу http://midp.dev.juga.ru/ и облизывался
program graph;
var
x1,x2:real;
y1,y2:real;
ff:real;
okCommand:command;
nameField,nameField2,d:integer;
userName,a:string;
m:real;
label_id:integer;
choiceGroupID: integer;
repa: integer;
choiceGroupID2: integer;
par, lin, sin, gep, sq, par2: integer;
igrat, about, vyhod, help, hist : integer;
exit, exit1, play, clicked : command;
function f(x:real): real;
begin
if choiceIsSelected
(choiceGroupID, par) then
begin
f:=x*x;
end;
if choiceIsSelected
(choiceGroupID, par2) then
begin
f:=x*x*x;
end;
if choiceIsSelected
(choiceGroupID, sq) then
begin
f:=sqrt(x);
end;
if choiceIsSelected
(choiceGroupID, gep) then
begin
f:=2/x;
end;
if choiceIsSelected
(choiceGroupID, lin) then
begin
f:=2*x+5;
end;
if choiceIsSelected
(choiceGroupID, sin) then
begin
f:=x;
end;
end;
procedure GrOfFunc;
var
x:real;
y:real;
dx:real;
l,b:real;
w,h:real;
x0,y0:real;
i:integer;
cm:command;
begin
l:=getWidth div 2;
b:=getHeight div 2;
h:=getHeight div 2;
w:=getWidth;
if choiceIsSelected
(choiceGroupID, sq) then
x1:=0;
else
x1:=-9;
x2:=9;
dx:=0.1;
setcolor(0,0,0);
x0:=getWidth div 2;
y0:=b;
DrawLine(trunc(x0-w), trunc(y0), trunc(x0+w), trunc(y0));
DrawLine(trunc(l), trunc(b-h), trunc(l), trunc(b+h));
setColor(255, 0, 0);
x:=x1;
if m=0 then m:=1;
repeat
y:=f(x);
DrawLine(trunc(x0+x*m), trunc(y0-y*m), trunc(x0+(x+dx)*m), trunc(y0-f(x+dx)*m));
setColor(255, 255, 255);
fillRect(0, 0, 50, 23);
setColor(255, 0, 0);
drawtext(IntegerToString(trunc(x*m)),1,0);
drawtext(IntegerToString(trunc(y*m)),1,11);
//delay(d*1000);
x:=x+dx;
repaint;
until (x>=x2);
end;
procedure form;forward;
Procedure paint;
begin
if not choiceIsSelected
(choiceGroupID2, repa) then
begin
setColor(255, 255, 255);
fillRect(0, 0, 200, 200);
end;
if formGetText(nameField)='' then m:=1 else
begin
m:=stringToReal(formGetText(nameField), 10);
d:=StringToInteger(formGetText(nameField2));
end;
ShowCanvas;
GrOfFunc;
while
getKeyClicked = KE_NONE do
begin
setColor(255, 0, 0);
drawtext('Press any',3,getHeight-20);
repaint;
end;
form;
end;
procedure menu; forward;
procedure form;
begin
ClearForm;
showForm;
choiceGroupID := formAddChoice('Выберите функцию', CH_EXCLUSIVE);
par := choiceAppendString(choiceGroupID, 'Y=X^2');
par2 := choiceAppendString(choiceGroupID, 'Y=X^3');
lin := choiceAppendString(choiceGroupID, 'Y=2*X+5');
sin := choiceAppendString(choiceGroupID, 'Y=X');
gep := choiceAppendString(choiceGroupID, 'Y=2/X');
sq := choiceAppendString(choiceGroupID, 'Y=sqrt(X)');
nameField := formAddTextField('Масштаб(X,Y*)', '', 2, TF_NUMERIC);
nameField2 := formAddTextField('Задержка(sec)', '', 1, TF_NUMERIC);
choiceGroupID2 := formAddChoice('Накладка', CH_MULTIPLE);
repa := choiceAppendString(choiceGroupID2, 'Да');
okCommand := createCommand('OK', CM_OK, 1);
addCommand(okCommand);
play := CreateCommand('Назад', CM_BACK, 1);
AddCommand(play);
clicked := getClickedCommand;
repeat
//delay(100);
clicked := getClickedCommand;
until (clicked = play) or (clicked = okCommand);
if clicked = play then menu;
paint;
end;
procedure ab;
begin
clearform;
showform;
{!}
play := CreateCommand('Назад', CM_BACK, 2);
AddCommand(play);
repeat
//delay(100);
until GetClickedCommand <> EmptyCommand;
end;
procedure pomosh;
begin
clearform;
showForm;
{!}
play := CreateCommand('Назад', CM_BACK, 2);
AddCommand(play);
repeat
//delay(100);
until GetClickedCommand <> EmptyCommand;
end;
procedure vers;
begin
clearform;
showForm;
{!}
play := CreateCommand('Назад', CM_BACK, 2);
AddCommand(play);
repeat
//delay(100);
until GetClickedCommand <> EmptyCommand;
end;
procedure menu;
begin
ShowMenu('График функции.', CH_IMPLICIT);
igrat := MenuAppendString('График');
about := MenuAppendString('Аффтар');
help := MenuAppendString('Помощь');
hist := MenuAppendString('История');
vyhod := MenuAppendString('Выход');
play := CreateCommand('OK', CM_SCREEN , 1);
AddCommand(play);
exit := CreateCommand('Выход', CM_EXIT, 2);
AddCommand(exit);
repeat
//delay(100);
clicked := getClickedCommand;
until (clicked = play) or (clicked = exit);
if clicked = exit then halt;
showCanvas;
if menuGetSelectedIndex = igrat then form;
if menuGetSelectedIndex = about then ab;
if menuGetSelectedIndex = vyhod then halt;
if menuGetSelectedIndex = hist then vers;
if menuGetSelectedIndex = help then pomosh;
menu;
end;
begin
menu;
while (getClickedCommand <> okCommand) do
begin
while
getKeyClicked = KE_NONE do
begin end;
end;
end.
|
(Offline)
|
|
22.12.2006, 21:06
|
#2
|
|
Re: График и ввод функции
Привет. Я видел эту программу и даже декомпилировал её Java Decompiler и у видел в ней кучу операторо if имто это и рисуется. Насколько я знаю математики строят графики подставляя значения х и соединяя найденные точки линиями. Перебирать значения х можно циклом for to do. Для х можно выбрать индекс самого цикла.
Далее ввод, для распознования можно использовать function pos.
Вместо минуса можно использовать сложение например 2-3 =2+(-3).
Я сам занимался таким проэктом на языке Visual Basic (решение задач с вводом формулы)я поковыряюсь внём и если смогу адаптировать его для МП обязательно сообшю.
|
|
|
23.12.2006, 15:03
|
#3
|
Знающий
Регистрация: 10.08.2006
Сообщений: 254
Написано 3 полезных сообщений (для 3 пользователей)
|
Re: График и ввод функции
Тут есть маленькое но...
Функции типа Eval м МП нет...
|
(Offline)
|
|
23.12.2006, 16:46
|
#4
|
AnyKey`щик
Регистрация: 22.12.2006
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: График и ввод функции
Вообщем, жду помощи
|
(Offline)
|
|
24.12.2006, 12:26
|
#5
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Re: График и ввод функции
eval можно конечно и написать, взять например от smallBasic разбор выражений.
|
(Offline)
|
|
24.12.2006, 21:15
|
#6
|
Знающий
Регистрация: 10.08.2006
Сообщений: 254
Написано 3 полезных сообщений (для 3 пользователей)
|
Re: График и ввод функции
Есть доки по этому вопросу? Я так понимаю это своего рода апи эмулятора?..
|
(Offline)
|
|
25.12.2006, 12:06
|
#7
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Re: График и ввод функции
Мы похоже друг друга не поняли.
Если вам нужен полноценный разбор математических выражений в МР его нужно написать или на самом МР или в виде библиотеки на яве.
Эмулятор здесь не причем
smallBasic был приведен в качестве примера, просто я на его основе учился писать такие вещи.
|
(Offline)
|
|
25.12.2006, 12:15
|
#8
|
Знающий
Регистрация: 10.08.2006
Сообщений: 254
Написано 3 полезных сообщений (для 3 пользователей)
|
Re: График и ввод функции
Я действительно немного не понял... Мне показалось, что имеется ввиду ява библиотека, своего рода аналог mobilebasic, который генерировал мидлеты по этому принципу...
|
(Offline)
|
|
25.12.2006, 18:22
|
#9
|
AnyKey`щик
Регистрация: 22.12.2006
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: График и ввод функции
Да не, нужен алгоритм разложения на паскале... Хотя и на яве у меня он уже есть, но я яву знаю на нуле
public class f
{
Stack m_forStack;
Stack m_intStack;
Stack m_tryStack;
Stack m_caseStack;
String m_aString;
Stack m_newStack;
Stack m_ifStack;
e m_doe;
byte m_byteaB[] = {
0, 8, 8, 5, 5, 3, 2, 10, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 1, 1, 1, 1
};
public f(String s)
{
m_tryStack = new Stack();
m_forStack = new Stack();
m_newStack = new Stack();
m_caseStack = new Stack();
m_intStack = new Stack();
m_ifStack = new Stack();
m_doe = (new e())._dee(e.m_ce);
m_aString = new String(s);
_avV();
_dovV();
_ifvV();
}
public void _ifvV()
{
m_newStack.setSize(0);
m_ifStack.setSize(0);
m_tryStack.setSize(0);
m_caseStack.setSize(0);
if(m_aString == "empty")
return;
for(int i = 0; i < m_forStack.size(); i++)
if(Integer.parseInt(m_forStack.elementAt(i).toString()) == 0)
{
m_newStack.addElement(m_forStack.elementAt(i));
m_ifStack.addElement(m_intStack.elementAt(i));
} else
if(m_tryStack.size() < 1)
{
m_tryStack.addElement(m_forStack.elementAt(i));
m_caseStack.addElement(m_intStack.elementAt(i));
} else
if(Integer.parseInt(m_forStack.elementAt(i).toString()) == 7)
{
m_tryStack.addElement(m_forStack.elementAt(i));
m_caseStack.addElement(m_intStack.elementAt(i));
} else
if(Integer.parseInt(m_forStack.elementAt(i).toString()) == 8)
{
for(; _forvI() != 7; m_ifStack.addElement(m_caseStack.pop()))
m_newStack.addElement(m_tryStack.pop());
m_tryStack.pop();
m_caseStack.pop();
} else
if(_forvI() >= 0)
{
if(m_byteaB[_forvI()] <= m_byteaB[Integer.parseInt(m_forStack.elementAt(i).toString())])
{
while(m_byteaB[_forvI()] <= m_byteaB[Integer.parseInt(m_forStack.elementAt(i).toString())])
{
m_newStack.addElement(m_tryStack.pop());
m_ifStack.addElement(m_caseStack.pop());
if(m_tryStack.size() < 1)
break;
}
m_tryStack.addElement(m_forStack.elementAt(i));
m_caseStack.addElement(m_intStack.elementAt(i));
} else
{
m_tryStack.addElement(m_forStack.elementAt(i));
m_caseStack.addElement(m_intStack.elementAt(i));
}
} else
{
m_tryStack.addElement(m_forStack.elementAt(i));
m_caseStack.addElement(m_intStack.elementAt(i));
}
for(; m_tryStack.size() > 0; m_ifStack.addElement(m_caseStack.pop()))
m_newStack.addElement(m_tryStack.pop());
}
public void _dovV()
{
String s = new String("");
m_forStack.setSize(0);
m_intStack.setSize(0);
if(m_aString == "empty")
return;
int j = m_aString.length();
if(j < 1)
return;
boolean flag = false;
boolean flag1 = false;
for(int i = 0; i < j; i++)
{
if(flag1)
{
if(_forCZ(m_aString.charAt(i)))
{
s = s + m_aString.charAt(i);
continue;
}
flag1 = false;
if(s.equals("sin"))
{
m_forStack.addElement(new Integer(9));
m_intStack.addElement(new e());
}
if(s.equals("cos"))
{
m_forStack.addElement(new Integer(10));
m_intStack.addElement(new e());
}
if(s.equals("lg"))
{
m_forStack.addElement(new Integer(11));
m_intStack.addElement(new e());
}
if(s.equals("log2"))
{
m_forStack.addElement(new Integer(12));
m_intStack.addElement(new e());
}
if(s.equals("tg"))
{
m_forStack.addElement(new Integer(13));
m_intStack.addElement(new e());
}
if(s.equals("arctg"))
{
m_forStack.addElement(new Integer(14));
m_intStack.addElement(new e());
}
if(s.equals("arccos"))
{
m_forStack.addElement(new Integer(15));
m_intStack.addElement(new e());
}
if(s.equals("arcsin"))
{
m_forStack.addElement(new Integer(16));
m_intStack.addElement(new e());
}
if(s.equals("sqrt"))
{
m_forStack.addElement(new Integer(19));
m_intStack.addElement(new e());
}
if(s.equals("pi"))
{
m_forStack.addElement(new Integer(20));
m_intStack.addElement(new e());
}
if(s.equals("x"))
{
m_forStack.addElement(new Integer(21));
m_intStack.addElement(new e());
}
if(s.equals("e"))
{
m_forStack.addElement(new Integer(22));
m_intStack.addElement(new e());
}
if(s.equals("abs"))
{
m_forStack.addElement(new Integer(23));
m_intStack.addElement(new e());
}
if(s.equals("ln"))
{
m_forStack.addElement(new Integer(24));
m_intStack.addElement(new e());
}
if(s.equals("log"))
{
m_forStack.addElement(new Integer(25));
m_intStack.addElement(new e());
}
if(s.equals("ctg"))
{
m_forStack.addElement(new Integer(26));
m_intStack.addElement(new e());
}
}
if(flag)
{
if(_ifCZ(m_aString.charAt(i)) || m_aString.charAt(i) == '.')
{
s = s + m_aString.charAt(i);
continue;
}
flag = false;
int k = s.indexOf('.');
if(k > -1)
{
m_forStack.addElement(new Integer(0));
m_intStack.addElement(new e(Integer.parseInt(s.substring(0, k)), -(m_aString.length() - k - 1)));
} else
{
m_forStack.addElement(new Integer(0));
m_intStack.addElement(new e(Integer.parseInt(s)));
}
}
if(m_aString.charAt(i) != ' ' && m_aString.charAt(i) != ',')
{
if(_doCZ(m_aString.charAt(i)))
{
m_forStack.addElement(new Integer(6));
m_intStack.addElement(new e());
}
if(_aCZ(m_aString.charAt(i)))
{
if(m_aString.charAt(i) == '+')
{
m_forStack.addElement(new Integer(1));
m_intStack.addElement(new e());
}
if(m_aString.charAt(i) == '-')
{
m_forStack.addElement(new Integer(2));
m_intStack.addElement(new e());
}
if(m_aString.charAt(i) == '*')
{
m_forStack.addElement(new Integer(3));
m_intStack.addElement(new e());
}
if(m_aString.charAt(i) == '/')
{
m_forStack.addElement(new Integer(4));
m_intStack.addElement(new e());
}
if(m_aString.charAt(i) == '^')
{
m_forStack.addElement(new Integer(5));
m_intStack.addElement(new e());
}
} else
if(m_aString.charAt(i) == '(')
{
m_forStack.addElement(new Integer(7));
m_intStack.addElement(new e());
} else
{
if(m_aString.charAt(i) == ')')
{
m_forStack.addElement(new Integer(8));
m_intStack.addElement(new e());
}
if(_ifCZ(m_aString.charAt(i)))
{
flag = true;
s = "" + m_aString.charAt(i);
} else
if(_forCZ(m_aString.charAt(i)))
{
flag1 = true;
s = "" + m_aString.charAt(i);
} else
{
}
}
}
}
}
private int _forvI()
{
if(m_tryStack.size() < 1)
return -1;
else
return Integer.parseInt(m_tryStack.peek().toString());
}
public void _avV()
{
String s = new String("");
int k = m_aString.length();
if(k < 1)
{
m_aString = "empty";
return;
}
for(int i = 0; i < k; i++)
{
if(m_aString.charAt(i) != ' ')
s = s + m_aString.charAt(i);
}
m_aString = ' ' + m_aString + ' ';
for(int j = 0; j < k; j++)
{
if(m_aString.charAt(j) == '-' && m_aString.charAt(j - 1) != ')' && !_ifCZ(m_aString.charAt(j - 1)))
m_aString = m_aString.substring(0, j) + '_' + m_aString.substring(j + 1);
}
}
public boolean _ifCZ(char c)
{
return c >= '0' && c <= '9';
}
public e _aee(e e1)
{
e e2 = new e(0L);
e e3 = new e();
e e6 = new e();
e e8 = new e();
m_tryStack.setSize(0);
m_caseStack.setSize(0);
if(m_aString == "empty")
return new e(0L);
for(int k5 = 0; k5 < m_newStack.size(); k5++)
{
int l5 = ((Integer)m_newStack.elementAt(k5)).intValue();
if(l5 == 0)
{
m_tryStack.addElement(m_newStack.elementAt(k5));
m_caseStack.addElement(m_ifStack.elementAt(k5));
} else
if(l5 == 1)
{
e e9 = ((e)m_caseStack.pop())._elseee((e)m_caseStack.pop());
int i = 0;
m_tryStack.addElement(new Integer(i));
m_caseStack.addElement(e9);
} else
if(l5 == 2)
{
e e10 = ((e)m_caseStack.pop())._voidee((e)m_caseStack.pop())._ave();
int j = 0;
m_tryStack.addElement(new Integer(j));
m_caseStack.addElement(e10);
} else
if(l5 == 3)
{
e e11 = ((e)m_caseStack.pop())._bee((e)m_caseStack.pop());
int k = 0;
m_tryStack.addElement(new Integer(k));
m_caseStack.addElement(e11);
} else
if(l5 == 4)
{
e e4 = (e)m_caseStack.pop();
if(e4._ceZ(e.m_casee))
{
e2 = new e(0x7fffffffffffffffL, 0x7fffffffffffffffL);
return e2;
}
e e12 = ((e)m_caseStack.pop())._gotoee(e4);
int l = 0;
m_tryStack.addElement(new Integer(l));
m_caseStack.addElement(e12);
} else
if(l5 == 5)
{
e e5 = (e)m_caseStack.pop();
e e7 = (e)m_caseStack.pop();
if(e7._nulleZ(e.m_casee))
{
if(e5.m_elseJ < 0L)
{
e2 = new e(0x7fffffffffffffffL, 0x7fffffffffffffffL);
return e2;
}
}
e e13 = e._ifeDFe(e7, e5);
int i1 = 0;
m_tryStack.addElement(new Integer(i1));
m_caseStack.addElement(e13);
} else
if(l5 == 6)
{
e e14 = ((e)m_caseStack.pop())._ave();
int j1 = 0;
m_tryStack.addElement(new Integer(j1));
m_caseStack.addElement(e14);
} else
if(l5 == 9)
{
e e15 = e._ifee((e)m_caseStack.pop());
int k1 = 0;
m_tryStack.addElement(new Integer(k1));
m_caseStack.addElement(e15);
} else
if(l5 == 10)
{
e e16 = e._fee((e)m_caseStack.pop());
int l1 = 0;
m_tryStack.addElement(new Integer(l1));
m_caseStack.addElement(e16);
} else
if(l5 == 11)
{
e e17 = e._longee((e)m_caseStack.pop());
int i2 = 0;
m_tryStack.addElement(new Integer(i2));
m_caseStack.addElement(e17);
} else
if(l5 == 12)
{
e e18 = e._dee((e)m_caseStack.pop());
int j2 = 0;
m_tryStack.addElement(new Integer(j2));
m_caseStack.addElement(e18);
} else
if(l5 == 13)
{
e e19 = e._newee((e)m_caseStack.pop());
int k2 = 0;
m_tryStack.addElement(new Integer(k2));
m_caseStack.addElement(e19);
} else
if(l5 == 14)
{
e e20 = e._doee((e)m_caseStack.pop());
int l2 = 0;
m_tryStack.addElement(new Integer(l2));
m_caseStack.addElement(e20);
} else
if(l5 == 15)
{
e e21 = e._eee((e)m_caseStack.pop());
int i3 = 0;
m_tryStack.addElement(new Integer(i3));
m_caseStack.addElement(e21);
} else
if(l5 == 16)
{
e e22 = e._iee((e)m_caseStack.pop());
int j3 = 0;
m_tryStack.addElement(new Integer(j3));
m_caseStack.addElement(e22);
} else
if(l5 != 17 && l5 != 18)
if(l5 == 19)
{
e e23 = e._charee((e)m_caseStack.pop());
int k3 = 0;
m_tryStack.addElement(new Integer(k3));
m_caseStack.addElement(e23);
} else
if(l5 == 20)
{
e e24 = e.m_be;
int l3 = 0;
m_tryStack.addElement(new Integer(l3));
m_caseStack.addElement(e24);
} else
if(l5 == 21)
{
e e25 = e1;
int i4 = 0;
m_tryStack.addElement(new Integer(i4));
m_caseStack.addElement(e25);
} else
if(l5 == 22)
{
e e26 = e.m_ce;
int j4 = 0;
m_tryStack.addElement(new Integer(j4));
m_caseStack.addElement(e26);
} else
if(l5 == 23)
{
e e27 = e._foree((e)m_caseStack.pop());
int k4 = 0;
m_tryStack.addElement(new Integer(k4));
m_caseStack.addElement(e27);
} else
if(l5 == 24)
{
e e28 = e._dee((e)m_caseStack.pop())._gotoee(m_doe);
int l4 = 0;
m_tryStack.addElement(new Integer(l4));
m_caseStack.addElement(e28);
} else
if(l5 == 25)
{
e e29 = e._dee((e)m_caseStack.pop())._gotoee(e._dee((e)m_caseStack.pop()));
int i5 = 0;
m_tryStack.addElement(new Integer(i5));
m_caseStack.addElement(e29);
} else
if(l5 == 26)
{
e e30 = e.m_ife._gotoee(e._newee((e)m_caseStack.pop()));
int j5 = 0;
m_tryStack.addElement(new Integer(j5));
m_caseStack.addElement(e30);
} else
{
}
}
e2 = (e)m_caseStack.pop();
return e2;
}
public boolean _aCZ(char c)
{
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}
public boolean _forCZ(char c)
{
return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
}
public boolean _doCZ(char c)
{
return c == '_';
}
}
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:23.
|