[Stanford] RPN Calculator(model)

CalculatorBrain.h

//建model------菜单 > NewFile > iOS > Cocoa Touch > Objective-C class
// 完成操作数入栈和完成栈上的操作

#import <Foundation/Foundation.h>

@interface CalculatorBrain : NSObject 

   -(void)pushOperand:(double)operand;

   -(double)performOperation:(NSString *)operation;

@end

CalculatorBrain.m

//这就是model,接受操作数,返回运算结果

#import "CalculatorBrain.h"

@interface CalculatorBrain() //private的 

@property(nonatomic,strong)NSMutableArray *operandStack; //一定要是strong,因为只有我们在使用这个指针,strong会告诉 @end                                                     //编译器怎么管理内存,当property创建时值为0或者nil,发消息给nil什么也不发生

                   //提问:如果不用nonatomic会怎样?会有警告。因为重载了getter但没重载setter,但是又要锁线程,所以给你一个警告。

@implementation CalculatorBrain 

@synthesize operandStack=_operandStack; //@synthesize不会生成getter了,因为底下我们自己实现了 

                                            //提问:synthesize会自动分配空间吗?不会,synthesize只有一个变量指针,需要你来分配空间

-(NSMutableArray *)operandStack                       //NSMutableArray的getter方法实现:如果operandStack为空那就分配一个数组 {                                                                   //现在这个operandStack不可能是nil了    

   if(_operandStack==0)         

    _operandStack=[[NSMutableArray alloc] init];  //lazy instantiation 延迟实例化,在iOS里经常用到     

   return _operandStack; 

}                                                     //没有用setter,因为没有特殊的事情要做 

-(double)popOperand 

{   

      NSNumber *operandObject=[self.operandStack lastObject];         //NSMutableArray的实例方法lastObject。

                                                             //lastObject是数组最后一个对象的指针而不是一个副本     

        if (operandObject)      //如果对空数组做移除操作,不是nil是空,程序会崩溃 。前面的lastObject不会崩溃但removeLastObject会崩溃                        [self.operandStack removeLastObject];          //NSMutableArray的实例方法removeLastObject    

       return [operandObject doubleValue];                             //NSNumber解封(开箱unboxing)doubleValue。 

}

-(void)pushOperand:(double)operand  

{    

       [self.operandStack addObject:[NSNumber numberWithDouble:operand]];

       //NSNumber封装(装箱boxing)numberWithDouble及NSMutableArray的实例方法addObject。

       // 如果property创建operandStack的值为nil,此步什么也不发生。

       //为了避免此情况,要用构造函数设置operandStack,本例这个设置在getter里执行。

 } 

-(double)performOperation:(NSString *)operation 

{     

      double result=0;
      double numB =  [self popOperand];
      double numA =  [self popOperand]; 

       if ([operation isEqualToString:@"+"])                               //NSString的实例方法isEqualToString    

       {         result=numA+numB;     } 

       else if([@"*" isEqualToString:operation])   

       {         result=numA*numB;}    

        else if([@"-" isEqualToString:operation])     

        {        result=numA-numB;}     

        else if([@"/" isEqualToString:operation] && numB!=0)    

       {         result=numA/numB;   }   

        [self pushOperand:result];                               //把结果压回到栈上,因为要继续操作   

        return result; 

}

@end
时间: 2024-10-23 10:21:24

[Stanford] RPN Calculator(model)的相关文章

[Stanford] RPN Calculator(model improved version)

以前的model是把操作数压入栈里,遇到加减乘除号直接计算结果,改进版的是把操作数和加减乘除号都压入栈里,controller里的接口不变: CalculatorBrain.h #import <UIKit/UIKit.h> @interface CalculatorBrain : NSObject -(void)pushOperand:(double)operand; -(double)performOperation:(NSString *)operation; @property(rea

[Stanford] RPN Calculator (overall design)

RPN(Reverse Polish Notation),逆波兰表达式. RPN Calculator is a calculator that uses the Reverse Polish Notation method of user interaction, which is typically popular with people who deal with financial, engineering or other technical problems. 1)The funct

[Stanford] RPN Calculator(controller)

CalculatorViewController.h //iOS> Application > Single View Application 建立一个模板controller和空白View #import <UIKit/UIKit.h> @interface CalculatorViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *display; //display----

MVVM 实战之计算器

MVVM 实战之计算器 android DataBinding MVVM calculator Model View 布局文件 Fragment ViewModel 结束语 前些日子,一直在学习基于 RxAndroid + Retrofit + DataBinding 技术组合的 MVVM 解决方案.初识这些知识,深深被它们的巧妙构思和方便快捷所吸引,心中颇为激动.但是,“纸上得来终觉浅,绝知此事要躬行”,学习完以后心里还是没有谱,于是,决定自己动手做一个基于这些技术和框架的小应用. 既然是对新

r-cnn学习(四):源码学习

论文看的云里雾里,希望通过阅读其代码来进一步了解. 参考:http://blog.csdn.net/sloanqin/article/details/51525692 首先是./tools/train_faster_rcnn_alt_opt.py,通过其main函数了解整个训练流程. if __name__ == '__main__': #建议读者调试这个函数,进去看看每个变量是怎么回事 args = parse_args() #解析系统传入的argv参数,解析完放到args中返回 print(

对中间过程进行调试

这是观测stage2生成的rpn情况的代码: #!/usr/bin/env python # -------------------------------------------------------- # Faster R-CNN # Copyright (c) 2015 Microsoft # Licensed under The MIT License [see LICENSE for details] # Written by Ross Girshick # ------------

Faster RCNN代码理解(Python)

转自http://www.infocool.net/kb/Python/201611/209696.html#原文地址 第一步,准备 从train_faster_rcnn_alt_opt.py入: 初始化参数:args = parse_args() 采用的是Python的argparse 主要有–net_name,–gpu,–cfg等(在cfg中只是修改了几个参数,其他大部分参数在congig.py中,涉及到训练整个网络). cfg_from_file(args.cfg_file) 这里便是代用

faster-rcnn 之训练脚本解析:./tools/train_faster_rcnn_alt_opt.py

[说明]:欢迎加入:faster-rcnn 交流群 238138700,本文分析faster-rcnn 训练的python脚本: [debug]:我是把__main__修改了下,放在一个自己定义的函数里面,然后调用debug一步步看执行效果的,读者不妨也这样做,可以清晰看到程序是如何运行的: #!/usr/bin/env python # -------------------------------------------------------- # Faster R-CNN # Copyr

Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结

Exercise 1:Linear Regression---实现一个线性回归 关于如何实现一个线性回归,请参考:http://www.cnblogs.com/hapjin/p/6079012.html Exercise 2:Logistic Regression---实现一个逻辑回归 问题描述:用逻辑回归根据学生的考试成绩来判断该学生是否可以入学. 这里的训练数据(training instance)是学生的两次考试成绩,以及TA是否能够入学的决定(y=0表示成绩不合格,不予录取:y=1表示录