初投稿です。C#を使った電卓の作成で躓いています。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あしサーモン
記事: 3
登録日時: 2ヶ月前

初投稿です。C#を使った電卓の作成で躓いています。

#1

投稿記事 by あしサーモン » 2ヶ月前

ネット記事やYouTubeなどを参考にしながら電卓作成を行っています。
しかし、参考にしている記事や動画では起こっていない(省かれている?)エラーが起きるため修正の仕方が分からず困っています。
エラーとしては、「ハンドルされていない例外」という文言でConvertを使ったコード部分に出てきます。
処理したい内容としては、2つあります。
1つ目は、テキストボックスに初期値として表示している「0」に対して、実際に計算を行う際に打ち込んだ数字の前に0がついたままになってしまう問題です。そのためそれを処理しようとするコードにConvertを使うとデバックの際にエラーとなります。
例:表示「0」→4のボタンを押す→表示「04」
  この修正自体はできたが、Convertを使わない方法でコードを記入した。

2つ目は、演算子を使った計算処理の際に演算子を押す前に表示されていた数字を記憶し、演算子が押された後の数字と計算を行い、結果を表示するという部分で、Convertを使用せずにその処理を行う方法が分かりません。そのため1つ目の問題は解決できても、2つ目でまたConvertを使用せざるを得ずエラーが起こってしまいます。

まだはじめて一か月なのでわからないことだらけです。
皆様のお力を貸していただけたら幸いです。

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 電卓_三号機
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool isFirst = true;
        decimal 値1 = 0;

        private void buttonNumber_Click(object sender, EventArgs e)
        {
            if (記号 != 四則演算の記号.未定義 && isFirst) 
            {
                値1 = Convert.ToDecimal(textDisplay.Text);
                textDisplay.Text = "";
                isFirst = false;
            }
            
            if (textDisplay.Text.Equals("0"))
            {
                textDisplay.Text = ((Button)sender).Text;
            }
            else 
            {
                textDisplay.Text = textDisplay.Text + ((Button)sender).Text;
            }

        }

        private void buttonClaer_Click(object sender, EventArgs e)
        {
            textDisplay.Text = "";
        }
        //小数点クリック
        private void buttonDot_Click(object sender, EventArgs e)
        {
            //小数点の重複チェック
            if (textDisplay.Text.IndexOf(".") >= 0) 
            {
                //既に小数点がある
                return;
            }
            textDisplay.Text = textDisplay.Text + ".";
        }

        enum 四則演算の記号
        {
            未定義,ADD, SUB, MUL, DIV
        };

        四則演算の記号 記号;

        private void buttonAdd_Click(object sender, EventArgs e)
        {
            記号 = 四則演算の記号.ADD;
            isFirst = true;
        }

        private void buttonSub_Click(object sender, EventArgs e)
        {
            記号 = 四則演算の記号.SUB;
            isFirst = true;
        }

        private void buttonMul_Click(object sender, EventArgs e)
        {
            記号 = 四則演算の記号.MUL;
            isFirst = true;
        }

        private void buttonDiv_Click(object sender, EventArgs e)
        {
            記号 = 四則演算の記号.DIV;
            isFirst = true;
        }

        private void buttonCalc_Click(object sender, EventArgs e)
        {
            decimal 値2 = Convert.ToDecimal(textDisplay.Text);
            decimal 結果 = 0;
            switch (記号) 
            {
                case 四則演算の記号.ADD:
                    結果 = 値1 + 値2;
                    break;
                case 四則演算の記号.SUB:
                    結果 = 値1 - 値2;
                    break;
                case 四則演算の記号.MUL:
                    結果 = 値1 * 値2;
                    break;
                case 四則演算の記号.DIV:
                    結果 = 値1 / 値2;
                    break;
            }
            textDisplay.Text = 結果.ToString();
        }
    }
}

Meta3

Re: 初投稿です。C#を使った電卓の作成で躓いています。

#2

投稿記事 by Meta3 » 2ヶ月前

何をしようとしてるのか。わからないのでプログラムにコメントをいれましょう。
Convertで出来るとおもいますが

decimal m = 100;
//decimal型を文字列に変換
s = Convert.ToString(m);
//文字列をdecimal型に変換
m = Convert.ToDecimal(s);

Convertクラスによるデータ型の変換

https://dobon.net/vb/dotnet/programing/convert.html#convert

あしサーモン
記事: 3
登録日時: 2ヶ月前

Re: 初投稿です。C#を使った電卓の作成で躓いています。

#3

投稿記事 by あしサーモン » 2ヶ月前

2020-12-28.png
エラー画面です。
失礼しました。確かに分かりづらいソースを書いてしまいました。。

