我想問一下如何將用戶插入的字符串轉換爲數學方程,以便xCode理解。Xcode將一串方程轉換爲數學方程
例如,如果用戶將其輸入到文本字段。 「2 * sin(2 * M_PI * t)」其中方程內部的「t」是代碼內部的變量,並且Xcode將能夠理解像
雙重答案= 2 * sin(2 * M_PI * t );
非常感謝 健
我想問一下如何將用戶插入的字符串轉換爲數學方程,以便xCode理解。Xcode將一串方程轉換爲數學方程
例如,如果用戶將其輸入到文本字段。 「2 * sin(2 * M_PI * t)」其中方程內部的「t」是代碼內部的變量,並且Xcode將能夠理解像
雙重答案= 2 * sin(2 * M_PI * t );
非常感謝 健
你可以用標準的可可類來完成,但是語法有點荒謬,而且設置的數量也是驚人的。
@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
和一個類別是如何繞過它的。最好的辦法是使用數學解析器像DDMathParser。
它允許變量替換並具有內置常量。
感謝您的回覆。我這樣做是爲了iOS,因爲NSPredicate中的字符串是@「2 * FUNCTION(2 * PI * $ t,'sin')== 0」這意味着當用戶輸入一個等式到文本字段必須遵循這個格式?對不起,我是一個初學者,從來沒有解決NSExpression。 – Kin 2012-03-21 01:38:10
@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