ssss

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        // 変数宣言
        private double currentNum = 0;
        private double operand = 0;
        private double ansNum = 0;
        private string displayNum = "";
        private string displayAns = "";
        private string displayExpression = "";
        private OPE lastOperator = OPE.NON;

        private bool overwrite = true;
        private bool continueCalculation = false;

        private enum OPE // 列挙子
        {
            NON,
            PLUS,
            MINUS,
            MULTIPLIED,
            DEVIDED,
        }
        private OPE mType = OPE.NON;

        public Form1()
        {
            InitializeComponent();
            DisplayNum.Text = "0";
            DisplayExpression.Text = "";
        }

        private void NumberButton(object sender, EventArgs e)
        {
            Button button = sender as Button;

            if (overwrite)
            {
                displayAns = button.Text;
                overwrite = false;
            }
            else if (!overwrite && DisplayNum.Text == "0")
            {
                displayAns = button.Text;
            }
            else
            {
                displayAns += button.Text;
            }
            DisplayNum.Text = displayAns;
        }

        private void Ope_Click(object sender, EventArgs e)
        {
            Button button = sender as Button;

            Num_PoolMethod();

            if (button.Text == "+")
            {
                mType = OPE.PLUS;
                displayExpression += displayAns + " + ";
            }
            else if (button.Text == "-")
            {
                mType = OPE.MINUS;
                displayExpression += displayAns + " - ";
            }
            else if (button.Text == "*")
            {
                mType = OPE.MULTIPLIED;
                displayExpression += displayAns + " * ";
            }
            else
            {
                mType = OPE.DEVIDED;
                displayExpression += displayAns + " / ";
            }

            lastOperator = mType;
            continueCalculation = false;
            overwrite = true;

            DisplayExpression.Text = displayExpression;
        }

        private void Num_PoolMethod()
        {
            if (double.TryParse(DisplayNum.Text, out currentNum))
            {
                if (!continueCalculation)
                {
                    operand = currentNum;
                }

                switch (mType)
                {
                    case OPE.NON:
                        ansNum = currentNum;
                        break;

                    case OPE.PLUS:
                        ansNum += operand;
                        break;
                    case OPE.MINUS:
                        ansNum -= operand;
                        break;
                    case OPE.MULTIPLIED:
                        ansNum *= operand;
                        break;
                    case OPE.DEVIDED:
                        if (operand != 0)
                        {
                            ansNum /= operand;
                        }
                        else
                        {
                            MessageBox.Show("Error: Divide by Zero");
                        }
                        break;
                }
                DisplayNum.Text = ansNum.ToString();
                continueCalculation = true;
            }
            else
            {
                MessageBox.Show("Error: Invalid number");
            }
        }

        private void btnEqual_Click(object sender, EventArgs e)
        {
            if (!continueCalculation)
            {
                Num_PoolMethod();
            }
            else
            {
                switch (lastOperator)
                {
                    case OPE.PLUS:
                        ansNum += operand;
                        break;
                    case OPE.MINUS:
                        ansNum -= operand;
                        break;
                    case OPE.MULTIPLIED:
                        ansNum *= operand;
                        break;
                    case OPE.DEVIDED:
                        if (operand != 0)
                        {
                            ansNum /= operand;
                        }
                        else
                        {
                            MessageBox.Show("Error: Divide by Zero");
                        }
                        break;
                }
                DisplayNum.Text = ansNum.ToString();
            }

            // 完全な数式を表示
            displayExpression += displayAns + " = ";
            DisplayExpression.Text = displayExpression;

            // displayExpressionをリセットして次の計算に備える
            displayExpression = ansNum.ToString();

            // 次の数式のためにオペランドを初期化
            displayAns = ansNum.ToString();

            continueCalculation = true;
            overwrite = true;
        }
    }
}

