シンプルなウェブ計算機を実装する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 フラッシュバック ツール)

推薦する

VMware Workstation 15 Pro インストール ガイド (初心者向け)

01. VMware Workstation Pro 15 のダウンロードダウンロード: VMwa...

VMware 15.5 バージョンのインストール Windows_Server_2008_R2 システム チュートリアル図

1. VMware 15.5から新しい仮想マシンを作成する1. VMware を開き、ホームページで...

Vue プラグイン エラー: このページで Vue.js が検出されました。問題は解決しました

Vue プラグインがエラーを報告しました: このページで Vue.js が検出されましたVueプラグ...

クロスドメイン js フロントエンドの 8 つの実装ソリューション

目次1. jsonp クロスドメイン2. document.domain + iframe クロスド...

Tomcat をサービスとして登録する際に注意すべき点のまとめ

Tomcat をサービスとして登録する場合の注意点は次のとおりです。 インターフェースを開いたら、以...

CSSはBEM命名規則の実践を使用する

クラスを見るとき、どのような情報を得たいですか?このクラスはどこで使用され、その機能は何ですか?この...

有名なブログの再設計例 28 件

1. Webデザイナーウォール 2. Veerleのブログ 3. チュートリアル9 4. UXブース...

Vue 画像切り抜きコンポーネントのサンプルコード

例:ヒント:このコンポーネントはvue-cropperの二次パッケージに基づいていますプラグインをイ...

MySQLのジョイントクエリについて詳しく説明します

目次ユニオンクエリ1. 中国の各省のIDと名前を照会する2. 湖南省のすべての地級市のIDと名称3....

base target="" はリンクのターゲットオープンフレームを制御します

<base target=_blank> は、基本リンクのターゲット フレームを新しいペ...

2048 ゲームを実装するためのネイティブ js

2048ミニゲーム、参考までに具体的な内容は以下のとおりですまず、2048ゲームは16のグリッドか...

Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました

MySQLへの接続ここでは、リモート接続に navicat を使用します。MySQL に接続する前に...

Vueはデータを初期状態にリセットします

場合によっては、データ内のデータを再利用する必要がありますが、データ内のデータはさまざまなフォーム、...

Nginx サーバーが Systemd カスタム サービス プロセス分析を追加

1. nginxを例に挙げるyumコマンドを使用してNginxをインストールしましたSystemd ...

JSでユーザーを追跡する方法

目次1. 同期AJAX 2. 非同期AJAX 3. ユーザーのクリックを追跡する4. リバウンドトラ...