書き直してみました。
しかし、同じくコンバートを使った変換部分にハンドルされていない例外と出てしまいます。
変換の仕方がおかしいのでしょうか、プログラム開始後30秒~50秒は想定している動作をしてくれますが、その後エラーになってしまいます。
画像

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 電卓_三号機
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool isFirst = true;
        decimal 値1 = 0;

        private void buttonNumber_Click(object sender, EventArgs e)
        {
            //四則演算が押されていた場合表示されている数字を記憶し消す
            if (記号 != 四則演算の記号.未定義 && isFirst) 
            {
                値1 = Convert.ToDecimal(textDisplay.Text);
                textDisplay.Text = "";
                isFirst = false;
            }

            //テキストボックスに数字を表示
            String text = textDisplay.Text + ((Button)sender).Text;

            //文字列 → 数値
            decimal d = Convert.ToDecimal(text);

            //数値 → 文字列(先端の0が消える)
            String text2 = d.ToString();

            textDisplay.Text = text2;
        }

        private void buttonClaer_Click(object sender, EventArgs e)
        {
            textDisplay.Text = "";
        }
        //小数点クリック
        private void buttonDot_Click(object sender, EventArgs e)
        {
            //小数点の重複チェック
            if (textDisplay.Text.IndexOf(".") >= 0) 
            {
                //既に小数点がある
                return;
            }
            textDisplay.Text = textDisplay.Text + ".";
        }

        enum 四則演算の記号
        {
            未定義,ADD, SUB, MUL, DIV
        };

        四則演算の記号 記号;

        private void buttonAdd_Click(object sender, EventArgs e)
        {
            記号 = 四則演算の記号.ADD;
            isFirst = true;
        }

        private void buttonSub_Click(object sender, EventArgs e)
        {
            記号 = 四則演算の記号.SUB;
            isFirst = true;
        }

        private void buttonMul_Click(object sender, EventArgs e)
        {
            記号 = 四則演算の記号.MUL;
            isFirst = true;
        }

        private void buttonDiv_Click(object sender, EventArgs e)
        {
            記号 = 四則演算の記号.DIV;
            isFirst = true;
        }

        private void buttonCalc_Click(object sender, EventArgs e)
        {
            //文字列 → 数値
            decimal 値2 = Convert.ToDecimal(textDisplay.Text);
            decimal 結果 = 0;
            switch (記号) 
            {
                case 四則演算の記号.ADD:
                    結果 = 値1 + 値2;
                    break;
                case 四則演算の記号.SUB:
                    結果 = 値1 - 値2;
                    break;
                case 四則演算の記号.MUL:
                    結果 = 値1 * 値2;
                    break;
                case 四則演算の記号.DIV:
                    結果 = 値1 / 値2;
                    break;
            }
            textDisplay.Text = 結果.ToString();
        }
    }
}

アバター
usao
記事: 1635
登録日時: 7年前

Re: 初投稿です。C#を使った電卓の作成で躓いています。

#4

投稿記事 by usao » 2ヶ月前

> コンバートを使った変換部分にハンドルされていない例外と出てしまいます。

変換できない文字列になってるから FormatException が投げられているんでしょう?
(だったら,こんなところで訊くよりも先に,まずは)
そのときに変換しようとした文字列の内容がどうなってるのかを見てみればよろしいのでは.

その時の文字列の内容すら示さずに「何か例外が出る」という話だけをしても,有効な情報が得られ難いだろうとは思いませんか?


●提案する問題解決の手順:

1.その例外が出る操作順序なりを確定させる.
2.その例外が出る操作を行う直前に,例外が出る場所あたりにブレークポイントでも仕掛けて,変換しようとしている文字列の内容が妥当であるかを見る.
3.妥当でないなら,なぜそんな内容の文字列になったのかを調べる.(再度初めから実行して,ハンドラ内を先頭からステップ実行してみるとかすればわかるのではないか?)
「妥当なのに(=変換できるべき内容の文字列をあたえているのに)例外が出る! 意味がわからん!」とかいう状態ならば,その具体情報を添えて訊くと良いのではないかと.

あしサーモン
記事: 3
登録日時: 2ヶ月前

Re: 初投稿です。C#を使った電卓の作成で躓いています。

#5

投稿記事 by あしサーモン » 2ヶ月前

確かにおっしゃる通りでした。。
どこが間違っているのかもわからないままの投げやりな質問でしたね。

問題解決の手順の提示ありがとうございます。
はじめたばかりで何もわからない状態で見よう見まねで書いているので、修正に時間がかかると思いますがもう一度修正を加えてきます。
アドバイスありがとうございます!

Meta3

Re: 初投稿です。C#を使った電卓の作成で躓いています。

#6

投稿記事 by Meta3 » 2ヶ月前

//テキストボックスに数字を表示
String text = textDisplay.Text + ((Button)sender).Text;

//文字列 → 数値
decimal d = Convert.ToDecimal(text);

ここで例外が発生するのだから text にdecimalに不適切な文字があるようです
((Button)sender).Text?

textのイミディエイト値を調べるとわかる(?text)

debugをすればわかります
(例外行にブレークポイント(F9)して実行(F5)…

Meta3

Re: 初投稿です。C#を使った電卓の作成で躓いています。

#7

投稿記事 by Meta3 » 2ヶ月前

それとMessageBox.Show(… でtextを表示しとおくとかLabelとか 一時的にForm.textに表示しておけば分かります

Meta3

Re: 初投稿です。C#を使った電卓の作成で躓いています。

#8

投稿記事 by Meta3 » 2ヶ月前

//テキストボックスに数字を表示
String text = textDisplay.Text + ((Button)sender).Text;

//◆ Debug用にForm1.Textに表示 ◆
this.Text = text;

//文字列 → 数値
decimal d = Convert.ToDecimal(text);

返信

“C言語何でも質問掲示板” へ戻る