2015-12-16 3 views
0

Я новичок в программировании Swift с использованием Xcode. Я создал приложение, которое очень похоже на калькулятор в 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. 

Итак, , что я на самом деле стремится здесь иметь тот же/аналогичный результат, что и окна 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 
     } 
    } 
+1

В верхней части действия 'btnEquals' вы обновляете значение свойства' currentNum' до самого последнего результата. В вашем методе работы в классе MyCalculator вы вычисляете новые результаты как «результат OP currentNum», например. для OP = *, 'results * currentNum ?. Повторное действие «равно» для пользователя приведет к экспоненциальному поведению, которое вы видите, т. Е. 'Result * currentNum' для повторного равного действия« result result ». Если вам требуется поведение калькулятора Windows, вам нужно сохранить «оригинальное» значение «currentNum», если пользователь не вводит новую операцию или новый операнд. – dfri

+0

Операция всегда выполняется с 'result' и' currentNum'. В начале операции 'currentNum' устанавливается в' result'. (2 * 2 = 4 * 4 = 16 * 16 = 256 и т. Д.) Для сохранения правой части операции вам нужна дополнительная переменная 'operand' (2 * 2 = 4 * 2 = 8 * 2 = 16) – vadian

+0

BTW , вы делаете минус для оператора «*». –

ответ

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 должно выполнять операцию результата с предыдущим значением.

2 * 2 = 4 = 8 = 16

4 * 2 = 8 = 16 = 32

16/4 = 4 = 1 = 0,25

+0

О, это верно, сэр. Я не знал, что boolean также полезен в такой ситуации. Спасибо. –

+0

Рад, что это решило. удачи. – iPrabu

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 

И после того, что оба result и currentNum имеют значение 4. Так оно выглядит следующим образом:

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

Правильный путь будет что-то вроде этого:

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

Используя этот правильный способ, о котором вы упомянули, работает ли он последовательно сэр? –

+0

Это не так? Должно быть, если я не ошибаюсь –

+0

Я действительно не знаю, почему вы используете Float вместо Double, но большинство людей будет очень недовольны калькулятором, который даже не обеспечивает точность в 8 цифр. – gnasher729

0

Проблема: Вы можете использовать lblResult для показать значение результата и использовать lblResult.text для следующего вычисления.

Ваш calc.currentNum перезаписывается вашим результатом. Вы должны использовать переменную для хранения результата, а другую для входных значений, тогда проблема будет решена :)

Смежные вопросы