Компилятор формул

  • Автор темы JTOne
  • Дата начала
Статус
Закрыто для дальнейших ответов.
J

JTOne

#1
Люди помогите создать простенький компелятор формул!

Суть такая:

я вожу 3x^2+-5x+4 или что то аналогичное(любая фунция)!

Суть в том что икс я знаю, просто надо пощитать, а вот как я сделать это?
 
E

Electro

#2
В этом случае я разрабатывал рекурсивную функцию.
Смотри на этом форуме: "Нужна помощь в подборе подходящего шаблона проектирования"
Прочитай вдумчиво, думаю разберешся.
Если нет пиши.
 
J

JTOne

#5
Слушай, а когда я подставляю вместо икса -1 оне не работает, говорит что типа, это не правельный символ! что делать? подскажи!
 
?

????

#6
а пример неработающего кода привести слабо? в тестовом приложении в архиве с сайта при подстановке -1 все работает
 
J

JTOne

#7
Как работает? я ввожу произвольную функцию(например 2x) и а потом x=-1, и оно не черта не работает!

Вот посмотри я тебе кидаю кусочек своего кода!

Код:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ExpressionParser parser = new ExpressionParser();
Hashtable h1 = new Hashtable();
tps xxx = new tps();

string st1;
string st2;
Console.WriteLine("F");
//st1= Console.ReadLine();

Console.WriteLine("x");
//st2= Console.ReadLine();

h1.Add("x", "-1");

double result = parser.Parse( "2x", h1 );

Console.WriteLine("F = {0}", result);
Console.ReadLine();

}
}
}
 
?

????

#8
<!--QuoteBegin-JTOne+3:11:2006, 15:55 -->
<span class="vbquote">(JTOne @ 3:11:2006, 15:55 )</span><!--QuoteEBegin-->Как работает? я ввожу произвольную функцию(например 2x) и а потом x=-1, и оно не черта не работает!
[snapback]47109" rel="nofollow" target="_blank[/snapback]​
[/quote]
 

Вложения

  • 9.5 КБ Просмотры: 83
J

JTOne

#9
Я вобщем розабрался, в чем проблема, это вся проблема в локализации, я вчера связался с автором, и он сказал что он живет в Швеции, после этого я себе поставил Швецскую локадизацию и все заработало как надо, а сегодня я опять обратно поставил свою и тоже работает - скорее всего это виндозер глючит!

Спасибо за помощь :blink:
 
P

pushkin

#10
Люди помогите создать простенький компелятор формул!

Суть такая:

я вожу 3x^2+-5x+4 или что то аналогичное(любая фунция)!

Суть в том что икс я знаю, просто надо пощитать, а вот как я сделать это?
Отличный способ описан ТУТ
 
D

Dottik

#11
Если нужен рабочий код, держи:

Этот класс переводит выражение в польскую запись
Код:
using System;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// makes from string polskij zapus
/// </summary>
public class Polka
{
string norm;
public Polka(string normal)
{
norm = normal;
}
private int prior(string s)
{
if (s[0] == '(' || s[0] == ')')
return 0;
if (s[0] == '+' || s[0] == '-')
return 1;
if (s[0] == '*' || s[0] == '/')
return 2;
if (s[0] == '^' || s[0] == 'l')
return 3;
if (s[0] == 's' || s[0] == 'c')
return 4;
return -1;
}

private bool isoper(char s)
{
if (s == '(' || s == ')' || s == '+' || s == '-')
return true;
if (s == 's' || s == 'c' || s == 'l' || s == '^')
return true;
if (s == '*' || s == '/')
return true;
return false;
}

public string Make()
{
string res = "";
List<string> stack = new List<string>();
for (int i = 0; i < norm.Length; ++i)
{
if (norm[i] == '(')
{
stack.Add("(");
continue;
}
if (norm[i] == ')')
{
for (int j = stack.Count - 1; j > 0; j--)
{
if (stack[j] == "(")
{
stack.RemoveAt(j);
break;
}
res += stack[j]+" ";
stack.RemoveAt(j);
}
continue;
}
if (isoper(norm[i]))
{
for (int j = stack.Count - 1; j >= 0; j--)
{
if (stack[j] == "(")
{
stack.Add(norm[i].ToString());
break;
}
if (prior(stack[j]) >= prior(norm[i].ToString()))
{
res += stack[j] + " ";
stack.RemoveAt(j);
}
}
}
else
{
if (norm[i] == 'x' || norm[i] == 'e')
{
res += norm[i].ToString()+" ";
continue;
}
for (int j = 0; j + i < norm.Length; ++j)
{
if (!(norm[i + j] >= '0' && norm[i + j] <= '9'))
{
i += (j - 1);
break;
}
res += norm[i + j];
}

res += " ";
}
}
return res;


}
}
, а этот, подсчитывает значение:
Код:
using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsApp
{
class Calculator
{
private string s;

private bool isoper(char s)
{
if (s == '(' || s == ')' || s == '+' || s == '-')
return true;
if (s == 's' || s == 'c' || s == 'l' || s == '^')
return true;
if (s == '*' || s == '/')
return true;
return false;
}

private bool isUnar(char s)
{
if (s == 'l' || s == 'c' || s == 's')
return true;
return false;
}

private double calc1(double x, char s)
{
if (s == 'l')
return Math.Log(x);
if (s == 'c')
return Math.Cos(x);
if (s == 's')
return Math.Sin(x);
return -1;
}

private double calc2(double x1, double x2, char s)
{
if (s == '+')
return x1+x2;
if (s == '-')
return x2-x1;
if (s == '^')
return Math.Pow(x2, x1);
if (s == '*')
return x1 * x2;
if (s == '/')
return x2 / x1;
return -1;
}

public Calculator(string s)
{
this.s = s;
}

public double F(double x)
{
double x1,x2,res = 0;
string ts;
List<double> stack = new List<double>();
for (int i = 0; i < s.Length; ++i)
{
if (s[i] == ' ')
continue;
if (isoper(s[i]))
{
if (isUnar(s[i]))
{
x1 = stack[stack.Count - 1];
stack.RemoveAt(stack.Count - 1);
res = calc1(x1, s[i]);
stack.Add(res);
continue;
}
x1 = stack[stack.Count - 1];
x2 = stack[stack.Count - 2];
stack.RemoveAt(stack.Count - 1);
stack.RemoveAt(stack.Count - 1);
res = calc2(x1, x2, s[i]);
stack.Add(res);
}
else
{
if (s[i] == 'x')
{
stack.Add(x);
continue;
}
if (s[i] == 'e')
{
stack.Add(Math.E);
continue;
}
ts = "";
for (int j = 0; j + i < s.Length; ++j)
{
if (!(s[i + j] >= '0' && s[i + j] <= '9'))
{
i += (j - 1);
break;
}
ts += s[i + j];
}
stack.Add(Convert.ToDouble(ts));
}
}
res = stack[0];
return res;
}

}
}
одно НО: выражение должно быть в общих скобках.
 
M

Marsianin

#12
У меня прога рисует графики уравнений. За уравнение отвечает одна строка и выглядит примерно так:
Y = X ^ 2 - 3
Мне надо чтобы если ввести в текстовое поле например (x * 8) ^ 3 рисовался бы график функции Y = (x * 8) ^ 3. Вобщем мне надо научить прогу рисовать графики любых функций. Если кто-то знает как это сделать - пишите. Заранее спасибо.

P.S. Я пишу на VisualBasic.Net 2003
 
Статус
Закрыто для дальнейших ответов.