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 コマンドの使用に関するヒント

推薦する

Tomcat サービスに Java 起動コマンドを追加する方法

私の最初のサーバープログラム現在、オンラインゲームの書き方を学んでいるので、サーバーサイドのプログラ...

Vue3.0 手書きカルーセル効果

この記事では、Vue3.0の手書きカルーセル効果の具体的なコードを参考までに共有します。具体的な内容...

効率的なMySQLページングの詳細な説明

序文通常、大量のデータを扱う MySQL クエリには「ページング」戦略が採用されます。ただし、ページ...

MySQL (InnoDB) がデッドロックを処理する方法の詳細な説明

1. デッドロックとは何ですか?正式な定義は次のとおりです: 2 つのトランザクションが相手側で必要...

Vue-pdfはPDFファイルのオンラインプレビューを実装します

序文ほとんどのプロジェクトでは、PDF ファイルのオンライン プレビューに遭遇するでしょう。このプロ...

CSSの複数条件の書き方の詳細説明:

:not疑似クラスセレクターは、式に一致しない要素をフィルタリングできます。例 テーブル tbod...

MySQL ストアド プロシージャ関連の権限変更の問題

MySQL データベースを使用すると、他のユーザーが定義したストアド プロシージャを他のユーザーが変...

jQueryはすべての選択と逆選択操作ケースを実装します

この記事では、全選択と逆選択操作を実装するためのjQueryの具体的なコードを参考までに共有します。...

MySQL シリーズ 6 のユーザーと認証

目次チュートリアルシリーズ1. ユーザー管理1. ユーザーアカウント2. アカウントの追加と削除3....

IE における条件付きコメントの利点と欠点

IE の条件付きコメントは、通常の (X)HTML コメントに対する Microsoft 独自の (...

ES6分解課題の原理と応用

目次配列分割代入オブジェクトの分解代入分割割り当ての適用変数の値の交換関数から複数の値を返すマップ構...

ページのキャッシュを防ぐソリューション

解決: <head> に次のコードを追加します。コードをコピーコードは次のとおりです。 ...

Tomcatアーキテクチャの原則をアーキテクチャ設計に分析する

目次1. 学習目標1.1. Tomcatアーキテクチャの設計と原則をマスターして社内スキルを向上させ...

MySQL 分離レベルの詳細な説明と例

目次MySQL の 4 つの分離レベルデータ テーブルを作成します。分離レベルの設定物事の分離レベル...

JavaScript の useRef と useState の紹介

目次1. useStateフック2. useRefフック3. useRef と useState 4...