シンプルなウェブ計算機を実装するJavaScript

シンプルなウェブ計算機を実装するJavaScript

背景

私は新しいプロジェクト チームに配属されたので、プロジェクトでは js を使用する必要がありますが、これまで js に触れたことがなかったので、リーダーは私に 1 週​​間の学習期間を与えることにしました。はい、4 つの混合演算をサポートする簡単な計算機を実装することが宿題なので、この記事があります。したがって、この記事の主な焦点は html と css ではありません。結局のところ、私は fur について少ししか知らず、深く勉強していません。

成果を達成する

最終的なページは以下のようになります。マウスでボタンをクリックすると、ボタンの色が変わり、混合操作を行うことができます。

上段に計算式が表示され、「=」を押すと計算結果が表示されます。

使用される技術

計算機ページは HTML テーブルを使用して描画されます。ボタンのサイズ、色、マウス ホバーの色は CSS によって設定されます。ボタンをクリックすると、値と計算結果が最上行に表示されます。4 つの混合演算は JS によって実行されます。

実装のアイデア

ここでは、.html、.css、.jsの3つのファイルに分割しました。

1. まず、HTMLとCSSを書いて、Webページの外観を描きます。ここでは詳しく説明しません。興味があれば、コードを直接見ることができます。
2. 次に、js の DOM イベントを使用して、さまざまな種類のボタンにクリック イベントを追加し、さまざまな js 関数を呼び出します。
このステップでは、主に特定のボタンを押すことでどのような機能を実現するのか、どのようなエフェクトを表示するのかなど、ロジックを明確に分割して、後から関数を埋めていくロジックがごちゃごちゃしないようにするために、最初に関数定義を書きました。
3. 最後に、js 関数を実装します。つまり、4 つの混合演算を完了します。4 つの混合演算を実装して結果を表示する方法に重点が置かれます。

上記の数式と結果を表示する際、グローバル変数の配列を定義しました。ボタンがクリックされるたびに、ボタンの値が配列にプッシュされ、表示時に配列を直接スローできるようになります。これを行うもう 1 つの理由は、バックスペース キーをクリックするとポップアップが表示され、クリア キーをクリックすると、配列変数に空の配列が直接割り当てられるため、操作が簡単になるからです。

次の重要なステップは、式を計算することです。たとえば、3 * 4.5 - 1= のような式を入力した場合、どのように評価するのでしょうか。私が考えた方法は、まず入力配列をインフィックス式に変換し、次にインフィックス式をポストフィックス式に変換し、最後にポストフィックス式を評価するというものです。

1. まず、上記の配列処理により、['3','*','4','.','5','-','1'] のような配列が得られます。
2. この配列を次のような文字列に変換します: "3*4.5-1"
3. 次に、演算子と数字を区切って新しい配列['3','*','4.5','-','1']に処理します。
4. 処理後、スタックを使用して中置式を後置式に変換します。
5. スタックを使用して接尾辞式を評価し、結果を = の後に格納します。

ステップ 4.5 はデータ構造におけるスタックの適用に関するものなので、よくわからない場合はデータ構造を確認してください。これで完了です。

具体的な実装コード

上で述べたように、十分に分析したので、これについてはあまり言及せず、直接コードに進みます。

.html ファイル

<!DOCTYPE html>
<html>
    <ヘッド>
        <title>電卓</title>
        <link rel="スタイルシート" href="calculator.css" >
        <script src="calculator.js"></script>
    </head>

    <本文>
        <div>
            <表の境界線="1">
                <頭>
                    <th colspan="4">
                        <input type="text" id="result" 無効>
                    </th>
                </thead>

                <t本文>
                    <tr>
                        <td><button class="operate" onclick="showNumber(this)">(</button></td>
                        <td><button class="operate" onclick="showNumber(this)">)</button></td>
                        <td><button class="operate" onclick="clearOneResult()">←</button></td>
                        <td><button class="operate" onclick="clearResult()">C</button></td>
                    </tr>
                    <tr>
                        <td><button class="calculate" onclick="showNumber(this)">7</button></td>
                        <td><button class="calculate" onclick="showNumber(this)">8</button></td>
                        <td><button class="calculate" onclick="showNumber(this)">9</button></td>
                        <td><button class="operate" onclick="showNumber(this)">*</button></td>
                    </tr>
                    <tr>
                        <td><button class="calculate" onclick="showNumber(this)">4</button></td>
                        <td><button class="calculate" onclick="showNumber(this)">5</button></td>
                        <td><button class="calculate" onclick="showNumber(this)">6</button></td>
                        <td><button class="operate" onclick="showNumber(this)">-</button></td>
                    </tr>
                    <tr>
                        <td><button class="calculate" onclick="showNumber(this)">1</button></td>
                        <td><button class="calculate" onclick="showNumber(this)">2</button></td>
                        <td><button class="calculate" onclick="showNumber(this)">3</button></td>
                        <td><button class="operate" onclick="showNumber(this)">+</button></td>
                    </tr>
                    <tr>
                        <td><button class="calculate" onclick="showNumber(this)">0</button></td>
                        <td><button class="calculate" onclick="showNumber(this)">.</button></td>
                        <td><button class="operate" onclick="showNumber(this)">/</button></td>
                        <td><button class="operate" onclick="showAnswer()">=</button></td>
                    </tr>
                </tbody>         
            </テーブル>
        </div>
    </本文>
