2014-01-23 3 views
1

У меня есть целая куча математических функций, являющихся выход из программы в этом формате:Форматирование математических функций

(704253724578.0182000000000000 .* (mydivide (mydivide (mydivide (mysqrt (- X13 X11)) (mydivide X18 X15)) (* (square (mydivide (* X1 X20) X19)) X2)) (mydivide (* (* X1 X20) (mydivide X25 X15)) X9))) + 77.2424201451314200 

Мне нужно написать скрипт, чтобы преобразовать их в несколько читаемых форматов, как это:

(704253724578.0182000000000000 * (((sqrt(X13-X11)/(X18/X15)) /((((X1*X20)/X19)^2) * X2))/ (((X1 * X20) * (X25/X15))/X9))) + 77.2424201451314200 

Любые идеи о том, что является лучшим способом сделать это в java? Или есть ли еще какие-нибудь другие инструменты для этого, кроме java?

Спасибо!

+1

Это похоже на терминологическую алгебру для проблемы с инфиксной нотацией, которая не зависит от языка. –

+0

При использовании степеней/экспонентов не используйте символ '^', он не делает то, что, по вашему мнению, делает. если вам нужно 'x', поднятое до степени' 2' (например, 'x^2'), вы должны использовать' Math.pow (x, 2) '. Оператор '^' фактически является ["побитовым исключением OR"] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html). –

+0

прав ... Я на самом деле не пытаюсь сделать математику. Я просто пытаюсь отформатировать строки, чтобы перейти от префиксной нотации к нотации infix. Любая идея о том, как форматировать строки? Благодаря! –

ответ

0

Установите Ruby и один красивый драгоценный камень под названием «sexpistol», который позволяет обрабатывать s-выражения.

Я взломал для вас решение:

require 'sexpistol' 
require 'pp' 

exp="(704253724578.0182000000000000 .* (mydivide (mydivide (mydivide (mysqrt (- X13 X11)) (mydivide X18 X15)) (* (square (mydivide (* X1 X20) X19)) X2)) (mydivide (* (* X1 X20) (mydivide X25 X15)) X9))) + 77.2424201451314200" 

parser = Sexpistol.new 
tree= parser.parse_string(exp) 

SYM={ 
    :".*" => :*, 
    :* => :*, 
    :"+" => :"+", 
    :- => :-, 
    :mydivide => :/, 
    :square => "^2", 
    :mysqrt => "mysqrt" 
    } 

def isPrefix sexp 
    return true if SYM[sexp.first] 
    return false  
end 

def p2i sexp 
    if sexp.is_a? Array 
     if isPrefix(sexp) 
      op,lhs,rhs =sexp 
      case op 
      when :square 
       return [p2i(lhs),SYM[op]] 
      when :mysqrt 
       return [:mysqrt,p2i(lhs)] 
      else 
       return [p2i(lhs),SYM[op],p2i(rhs)] 
      end 
     else 
      lhs,op,rhs=sexp 
      return [p2i(lhs),SYM[op],p2i(rhs)] 
     end 
    else 
     return sexp 
    end 
end 

pp parser.to_sexp(p2i(tree)).first 
# prints : (704253724578.0182 * ((((mysqrt (X13 - X11))/(X18/X15))/((((X1 * X20)/X19) ^2) * X2))/(((X1 * X20) * (X25/X15))/X9))) + 77.24242014513142 

Если вы пишете статью, вы можете признать меня!

+0

Спасибо за помощь всем! Я понял, используя стеки, чтобы нажимать и высказывать термины в java. –

+0

Возможно, вы можете подтвердить ответ (рабочее решение). Спасибо ! – JCLL

Смежные вопросы