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;
}
}
}
プログラムの説明
変数宣言:
currentNum: 現在表示されている数値を保持します。
operand: 計算の操作数を保持します。
ansNum: 計算結果を保持します。
displayNum, displayAns, displayExpression: それぞれの表示用の文字列です。
lastOperator, mType: 最後に使用された演算子と現在の演算子を保持します。
overwrite, continueCalculation: 表示の上書きと計算の継続を管理するフラグです。
列挙型 OPE:
演算子を定義しています (NON, PLUS, MINUS, MULTIPLIED, DEVIDED)。
コンストラクタ Form1:
初期化処理を行い、表示を初期状態に設定します。
NumberButtonメソッド:
数字ボタンがクリックされたときの処理を行います。表示を更新し、入力された数字を displayAns に追加します。
Ope_Clickメソッド:
演算子ボタンがクリックされたときの処理を行います。Num_PoolMethodを呼び出し、現在の数値を操作数に設定します。その後、演算子を mType に設定し、displayExpression を更新します。
Num_PoolMethodメソッド:
現在の数値をパースし、演算を行います。演算の種類に応じて ansNum を更新します。ゼロ除算の場合はエラーメッセージを表示します。
btnEqual_Clickメソッド:
イコールボタンがクリックされたときの処理を行います。最後に使用された演算子に基づいて最終結果を計算し、表示を更新します。
処理の流れとアルゴリズム
初期化:
フォームが初期化され、表示がクリアされる (DisplayNum.Text = "0", DisplayExpression.Text = "")。
数字ボタンのクリック (NumberButton):
数字が入力されると、現在の表示を更新し、必要に応じて displayAns を上書きまたは追加します。
演算子ボタンのクリック (Ope_Click):
現在の数値を Num_PoolMethod を使って処理し、演算子を設定します。displayExpression に演算子を追加します。
数値のプール処理 (Num_PoolMethod):
現在の表示されている数値をパースし、ansNum に対して選択された演算を行います。
演算が NON であれば、ansNum に現在の数値を設定します。
ゼロ除算の場合はエラーメッセージを表示します。
イコールボタンのクリック (btnEqual_Click):
最後に使用された演算子に基づいて計算を完了し、最終結果を表示します。displayExpression に "=" を追加します。
注意点
ゼロ除算や無効な数値入力に対するエラーハンドリングがあります。
計算を続けるか新しい計算を始めるかを管理するフラグ (continueCalculation, overwrite) があります。
このプログラムは基本的な電卓の機能を実現するためのものであり、ユーザーインターフェイスを通じて入力された数値と演算子を使って連続した計算を行うことができます。
アルゴリズムとフローチャートを表示してください
ChatGPT
アルゴリズム
以下に、プログラムの主なアルゴリズムを示します。
数字ボタンのクリック処理 (NumberButton メソッド)
数字ボタンがクリックされる
overwrite フラグが true ならば、displayAns にクリックされたボタンのテキストを設定し、overwrite を false に設定
そうでなければ、DisplayNum.Text が "0" ならば、displayAns にクリックされたボタンのテキストを設定
それ以外の場合は、displayAns にクリックされたボタンのテキストを追加
DisplayNum.Text を displayAns に設定
演算子ボタンのクリック処理 (Ope_Click メソッド)
演算子ボタンがクリックされる
Num_PoolMethod を呼び出す
クリックされたボタンのテキストに応じて mType を設定し、displayExpression に現在の displayAns と演算子を追加
lastOperator に mType を設定
continueCalculation を false に設定
overwrite を true に設定
DisplayExpression.Text を displayExpression に設定
数値のプール処理 (Num_PoolMethod メソッド)
DisplayNum.Text を currentNum にパース
continueCalculation が false ならば、operand に currentNum を設定
mType に応じて以下の処理を実行
NON: ansNum を currentNum に設定
PLUS: ansNum に operand を加算
MINUS: ansNum から operand を減算
MULTIPLIED: ansNum に operand を乗算
DEVIDED: operand が 0 でなければ ansNum を operand で除算、それ以外の場合はエラーメッセージを表示
DisplayNum.Text を ansNum.ToString() に設定
continueCalculation を true に設定
イコールボタンのクリック処理 (btnEqual_Click メソッド)
イコールボタンがクリックされる
continueCalculation が false ならば、Num_PoolMethod を呼び出す
そうでなければ、lastOperator に応じて以下の処理を実行
PLUS: ansNum に operand を加算
MINUS: ansNum から operand を減算
MULTIPLIED: ansNum に operand を乗算
DEVIDED: operand が 0 でなければ ansNum を operand で除算、それ以外の場合はエラーメッセージを表示
DisplayNum.Text を ansNum.ToString() に設定
displayExpression に " = " を追加
DisplayExpression.Text を displayExpression に設定
フローチャート
以下に各主要なメソッドのフローチャートを示します。
数字ボタンのクリック処理 (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 の役割
continueCalculation が false の場合:
演算子ボタンがクリックされた直後であり、次の数値入力が新しい操作数として扱われる。
Num_PoolMethod メソッド内で現在の表示されている数値が operand として設定される。
continueCalculation が true の場合:
継続して計算が行われている状態を示す。つまり、前の計算結果に基づいて新しい計算が行われる。
演算子ボタンがクリックされても、計算結果がクリアされずに次の操作が実行される。
continueCalculation の使用場所
Num_PoolMethod メソッド:
現在の表示されている数値をパースし、currentNum に設定。
continueCalculation が false の場合、operand に currentNum を設定。
計算が行われ、結果が ansNum に保存される。
最後に continueCalculation を true に設定。
Ope_Click メソッド:
Num_PoolMethod を呼び出し、現在の数値を計算に含める。
演算子を設定し、continueCalculation を false に設定して、新しい操作が始まることを示す。
btnEqual_Click メソッド:
continueCalculation が false の場合、Num_PoolMethod を呼び出し、新しい計算を行う。
continueCalculation が true の場合、最後の演算子に基づいて計算を続行する。
アルゴリズムとフローチャートの更新
数値のプール処理 (Num_PoolMethod メソッド)
DisplayNum.Text を currentNum にパース
continueCalculation が false ならば、operand に currentNum を設定
mType に応じて以下の処理を実行
NON: ansNum を currentNum に設定
PLUS: ansNum に operand を加算
MINUS: ansNum から operand を減算
MULTIPLIED: ansNum に operand を乗算
DEVIDED: operand が 0 でなければ ansNum を operand で除算、それ以外の場合はエラーメッセージを表示
DisplayNum.Text を ansNum.ToString() に設定
continueCalculation を true に設定
演算子ボタンのクリック処理 (Ope_Click メソッド)
演算子ボタンがクリックされる
Num_PoolMethod を呼び出す
クリックされたボタンのテキストに応じて mType を設定
displayExpression に現在の displayAns と演算子を追加
lastOperator に mType を設定
continueCalculation を false に設定
overwrite を true に設定
DisplayExpression.Text を displayExpression に設定
イコールボタンのクリック処理 (btnEqual_Click メソッド)
イコールボタンがクリックされる
continueCalculation が false ならば、Num_PoolMethod を呼び出す
continueCalculation が true の場合、lastOperator に応じて以下の処理を実行
PLUS: ansNum に operand を加算
MINUS: ansNum から operand を減算
MULTIPLIED: ansNum に operand を乗算
DEVIDED: operand が 0 でなければ ansNum を operand で除算、それ以外の場合はエラーメッセージを表示
DisplayNum.Text を ansNum.ToString() に設定
displayExpression に " = " を追加
DisplayExpression.Text を displayExpression に設定
更新後のフローチャート
数字ボタンのクリック処理 (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に
この記事が気に入ったらサポートをしてみませんか?