はじめまして。今回、記事の記載を担当する、2025年4月に入社したtakiです。
第1回から第3回までは先輩社員が執筆を担当していましたが、第4回からは私が引き継ぐこととなりました。
これまでの流れを大切にしながら、新しい視点も交えつつ、役立つ情報をお届けできればと思います。
前回までを見ていない方はこちら↓
C#に挑戦 電卓を作ってみよう~第1回~
C#に挑戦 電卓を作ってみよう~第2回~
C#に挑戦 電卓を作ってみよう~第3回~
今回の内容
前回の続きから作成していくのも良いのですが、
第1回で紹介されていたとおり、初心者が取り組むのに適した内容であるとのことでしたので、
まずは自身の勉強も兼ねて第1回から第3回までの内容を実際に作成してみました。
今回は、その中で見つかった問題点を修正しながら、理解を深めていきたいと思います。
問題点と対策①
・数値を入力する前に演算子を入力できてしまう

電卓は基本的に、最初に数値を入力してから四則演算を行うものです。
そのため、利用者が数値から入力することを前提として処理を実装しがちです。
しかし、今回のように演算子を先頭に入力できる状態は本来の仕様ではないため、
想定外の入力パターンとなり、不具合や予期しない動作につながる可能性があります。

このように、想定外の操作や入力も考慮して実装する考え方を「防御的プログラミング」といいます。
今回の対策としてはTextBoxを表示すると同時に「0」を表示する処理を追加しました。

public Form1()
{
InitializeComponent();
textBox1.Text = "0";
}これにより、数値を入力する前に演算子だけを入力することができなくなり、想定した操作手順で電卓を使用できるようになりました。
問題点と対策②
・続けて演算子を入力した場合、不具合が発生してしまう

では、この不具合はなぜ発生したのでしょうか。
原因を確認するため、第3回で実装した演算子入力時の処理を振り返ってみます。
第3回にて作成したbutton_Multiplication_Click(乗算ボタン)関数では、
【処理内容】
・「計算処理を実行せずに演算子を追加」
または
・「計算処理を実行してから演算子を追加」
のどちらを行うのかを CalSetCheck 関数にて判定し、それぞれ処理を実施しています。
private bool CalSetCheck()
{
bool bChecked = true;
// 既に一度演算ボタンが押されデータが保持されている場合
if (b_Calformulflg == true)
{
// 2度目の演算ボタン押下
bChecked = false;
}
//1度目の演算ボタン押下の場合は bChecked は true のまま
return bChecked;
}しかし、現在の処理では「演算子が入力されたかどうか」は確認できていても、
その後に「数値が入力されたかどうか」までは確認できていませんでした。
例えば、「4」「×」「÷」と入力した場合、「÷」を入力した時点で、
「×」が入力されているため、「計算処理を実行してから演算子を追加する」処理が実行されてしまいます。
その際「×」の後に数値が入力されていないので「4×」という未完成の式を計算しようとして、不具合が発生していました。

今回の対策としては、演算子が連続して入力された場合に、直前の演算子を新しく入力された演算子へ置き換える機能を追加しました。
現状では、演算子が連続で入力された場合、TextBoxの末尾には直前に入力した演算子が存在していますね。
この状態を確認するため、「TextBoxの末尾が演算子かどうかを判定する関数」を作成しました。
private bool EndsWithOperator()
{
bool bChecked = false;
// TextBox末尾が演算子か判定
if (textBox1.Text.EndsWith(" + ") ||
textBox1.Text.EndsWith(" - ") ||
textBox1.Text.EndsWith(" × ") ||
textBox1.Text.EndsWith(" ÷ "))
{
// TextBox末尾が演算子である
bChecked = true;
}
// TextBox末尾が演算子でない場合は bChecked は false のまま
return bChecked;
}呼び出し元では、その戻り値をもとに末尾の演算子を削除するかどうかを判定し、
削除後に新たに入力された演算子を追加することで、演算子の入力を置き換える処理を実現しました。
private void button_Multiplication_Click(object sender, EventArgs e)
{
if (EndsWithOperator() == false)
{
if (CalSetCheck() == true)
{
getTextData();
b_Calformulflg = true;
}
else
{
getTextData();
m_d_resultDateFs = Calculation();
textBox1.Text = m_d_resultDateFs.ToString();
}
}
else
{
textBox1.Text = m_d_resultDateFs.ToString();
}
textBox1.Text += " × ";
m_str_Calformula = "*";
}これにより、演算子を連続入力した場合の不具合を防止できるだけでなく、一度入力した演算子を別の演算子へ変更できるようになりました。
あとがき
今回は、第1回から第3回までの内容を振り返りながら、不具合の修正と改善を行うことができました。
次回からは、第3回の続きとなる「演算機能の追加」の実装に取り組んでいきます。
関連記事
-
第1回 Visual C++で作成したDLL内のクラスをC#で利用する方法
こんにちは、ILCです。 Visual C++ (以下 VC++)で作成されたDynamic...
公開日:2024.01.19 更新日:2024.01.19
tag : Windows
-
-
【新機能探訪】Android 13から導入された『アプリごとの言語設定』
こんにちは、KNSKです。よろしくお願いします。 今回は Android13の新機能である『...
公開日:2022.12.09 更新日:2022.12.09
tag : スマートデバイス
-
-
第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~
こんにちは、GTです。よろしくお願いします。 最近業務でラズパイのBluetooth機能を使...
公開日:2021.12.24 更新日:2021.12.24
tag : Bluetooth Raspberry Pi
-
こんにちは。WwWです。 システム系の開発をしていると様々な問題が起こります。 そこで今回は...
公開日:2023.04.28 更新日:2023.04.28