今天做了个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. Controller和View的交互

    Controller和View的交互 目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI ...

  2. 前端学习笔记(zepto或jquery)—— 布局技巧(一)

    html5中有一些标签我们很难改变其样式,例如input=file,select等.这个时候我们需要改变一下思路,将原有透明度置为0,借助于div或span等以控制样式的标签来代替. 效果图: < ...

  3. 【百度地图API】如何实现信息窗口轮询

    原文:[百度地图API]如何实现信息窗口轮询 摘要: 很多微博或者SNS开发者,想结合地图展示用户的微博或者状态.这时,利用信息窗口就是最好的展示方式了. 在这里,我们使用信息窗口轮询的方式来实现这一 ...

  4. Fluent Validation + NInject3 + MVC5

    Fluent Validation + NInject + MVC - Why & How : Part 1 http://fluentvalidation.codeplex.com/ htt ...

  5. easyui datagrid 单元格编辑 即见即所得,MVC菜单维护,扫描增加

    效果如图: 参见 EasyUI 官方 Demo 及文档 @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Lay ...

  6. 小结css2与css3的区别

    CSS3引进了一些新的元素新的特性,我收集以下,自己做了一个小结: animation(基础动画)eg:  div{animation: myfirst 5s linear 2s infinite a ...

  7. HTML5 五彩圆环Loading加载动画实现教程

    原文:HTML5 五彩圆环Loading加载动画实现教程 今天我们要来介绍一款效果很特别的HTML5 Loading加载动画,不像其他的Loading动画,这款Loading动画颜色很丰富,并且在转圈 ...

  8. 非常多人不愿意承认汉澳sinox已经超过windows

    汉澳sinox採用的zfs和jail打造高可靠性存储server和矩阵计算机,这不是windows和linux能相提并论的. 只是非常多人立即出来出来反驳说,windows驱动程序多(就是支持硬件多) ...

  9. Java集合之Stack 源码分析

    1.简介 栈是数据结构中一种很重要的数据结构类型,因为栈的后进先出功能是实际的开发中有很多的应用场景.Java API中提供了栈(Stacck)的实现,简单使用如下所示 package com.tes ...

  10. openwrt构建过程探索

    参考网站:http://wiki.openwrt.org/doc/howto/buildroot.exigence 需要下载必要的库文件,编译器等... 1 首先要获得openwrt的源码,参考ope ...