</html>

.css ファイル

テーブル{
    マージン: 20px;
    パディング: 1px;
}

th、入力{
    高さ: 120px;
    幅: 410ピクセル;
    背景色:rgb(233, 232, 232);
    テキスト配置: 右;
    フォントサイズ: 40px;
}


ボタン{
    高さ: 100px;
    幅: 100ピクセル;
    パディング: 0px;
    フォントサイズ: 30px;
}

th、入力、td、ボタン{
    境界線: 0px;
}

.計算{
    背景色: rgb(231, 231, 235);
}

.操作{
    色: コーラル;
}

ボタン:ホバー{
    背景色: rgb(147, 241, 253);
}

.js ファイル

var 結果 = 新しい配列();
var ops = "+-*/";

関数 arrToStr(arr) {
    var strResult = "";
    (var i = 0; i < arr.length; i++) の場合 {
        strResult += arr[i];
    }
    strResult を返します。
}


関数 showResult() {
    document.getElementById("結果").value = arrToStr(結果);
}


関数 showNumber(id) {
    var val = id.innerHTML;
    結果をプッシュします。
    結果を表示します。
}


関数 showAnswer() {

    var 回答 = "";
    var str = arrToStr(結果);

    var midExpre = strToExpress(str);
    var サフィックスExpre = midToSuffix(midExpre);
    答え = suffixValue(suffixExpre);

    //コンソールログ(midExpre);
    //console.log(サフィックスExpre);

    document.getElementById("result").value = str + "=" + 回答;

}


関数 clearResult() {
    結果 = [];
    結果を表示します。
}


関数 clearOneResult() {
    結果.pop();
    結果を表示します。
}


関数strToExpress(str) {

    var textArr = str.split('');
    var newTextArr = [];
    var calTextArr = [];

    (var i = 0; i < str.length; i++) の場合 {
        ops.indexOf(str[i]) != -1 の場合 {
        
            newTextArr.push("|", str[i], "|");
        }
        そうでない場合 (str[i] == '('){
            newTextArr.push(str[i], "|");
        }
        そうでない場合 (str[i] == ')'){
            newTextArr.push("|", str[i]);
        }
        それ以外 {
            新しいTextArr.push(textArr[i]);
        }
    }

    calTextArr = newTextArr.join('').split('|');

    calTextArr を返します。
}


関数midToSuffix(midExpre) {

    var opStack = [];
    var サフィックスExpre = [];

    (var i = 0; i < midExpre.length; i++) の場合 {

        ops.indexOf(midExpre[i]) != -1 || midExpre[i] == '(' || midExpre[i] == ')' の場合 {

            if (midExpre[i] == '(' || opStack[opStack.length - 1] == '(') {
                opStack.push(midExpre[i]);
            }

            そうでない場合(midExpre[i] == ')'){
                する {
                    サフィックスExpre.push(opStack.pop());
                } while (opStack[opStack.length - 1] != '(');
                opStack.pop();
            }
            そうでない場合 (opStack.length == 0 || Priority(midExpre[i]) > Priority(opStack[opStack.length - 1])) {
                opStack.push(midExpre[i]);
            }
            それ以外 {
                する {
                    サフィックスExpre.push(opStack.pop());
                } while (opStack.length > 0 && Priority(midExpre[i]) <= Priority(opStack[opStack.length - 1]));

                opStack.push(midExpre[i]);
            }
        }

        それ以外 {
            suffixExpre.push(midExpre[i]);
        }
    }

    (opStack.length > 0) の場合 {
        サフィックスExpre.push(opStack.pop());
    }

    suffixExpre を返します。
}

関数 Priority(op) {
    var opPri = 0;
    スイッチ(op){
        ケース「+」:
            opPri = 1;
            壊す;
        場合 "-":
            opPri = 1;
            壊す;
        場合 "*":
            opPri = 2;
            壊す;
        場合 "/":
            opPri = 2;
            壊す;

    }
    opPri を返します。
}

