【问题标题】:Xcode command line tool for calculator计算器的 Xcode 命令行工具
【发布时间】:2014-06-12 03:20:45
【问题描述】:

我想使用XCode/OSX application/Command line tool/Foundation 类型制作命令行计算器。 在 XCode 中,转到 Products/Scheme/Edit Scheme。在此,我们可以添加或删除命令行参数。这些命令行参数存储在参数向量中,即argv[]
我正在使用 NSArray 将这些参数存储在 Objective-C 数组中。
现在,我想做一个可以计算表达式的计算器。
例如,我的论点是argv[1]=5argv[2]=+argv[3]= 10argv[4]=-argv[5]=2。因此,这些参数将评估表达式并给出结果。 结果=13

#import <Foundation/Foundation.h>

int main(int argc, const char* argv[])
{

    @autoreleasepool {
        NSArray *myarray =[[NSProcessInfo processInfo] arguments];

        for (int i=1; i<argc ; i++) {
            NSLog (@"Arguents %d=%@", i, myarray[i]);
        }

        return 0;
    }
}

【问题讨论】:

    标签: objective-c macos command-line foundation


    【解决方案1】:

    这是一个简单的计算器,几分钟就搞定了:

    #import <Foundation/Foundation.h>
    
    typedef enum {
        OP_NONE,
        OP_ADD,
        OP_SUB,
        OP_MULT,
        OP_DIV
    } Op;
    
    static int calc(NSArray *args) {
        Op op = OP_NONE;
        int result = 0;
        for (NSString *arg in args) {
            if ([arg isEqualToString:@"+"]) {
                op = OP_ADD;
            } else if ([arg isEqualToString:@"-"]) {
                op = OP_SUB;
            } else if ([arg isEqualToString:@"*"]) {
                op = OP_MULT;
            } else if ([arg isEqualToString:@"/"]) {
                op = OP_DIV;
            } else {
                int value = [arg intValue];              // NO ERROR CHECKING!!!
                switch(op) {
                    case OP_ADD: result += value; break;
                    case OP_SUB: result -= value; break;
                    case OP_MULT: result *= value; break;
                    case OP_DIV: result /= value; break;
                    case OP_NONE: result = value; break;
                    default: abort();
                }
                op = OP_NONE;
            }
        }
        return result;
    }
    
    int main(int argc, const char **argv) {
        @autoreleasepool {
            NSMutableArray *args = [NSMutableArray new];
            for (int i = 1; i < argc; i++)
                [args addObject:@(argv[i])];
            NSLog(@"result = %d", calc(args));
        }
        return 0;
    }
    

    编译:

    $ clang -DDEBUG=1 -g -fobjc-arc -o calc calc.m -framework Foundation
    

    测试:

    typhon:tinkering (master) $ ./calc 3 + 9
    2014-04-26 13:23:05.628 calc[8728:507] result = 12
    typhon:tinkering (master) $ ./calc 2 / 1
    2014-04-26 13:23:20.500 calc[8738:507] result = 2
    typhon:tinkering (master) $ ./calc 99 / 11
    2014-04-26 13:23:25.364 calc[8742:507] result = 9
    typhon:tinkering (master) $ ./calc 99 / 12
    2014-04-26 13:23:27.740 calc[8746:507] result = 8
    typhon:tinkering (master) $ ./calc 99 \* 11
    2014-04-26 13:23:53.588 calc[8754:507] result = 1089
    

    注意事项:

    • 目前仅适用于整数数学,但很容易转换为浮点数。
    • 解析号码时没有错误检查。
    • 如果要进行乘法运算,您需要指定 \*,因为 * 是用于执行 shell globbing 的符号。
    • 您不需要NSProcessInfo 来获取传递给main() 的命令行参数。

    【讨论】:

    • 这是完美的工作。谢谢你的建议。但是我可以使用不同的类进行加法、乘法、除法、减法、模数制作这个计算器吗?我想制作一个主要课程,即计算器并调用计算器课程中的所有课程。并在主类中执行。而且我还想在我的计算器中使用模数运算符。还有一件事是可以先进行乘法、除法和取模,然后再进行加法、减法。就像优先级检查意味着高优先级的运算符应该首先执行,然后是低优先级的运算符。
    • @user3575678 我认为对不同的数学运算使用不同的类是没有意义的,除非您想学习面向对象编程的某些方面并尝试多态性,因为这些运算是如此微不足道,但是这是您的代码,因此您可以随心所欲地进行操作。就运算符关联性而言,这会影响完整的解析框架(在维基百科上查找 Parsing),而不是容易适合我给出的简单示例的东西,因为没有概念的分组。就模数而言,这是一个微不足道的变化。
    • 对不起,这是我的错误。我想创建一个名为计算器的类,并希望在该类中定义方法并在主类中调用计算器类。我要做的就是使用类概念来评估这个数学表达式。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多