IOS之计算器实现

本文利用ios实现计算器app,后期将用mvc结构重构

import UIKitclass CalculViewController: UIViewController {@IBOutlet weak var display: UILabel!var userIsInTheMiddleOFTypingANumber:Bool=false@IBAction func appendDigit(sender: UIButton) {let digit=sender.currentTitle!if userIsInTheMiddleOFTypingANumber {display.text=display.text!+digit}else{display.text=digituserIsInTheMiddleOFTypingANumber=true}}var operandstack:Array<Double>=Array<Double>()@IBAction func operate(sender: UIButton) {let operation=sender.currentTitle!;if userIsInTheMiddleOFTypingANumber {enter()}switch operation {case "×":performeOperation{$0*$1}case "÷":performeOperation{$1/$0}case "+":performeOperation{$0+$1}case "-":performeOperation{$1-$0}case "√":performeOperation{sqrt($0)}default:break}}//    func multiply(op1:Double,op2:Double) -> Double {
//        return op1*op2;
//    }func performeOperation(operation:(Double,Double)->Double){if operandstack.count>=2 {displayValue=operation(operandstack.removeLast(),operandstack.removeLast())enter()}}private func performeOperation(operation:Double->Double){if operandstack.count>=1 {displayValue=operation(operandstack.removeLast())enter()}}@IBAction func enter() {userIsInTheMiddleOFTypingANumber=falseoperandstack.append(displayValue)print("operandstack=\(operandstack)")}var displayValue:Double{get{return NSNumberFormatter().numberFromString(display.text!)!.doubleValue}set{display.text="\(newValue)"userIsInTheMiddleOFTypingANumber=false}}

知识点如下

  • 计算型属性的setter与getter
  • swift利用函数作为参数
  • swift的重载,详情参见:swift override

效果如下

增加model文件

import Foundationclass CalculatorBrain {private enum Op : CustomStringConvertible{case operand(Double)case UnaryOperation(String,Double->Double)case BinaryOperation(String,(Double,Double)->Double)var description:String{get{switch self {case .operand(let operand):return "\(operand)"case .BinaryOperation(let symbol,_):return symbolcase .UnaryOperation(let symbol, _):return symbol}}}}private var opstack=[Op]()private var knowOps=[String:Op]()init(){func learnOp(op:Op){knowOps[op.description]=op}learnOp(Op.BinaryOperation("×"){$0*$1})learnOp(Op.BinaryOperation("÷"){$1/$0})learnOp(Op.BinaryOperation("+"){$0+$1})learnOp(Op.BinaryOperation("-"){$1-$0})learnOp(Op.UnaryOperation("√"){sqrt($0)})
//        knowOps["×"]=Op.BinaryOperation("×"){$0*$1}
//        knowOps["÷"]=Op.BinaryOperation("÷"){$1/$0}
//        knowOps["+"]=Op.BinaryOperation("+"){$0+$1}
//        knowOps["-"]=Op.BinaryOperation("-"){$1-$0}
//        knowOps["√"]=Op.UnaryOperation("√"){sqrt($0)}}private func evaluate(ops:[Op])->(result:Double?,remainOps:[Op]){if !ops.isEmpty {var remainOps=ops;let op=remainOps.removeLast()switch op {case Op.operand(let operand):return(operand,remainOps)case Op.UnaryOperation(_, let operation):let operandEvalution=evaluate(remainOps)if let operand=operandEvalution.result{return(operation(operand),operandEvalution.remainOps)}case Op.BinaryOperation(_, let operation):let operandEvlution1=evaluate(remainOps)if let operand1=operandEvlution1.result {let operandEvlution2=evaluate(operandEvlution1.remainOps)if let operand2=operandEvlution2.result {return (operation(operand1,operand2),operandEvlution2.remainOps)}}}}return (nil,ops)}func evaluate()->Double?{let (result,remainder)=evaluate(opstack)print("\(opstack)=\(result)with\(remainder)left over")return result}func pushOperand(operand:Double)->Double?{opstack.append(Op.operand(operand))return evaluate()}func performOperation(symbol:String)->Double?{if let operation=knowOps[symbol]{opstack.append(operation)}return evaluate()}}

controll修改为

import UIKitclass CalculViewController: UIViewController {@IBOutlet weak var display: UILabel!var userIsInTheMiddleOFTypingANumber:Bool=falsevar brain=CalculatorBrain()@IBAction func appendDigit(sender: UIButton) {let digit=sender.currentTitle!if userIsInTheMiddleOFTypingANumber {display.text=display.text!+digit}else{display.text=digituserIsInTheMiddleOFTypingANumber=true}} //var operandstack:Array<Double>=Array<Double>()@IBAction func operate(sender: UIButton) {if userIsInTheMiddleOFTypingANumber {enter()}if let operation=sender.currentTitle{if let result=brain.performOperation(operation) {displayValue=result}else{displayValue=0}}}@IBAction func enter() {userIsInTheMiddleOFTypingANumber=falseif let result=brain.pushOperand(displayValue){displayValue=result}else{displayValue=0}}var displayValue:Double{get{return NSNumberFormatter().numberFromString(display.text!)!.doubleValue}set{display.text="\(newValue)"userIsInTheMiddleOFTypingANumber=false}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI进军新药发现研究?这99页slides了解一下

来源&#xff1a;专知摘要&#xff1a;近些年&#xff0c;深度学习对许多研究领域产生了深远的影响&#xff0c;应用场景也十分宽泛。我们都知道在医疗领域&#xff0c;新药发现研究是高成本&#xff0c;低产出的&#xff0c;但是对推进医疗领域的发展起到至关重要的作用。今天…

HDU 4651 数论 partition 求自然数的拆分数

别人的解题报告&#xff1a; http://blog.csdn.net/zstu_zlj/article/details/9796087 我的代码&#xff1a; 1 #include <cstdio>2 #define N 1000203 const int mod 1e97;4 int p[N];5 void Partition()6 {7 p[0] 1;8 for(int n1; n < 1e5; n)9 { 10 …

IOS之笑脸app

ios笑脸app实现 import UIKitIBDesignable class FaceView: UIView {IBInspectablevar lineWidth:CGFloat3{didSet{setNeedsLayout()}}IBInspectablevar color:UIColor UIColor.blueColor(){didSet{setNeedsLayout()}}IBInspectablevar scale:CGFloat0.9{didSet{setNeedsLay…

15年来,自然语言处理发展史上的8大里程碑

来源&#xff1a;Deep Tech深科技自然语言是人类独有的智慧结晶。自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;旨在研究能实现人与计算机之间用自然语言进行有效通信的各种理…

最短路径实现

主要工具 QGIS建立拓扑关系 Postgres存储数据表 Geoserver发布相关服务 QGIS建立拓扑关系 使用v.clean运行&#xff0c;并用DBManager即可以建立拓扑关系并导入数据库。 注意 QGIS2.16有数据溢出问题&#xff0c;使用QGIS2.14可以解决这个问题 Postgres存储数据表 导…

2019将成机器学习关键年:中美AI或有一战

作者 | Hussain Fakhruddin译者 | 大小非编辑 | Vincent 来源 | AI前线(ID&#xff1a;ai-front)导读&#xff1a;2019 年将是机器学习关键的一年。ML 已经成为全球数字转型的关键要素之一——到 2021 年底&#xff0c;累计投资预计将达到 580 亿美元。在企业应用领域&#xff…

深度 | IBM长文解读人工智能、机器学习和认知计算

来源&#xff1a;人工智能产业链联盟人工智能的发展曾经经历过几次起起伏伏&#xff0c;近来在深度学习技术的推动下又迎来了一波新的前所未有的高潮。近日&#xff0c;IBM 官网发表了一篇概述文章&#xff0c;对人工智能技术的发展过程进行了简单梳理&#xff0c;同时还图文并…

多变量线性回归

目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征, 例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,…,xn) 增添更多特征后,我们引入一系列新的注释: n 代表特征的数量 x(i)代表第 i 个训练实例,是特征矩阵中的第 i 行,是一…

人工智能乌托邦 迪拜认为2071年人类应该这样生活!

来源&#xff1a;网易智能不同于硅谷老牌的科技力量&#xff0c;迪拜一直是独特的存在。他们日益崛起的科技实力正在被验证&#xff0c;无论是全面AI化的基础建设和城市治安力量&#xff0c;还是频频登上全球科技头条的机器人警察和空中出租车&#xff0c;迪拜试图摆脱很多人眼…

逻辑回归与正则化

在分类问题中,你要预测的变量 y 是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。 在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问 题的例子有:判断一封电子邮件是否是垃圾邮件;判…

万字报告!一文看懂全球车厂的技术家底模块化平台

来源&#xff1a;智东西摘要&#xff1a;介绍模块化平台以及该平台对车企的重要意义&#xff0c;详解车企模块化平台布局。汽车的研发制造方式经历了手工作坊式到标准化流水线再到平台化&#xff0c;目前主流车企纷纷采取模块化平台方式。汽车模块化平台研发制造是指车企基于通…

西湖大学全披露:68位顶级科学家加盟,已获捐资35亿,最小捐赠者12岁

来源&#xff1a;量子位最终&#xff0c;2018年10月20日&#xff0c;成为了西湖大学的成立日。在刚结束的成立大会上&#xff0c;5名诺贝尔奖得主、70余位国内外校长及代表、近百位捐赠人齐聚。可谓少长咸集&#xff0c;高朋满座&#xff0c;生而备受期待。而且就在创立大会上&…

字体大宝库:设计师必备的专业免费英文字体

字体绝对是每一个设计非常重要的部分&#xff0c;设计者总是希望有最好的免费字体&#xff0c;以保持他们字体库的更新。所以今天我要向设计师们分享一个专业的免费英文字体集合。这些免费的字体是适用于任何类型的图形设计&#xff1a;Web&#xff0c;打印&#xff0c;动态图形…

神经网络学习

代价函数 首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有 m 个,每个包含一组输入 x 和一组输出信号 y,L 表示神经 网络层数,Sl表示每层的 neuron 个数(SL表示输出层神经元个数),SL代表最后一层中处理 单元的个数。 将神经网络的分类定义为两种情况:二类分…

干货|深度!“人工智能+制造”产业发展研究报告

来源&#xff1a;&#xff1a;腾讯研究院工业革命以后的“自动化”概念追求的是机器自动生产&#xff0c;本质是“机器替人”&#xff0c;强调在完全不需要人的情况下进行不间断的大规模机器生产&#xff1b;而“智能化”追求的是机器的柔性生产&#xff0c;本质是“人机协同”…

机器学习系统设计与建议

当我们在运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以 做什么? 1. 获得更多的训练实例——通常是有效的,但代价较大,下面的方法也可能有效,可 考虑先采用下面的几种方法。 2. 尝试减少特征的数量 3. 尝试获得更多的特征 4. 尝试增加多项式特征…

李飞飞重返斯坦福后的大动作:开启「以人为中心的AI计划」

来源&#xff1a;网络大数据刚刚&#xff0c;李飞飞宣布斯坦福开启「以人为中心的 AI 计划」(Human-Centered AI Initiative&#xff0c;HAI)&#xff0c;该项目由李飞飞和斯坦福大学前教务长 John Etchemendy 共同主导&#xff0c;Chris Manning 也参与其中。李飞飞在 twitter…

支持向量机学习

与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性 方程时 供了一种更为清晰,更加强大的方式 如果我们用一个新的代价函数来代替,即这条从 0 点开始的水平直线,然后是一条斜 线,像上图。那么,现在让我给这两个方程命名,左边的函数,我称之为cost1(z),同时,…

中国安防行业十年报告:产值增涨四倍!双巨头全球称雄

来源&#xff1a;智东西近年来&#xff0c;安防是一个快速增长的行业&#xff0c; 过去十年&#xff0c; 复合 17%的行业增长率证明了行业的持续性&#xff0c;龙头份额提升持续获得超越平均的增速。 根据历史数据&#xff0c; 2008 年至 2017 年&#xff0c; 十年内中国安防行…

聚类算法学习

聚类是一种非监督学习方法 在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正 样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签,我们需要据此拟合一 个假设函数。与此不同的是,在非监督学习中,我们的数据没有附带任何标签,我们拿到…