2019-02-28 :计算器使用逻辑进行编程(未使用eval函数)

<!DOCTYPE html>
<html leng="zh-en">
    <!-- 

        报错:在ac()和inputText()中会出现undefined

    -->
<head>
    <meta charset="UTF-8">
    <title>简易计算器</title>
    <style>
    *{
        margin: 0px;
        padding: 0px;
    }
    .box{
        position: absolute;
        top: 50px;
        left: 50%;
        margin-left: -100px;
    }
    #result{
        height: 50px;
        width:200px;
        box-sizing: border-box;
    }
    #keys{
        display: flex;
        flex-wrap: wrap;
        max-width: 200px;
    }
    #keys li{
        display: inline-block;
        list-style: none;
        height: 50px;
        width: 50px;
        border: 1px #111 solid;
        box-sizing: border-box;
        text-align: center;
        line-height: 50px;
    }
    #keys li:hover{
        cursor: pointer;
    }
    </style>
</head>
<body>
    <div class="box">
        <input id="result" type="text" value="0">
        <ul id = "keys">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>+</li>
            <li>4</li>
            <li>5</li>
            <li>6</li>
            <li>-</li>
            <li>7</li>
            <li>8</li>
            <li>9</li>
            <li>*</li>
            <li>0</li>
            <li>/</li>
            <li>AC</li>
            <li>DEL</li>
            <li style="width:100px">.</li>
            <li style="width:100px">=</li>
        </ul>
    </div>
<script>
    var input = document.getElementById("result");
    
    var num1,num2,result;

    for (var i = 0; i < 18; i ++) {
        document.getElementsByTagName("li")[i].onclick = start;
    }
    function start(){
        switch(this.innerHTML){
            case "+": 
            case "-": 
            case "*": 
            case "/":jie(this.innerHTML);break; 
            case "=": reslutIs();break;
            case "AC": ac();break;
            case "DEL": del();break;
            default : inputText(this.innerHTML);break;
        }
        input.value = result;
    }
    function ac(){
        input.value = "";
    }
    function del(){
        input.value = input.value.substring(0,input.value.length - 1);
    }

    /* 
     * 输入函数
     * 报错:出现undefined
     *
     */
     function inputText(obj){
        
        if (input.value == "0") {
            input.value = "";
        }
        input.value += obj;

    }

    /* 
     *  等于函数
     *  思路:对式子进行判断,并计算结果
     *      因为式子最多一次运算,也就是最多进行计算一次,有两个数字进行计算
     *      可以直接使用parseFloat(),提取第一个数字
     *      将提取的第一个数字转为字符串保存在另一个变量里,检测字符串的长度,从而确定运算符的位置
     *      最后提取第二个数字,转为数字类型
     *      根据判断的运算符进行相应的运算即可
     */
    function reslutIs(){
        num1 = parseFloat(input.value);
        var index;
        index = "" + num1;
        index = index.length;
        if ( input.value.indexOf("+") == 0) {
            index ++;
        }

        //提取运算符,判断是什么运算
        operator = input.value[index];      
        
        //提取最后的数字
        num2 = parseFloat(input.value.substring(index + 1, input.value.length));

        switch(operator) {
            case "+": result = num1 + num2;break;
            case "-": result = num1 - num2;break;
            case "*": result = num1 * num2;break;
            case "/": result = num1 / num2;break;
        }
    }

    /* 
     *  加减乘除函数
     *  思路:首先判断目前的式子是否可以运算,可以的话先使用resultIs()进行运算,最后添加相应符号即可
     *  
     */
    function jie(opr){
        /* 此处粘贴resultIs()处的代码,判断取得的num2是不是NaN */
        num1 = parseFloat(input.value);
        var index;
        index = "" + num1;
        index = index.length;
        if ( input.value.indexOf("+") == 0) {
            index ++;
        }

        //提取运算符,判断是什么运算
        operator = input.value[index];      
        //提取最后的数字
        num2 = parseFloat(input.value.substring(index + 1, input.value.length));

        if ( isNaN(num2) || input.value.length == index ) {
            inputText();
        }else{
            reslutIs();
        }
        switch(opr) {
            case "+": result = result + "+";break;
            case "-": result = result + "-";break;
            case "*": result = result + "*";break;
            case "/": result = result + "/";break;
        }
    }
    
</script>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容