Whats wrong with my square root on my calculator app?

Hi guys,


So for some reason, if I click square root on my calculator app it comes up with the number 17, why?


Many thanks,

Tennyson

-------------------------------------------------------------


import UIKit


class ViewController: UIViewController {

var numberOnScreen:Double = 0

var previousNumber:Double = 0

var performingMath = false

var operation = 0

@IBOutlet weak var label: UILabel!

@IBAction func numbers(_ sender: UIButton)

{

if performingMath == true {

label.text = String(sender.tag-1)

numberOnScreen = Double(label.text!)!

performingMath = false

} else {

label.text = label.text! + String(sender.tag-1)

numberOnScreen = Double(label.text!)!

}

}

@IBAction func buttons(_ sender: UIButton!)

{

if label.text != "" && sender.tag != 11 && sender.tag != 16

{

previousNumber = Double(label.text!)!

if sender.tag == 12 //Divide

{

label.text = "÷";

}

else if sender.tag == 13 //Multiply

{

label.text = "x"

}

else if sender.tag == 14 //Minus

{

label.text = "-"

}

else if sender.tag == 15 //Plus

{

label.text = "+"

}

else if sender.tag == 17 // Square Root

{

label.text = "√"

}

operation = sender.tag

performingMath = true

} else if sender.tag == 16 {

if operation == 12 {

label.text = String(previousNumber / numberOnScreen)

} else if operation == 13 {

label.text = String(previousNumber * numberOnScreen)

} else if operation == 14{

label.text = String(previousNumber - numberOnScreen)

} else if operation == 15 {

label.text = String(previousNumber + numberOnScreen)

} else if operation == 17 {

label.text = String(previousNumber * numberOnScreen * numberOnScreen)

}

}

else if sender.tag == 11

{

label.text = ""

previousNumber = 0

numberOnScreen = 0

operation = 0

}

}


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.

}



}

Where do you compute suare root ????


Is it here :

                label.text = String(previousNumber * numberOnScreen * numberOnScreen)


But you have already set

            else if sender.tag == 17 // Square Root
            {
                label.text = "√"
            }


So:

- what is label ?

- what is the value of previousNumber

- what is the value of numberOnScreen

- do you expect previousNumber * numberOnScreen * numberOnScreen to compute square root ?


print some log:

            } else if operation == 17 {
              print("previousNumber", previousNumber)
              print("numberOnScreen", numberOnScreen)

                label.text = String(previousNumber * numberOnScreen * numberOnScreen)
          
            }



Some other comments :

- when you post code, please format with code formatter <>


- your code would be much more readable with switch statements


    @IBAction func buttons(_ sender: UIButton!) {
       
        if label.text != "" {
            previousNumber = Double(label.text!)!
            switch sender.tag {
            case 11 :
                label.text = ""
                previousNumber = 0
                numberOnScreen = 0
                operation = 0

            case 12 : label.text = "÷"
            case 13 : label.text = "x"
            case 14 : label.text = "-"
            case 15 : label.text = "+"
            case 16 :
                switch operation {
                case 12 : label.text = String(previousNumber / numberOnScreen)
                case 13 : label.text = String(previousNumber * numberOnScreen)
                case 14 : label.text = String(previousNumber - numberOnScreen)
                case 15 : label.text = String(previousNumber + numberOnScreen)
                case 17 : label.text = String(previousNumber * numberOnScreen * numberOnScreen)
                default : label.text = ""
                }
            case 17 : label.text = "√"
            default : label.text = ""
            }

            operation = sender.tag
            performingMath = true
           
        }
     }

- it is a bit confusing: what is tag value of 16 ? Then operation is reusing tag values ?

So for some reason, if I click square root on my calculator app it comes up with the number 17, why?

Maybe some of your buttons' action is connected to a bad method (or possibly bad methods). Better re-check all of them. (And also check the tag values of all the buttons.)


By the way, the expression for `operation` 17 `label.text = String(previousNumber * numberOnScreen * numberOnScreen)` is far from square root. What do you really want to do?

So, what was the problem ? Did you find it. It would be cool to report here.

I just need the mathematical operations that compute square root, but thanks for the help.

Where do you compute square root ????


Is it here :



label.text = String(previousNumber * numberOnScreen * numberOnScreen)

But you have already set



  1. else if sender.tag == 17 // Square Root
  2. {
  3. label.text = "√"
  4. }


-----------------------


The bottom one is to set what the label should say, and the top one shows the mathematical operations for it, thanks for the help though, but all I need are the mathematical operations to compute square root.

Why do you need to use previous number ? Do you want the square root of numberOnScreen ?