プログラムの説明

  1. 変数宣言

    • currentNum: 現在表示されている数値を保持します。

    • operand: 計算の操作数を保持します。

    • ansNum: 計算結果を保持します。

    • displayNum, displayAns, displayExpression: それぞれの表示用の文字列です。

    • lastOperator, mType: 最後に使用された演算子と現在の演算子を保持します。

    • overwrite, continueCalculation: 表示の上書きと計算の継続を管理するフラグです。

  2. 列挙型 OPE

    • 演算子を定義しています (NON, PLUS, MINUS, MULTIPLIED, DEVIDED)。

  3. コンストラクタ Form1

    • 初期化処理を行い、表示を初期状態に設定します。

  4. NumberButtonメソッド

    • 数字ボタンがクリックされたときの処理を行います。表示を更新し、入力された数字を displayAns に追加します。

  5. Ope_Clickメソッド

    • 演算子ボタンがクリックされたときの処理を行います。Num_PoolMethodを呼び出し、現在の数値を操作数に設定します。その後、演算子を mType に設定し、displayExpression を更新します。

  6. Num_PoolMethodメソッド

    • 現在の数値をパースし、演算を行います。演算の種類に応じて ansNum を更新します。ゼロ除算の場合はエラーメッセージを表示します。

  7. btnEqual_Clickメソッド

    • イコールボタンがクリックされたときの処理を行います。最後に使用された演算子に基づいて最終結果を計算し、表示を更新します。

処理の流れとアルゴリズム

  1. 初期化

    • フォームが初期化され、表示がクリアされる (DisplayNum.Text = "0", DisplayExpression.Text = "")。

  2. 数字ボタンのクリック (NumberButton)

    • 数字が入力されると、現在の表示を更新し、必要に応じて displayAns を上書きまたは追加します。

  3. 演算子ボタンのクリック (Ope_Click)

    • 現在の数値を Num_PoolMethod を使って処理し、演算子を設定します。displayExpression に演算子を追加します。

  4. 数値のプール処理 (Num_PoolMethod)

    • 現在の表示されている数値をパースし、ansNum に対して選択された演算を行います。

    • 演算が NON であれば、ansNum に現在の数値を設定します。

    • ゼロ除算の場合はエラーメッセージを表示します。

  5. イコールボタンのクリック (btnEqual_Click)

    • 最後に使用された演算子に基づいて計算を完了し、最終結果を表示します。displayExpression に "=" を追加します。

注意点

  • ゼロ除算や無効な数値入力に対するエラーハンドリングがあります。

  • 計算を続けるか新しい計算を始めるかを管理するフラグ (continueCalculation, overwrite) があります。

このプログラムは基本的な電卓の機能を実現するためのものであり、ユーザーインターフェイスを通じて入力された数値と演算子を使って連続した計算を行うことができます。

アルゴリズムとフローチャートを表示してください

ChatGPT

アルゴリズム

以下に、プログラムの主なアルゴリズムを示します。

数字ボタンのクリック処理 (NumberButton メソッド)

  1. 数字ボタンがクリックされる

  2. overwrite フラグが true ならば、displayAns にクリックされたボタンのテキストを設定し、overwritefalse に設定

  3. そうでなければ、DisplayNum.Text"0" ならば、displayAns にクリックされたボタンのテキストを設定

  4. それ以外の場合は、displayAns にクリックされたボタンのテキストを追加

  5. DisplayNum.TextdisplayAns に設定

演算子ボタンのクリック処理 (Ope_Click メソッド)

  1. 演算子ボタンがクリックされる

  2. Num_PoolMethod を呼び出す

  3. クリックされたボタンのテキストに応じて mType を設定し、displayExpression に現在の displayAns と演算子を追加

  4. lastOperatormType を設定

  5. continueCalculationfalse に設定

  6. overwritetrue に設定

  7. DisplayExpression.TextdisplayExpression に設定

数値のプール処理 (Num_PoolMethod メソッド)

  1. DisplayNum.TextcurrentNum にパース

  2. continueCalculationfalse ならば、operandcurrentNum を設定

  3. mType に応じて以下の処理を実行

    • NON: ansNumcurrentNum に設定

    • PLUS: ansNumoperand を加算

    • MINUS: ansNum から operand を減算

    • MULTIPLIED: ansNumoperand を乗算

    • DEVIDED: operand0 でなければ ansNumoperand で除算、それ以外の場合はエラーメッセージを表示

  4. DisplayNum.TextansNum.ToString() に設定

  5. continueCalculationtrue に設定

イコールボタンのクリック処理 (btnEqual_Click メソッド)

  1. イコールボタンがクリックされる

  2. continueCalculationfalse ならば、Num_PoolMethod を呼び出す

  3. そうでなければ、lastOperator に応じて以下の処理を実行

    • PLUS: ansNumoperand を加算

    • MINUS: ansNum から operand を減算

    • MULTIPLIED: ansNumoperand を乗算

    • DEVIDED: operand0 でなければ ansNumoperand で除算、それ以外の場合はエラーメッセージを表示

  4. DisplayNum.TextansNum.ToString() に設定

  5. displayExpression" = " を追加

  6. DisplayExpression.TextdisplayExpression に設定

