[ios]任何人都可以帮助解决这个 DDMathParser 的新功能?

标签: ios Objective-C
发布时间: 2017/3/21 23:10:34
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我注册是求和函数 sum(expression,initial,final)expression包含独立变量 xinitialfinal 都是整数。例如, sum(2x,2,4) 应返回 2 * 2 + 3 * 2 + 4 * 2 = 18 。不过,我有问题而代以 xexpression 的每个值之间 initialfinal 。这里是我的代码,它不工作。谁能告诉我如何解决它呢?

//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"];

解决方法 1:

在这里作者 DDMathParser。

有两件事错了和一件事次优。

  1. 错了,你不能调用此函数"求和"。 "sum"是内置的函数,并且内置函数不能被覆盖
  2. 错了,你的函数的第一个参数是︰ "2x" 。 那很好,除了 x 被解释为一个函数,但里面你 for 循环你对待 x 好像它是一个变量。 你要么需要从根本上改变您的函数是如何工作的或使用窗体 2 * $x (或只是 2$x ) 作为您的函数的第一个参数。
  3. 次优-而不是让 doubleValue 关闭的评价参数,只是得到 integerValue 相反和避免整个的双 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。

官方微信
官方QQ群
31647020