WeChatアプレットはシンプルな計算機を実装する

WeChatアプレットはシンプルな計算機を実装する

WeChatアプレットの簡単な計算機は参考用です。具体的な内容は次のとおりです。

1. はじめに

1. 中置表現

中置式は算術式または論理式を表現する一般的な方法であり、演算子は中置形式でオペランド間に配置されます。中置式は、一般的に使用される算術表現方法です。

中置式は人間の脳にとっては理解しやすく、解析しやすいものですが、コンピュータにとっては非常に複雑です。そのため、式の値を計算するときは、通常、中置式を前置式または後置式に変換してから評価する必要があります。コンピュータが接頭辞または接尾辞の式を評価するのは非常に簡単です。

2. 接尾辞表現

式を左から右にスキャンします。数値に遭遇したら、その数値をスタックにプッシュします。演算子に遭遇したら、スタックの先頭にある 2 つの数値をポップし、演算子を使用してそれらに対応する計算 (次の先頭要素 op + スタックの先頭要素) を実行し、結果をスタックにプッシュします。上記のプロセスを式の右端まで繰り返します。計算によって得られた最終値が式の結果です。

例:

(1)8+4−62は次のように表される。
8 4+6 2-
(2)2*(3+5)-4+7/1は次のように表される。
3 5+2*7 1/4-+

たとえば、接尾辞表現「3 4 + 5 × 6 -」:

(1)左から右にスキャンし、3と4をスタックに押し込みます。
(2)+演算子に遭遇したので、4と3がポップされ(4はスタックの一番上の要素、3は2番目の要素、プレフィックス式との比較に注意)、3+4の値が計算され、7が得られ、7がスタックにプッシュされます。
(3)スタックに5をプッシュする。
(4)次は×演算子なので、5と7がポップされ、7×5=35が計算され、35がスタックにプッシュされます。
(5)6をスタックにプッシュする。
(6) 最後に、-演算子は35-6の値である29を計算し、最終結果を与えます。

2. プログラムコード

1. コード

app.js 構成コードは次のとおりです。

// アプリ.js
アプリ({
  起動() {
    // ローカルストレージ機能を表示 const logs = wx.getStorageSync('logs') || []
    ログをアンシフトします(Date.now())
    wx.setStorageSync('logs', ログ)

    // ログイン wx.login({
      成功: res => {
        // openId、sessionKey、unionIdと引き換えにres.codeをバックエンドに送信します
      }
    })
  },
  グローバルデータ: {
    ユーザー情報: null
  },
  
  電卓:
    express:'', //一時文字列 strList:[], //インフィックス式の保存(先入先出キュー)
    strListP:[], // サフィックス式 (キュー先入先出)
    list:[], //演算子のスタックを格納(先入れ先出し)
    calculate:[] //式スタックを計算する(先入れ先出し)
  }
})

2. ロジックコード

calculator.js のコードは次のとおりです。

