2012-03-21 57 views
1

我想問一下如何將用戶插入的字符串轉換爲數學方程,以便xCode理解。Xcode將一串方程轉換爲數學方程

例如,如果用戶將其輸入到文本字段。 「2 * sin(2 * M_PI * t)」其中方程內部的「t」是代碼內部的變量,並且Xcode將能夠理解像

雙重答案= 2 * sin(2 * M_PI * t );

非常感謝 健

回答

5

你可以用標準的可可類來完成,但是語法有點荒謬,而且設置的數量也是驚人的。

@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和一個類別是如何繞過它的。
+0

感謝您的回覆。我這樣做是爲了iOS,因爲NSPredicate中的字符串是@「2 * FUNCTION(2 * PI * $ t,'sin')== 0」這意味着當用戶輸入一個等式到文本字段必須遵循這個格式?對不起,我是一個初學者,從來沒有解決NSExpression。 – Kin 2012-03-21 01:38:10

+0

@Kin這應該在iOS中工作。您需要更改用戶條目的格式以匹配'NSPredicate'期望的內容。注意最後的'== 0',這是缺乏公開可用的表達式解析API的解決方法。只有謂詞解析器可用,因此您將一個表達式'2 * sin(2 * M_PI * t)'轉換爲謂詞'2 * sin(2 * M_PI * t)== 0',並使用' leftExpression'調用。 – dasblinkenlight 2012-03-21 09:18:13

3

最好的辦法是使用數學解析器像DDMathParser

它允許變量替換並具有內置常量。

+0

謝謝!這個數學解析器幫助了很多! – Kin 2012-03-21 13:17:25

+0

DDMathParser是否適用於mac和ios應用程序 – 2012-10-24 07:06:00

+0

@VigneshKumar是的,iOS 4.0或更高版本以及OS X 10.6或更高版本的每個wiki頁面:https://github.com/davedelong/DDMathParser/wiki/Adding-DDMathParser-to-您的項目 – lnafziger 2012-10-24 16:53:18