Xcode命令行工具用于计算器

时间:2014-04-26 10:27:24

标签: objective-c macos command-line foundation

我想使用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;
    }
}

1 个答案:

答案 0 :(得分: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()来获取命令行参数。