Xcode Преобразование строки уравнения в математическое уравнение - PullRequest
1 голос
/ 21 марта 2012

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 21 марта 2012

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

@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 и какая категория используется для ее обхода.
3 голосов
/ 21 марта 2012

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

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

...