我正在尝试制作计算器应用。我希望它符合操作顺序等等。我想这样做的方法是在按下操作时将数字和操作添加到double的末尾。我找不到任何方法将数字和操作(+, - ,*,/)添加到double的末尾,或者在objective c中的任何数字相关类。
如果您知道有任何方法可以做到这一点,或者对如何做到这一点有不同的想法,这将是非常棒的。感谢。
答案 0 :(得分:2)
这在许多层面上都不是一个好方法。首先,只需在数字的“结尾”添加操作(无论你的意思是“结束”在这里)都不会让你进入操作顺序。您需要跟踪整个表达式(或至少不仅仅是最后一个操作数)。由于您在ObjC工作,您可能需要一种面向对象的方法来管理表达式。谷歌为“面向对象的计算器”。有很多例子。 (不要担心示例是否在ObjC中;您应该能够在任何OOP语言中应用相同的对象模型。)@ ordjanfoe提供了这个的开头,但是正确的操作顺序更复杂。幸运的是,它已经解决了很多次。有关一个ObjC解决方案,请参阅DDMathParser。
接下来要咬你的是double
是计算器的危险类型。您的用户希望在Base-10中工作。 double
在Base-2中运行。会出现舍入错误,当你清楚地意味着5时,结果会像4.999999999那样结束。如果你打算显示小数,那么就用十进制表示。 Cocoa为此提供NSDecimalNumber
类,以及NSDecimal
基础类型。
答案 1 :(得分:0)
当用户输入操作时,您需要收集它们,因此每个操作都需要一个自定义对象:
typedef enum {
CalcOperatonTypeValue, // value is valid
CalcOperatonTypeAdd, // +
CalcOperatonTypeSub, // -
CalcOperatonTypeMult, // *
CalcOperatonTypeDiv // %
} CalcOperationType;
@interface CalcOperation : NSObject
@property (assign) CalcOperationType type;
@property (assign) double value;
@end
然后在用户执行操作时将这些数据收集到一个可变数组中(请注意CalcOperation.value
仅在type
为CalcOperatonTypeValue
时有效)。
然后当你想知道当前值是什么(显示)时,执行以下操作:
double total = 0.0, lastValue = 0.0;
for (CalcOperation *op in operations) {
switch (op.type) {
case CalcOperatonTypeValue:
lastValue = op.value;
break;
case CalcOperatonTypeAdd:
total += lastValue;
break;
case CalcOperatonTypeSub:
total -= lastValue;
break;
case CalcOperatonTypeMult:
total *= lastValue;
break;
case CalcOperatonTypeDiv:
total /= lastValue;
break;
default:
NSAssert(NO, @"Invalid operation type");
break;
}
}
注意:在此变为稳定之前,需要进行更多的错误检查。