今天做了个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. 接收终端Request.InputStream阅读

    接收终端Request.InputStream阅读请求页面参数,最后字符串. byte[] byts = new byte[HttpContext.Current.Request.InputStrea ...

  2. nodejs爬虫系统

    其中express是服务端框架 request相当于前端的ajax请求 cheerio相当于jq 开始 首先我们先新建一个 crawler目录 执行 npm install express -g 命令 ...

  3. 从头开始学JavaScript(一)——基础中的基础

    概要:javascript的组成. 各个组成部分的作用 . 一.javascript的组成   javascript   ECMAScript(核心) DOM(文档对象模型) BOM(浏览器对象模型) ...

  4. 刚学unity3d,跟着仿作了flappy bird,记下一些琐碎的心得!

    1.关于场景,即scene. 一个正常的游戏至少要有三个场景,即菜单(或者文件夹)场景.游戏关卡场景.游戏结束场景.它们一般统一放在project文件夹下scene文件夹(自己创建)中,方便管理. 1 ...

  5. ArcGIS API for Silverlight 编辑Geometry

    概述 ArcMap的编辑功能是非常强大的,ArcEngine编写的CS程序也可以用到ArcMap中提供的编辑功能,那么ArcGIS API forSilverlight针对Geometry的编辑提供了 ...

  6. Serialization performance analysis

    Serialization performance analysis http://www.skyscanner.net/blogs/serialization-performance-analysi ...

  7. Linq to Sql : 动态构造Expression进行动态查询

    原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...

  8. [译]Java 设计模式之迭代器

    (文章翻译自java-design-pattern-iterator) 迭代器模式用于迭代遍历一个集合对象.它是一个经常被用到的模式,你可能以前使用过它.不管在任何时候你看见一些方法像hasNext( ...

  9. 使用vsnprintf后链接错误及解决方法

    /home/merlin/swinstall/MentorGraphics/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib//../../../../a ...

  10. 如何在局域网安装Redmine(转贴)

    如何在局域网安装Redmine(转贴) 分类: Redmine2009-06-01 10:31 1740人阅读 评论(0) 收藏 举报 phpmyadmin项目管理railssubversion数据库 ...