[ios]
说明:
前面的RPN计算器是按照课程做的,是后缀表达式的计算。现在这个计算器是中缀表达式的计算,而且把计算过程也显示在屏幕上,是一般的计算器。
设计方法:
在Model里用了两个栈,一个是数字栈,一个是操作符栈,如果压入数字的话,检查操作符栈的最顶端元素是不是乘号和除号,如果是乘号和除号则出栈计算计算结果,最终,在按下“等号键”计算结果时,操作符栈中只有加号和减号。
Final “View” as follows:
the codes of the “Model”:
// OrdinaryCalculatorBrain.h // OrdinaryCalculator // // Created by Lvxy on 10/4/14. // Copyright (c) 2014 Lvxy. All rights reserved. // #import <UIKit/UIKit.h> @interface OrdinaryCalculatorBrain : NSObject -(void)pushOperation:(NSString *)operation; // + - * / -(void)pushOperand:(double)operand; -(double)equal; -(void)clearAll; @end // OrdinaryCalculatorBrain.m // OrdinaryCalculator // // Created by Lvxy on 10/4/14. // Copyright (c) 2014 Lvxy. All rights reserved. // #import "OrdinaryCalculatorBrain.h" @interface OrdinaryCalculatorBrain() @property (nonatomic,strong)NSMutableArray *numberStack; @property(nonatomic,strong)NSMutableArray *operationStack; @end @implementation OrdinaryCalculatorBrain @synthesize numberStack = _numberStack; @synthesize operationStack = _operationStack; -(NSMutableArray*)numberStack{ if (_numberStack==0) { _numberStack = [[NSMutableArray alloc]init]; } return _numberStack; } -(NSMutableArray*)operationStack{ if(_operationStack==0){ _operationStack = [[NSMutableArray alloc]init]; } return _operationStack; } -(void)pushOperation:(NSString *)operation{ // + - * / [self.operationStack addObject:operation]; } -(void)pushOperand:(double)operand{ NSString *lastOperation = [self.operationStack lastObject]; if (lastOperation==nil || [lastOperation isEqualToString:@"+" ]||[lastOperation isEqualToString:@"-"]){ [self.numberStack addObject:[NSNumber numberWithDouble:operand]]; } else if([lastOperation isEqualToString:@"*" ]||[lastOperation isEqualToString:@"/"]){ [self.operationStack removeLastObject]; double num2 = operand; NSNumber *lastNumber = [self.numberStack lastObject]; if(lastNumber)[self.numberStack removeLastObject]; double num1 = [lastNumber doubleValue]; if ([lastOperation isEqualToString:@"*" ]) { [self.numberStack addObject:[NSNumber numberWithDouble:num1*num2]]; }else if([lastOperation isEqualToString:@"/" ]){ [self.numberStack addObject:[NSNumber numberWithDouble:num1/num2]]; } } } -(double)equal{ double result = 0; while ([self.operationStack lastObject]!=nil) { NSString *lastOperation = [self.operationStack lastObject]; if (lastOperation) [self.operationStack removeLastObject]; double num1 = result; NSNumber *lastNumber = [self.numberStack lastObject]; if(lastNumber)[self.numberStack removeLastObject]; double num2 = [lastNumber doubleValue]; if ([lastOperation isEqualToString:@"+" ]) { result = num1+num2; }else if([lastOperation isEqualToString:@"-" ]){ result = num1-num2; } } NSNumber *lastNumber = [self.numberStack lastObject]; if(lastNumber)[self.numberStack removeLastObject]; double num2 = [lastNumber doubleValue]; result += num2; return result; } -(void)clearAll{ if (self.numberStack) { [self.numberStack removeAllObjects]; } if(self.operationStack){ [self.operationStack removeAllObjects]; } } @end
the codes of the “controller”:
// CalculatorViewController.h // OrdinaryCalculator // // Created by Lvxy on 10/4/14. // Copyright (c) 2014 Lvxy. All rights reserved. // #import <UIKit/UIKit.h> @interface CalculatorViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *display; @end // CalculatorViewController.m // OrdinaryCalculator // // Created by Lvxy on 10/4/14. // Copyright (c) 2014 Lvxy. All rights reserved. // #import "CalculatorViewController.h" #import "OrdinaryCalculatorBrain.h" @interface CalculatorViewController () @property (nonatomic,strong)OrdinaryCalculatorBrain *brain; @property(nonatomic)BOOL userIsInTheMiddleOfEnteringANumber; @property(nonatomic)NSString *currentDigit; @property(nonatomic)BOOL IsNotFirstPressed; @end @implementation CalculatorViewController @synthesize display = _display; @synthesize brain = _brain; @synthesize userIsInTheMiddleOfEnteringANumber=_userIsInTheMiddleOfEnteringANumber; @synthesize IsNotFirstPressed=_IsNotFirstPressed; -(OrdinaryCalculatorBrain*)brain{ if(_brain==nil) _brain = [[OrdinaryCalculatorBrain alloc] init]; return _brain; } - (IBAction)digitPressed:(UIButton *)sender { if(self.IsNotFirstPressed==0){ self.display.text = @""; self.IsNotFirstPressed = 1; } NSString *digit = sender.currentTitle; self.display.text = [self.display.text stringByAppendingString:digit]; if (self.userIsInTheMiddleOfEnteringANumber) { self.currentDigit = [self.currentDigit stringByAppendingString:digit]; }else{ self.currentDigit = digit; self.userIsInTheMiddleOfEnteringANumber = 1; } } - (IBAction)operationPressed:(UIButton *)sender { [self.brain pushOperand:[self.currentDigit doubleValue]]; self.currentDigit = @""; self.display.text = [self.display.text stringByAppendingString:sender.currentTitle]; [self.brain pushOperation:sender.currentTitle]; self.userIsInTheMiddleOfEnteringANumber = 0; } - (IBAction)ClearPressed { [self.brain clearAll]; self.userIsInTheMiddleOfEnteringANumber = 0; self.IsNotFirstPressed = 0; self.display.text = @"0"; } - (IBAction)equalPressed:(UIButton *)sender { [self.brain pushOperand:[self.currentDigit doubleValue]]; self.currentDigit = @""; double result = [self.brain equal]; self.display.text = [[self.display.text stringByAppendingString:@"="]stringByAppendingString:[NSString stringWithFormat:@"%g",result]]; self.userIsInTheMiddleOfEnteringANumber = 0; } @end
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。