// ページ/計算機/計算機.js
const アプリ = getApp()
ページ({
  /**
   * ページの初期データ */
  データ: {
    演算子: ['AC'、'DEL'、'%'、'/'、'7'、'8'、'9'、'×'、'4'、'5'、'6'、'+'、'1'、'2'、'3'、'-'、'0'、'.']、
    回答: '=',
    式: '0'、
  },

  すべてクリア() {
    this.setData({
      式: '0'、
      結果: ''
    })
  },

  クリック: 関数 (イベント) {
    イベントターゲットデータセットの値。

    (値 == 'AC')の場合{
      this.clearAll();
    } それ以外の場合 (val == 'DEL') {
      if (this.data.expression != '0') {
        定数 res = this.data.expression.substr(0, this.data.expression.length - 1);
        this.setData({
          表現: res
        })
      }
    } それ以外 {
      var len = this.data.expression.length;
      var s = this.data.expression.substring(len - 1, len);
      if ((this.checkOperator(s)) && this.checkOperator(val)) {
        定数 res = this.data.expression.substr(0, this.data.expression.length);
        this.setData({
          表現: res
        })
      } それ以外 {
        if ((this.data.expression == '0') && (val == '.')) {
          this.setData({
            式: this.data.expression + String(val)
          })
        } それ以外 {
          this.setData({
            式: this.data.expression === '0' ? val: this.data.expression + String(val)
          })
        }
      }

    }

  },

  結果() {
    app.calculator.strList.length = 0;
    app.calculator.strListP.length = 0;
    app.calculator.list.length = 0;
    app.calculator.calculate.length = 0;

    this.expressToStrList(このデータ式);

    tempList を app.calculator.strList とします。
    this.expressToStrListP(tempList);

    tempP = app.calculator.strListPとします。
    (let m in tempP) {
      if (this.checkOperator(tempP[m])) {
        op1 = app.calculator.calculate[0]とします。
        app.calculator.calculate.shift();
        op2 = app.calculator.calculate[0]とします。
        app.calculator.calculate.shift();
        app.calculator.calculate.unshift(this.countDetail(op2, tempP[m], op1));
      } それ以外 {
        app.calculator.calculate.unshift(tempP[m])
      }
    }
    this.setData({
      結果: app.calculator.calculate[0]
    });
  },

  countDetail(数値1, 演算子, 数値2) {
    結果を 0.0 とします。
    試す {
      if (演算子 == "×") {
        結果 = parseFloat(num1) * parseFloat(num2);
      } そうでなければ (演算子 == "/") {
        結果 = parseFloat(num1) / parseFloat(num2);
      } それ以外の場合 (演算子 == "%") {
        結果 = parseFloat(num1) % parseFloat(num2);
      } それ以外の場合 (演算子 == "+") {
        結果 = parseFloat(num1) + parseFloat(num2);
      } それ以外 {
        結果 = parseFloat(num1) - parseFloat(num2);
      }
    } キャッチ(エラー){

    }
    結果を返します。
  },

  expressToStrListP(tempList) { // 中置式セットを後置式セットに変換する for (let item in tempList) {
      if (this.checkOperator(tempList[item])) {
        (app.calculator.list.length == 0)の場合{
          app.calculator.list.unshift(tempList[item]);
        } それ以外 {
          if (this.compaerOperator(app.calculator.list[0], tempList[item])) {
            for (let x in app.calculator.list) {
              app.calculator.strListP.push(app.calculator.list[x]);
            }
            app.calculator.list.length = 0;
            app.calculator.list.unshift(tempList[item]);
          } それ以外 {
            app.calculator.list.unshift(tempList[item]);
          }
        }
      } それ以外 {
        app.calculator.strListP.push(tempList[item]);
      }
    }
    (app.calculator.list.length > 0) の場合 {
      for (let x in app.calculator.list) {
        app.calculator.strListP.push(app.calculator.list[x]);
      }
      app.calculator.list.length = 0;
    }
  },

  比較演算子(op1, op2) {
    if ((op1 == "%" || op1 == "×" || op1 == "/") && (op2 == "-" || op2 == "+")) {
      true を返します。
    } それ以外 {
      false を返します。
    }
  },

  expressToStrList(expression) { //文字列式をインフィックスキューに変換します。let temp = '';
    (i = 0 とします; i < 式の長さ; i++) {
      if (i == 0 && 式[i] == "-") {
        temp = temp + 式[i];
      } それ以外 {
        if (this.checkDigit(式[i])) {
          temp = temp + 式[i];
        } それ以外 {
          (温度長さ>0)の場合{
            if (式[i] == ".") {
              temp = temp + 式[i];
            } それ以外 {
              app.calculator.strList.push(parseFloat(temp));
              温度 = '';
              app.calculator.strList.push(式[i]);
            }
          } それ以外 {
            temp = temp + 式[i];
          }
        }
      }
    }
    if (temp.length > 0 && this.checkDigit(temp.substring(temp.length - 1))) {
      app.calculator.strList.push(parseFloat(temp));
      温度 = '';
    }
  },

  //演算子かどうかを判定する checkOperator(input) {
    if (入力 == "-" || 入力 == "+" || 入力 == "/" || 入力 == "%" || 入力 == "×") {
      true を返します。
    } それ以外 {
      false を返します。
    }
  },

  // 数値かどうかをチェックする checkDigit(input) {
    if ((/^[0-9]*$/.test(入力))) {
      true を返します。
    } それ以外 {
      false を返します。
    }
  },
})

3. インターフェースコード

calculator.js のコードは次のとおりです。

<!--pages/calculator/calculator.wxml-->
<view class="contaniner">
  <view class="displayer">
     <view class="text">{{式}}</view>
     <view class="result">={{result}}</view>
    </ビュー>
  <view class="btnArea">
    <block wx:for="{{operators}}">
        <view class="btn" data-value="{{item}}" capture-bind:tap="click">{{item}}</view>
    </ブロック>
    <view class="btn btn1" data-value="{{res}}" bindtap="result">{{res}}</view>
  </ビュー>
</ビュー>

4. スタイルコード

calculator.js のコードは次のとおりです。