フローチャート

以下に各主要なメソッドのフローチャートを示します。

数字ボタンのクリック処理 (NumberButton メソッド)

plaintext

コードをコピーする

[数字ボタンがクリックされる] | v [overwrite == true] | / \ yes no / \ [displayAnsにクリックされたボタンのテキストを設定] [overwriteをfalseに設定] [DisplayNum.Text == "0"] | / \ yes no / \ [displayAnsにクリックされたボタンのテキストを設定] [displayAnsにクリックされたボタンのテキストを追加] | v [DisplayNum.TextをdisplayAnsに設定]

演算子ボタンのクリック処理 (Ope_Click メソッド)

plaintext

コードをコピーする

[演算子ボタンがクリックされる] | v [Num_PoolMethodを呼び出す] | v [クリックされたボタンのテキストに応じてmTypeを設定] | v [displayExpressionに現在のdisplayAnsと演算子を追加] | v [lastOperatorにmTypeを設定] | v [continueCalculationをfalseに設定] | v [overwriteをtrueに設定] | v [DisplayExpression.TextをdisplayExpressionに設定]

数値のプール処理 (Num_PoolMethod メソッド)

plaintext

コードをコピーする

[DisplayNum.TextをcurrentNumにパース] | v [continueCalculation == false] | / \ yes no / \ [operandにcurrentNumを設定] | v [mTypeに応じた処理を実行] | | | | | NON PLUS MINUS MULTIPLIED DEVIDED | | | | | [ansNum= [ansNum [ansNum= [ansNum= [ansNum= currentNum] +operand] -operand] *operand] /operand] | | [ゼロ除算ならエラーメッセージ表示] | v [DisplayNum.TextをansNum.ToString()に設定] | v [continueCalculationをtrueに設定]

イコールボタンのクリック処理 (btnEqual_Click メソッド)

plaintext

コードをコピーする

[イコールボタンがクリックされる] | v [continueCalculation == false] | / \ yes no / \ [Num_PoolMethodを呼び出す] [lastOperatorに応じた処理を実行] | | | | | PLUS MINUS MULTIPLIED DEVIDED | | | | | [ansNum+ [ansNum- [ansNum* [ansNum/ operand] operand] operand] operand] | | [ゼロ除算ならエラーメッセージ表示] | v [DisplayNum.TextをansNum.ToString()に設定] | v [displayExpressionに" = "を追加] | v [DisplayExpression.TextをdisplayExpressionに設定]

これらのフローチャートは、それぞれのメソッド内での主要な処理の流れを視覚的に表現しています。

continueCalculation

ChatGPT

continueCalculation フラグは、計算の継続状態を管理するために使用されます。特に、演算子ボタンがクリックされた後に次の数値入力が計算に含まれるか、新しい計算を始めるかを制御します。以下に、continueCalculation がどのように使われているかを詳しく説明します。

continueCalculation の役割

  • continueCalculationfalse の場合:

    • 演算子ボタンがクリックされた直後であり、次の数値入力が新しい操作数として扱われる。

    • Num_PoolMethod メソッド内で現在の表示されている数値が operand として設定される。

  • continueCalculationtrue の場合:

    • 継続して計算が行われている状態を示す。つまり、前の計算結果に基づいて新しい計算が行われる。

    • 演算子ボタンがクリックされても、計算結果がクリアされずに次の操作が実行される。

continueCalculation の使用場所

  1. Num_PoolMethod メソッド

    • 現在の表示されている数値をパースし、currentNum に設定。

    • continueCalculationfalse の場合、operandcurrentNum を設定。

    • 計算が行われ、結果が ansNum に保存される。

    • 最後に continueCalculationtrue に設定。

  2. Ope_Click メソッド

    • Num_PoolMethod を呼び出し、現在の数値を計算に含める。

    • 演算子を設定し、continueCalculationfalse に設定して、新しい操作が始まることを示す。

  3. btnEqual_Click メソッド

    • continueCalculationfalse の場合、Num_PoolMethod を呼び出し、新しい計算を行う。

    • continueCalculationtrue の場合、最後の演算子に基づいて計算を続行する。

