2013-03-30 69 views
1

我註冊的求和功能是sum(expression,initial,final)expression包含自變量xinitialfinal是整數。例如,sum(2x,2,4)應返回2 * 2 + 3 * 2 + 4 * 2 = 18。但是,我無法在expression中替換x中的每個值initialfinal之間的值。這是我的代碼,它不起作用。任何人都可以告訴我如何解決它?任何人都可以幫助解決這個DDMathParser新功能嗎?

//sum(expr (dependent on x),initial,final) 
[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) { 
    DDExpression *final = nil; 
    if([args count] == 3){ 
     DDExpression *expr = [args objectAtIndex:0]; 
     DDExpression *start = [args objectAtIndex:1]; 
     DDExpression *end = [args objectAtIndex:2]; 
     //test whether start and end are integers 
     double startDouble = [[start evaluateWithSubstitutions:nil evaluator:evaluator error:nil] doubleValue]; 
     double endDouble = [[end evaluateWithSubstitutions:nil evaluator:evaluator error:nil] doubleValue]; 
     int startInt = (int)startDouble; 
     int endInt = (int)endDouble; 
     if (((startDouble-startInt)>0.9999 || (startDouble-startInt)<0.0001) && ((endDouble-endInt)>0.9999 || (endDouble-endInt)<0.0001)) { 
      //start and end are integers 
      double resultSum = 0; 
      for (int i=startInt; i<=endInt; i++) { 
       NSNumber *xValue = [NSNumber numberWithInt:i]; 
       NSDictionary *substitution = [NSDictionary dictionaryWithObjectsAndKeys:xValue,@"x", nil]; 
       NSNumber *valueOfExpr = [expr evaluateWithSubstitutions:substitution evaluator:evaluator error:nil]; 
       resultSum = resultSum + [valueOfExpr doubleValue]; 
      } 
      final = [DDExpression numberExpressionWithNumber:[NSNumber numberWithDouble:resultSum]]; 
     } 
    } 
    return final; 
}forName:@"sum"]; 
+0

爲什麼不直接向戴夫德隆自己提問? :) –

回答

2

DDMathParser作者在這裏。

有兩件事是錯誤的,一件事情不理想。

  1. 錯 - 您無法調用此函數「sum」。 "sum" is a built-in functionbuilt-in functions cannot be overridden
  2. 錯誤 - 您的功能的第一個參數是:"2x"。這很好,除了x被解釋爲函數,但在for循環中,您將x視爲變量。您可能需要從根本上改變功能的工作方式,或者使用2 * $x(或2$x)作爲函數的第一個參數。
  3. 次優 - 與其將doubleValue置於評估參數之外,只需獲取integerValue,而不是避免整個double-to-int轉換。

以下是我會收拾你的函數(雖然你可能應該多做一點在error OUT參數填充的方式):

[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) { 
    DDExpression *final = nil; 
    if ([args count] == 3) { 
     DDExpression *expr = [args objectAtIndex:0]; 
     DDExpression *start = [args objectAtIndex:1]; 
     DDExpression *end = [args objectAtIndex:2]; 
     //get the start and end values 
     NSInteger startValue = [[eval evaluateExpression:start withSubstitutions:vars error:error] integerValue]; 
     NSInteger endValue = [[eval evaluateExpression:end withSubstitutions:vars error:error] integerValue]; 

     double sum = 0; 
     for (NSInteger i = startValue; i <= endValue; i++) { 
      NSDictionary *substitution = @{@"x": @(i)}; 
      NSNumber *value = [eval evaluateExpression:expr withSubstitutions:substitution error:error]; 
      sum += [value doubleValue]; 
     } 
     final = [DDExpression numberExpressionWithNumber:@(sum)]; 
    } 
    return final; 
} forName:@"sum2"]; 

有了這個,你可以做sum2(2*$x, 2, 4)它將評估爲18.

+0

謝謝。我有一個問題:當我註冊函數之前(他們工作得很好),我寫了'NSInteger startValue = [[evaluateator evaluateExpression:start withSubstitutions:vars error:error] integerValue];'而不是'NSInteger startValue = [[eval evaluateExpression :以Substitutions開頭:vars error:error] integerValue];'。不同之處在於我將消息發送給'evaluateator'而不是'eval'。你能告訴我有什麼不同嗎?爲什麼兩個都好?順便說一句,在所有註冊之前,我宣佈了'DDMathEvaluator *評估者= [DDMathEvaluator sharedMathEvaluator]'。 – zyl1024

+0

@ zyl1024您應該更喜歡將'DDMathEvaluator'實例傳遞到您從塊外部捕獲的那個塊上。 –

相關問題