Xcode Преобразование строки уравнения в математическое уравнение

Я хотел бы спросить, как я могу преобразовать строку, вставленную пользователем, в математическое уравнение, чтобы xCode понял.

Например, если пользователь вводит это в текстовое поле. «2*sin(2*M_PI*t)», где «t» внутри уравнения является переменной внутри кода, и Xcode сможет понять уравнение, например

двойной ответ = 2*sin(2*M_PI*t);

Большое спасибо, Кин


person Kin    schedule 21.03.2012    source источник


Ответы (2)


Вы можете сделать это, используя только стандартные классы какао, но синтаксис становится несколько нелепым, и количество настроек также ошеломляет.

@interface MyExprTest : NSObject
-(void)run;
@end

@implementation MyExprTest

-(void)run {
    NSExpression *e = [(NSComparisonPredicate *)[NSPredicate
        predicateWithFormat:@"2*FUNCTION(2*PI*$t,'sin')==0"]
        leftExpression];
    NSMutableDictionary *vars = [NSMutableDictionary
                             dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithDouble:0.04], @"t",
                             nil];
    NSLog(@"%@", [e expressionValueWithObject:self context:vars]);
}

-(double)PI {
    return M_PI;
}

@end

@interface NSNumber (Trigonometry)
- (NSNumber*)sin;
@end

@implementation NSNumber (Trigonometry)

- (NSNumber*) sin {
    double result = sin([self doubleValue]);
    return [NSNumber numberWithDouble:result];
}

@end

int main (int argc, const char * argv[]) {
    MyExprTest *t = [[MyExprTest alloc] init];
    [t run];
    return 0;
}

Несколько указаний на заметку:

  • t в вашем выражении стало $t, чтобы вы могли сослаться на него из словаря vars
  • M_PI стало просто PI; обратите внимание на добавленный метод для его поддержки
  • Встроенных тригонометрических функций нет; посмотрите, как FUNCTION и категория используются, чтобы обойти это.
person Sergey Kalinichenko    schedule 21.03.2012
comment
Спасибо за ответ. Я делаю это для iOS, поскольку строка в NSPredicate имеет вид @2*FUNCTION(2*PI*$t,'sin')==0, что означает, что когда пользователь вводит уравнение в текстовое поле, он должен следовать этому формату? Извините, я новичок и никогда не работал с NSExpression. - person Kin; 21.03.2012
comment
@Kin Это должно работать в iOS. Вам нужно будет изменить формат ввода пользователя, чтобы он соответствовал тому, что ожидает NSPredicate. Обратите внимание на ==0 в конце, это обходной путь из-за отсутствия общедоступного API синтаксического анализа выражений. Доступен только анализатор предикатов, поэтому вы превращаете выражение 2*sin(2*M_PI*t) в предикат 2*sin(2*M_PI*t)==0 и берете его левую часть с помощью вызова leftExpression. - person Sergey Kalinichenko; 21.03.2012

Лучше всего использовать математический анализатор, например DDMathParser.

Он допускает замену переменных и имеет встроенные константы.

person lnafziger    schedule 21.03.2012
comment
Спасибо! этот математический парсер очень помогает! - person Kin; 21.03.2012
comment
подходит ли DDMathParser для приложений mac и ios - person vignesh kumar; 24.10.2012
comment
@VigneshKumar Да, iOS 4.0 или новее и OS X 10.6 или новее на его вики-странице: github.com/davedelong/DDMathParser/wiki/ - person lnafziger; 24.10.2012