/* ページ/計算機/計算機.wxss */
  .コンテナ1{
    幅: 100%;
    高さ: 100%;
  }

  .ディスプレイ{
    境界線: 1px 実線 #f1f3f3;
    幅: 100%;
    高さ: 602![ここに画像の説明を挿入](https://img-blog.csdnimg.cn/20210328162054440.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDI4MjE5,size_16,color_FFFFFF,t_70#pic_center)
rpx;
    フォントサイズ: 45rpx;
    背景色: rgba(241, 243, 243, 1.0);
  }
.btnエリア{
  ディスプレイ: フレックス;
  flex-flow: 行折り返し;
  コンテンツの配置: flex-start;
  パディング: 3rpx;
  マージン: 0;
  背景色: rgb(241, 243, 243);
}
  .btn{
    幅: 185rpx;
    ディスプレイ: フレックス;
    アイテムの位置を中央揃えにします。
    高さ: 120rpx;
    コンテンツの中央揃え: 中央;
    境界線: 1rpx 実線 #e8eaeb;
    色: 黒;
    背景色: #F7F8F9;
  }
  .btn1{
    幅: 370rpx;
  }
  。文章{
    幅: 100%;
    高さ: 10%;
    テキスト配置: 右;
    上マージン: 470rpx;
    背景色: rgba(241, 243, 243, 1.0);
    位置: 絶対;
    単語区切り: 単語区切り;
  }

  。結果{
    幅: 100%;
    高さ: 58rpx;
    テキスト配置: 右;
    上マージン: 530rpx;
    背景色: rgba(241, 243, 243, 1.0);
    位置: 絶対;
    単語区切り: 単語区切り;
  }

3. プログラムのスクリーンショット

IV. 結論

配列を使用してスタックを実装し、式を中置式に変換し、さらに後置式に変換して、スタックを使用して計算を実装します。

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

以下もご興味があるかもしれません:
  • WeChatアプレットで計算機機能を実装する
  • WeChatアプレットがシンプルな計算機機能を実装
  • WeChatアプレットが計算機機能を実装
  • WeChat アプレット計算機の例
  • WeChatアプレットが計算機機能を実装
  • WeChatアプレットがシンプルな計算機機能を実装
  • WeChatアプレットはシンプルな計算機を実装する
  • WeChat アプレットのシンプルな計算機の実装コード例
  • WeChat アプレット計算機の例

<<:  MySql でメモリ使用量を削減する方法の詳細な説明

>>:  docker inspect コマンドの使用に関するヒント

推薦する

EclipseのプロジェクトをTomcatに追加できない問題を解決する方法

1. プロジェクトを右クリックしてプロパティを選択します2. プロジェクトファセットをクリック3. ...

MySQL 5.7.18 MSI インストール グラフィック チュートリアル

この記事では、参考までにMySQL 5.7.18 MSIインストールチュートリアルを紹介します。具体...

MySQL の中国語ソートの詳細と例

MySQL の漢字ソートの詳細な説明デフォルトでは、MySQL は日付、時刻、および英語の文字列の並...

Vueでタイマーをエレガントにクリアする方法

目次序文最適化派生的な質問: beforeDestroy はトリガーされませんか?序文タイマーをクリ...

Apple Watchのインタラクションデザインにおける4つの全く異なる体験が明らかに

今日も Watch アプリのデザインに関する話です。私はケーススタディが大好きなので、同じトピックを...

MySQL Server 8.0.13.0 インストールチュートリアル(画像とテキスト付き)

MySQL 6.1.3 をベースにした 8.0.13 をインストールします。 MySQL 8.0....

JavaScript 関数のコンテキストのルールは何ですか?

目次1. ルール 1: Object.Method() 1.1 ケース1 1.2 ケース2 1.3 ...

ボタンと入力タイプの違いと注意点

<button> タグ<br />定義と使用法<button> ...

Docker 可視化グラフィックツール portainer の詳細な説明

目次1. ポーテナーの紹介2. Portainer アーキテクチャの概要3. Portainerのイ...

モバイルデバイスで 1 ピクセルの境界線の問題を解決するいくつかの方法 (5 つの方法)

この記事では、モバイルデバイス上の 1 ピクセルの境界線の問題を解決する 5 つの方法を紹介します。...

docker run後、ステータスは常にExitedになります

追加するdocker run -it -name test -d nginx:latest /bin...

友達やグループを見つけるためのJavaScriptのLayim

現在、layuiの関係者はlayim友達検索ページの構造とスタイルを提供していません。私は個人的に非...

表示または可視性によってHTML要素を非表示にする

場合によっては、特定の条件に基づいて Web ページ内の HTML 要素を表示するか非表示にするかを...

Webサービスのリモートデバッグとタイムアウト動作原理の分析

Webサービスのリモートデバッグ.NET では、WEBSERVICE のリモート デバッグ機能はデフ...

Vue の親子コンポーネントの値転送と一方向データフローの問題の詳細な説明

目次序文1. 親コンポーネントが子コンポーネントに値を渡す2. サブコンポーネントのprops型制約...