今天做了个iphone的小例子计算器:才用mvc设计模式

项目目录:

代码如下:

CalculatorViewController:(MVC的控制器)

//  CalculatorViewController.h
// Calculator
//
// Created by WildCat on 13-7-28.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import <UIKit/UIKit.h> @interface CalculatorViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *display; @end
//
// CalculatorViewController.m
// Calculator
//
// Created by WildCat on 13-7-28.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import "CalculatorViewController.h"
#import "CalculatorBrain.h" @interface CalculatorViewController()
@property (nonatomic) BOOL userIsinTheMiddleOfEnteringANumber;
@property(nonatomic,strong)CalculatorBrain *brain;
@end @implementation CalculatorViewController
@synthesize display=_display; @synthesize userIsinTheMiddleOfEnteringANumber=_userIsinTheMiddleOfEnteringANumber; @synthesize brain=_brain;
-(CalculatorBrain *)brain{
if(!_brain) _brain=[[CalculatorBrain alloc] init];
return _brain; } - (IBAction)digitPressed:(UIButton *)sender {
NSString *digit=[sender currentTitle];
//建一个局部变量 if (self.userIsinTheMiddleOfEnteringANumber) { self.display.text=[self.display.text stringByAppendingString:digit];
}else{
self.display.text=digit;
self.userIsinTheMiddleOfEnteringANumber=YES;
} }
- (IBAction)operationPressed:(UIButton *)sender { if ([self userIsinTheMiddleOfEnteringANumber]) {
[self enterPressed];
}
double result=[self.brain performOperation:sender.currentTitle]; NSString *resultString=[NSString stringWithFormat:@"%g",result];
self.display.text=resultString; }
- (IBAction)enterPressed { [self.brain pushOperand:[self.display.text doubleValue]];
self.userIsinTheMiddleOfEnteringANumber=NO; }
- (IBAction)enterDEL:(id)sender {
NSString *nowstr=self.display.text;
int len=nowstr.length;
int nowlength=len-1;
if (nowlength>=1) {
self.display.text=[nowstr substringWithRange:NSMakeRange(0, nowlength)]; }else{
self.display.text=@"0";
} } @end


CalculatorBrain(计算器大脑mvc中的model)

//  CalculatorBrain.h
// Calculator
//
// Created by WildCat on 13-7-28.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import <Foundation/Foundation.h> @interface CalculatorBrain : NSObject
-(void)pushOperand:(double)operand;
-(double)performOperation:(NSString *)operation; @property (readonly)id program;
+(double) runProgram:(id) program;
+(NSString *)discriptionOfProgram:(id) program; @end
//
// CalculatorBrain.m
// Calculator
//
// Created by WildCat on 13-7-28.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import "CalculatorBrain.h"
//定义一个私有的栈
@interface CalculatorBrain()
@property (nonatomic,strong)NSMutableArray *programStack;
@end @implementation CalculatorBrain
@synthesize programStack=_programStack;
//ProgramStack的setter and getter............
-(NSMutableArray *)programStack{
if (_programStack==nil) {
_programStack=[[NSMutableArray alloc] init];
}
return _programStack;
}
-(void)setProgramStack:(NSMutableArray *)programStack{
_programStack=programStack;
} -(double)performOperation:(NSString *)operation{
[self.programStack addObject:operation];
return [CalculatorBrain runProgram:self.program]; }
-(id)program{ return [self.programStack copy];
}
//入栈
-(void)pushOperand:(double)operand{ [self.programStack addObject:[NSNumber numberWithDouble:operand]]; }
//出栈
-(double)popOperand{
NSNumber *number=[self.programStack lastObject];
if (number) {
[self.programStack removeLastObject];
}
return [number doubleValue]; }
+(double)popOperandOffStack:(NSMutableArray *)stack{
double result=0;
id topOfStack=[stack lastObject];
if (topOfStack) {
[stack removeLastObject];
}
if ([topOfStack isKindOfClass:[NSNumber class]]){
result=[topOfStack doubleValue];
}else if ([topOfStack isKindOfClass:[NSString class]]){
NSString*operation=topOfStack;
if ([@"+" isEqualToString:operation]) {
result=[self popOperandOffStack:stack]+[self popOperandOffStack:stack];
}else if ([@"*" isEqualToString:operation]){
result=[self popOperandOffStack:stack]*[self popOperandOffStack:stack];
}else if ([@"-" isEqualToString:operation]){ double firstnumber=[self popOperandOffStack:stack];
double secondnumber=[self popOperandOffStack:stack];
result=secondnumber-firstnumber;
}else if([@"/" isEqualToString:operation]){
double firstnumber=[self popOperandOffStack:stack];
double secondnumber=[self popOperandOffStack:stack];
if(firstnumber)result=secondnumber/firstnumber;
} }
return result; }
+(double) runProgram:(id) program{
NSMutableArray *stack;
if ([program isKindOfClass:[NSArray class]]) {
stack=[program mutableCopy];
} return [self popOperandOffStack:stack];
}
+(NSString *)discriptionOfProgram:(id) program{ return @"Implament this in Assignment2";
} @end

