今天做了个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. hardware_hp存储映射_方案

    修改虚拟磁盘映射方式 每个刀片独立对应映射存储空间 这样就不会造成数据写入冲突, old new 步奏: 创建过程  lun号码  1-155 之间 第二步奏 最后 指定: 就ok了 2012年12月 ...

  2. 【转】Android 常用 adb 命令总结

    原文地址:http://testerhome.com/topics/2565 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Andr ...

  3. 【转】Appium 服务器端从启动到case完成的活动分析

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39474151 此文的目的主要是通过分析Appium Server打印出来的log,加深对A ...

  4. 破解Kaleidoscope-2.1.0-134,无限试用

    找到超时时间计算的地方,有非常多处,大概几十外,大约类似下面的代码,作者应该是copy了非常多份反复的代码, 10000C592 F2 0F 10 8D 40 FE FF FF             ...

  5. A generic error occurred in GDI+. 上传图片报错

    代码就不说了,因为本地测试 ok, 服务端 就不行 ,服务器 环境 阿里云 win2008 r2  64 位 原因 是我没有这是 文件加权限 : 左边 的 少了 权限~ 代码 :含义是 网络图片 裁剪 ...

  6. Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释

     上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  7. Kafka集群在空载情况下Cpu消耗比较高的问题

    线上kafka与storm的空载情况下负载都比较高, kafka达到122%, storm平均负载达到, 20%,  当前是通过Ambari下管理kafka的, a. 先停止s5的kafka进程.b. ...

  8. Python 3.3 try catch所有的错误Error,不包括Exception。关键在于 sys.exc_info()

    import os; import sys; #---------------------------------------------- def main( ) : try : a = 1 / 0 ...

  9. IE8下div中2个button仅仅显示一个

    IE8下div中2个button仅仅显示一个,代码例如以下: <div id="adviceType" style="display: none;" &g ...

  10. Ping域名惊现65.49.2.178

    --- 昨天新建的博,早晨起来进去看看,发现无法访问.这… 排错开始,ping域名出现如上图所示结果,请求超时…哪里的问题呢 有时常识是害人的,想起了前两月群里也有人说本地无法访问自己网站,别人能访问 ...