IOS基础开发二(iphone计算器)
今天做了个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";
} } @endCalculatorBrain(计算器大脑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计算器)的更多相关文章
- iOS:界面适配(二)--iPhone/iPad适配(关于xib)
本文纯属个人看法,强迫症后遗症 版本:xcode 6.0 + iOS SDK 8.0 讨论范围:控制器的view(创建VC时自带的xib) ------------------------------ ...
- IOS基础之 (二) 面向对象思想
编写Objective-C程序时,要使用Foundation框架. 什么是框架? 框架(framework)是由很多类(class)组成的库,可以用来编写程序. 对象(Object) 对象可以保存数据 ...
- ios 基础学习二
1:@property @synthesize 属性(类似java里的get set) 上面那个类原先的实现是这样: #import @interface Photo : NSObject { NS ...
- ios高效开发二--ARC跟block那点事
block是可以捕捉上下文的特殊代码块. block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本. 如果通过self拥有一个block,然后 ...
- IOS基础开发一(ios程序运行过程)
今天做了一个简单的仿QQ登陆UI晒一晒:
- iOS蓝牙开发(二)蓝牙相关基础知识
原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...
- 精品教程--IOS零基础开发环境搭建
下载源码 技术要点: 1. 启动XCODE开始开发 2. IOS项目文件结构分析 3. 添加视图label组件 4. 程序的入口以及启动流程 5. 源码详细的中文注释 ...... 详细介绍: 1. ...
- Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课
Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用Q Q群直播方式进行直播,价值99元视频课程免费直播.完整的基于Swift项目实战,手把手教你做一个Swift版i ...
- iOS 11开发教程(五)iOS11模拟器介绍二
iOS 11开发教程(五)iOS11模拟器介绍二 3.iOS11模拟器中设置语言 对于不同国家的人来说,使用到的语言是不一样的.一般情况下iOS11模拟器默认使用的English(英语).对于英文不好 ...
随机推荐
- java_Eclipse中SVN的安装步骤(两种)和使用方法
若是只要site地址: http://subclipse.tigris.org/update_1.6.x, 下边可以忽略 一.给Eclipse安装SVN,最常见的有两种方式:手动方式和使用安装向导方 ...
- 深入浅出MS06-040
入浅出MS06-040 时至今日,网上已有颇多MS06-040的文章,当中不乏精辟之作.与其相比,本文突显业余,技术上无法超越,徒逞口舌之快.本文适合有一定计算机基础,初步了解溢出攻击原理,略微了解逆 ...
- UVA Don't Get Rooked
主题如以下: Don't Get Rooked In chess, the rook is a piece that can move any number of squaresverticall ...
- NDMCDB数据库hang住故障分析 - cursor: pin S wait on X
问题描写叙述: 上午刚刚到办公室,就有监控人员邮件反馈,昨晚NDMCDB407数据库被重新启动过,让我分析一下数据库重新启动的原因.因为昨晚业务有版本号上线,所以短信警告关闭了,所以没有短信下发到我手 ...
- hadoop编程小技巧(5)---自己定义输入文件格式类InputFormat
Hadoop代码測试环境:Hadoop2.4 应用:在对数据须要进行一定条件的过滤和简单处理的时候能够使用自己定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForm ...
- Android实现“是否退出”对话框和“带图标的列表”对话框
今天我们学习的内容是实现两种对话框(Dialog),第一种是询问是否退出对话框,另外一种是带图标的列表对话框,程序的执行效果是,我们点击button1的时候,弹出第一种对话框,我们点击button2的 ...
- 关于WebBrowser.DocumentCompleted事件
原文:关于WebBrowser.DocumentCompleted事件 今天发现使用WebBrowser时载入一个页面后DocumentCompleted事件会被调用2次,后来发现这两次WebBrow ...
- 使用gson和httpclient呼叫微信公众平台API
吐槽:微信api很无语.有一部分xml.有一部分json. 最近看如何调用微信公众平台json有关api更方便.终于找到了httpcliect和gson对. 假设你有一个更好的办法,请告诉我. 了解如 ...
- Spring源深和六系列 CreateBean过程
blog宗旨:用图说话. 这一章的图讲述了createBean的过程.到这里spring容器就能够完毕IOC的整个过程,拿到我们须要的对象. 下一章我们接着来看一看AOP完毕的过程. 附:文件夹 Sp ...
- 屏幕录制H.264视频,AAC音频,MP4复,LibRTMP现场活动
上周完成了一个屏幕录制节目,实时屏幕捕获.记录,视频H.264压缩,音频应用AAC压缩,复用MP4格公式,这使得计算机和ios设备上直接播放.支持HTML5的播放器都能够放,这是标准格式的优点.抓屏也 ...