関数 suffixValue(suffixExpre) {
    var calStack = [];

    console.log(サフィックスExpre);
    (var i = 0; i < suffixExpre.length; i++) の場合 {
        ops.indexOf(suffixExpre[i]) != -1 の場合 {
            var opRight = Number(calStack.pop());
            var opLeft = Number(calStack.pop());
            var tmpResult = 0;
            スイッチ (suffixExpre[i]) {
                ケース '+':
                    tmpResult = opLeft + opRight;
                    壊す;
                場合 '-':
                    tmpResult = opLeft - opRight;
                    壊す;
                場合 '*':
                    tmpResult = opLeft * opRight;
                    壊す;
                場合 '/':
                    tmpResult = opLeft / opRight;
                    壊す;
            }
            calStack.push(tmpResult);
        }
        それ以外 {
            calStack.push(サフィックスExpre[i]);
        }

        コンソールにログ出力します。
    }

    calStack.pop() を返します。
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 計算機機能を実現するjsバージョン
  • シンプルな計算機を実装するためのネイティブ js
  • JavaScript で簡単な計算機を実装する
  • jsを使って簡単な計算機を作る
  • JavaScript を使用した Web 計算機の作成
  • 豊富なコンテンツと実用的なメソッドを備えた、JavaScript で書かれたシンプルな計算機です。おすすめ
  • jsはシンプルな計算機を実装します
  • 電卓操作を実現するシンプルなjsコード
  • HTML+JS は、シンプルな計算機コード (加算、減算、乗算、除算) を実装します。
  • JavaScriptで計算機機能を実現するプロセスの詳細な説明

<<:  5分でWebRTCビデオチャットを構築する

>>:  MySQL データを誤って削除した場合の簡単な解決策 (MySQL フラッシュバック ツール)

推薦する

Docker、Nginx、Jenkins をベースにした自動フロントエンド デプロイメント

目次事前準備展開ターゲットDocker環境構築クラウドサーバーに接続Docker環境をインストールす...

Vue3 の ref toRef と toRefs の違いを理解する方法

目次1. 基本1.参照2. 参照3. 参照4. 最適な使い方2. 詳細な1. なぜrefが必要なのか...

HTMLフォームのいくつかの送信方法の概要

最も一般的で、最もよく使用され、最も一般的な方法は、submit タイプを使用することです。コードを...

VirtualBox+Ubuntu16でKubernetesクラスタを構築する実装

目次Kubernetesについて基本的な環境の準備VirtualBoxをインストールするUbuntu...

遭遇したいくつかのブラウザ互換性の問題について簡単に説明します

背景ブラウザの互換性の問題を解決するのは非常に面倒なことです。高度な技術はそれほど必要ありませんが、...

フォームデータを取得するための Node.js メソッドの 3 つの例

序文Nodejs はサーバーサイド言語です。開発中、登録やログインなどでは、判断のためにフォームを通...

MySQL インデックスの失敗を引き起こす一般的な書き込み方法の概要

序文最近、古いプロジェクトから残ったいくつかの SQL 最適化の問題に対処するのに忙しくしています。...

Dreamweaver で Zen コーディングを使用する方法

前回の記事「Zen Coding: HTML/CSS コードを素早く記述する方法」を公開した後、一部...

DPlayer.js ビデオ再生プラグインの使い方

DPlayer.jsビデオプレーヤープラグインは使いやすい主な用途: ビデオの再生、監視の開始、終了...

Dockerfile をベースに Zabbix 監視システムのコード例を作成する

forループを使用してZabbixイメージをコンテナにインポートします。 n を `ls *.tar...

現在使用されている設定ファイル my.cnf を表示する mysql メソッド (推奨)

my.cnfは、MySQL の起動時に読み込まれる設定ファイルです。通常は MySQL インストー...

Vue2.0でデータの双方向バインディング機能をjsを使って実装する

Object.definePropertyの理解文法:オブジェクト.defineProperty(o...

Linux サーバーでフォルダー、ファイル、解凍コマンドを削除する方法

1. フォルダを削除する例: rm -rf /usr/java /usr/javaディレクトリとその...

Apache、Tomcat、Nginx サーバーの詳細な理解と比較分析

質問1件会社のサーバーはApacheを使用しており、バックエンドはPHP、サーバーはLinux C/...

ファイルをアップロードするための HTML フォームの「参照」ボタンを変更する方法

コードをコピーコードは次のとおりです。 <!DOCTYPE HTML PUBLIC "...