代码库> 其他> swift 计算器
swift 计算器
关注
上传者:pig18478966 分类:其他(Others)
查看次数:4551 下载次数:8
上传时间:2014-07-03 大小:
//
//  ViewController.swift
//  MyCalculator
//
//  Created by llx on 10/06/14.
//  Copyright (c) 2014 LLX. All rights reserved.
//


import UIKit
import Foundation


classViewController: UIViewController,UIAlertViewDelegate{
    var str:NSString[]=[""]
    var displayString:NSMutableString=""
    @IBOutlet var label : UILabel

   func delete(){
    if str.count>1
    { str.removeLast()}
displayString=""
    for string in str
    {
        displayString.appendString(string)
    }
println(str)
label.text=displayString



    }
    func equal(){
        if str.count != 1
        {
            var canRun:Bool=true

            str[0]="("
            str+=")"
            func getFuckingValue(strMember:String)->Double
            {
                switch strMember
                    {
                case "1":return 1
                case "2":return 2
                case "3":return 3
                case "4":return 4
                case "5":return 5
                case "6":return 6
                case "7":return 7
                case "8":return 8
                case "9":return 9
                case "0":return 0
                default: return 0//try to void this
                }
            }
            func power(index:Int)
            {
                str[index]=("(pow(str[index-1].doubleValue,str[index+1].doubleValue))")
                str.removeAtIndex(index+1)
                str.removeAtIndex(index-1)
            }
            func times(index:Int)
            {
                str[index]=("(str[index-1].doubleValue*str[index+1].doubleValue)")
                str.removeAtIndex(index+1)
                str.removeAtIndex(index-1)
            }
            func devide(index:Int)->Bool
            {    var canDevide_1:Bool=true

                if str[index+1].doubleValue != Double(0) && str[index+1].doubleValue != 0
                {str[index]=("(str[index-1].doubleValue/str[index+1].doubleValue)")
                    str.removeAtIndex(index+1)
                    str.removeAtIndex(index-1)
                }
                else {canDevide_1=false}
                println("(canDevide_1)")
                return canDevide_1
            }
            func add(index:Int)
            {
                str[index]=("(str[index-1].doubleValue+str[index+1].doubleValue)")
                str.removeAtIndex(index+1)
                str.removeAtIndex(index-1)
            }
            func judge(index:Int)
            {
                if index != 0
                {
                    switch str[index-1]
                        {

                    case "sin": str[index] = ("(sin(str[index].doubleValue))")
                    str.removeAtIndex(index-1)
                    case "cos": str[index] = ("(cos(str[index].doubleValue))")
                    str.removeAtIndex(index-1)
                    case "tan": str[index] = ("(tan(str[index].doubleValue))")
                    str.removeAtIndex(index-1)
                    case "arcsin":
                        if str[index].doubleValue>1 || str[index].doubleValue<(-1)
                        {
                            canRun=false
                        }
                        str[index] = ("(asin(str[index].doubleValue))")
                        str.removeAtIndex(index-1)
                    case "arccos":
                        if str[index].doubleValue>1 || str[index].doubleValue<(-1)
                        {
                            canRun=false
                        }
                        str[index] = ("(acos(str[index].doubleValue))")
                        str.removeAtIndex(index-1)
                    case "arctan": str[index] = ("(atan(str[index].doubleValue))")
                    str.removeAtIndex(index-1)
                    case "ln"str[index] = ("(log(str[index].doubleValue))")
                    str.removeAtIndex(index-1)
                    case "lg": str[index] = ("(log10(str[index].doubleValue))")
                    str.removeAtIndex(index-1)
                    default: break
                    }
                }
            }
            println(str)

            changeNumber: for index in 0..str.count
            {

                var lengthOfNum=0
                var point=0
                var indexOfFirstNum=0
                findFirstNumber: while true
                {
                    switch str[indexOfFirstNum]
                        {
                    case "1","2","3","4","5","6","7","8","9","0":
                        break findFirstNumber
                    default:
                        indexOfFirstNum++
                        if indexOfFirstNum>str.count-1//!!!
                        {
                            break changeNumber
                        }//stop checking
                    }
}//find the index of first number

                var i=indexOfFirstNum
                findTheNumber:while true
                {

                    switch str
                        {
                    case "1","2","3","4","5","6","7","8","9","0":
                        lengthOfNum++
                    case ".":
                        point=indexOfFirstNum+lengthOfNum++

                    default:
                        break findTheNumber
                    }
                    i++
                    if i>str.count-1
                    {
                        break findTheNumber
                    }

}//find the length of one number with point

                var point_change=point-indexOfFirstNum
                var numberValue=0.0
                var sum=0.0
                var lengthOfNum_change=lengthOfNum
                var indexOfTheNum=indexOfFirstNum
                if point != 0
                {
                    str[point] = "0"
                    while lengthOfNum_change != 0
                    {
                        numberValue = getFuckingValue(str[indexOfTheNum])
                        if point_change>0{
                            sum += numberValue*pow(10.0,Double(point_change-1))}
                        if point_change<=0{
                            sum += numberValue*pow(10.0,Double(point_change))}

                        point_change--
                        lengthOfNum_change--
                        indexOfTheNum++
                    }
                    if point != 0
                    {
                        str[point] = "(sum)"
                        for var index_1=indexOfFirstNum;index_1                         {
                            str.removeAtIndex(indexOfFirstNum)
                        }
                        for var index_1=0;index_11;index_1++
                        {
                            str.removeAtIndex(indexOfFirstNum+1)
                        }
                    }
                }
                if point == 0 && lengthOfNum>1
                {
                    i=0
                    while lengthOfNum_change != 0
                    {
                        numberValue = getFuckingValue(str[indexOfTheNum])

                        sum += numberValue*pow(10.0,Double(lengthOfNum_change-1))
                        lengthOfNum_change--
                        indexOfTheNum++
                        i++

                    }

                    for _ in 0..i-1
                    { str.removeAtIndex(indexOfFirstNum)}
                    str[indexOfFirstNum] = "(sum)"
                }
                if lengthOfNum==1
                {
                    str[indexOfFirstNum]="(str[indexOfFirstNum].doubleValue)"
                }


} //change all the numbers to correct form

            for var i=0;i<str.count;i++
            {switch str
                {
            case "e":
                str="(M_E)"
                //replace e
                switch str[i-1]{
                case "+","-","*","/","^","(": break
                default: str.insert("*",atIndex:i)
                i--
                }
                switch str[i+1]{
                case "+","-","*","/","^",")": break
                default: str.insert("*",atIndex:i+1)
                i--
}//add * if it's directly connected to number

            case "π":
                str="(M_PI)"
                //replace pai
                switch str[i-1]{
                case "+","-","*","/","^","(": break
                default: str.insert("*",atIndex:i)
                i--
                }
                switch str[i+1]{
                case "+","-","*","/","^",")": break
                default: str.insert("*",atIndex:i+1)
                i--
}//add * if it's directly connected to number
            default: break
                }
}//change pai and e
            println(str)


            var right=0
            var left=0
            var i=0
            var i_1=0
            do
            {
                right=0
                left=0
                for i=0;i<str.count;i++
                {
                    if str=="("
                    {

                        left=i
                        findRight: for i_1=i;i_1<str.count;i_1++
                        {
                            if str[i_1]==")"
                            {
                                right=i_1
                                break findRight
                            }
                        }
                    }

}//find the last left bracket

                if right != 0
                {
                    oneTime: for i=left;i                     {
                        if str == "^"
                        {
                            power(i)
                            right-=2
                            i--
                        }
                        if str == ""
                        {
                            canRun=devide(i)
                            right-=2
                            i--
                        }
                        if str == "*"
                        {
                            times(i)
                            right-=2
                            i--
                        }

                    }

                    for i=left;i                     {
                        if str == "-"
                        {str[i+1]="(0-str[i+1].doubleValue)"
                            if str[i-1] == "("
                            {str.removeAtIndex(i)}

                            else {str="+"}
                        }

                    }//change - to +
                    for i=left;i                     {
                        if str == "+"
                        {
                            add(i)
                            right-=2
                            i--
                        }

}//add all in a bracket
                    str.removeAtIndex(left+2)
                    str.removeAtIndex(left)
                }


                judge(left)


            }while right != 0
//run until no bracket
            let alert = UIAlertView()
            alert.title = ""

            if str[0].doubleValue%1 == 0
            {
                var messageValue=Int(str[0].doubleValue)
                if canRun
                { alert.message = "(messageValue)"}
                else
                { alert.message = "wrong number"}
            }
            else
            {
                if canRun
                { alert.message = "(str[0].doubleValue)"}
                else
                { alert.message = "wrong number"}
            }



            alert.addButtonWithTitle("ok")
            alert.show()
            if str.count>1
            {for _ in 0..str.count-1
            {
                str.removeLast()
}}//in case of wrong input
            str[0]=""


            displayString=""
            label.text=""


        }
    }



    @IBAction func gest_del(sender : AnyObject) {
    delete()
    }
    @IBAction func gest_equal(sender : AnyObject) {
equal()
    }



    @IBAction func sin_1(sender : AnyObject) {


        str+="sin"
        str+="("

displayString.appendString("sin(")
label.text=displayString
    }
    @IBAction func cos_1(sender : AnyObject) {
         str+="cos"
         str+="("
displayString.appendString("cos(")
label.text=displayString
    }
    @IBAction func tan_1(sender : AnyObject) {
         str+="tan"
         str+="("
displayString.appendString("tan(")
label.text=displayString
    }
    @IBAction func asin_1(sender : AnyObject) {
         str+="arcsin"
         str+="("
displayString.appendString("arcsin(")
label.text=displayString
    }
    @IBAction func acos_1(sender : AnyObject) {
         str+="arccos"
         str+="("
displayString.appendString("arccos(")
label.text=displayString
    }
    @IBAction func atan_1(sender : AnyObject) {
         str+="arctan"
         str+="("
displayString.appendString("arctan(")
label.text=displayString
    }
    @IBAction func ln(sender : AnyObject) {
         str+="ln"
         str+="("
displayString.appendString("ln(")
label.text=displayString
    }
    @IBAction func lg(sender : AnyObject) {
         str+="lg"
         str+="("
displayString.appendString("lg(")
label.text=displayString
    }
    @IBAction func pai(sender : AnyObject) {
         str+="π"
displayString.appendString("π")
label.text=displayString
    }
    @IBAction func e(sender : AnyObject) {
         str+="e"
displayString.appendString("e")
label.text=displayString
    }
    @IBAction func one(sender : AnyObject) {
         str+="1"
displayString.appendString("1")
label.text=displayString
    }
    @IBAction func two(sender : AnyObject) {
         str+="2"
displayString.appendString("2")
label.text=displayString
    }
    @IBAction func three(sender : AnyObject) {
         str+="3"
displayString.appendString("3")
label.text=displayString
    }
    @IBAction func four(sender : AnyObject) {
         str+="4"
displayString.appendString("4")
label.text=displayString
    }
    @IBAction func five(sender : AnyObject) {
         str+="5"
displayString.appendString("5")
label.text=displayString
    }
    @IBAction func six(sender : AnyObject) {
         str+="6"
displayString.appendString("6")
label.text=displayString
    }
    @IBAction func seven(sender : AnyObject) {
        str+="7"
displayString.appendString("7")
label.text=displayString
    }
    @IBAction func eight(sender : AnyObject) {
         str+="8"
displayString.appendString("8")
label.text=displayString
    }
    @IBAction func nine(sender : AnyObject) {
         str+="9"
displayString.appendString("9")
label.text=displayString
    }
    @IBAction func zero(sender : AnyObject) {
         str+="0"
displayString.appendString("0")
label.text=displayString
    }
    @IBAction func add(sender : AnyObject) {
         str+="+"
displayString.appendString("+")
label.text=displayString
    }
    @IBAction func min(sender : AnyObject) {
         str+="-"
displayString.appendString("-")
label.text=displayString
    }
    @IBAction func time(sender : AnyObject) {
         str+="*"
displayString.appendString("*")
label.text=displayString
    }
    @IBAction func devide(sender : AnyObject) {
         str+=""
displayString.appendString("")
label.text=displayString
    }
    @IBAction func point(sender : AnyObject) {
         str+="."
displayString.appendString(".")
label.text=displayString
    }
    @IBAction func power(sender : AnyObject) {
         str+="^"
displayString.appendString("^")
label.text=displayString
    }
    @IBAction func left(sender : AnyObject) {
         str+="("
displayString.appendString("(")
label.text=displayString


    }
    @IBAction func right(sender : AnyObject) {
         str+=")"
displayString.appendString(")")
label.text=displayString


    }
    @IBAction func equal(sender : AnyObject) {





        equal()    }
    @IBAction func del(sender : AnyObject) {
       delete()
    }

    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.
    }




}


    
收藏
我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0


下载过该代码的还下载了
综合评论
提示
sina weixin mail 回到顶部