功能等于计算器

时间:2015-12-16 13:46:27

标签: ios swift calculator equals-operator

我是使用Xcode进行Swift编程的新手。我创建了一个与Windows 7中的计算器非常类似的应用程序(默认计算器)。我遇到了等于@IBAction按钮的问题。在Windows 7计算器中,执行操作的每个数字

像:

2*2 = 4

这将是结果,如果你点击按钮" ="连续它将执行操作,第二个输入将乘以结果,因此它将是这样的。

//WINDOWS 7 CALCULATOR OUTPUT

4 // this is the result
//if user press equals consecutively
4, 8 , 16 , 32 , 64
//and so on, this is how the windows 7 calcu executes the equals button

在我的代码中,我遇到了问题。当我按下等于它将连续乘以结果。

示例:

//MY CALCULATOR OUTPUT IN XCODE

2 * 2 = 4 //result is four

//If equals is click consecutively the result would be this
4 , 16 , 256 , 65536 // and so on

//so basically it will multiply the result of calculator's result.

所以,我实际瞄准的目标是获得与Windows 7计算器相同/相似的结果。我该如何执行这种方法?我是否必须声明一个包含第二个数字输入的临时变量?

到目前为止,这是我的代码:

我创建了一个名为MyCalculator.swift的类

我的计算器

//
//  MyCalculator.swift
//  Calculator
//
//  Created by
//  Anonymous
//

import Foundation

class MyCalculator
{
    var memory: Float = 0

    var percentnum: Float = 0

    var currentNum: Float = 0

    var result: Float = 0

    var operation: String = ""

    var isOperation: Bool = false

    var isRepeatOperation: Bool = false

    var isNum: Bool = false

    func operation (operation:String) -> Float
    {
        if operation == "+" {
            result = result + currentNum
        }
        else if operation == "-" {
            result = result - currentNum
        }
        else if operation == "*" {
            result = result * currentNum
        }
        else if operation == "/" {
            result = result / currentNum
        }
        return result
    }

    func percent(percentNum:Float) ->Float
    {
        let valpercent = percentNum * 0.01
        result = result * valpercent
        return result
    }

    func clearAll() {
        result = 0
        currentNum = 0
        isNum = false

    }

}

这是我的ViewController.swift文件

查看控制器

//
//  ViewController.swift
//  Calculator
//
//  Created by 
//  Anonymous
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //Start Calculator

    //Declerations      

    //Label Result: This is where the result is displayed
    @IBOutlet weak var lblResult: UILabel!


    //Initialization
    let calc = MyCalculator() //call the class MyCalculator

    //Function for Number Inputs
    @IBAction func btnNumInput(sender: AnyObject)
    {
        let num = sender.currentTitle 
        if calc.isNum == false
        {
            lblResult.text = num
            calc.isNum = true
        }
        else
        {
            lblResult.text = lblResult.text! + num!!
        }
        calc.isRepeatOperation = false
    }

    //Function for Equals
    @IBAction func btnEquals(sender: AnyObject)
    {
        calc.currentNum = Float(lblResult.text!)!
        lblHistory.text = ""
        calc.isNum = false

        if calc.operation == "+"
        {
            calc.result = calc.operation("+")
        }
        else if calc.operation == "-"
        {
            calc.result = calc.operation("-")
        }
        else if calc.operation == "*"
        {
            calc.result = calc.operation("*")
        }
        else if calc.operation == "/"
        {
            calc.result = calc.operation("/")
        }

        if calc.operation == "/" && calc.currentNum == 0
        {
            lblResult.text = "Cannot divide by zero"
            calc.result = 0
        }
        else
        {
            let stringresult = String(format:"%g" , calc.result)
            lblResult.text = "\(stringresult)"
            calc.isOperation = false
        }
    }

3 个答案:

答案 0 :(得分:2)

我希望这会解决

func btnEquals(sender: AnyObject)
{
 if (!calc.isRepeatOperation) {  //New Code
    calc.currentNum = Float(lblResult.text!)!
 } 
 lblHistory.text = ""
 calc.isNum = false
 //.....
 else {
        let stringresult = String(format:"%g" , calc.result)
        lblResult.text = "\(stringresult)"
        calc.isOperation = false
        calc.isRepeatOperation = true  //New Code
    }

}

原因是currentValue被结果标签覆盖。 重复的equalTo应该使用previousValue执行结果操作。

2 * 2 = 4 = 8 = 16

4 * 2 = 8 = 16 = 32

16/4 = 4 = 1 = 0.25

答案 1 :(得分:0)

是的,您需要一些临时变量来存储乘数,目前您正在做的事情:

func operation (operation:String) -> Float
    {
        ...
        else if operation == "*" {
            // I suppose this is typo? and there is actualy * instead of "-"?
            result = result - currentNum  
        }
        ...
    }

所以你有:

2*2 = 4

之后,resultcurrentNum都有值4.所以它是这样的:

4*4 = 16
// result, currentNum = 16
16*16 = 256

正确的方法是这样的:

else if operation == "*" {                    
    result = currentNum * multiplier  
}

答案 2 :(得分:0)

问题是:您使用lblResult显示结果值,并使用lblResult.text进行下一次计算。

您的calc.currentNum会被您的结果覆盖。 您必须使用变量来存储结果而另一个变量用于输入值,然后问题将得到解决:)