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

Тема в разделе ".NET", создана пользователем JTOne, 30 окт 2006.

Статус темы:
Закрыта.
  1. JTOne

    JTOne Гость

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

    Суть такая:

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

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

    Electro Гость

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

    JTOne Гость

    Дружеще уважил? :) ???????? Пасибо! То что надо!
     
  4. JTOne

    JTOne Гость

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

    ???? Гость

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

    JTOne Гость

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

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

    Код (Text):
    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();

    }
    }
    }
     
  7. ????

    ???? Гость

    <!--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]
     

    Вложения:

    • q.PNG
      q.PNG
      Размер файла:
      9,5 КБ
      Просмотров:
      83
  8. JTOne

    JTOne Гость

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

    Спасибо за помощь :blink:
     
  9. pushkin

    pushkin Гость

    Отличный способ описан ТУТ
     
  10. Dottik

    Dottik Гость

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

    Этот класс переводит выражение в польскую запись
    Код (Text):
    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;


    }
    }
    , а этот, подсчитывает значение:
    Код (Text):
    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;
    }

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

    Marsianin Гость

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

    P.S. Я пишу на VisualBasic.Net 2003
     
Загрузка...
Похожие Темы - Компилятор формул
  1. glauberov
    Ответов:
    1
    Просмотров:
    1.300
  2. Shandrik
    Ответов:
    0
    Просмотров:
    1.354
  3. Dana0
    Ответов:
    1
    Просмотров:
    1.205
  4. programmerr
    Ответов:
    3
    Просмотров:
    1.780
  5. Stashevckiy
    Ответов:
    5
    Просмотров:
    3.285
Статус темы:
Закрыта.

Поделиться этой страницей