アルゴリズムとフローチャートの更新

数値のプール処理 (Num_PoolMethod メソッド)

  1. DisplayNum.TextcurrentNum にパース

  2. continueCalculationfalse ならば、operandcurrentNum を設定

  3. mType に応じて以下の処理を実行

    • NON: ansNumcurrentNum に設定

    • PLUS: ansNumoperand を加算

    • MINUS: ansNum から operand を減算

    • MULTIPLIED: ansNumoperand を乗算

    • DEVIDED: operand0 でなければ ansNumoperand で除算、それ以外の場合はエラーメッセージを表示

  4. DisplayNum.TextansNum.ToString() に設定

  5. continueCalculationtrue に設定

演算子ボタンのクリック処理 (Ope_Click メソッド)

  1. 演算子ボタンがクリックされる

  2. Num_PoolMethod を呼び出す

  3. クリックされたボタンのテキストに応じて mType を設定

  4. displayExpression に現在の displayAns と演算子を追加

  5. lastOperatormType を設定

  6. continueCalculationfalse に設定

  7. overwritetrue に設定

  8. DisplayExpression.TextdisplayExpression に設定

イコールボタンのクリック処理 (btnEqual_Click メソッド)

  1. イコールボタンがクリックされる

  2. continueCalculationfalse ならば、Num_PoolMethod を呼び出す

  3. continueCalculationtrue の場合、lastOperator に応じて以下の処理を実行

    • PLUS: ansNumoperand を加算

    • MINUS: ansNum から operand を減算

    • MULTIPLIED: ansNumoperand を乗算

    • DEVIDED: operand0 でなければ ansNumoperand で除算、それ以外の場合はエラーメッセージを表示

  4. DisplayNum.TextansNum.ToString() に設定

  5. displayExpression" = " を追加

  6. DisplayExpression.TextdisplayExpression に設定

更新後のフローチャート

数字ボタンのクリック処理 (NumberButton メソッド)

plaintext

コードをコピーする

[数字ボタンがクリックされる] | v [overwrite == true] | / \ yes no / \ [displayAnsにクリックされたボタンのテキストを設定] [overwriteをfalseに設定] [DisplayNum.Text == "0"] | / \ yes no / \ [displayAnsにクリックされたボタンのテキストを設定] [displayAnsにクリックされたボタンのテキストを追加] | v [DisplayNum.TextをdisplayAnsに設定]

演算子ボタンのクリック処理 (Ope_Click メソッド)

plaintext

コードをコピーする

[演算子ボタンがクリックされる] | v [Num_PoolMethodを呼び出す] | v [クリックされたボタンのテキストに応じてmTypeを設定] | v [displayExpressionに現在のdisplayAnsと演算子を追加] | v [lastOperatorにmTypeを設定] | v [continueCalculationをfalseに設定] | v [overwriteをtrueに設定] | v [DisplayExpression.TextをdisplayExpressionに設定]

数値のプール処理 (Num_PoolMethod メソッド)

plaintext

コードをコピーする

[DisplayNum.TextをcurrentNumにパース] | v [continueCalculation == false] | / \ yes no / \ [operandにcurrentNumを設定] | v [mTypeに応じた処理を実行] | | | | | NON PLUS MINUS MULTIPLIED DEVIDED | | | | | [ansNum= [ansNum [ansNum= [ansNum= [ansNum= currentNum] +operand] -operand] *operand] /operand] | | [ゼロ除算ならエラーメッセージ表示] | v [DisplayNum.TextをansNum.ToString()に設定] | v [continueCalculationをtrueに設定]

イコールボタンのクリック処理 (btnEqual_Click メソッド)

plaintext

コードをコピーする

[イコールボタンがクリックされる] | v [continueCalculation == false] | / \ yes no / \ [Num_PoolMethodを呼び出す] [lastOperatorに応じた処理を実行] | | | | | PLUS MINUS MULTIPLIED DEVIDED | | | | | [ansNum+ [ansNum- [ansNum* [ansNum/ operand] operand] operand] operand] | | [ゼロ除算ならエラーメッセージ表示] | v [DisplayNum.TextをansNum.ToString()に設定] | v [displayExpressionに" = "を追加] | v [DisplayExpression.TextをdisplayExpressionに

この記事が気に入ったらサポートをしてみませんか?