if so (as long as numberOnScreen is effectively a Double as it seems


label.text = String(sqrt(numberOnScreen)


if numberOnScreen is negative, you get a nan result.

So you can use the absolute value:


label.text = String(sqrt(abs(numberOnScreen))

If I use your code then I click square root on my calculator, it comes up with nothing on the label and if I do √9 then click = the answer is nothing, am I doing something wrong?


-----------------------



if label.text != "" {

previousNumber = Double(label.text!)!

switch sender.tag {

case 11 :

prevNumLabel.text = label.text

label.text = ""

previousNumber = 0

numberOnScreen = 0

operation = 0

case 12 : label.text = "÷"

case 13 : label.text = "×"

case 14 : label.text = "-"

case 15 : label.text = "+"

case 17 : label.text = "√"

case 16 :

switch operation {

case 12 : label.text = String(previousNumber / numberOnScreen)

case 13 : label.text = String(previousNumber * numberOnScreen)

case 14 : label.text = String(previousNumber - numberOnScreen)

case 15 : label.text = String(previousNumber + numberOnScreen)

case 17 : label.text = String(sqrt(abs(numberOnScreen)))

default : label.text = ""

}

default : label.text = ""

}

operation = sender.tag

operatingMath = true

}

What do you mean : the answer is nothing


What is the action associated to the '=" sign ?


Sorry, but I don't understand your code.


if label.text != "" {     
            previousNumber = Double(label.text!)!
          
            switch sender.tag {           
            case 11 :
                prevNumLabel.text = label.text
                label.text = ""
                previousNumber = 0
                numberOnScreen = 0
                operation = 0
              
            case 12 : label.text = "÷"
            case 13 : label.text = "×"
            case 14 : label.text = "-"
            case 15 : label.text = "+"
            case 17 : label.text = "√"
            case 16 :
              
                switch operation {
                  
                    case 12 : label.text = String(previousNumber / numberOnScreen)
                    case 13 : label.text = String(previousNumber * numberOnScreen)
                    case 14 : label.text = String(previousNumber - numberOnScreen)
                    case 15 : label.text = String(previousNumber + numberOnScreen)
                    case 17 : label.text = String(sqrt(abs(numberOnScreen)))
                  
                default : label.text = ""
                  
                }
              
            default : label.text = ""
              
            }
          
            operation = sender.tag
            operatingMath = true
     }



line 09, numberOnScreen is set to 0


It is not modified later.


So at line 25, it is still 0 !


So, probably you want to use previousNumber (if operation is effectively 17 when you execute this code):


                   case 17 : label.text = String(sqrt(abs(previousNumber)))
"What do you mean: the answer is nothing?" Well, on my 'answer label (IBOutlet: label)' when I hit '= (or case 16)' the label comes says nothing.  To make my code easier to read, I will set a comment (// (text)) to display why and what that line does...

if label.text != "" { // If the 'answer label (IBOutlet: label)' does not say nothing      
            previousNumber = Double(label.text!)!  // To remember the previous number you wrote

            switch sender.tag {  // To switch cases between the sender.tag
            case 11 :  // case 11 : clear button (to clear the question or answer you wrote)
                prevNumLabel.text = label.text  
                label.text = ""  
                previousNumber = 0  
                numberOnScreen = 0  
                operation = 0  

            case 12 : label.text = "÷"  // Text for division
            case 13 : label.text = "×"  // Text for multiplication
            case 14 : label.text = "-"  // Text for substration
            case 15 : label.text = "+"  // Text for addition
            case 17 : label.text = "√"  // Text for square root
            case 16 :  // case 16 : equals button (to come up with the equations answer)

                switch operation {  // Operations for the text on the label

                    case 12 : label.text = String(previousNumber / numberOnScreen) // Operation for divisions  
                    case 13 : label.text = String(previousNumber * numberOnScreen) // Operation for multiplication
                    case 14 : label.text = String(previousNumber - numberOnScreen) // Operation for substration
                    case 15 : label.text = String(previousNumber + numberOnScreen) // Operation for addition
                    case 17 : label.text = String(sqrt(abs(numberOnScreen))) //Operation for square root

                default : label.text = ""   // Default text

                }  

            default : label.text = "" // Default text

            }  

            operation = sender.tag  
            operatingMath = true  
    } 


I hope this helped, thanks for the assistance.
Appologies for the way this was set out, there is a glitch on the fourms.

Did you test with the change :


                   case 17 : label.text = String(sqrt(abs(previousNumber)))


So, if I read correctly, the label change to operation name (eg √) to the result of operation ? That may look strange to user ? What is expected if user tap again the same button which is now a number ?

Whats wrong with my square root on my calculator app?
 
 
Q