效果图:

IOS基础开发二(iphone计算器)的更多相关文章

  1. iOS:界面适配(二)--iPhone/iPad适配(关于xib)

    本文纯属个人看法,强迫症后遗症 版本:xcode 6.0 + iOS SDK 8.0 讨论范围:控制器的view(创建VC时自带的xib) ------------------------------ ...

  2. IOS基础之 (二) 面向对象思想

    编写Objective-C程序时,要使用Foundation框架. 什么是框架? 框架(framework)是由很多类(class)组成的库,可以用来编写程序. 对象(Object) 对象可以保存数据 ...

  3. ios 基础学习二

    1:@property  @synthesize 属性(类似java里的get set) 上面那个类原先的实现是这样: #import @interface Photo : NSObject { NS ...

  4. ios高效开发二--ARC跟block那点事

    block是可以捕捉上下文的特殊代码块. block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本. 如果通过self拥有一个block,然后 ...

  5. IOS基础开发一(ios程序运行过程)

    今天做了一个简单的仿QQ登陆UI晒一晒:

  6. iOS蓝牙开发(二)蓝牙相关基础知识

    原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...

  7. 精品教程--IOS零基础开发环境搭建

    下载源码 技术要点: 1. 启动XCODE开始开发 2. IOS项目文件结构分析 3. 添加视图label组件 4. 程序的入口以及启动流程 5. 源码详细的中文注释 ...... 详细介绍: 1. ...

  8. Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课

    Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用Q Q群直播方式进行直播,价值99元视频课程免费直播.完整的基于Swift项目实战,手把手教你做一个Swift版i ...

  9. iOS 11开发教程(五)iOS11模拟器介绍二

    iOS 11开发教程(五)iOS11模拟器介绍二 3.iOS11模拟器中设置语言 对于不同国家的人来说,使用到的语言是不一样的.一般情况下iOS11模拟器默认使用的English(英语).对于英文不好 ...

随机推荐

  1. java_软件发布版本_Asynch HttpClien 对比发行版本说明_Alpha、Beta、RC、GA版本的区别

    今天看了一天的apache 的httpasyncclient ,为了和默认的httpclient做个对比,httpcore是核心轻量级的提供传统阻塞IO 和 java NIO两种方式,httpclie ...

  2. oracle_有关表分区_查询

    <!--查询ORACLE分区表存在多少个分区-->  SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='TBL_PAGE';  < ...

  3. flex builder 4.7 ios 该溶液无法找到设备

    行政建议,没有设备 1) 视图itunes 该服务正在启动(Bonjour服务).测试..... .即使没有这样的假设 2)"D:\Program Files\Adobe\Adobe Fla ...

  4. 【转】HTTP协议两种提交参数的方式Form-data和raw

    原文:http://www.cnblogs.com/zhangfei/p/5099036.html HTTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提 ...

  5. Android 它们的定义ListView实现底部和页下拉刷新刷新的顶

    在项目开发.由于数据量过大,寻呼需要加载或下拉刷新.为了缓解长期等待-time负载.这个博客的评论中被自己的定义实例ListView实现底部的下拉刷新页面正在加载结果和顶部. 其效果图: 一.List ...

  6. MVC使用Bootstrap

    ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers 摘要: 序言ASP.NET MVC允许开发者创建自定义的HTML Helper ...

  7. RPC和RMI的区别(Difference Between RPC and RMI)

    RPC和RMI的区别(Difference Between RPC and RMI) RPC vs RMI RPC (Remote Procedure Call) and RMI (Remote Me ...

  8. 关于tcp封装http协议

    如果tcp中没有上层协议,那么就是简单的数据包的传输,如果tcp中有上层协议,那么,当客户端把tcp包发给server的时候,server端的socket收到数据包后,从中分离出应用层协议,交给上层继 ...

  9. IOS中TableView的使用(1) -创建一个简单的tableView

    创建一个简单的tableView: #import <UIKit/UIKit.h> /*tableView 一定要遵守这两个协议: UITableViewDataSource,UITabl ...

  10. Android Notification通知详细解释

    Android Notification通知具体解释  Notification: (一).简单介绍:         显示在手机状态栏的通知. Notification所代表的是一种具有全局效果的通 ...