C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 指定した文字が数値かどうかを判断


(過去ログ 138 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■81378 / inTopicNo.1)  指定した文字が数値かどうかを判断
  
□投稿者/ riiiya (6回)-(2016/09/12(Mon) 22:13:51)

分類:[.NET 全般] 

visual c# 初心者です。
現在visualstudio2008を使って電卓もどき?を作成しております。
指定した文字が数値かどうか判断するのに、char.isnumberメソッドを使ったらいいのは分かったのですが、
いまいち使い方がわからないためご教授頂きたいです。
処理と致しましては、テキストボックスに入力した計算式をボタン押した後、ラベルに表示するという感じです。
ただ、四則演算の優先は考えないとのことです。(例、10+20×2=60(左から順に計算))
で、どうしてもわからない処理がありわかる方よろしくお願い致します。


1.(1+1)を入力しボタンを押して計算を行う。
1.指定した文字が数値かどうか判断するメソッドを使用する(char.isnumber(value,i))
2.入力式分ループさせ、1文字目の数値を保持、2文字目である演算子を別の変数に保持、3文字目である数値を別の変数に保持する
3.合計値用変数に(左辺+右辺)を代入する

2.1桁+1桁の四則演算を行う
1.演算子の区分で計算するメソッドを作成する(引数、左辺、右辺、演算子 戻り値、計算結果)

すいませんが、この2つの処理のコードを教えて頂きたいです。
かなり調べたのですが初心者すぎて全然わかりませんでした。
よろしくお願い致します。
引用返信 編集キー/
■81380 / inTopicNo.2)  Re[1]: 指定した文字が数値かどうかを判断
□投稿者/ もりお (19回)-(2016/09/12(Mon) 23:28:01)
2016/09/12(Mon) 23:44:30 編集(投稿者)
No81378 (riiiya さん) に返信
こんな感じかしら

void test()
{
    String value = "1+1";
    int left = 0;
    int right = 0;
    char operatorName = '\0';
    
    for (int i = 0; i < value.Length; i++)
    {
        if (char.IsNumber(value, i))
        {
            if (i == 0)
            {
                left = int.Parse(value[i].ToString());
            }
            else if (i == 2)
            {
                right = int.Parse(value[i].ToString());
            }
        }
        else if (i == 1)
        {
            operatorName = value[i];
        }
    }

    int result = calculate(left, right, operatorName);
}

int calculate(int left, int right, char operatorName)
{
    if (operatorName == '+')
    {
        return left + right;
    }
    else
    {
        return 0;
    }
}

引用返信 編集キー/
■81382 / inTopicNo.3)  Re[1]: 指定した文字が数値かどうかを判断
□投稿者/ 魔界の仮面弁士 (898回)-(2016/09/13(Tue) 08:58:48)
No81378 (riiiya さん) に返信
> ただ、四則演算の優先は考えないとのことです。(例、10+20×2=60(左から順に計算))

優先度を考えても良い(10+20*2=50)のだとしたら、こういう手も。


private void Form1_Load(object sender, EventArgs e)
{
  textBox1.Text = "10+20*2";
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
  try
  {
    var calc = new DataTable("CALC").Compute(textBox1.Text, null);
    label1.Text = calc.ToString();
    label1.ForeColor = SystemColors.WindowText;
    label1.BackColor = Color.Transparent;
  }
  catch (Exception ex)
  {
    label1.Text = ex.Message;
    label1.ForeColor = Color.Yellow;
    label1.BackColor = Color.Red;
  }
}
引用返信 編集キー/
■81383 / inTopicNo.4)  Re[1]: 指定した文字が数値かどうかを判断
□投稿者/ 魔界の仮面弁士 (899回)-(2016/09/13(Tue) 09:56:50)
No81378 (riiiya さん) に返信
> 2.1桁+1桁の四則演算を行う
1 桁同士の計算が完成した後は、
2 桁以上の計算に着手すると思いますが、
その場合の注意点を:


> 1.指定した文字が数値かどうか判断するメソッドを使用する(char.isnumber(value,i))
Char.IsNumber は、「数字」の判定には使えますが、
それだけでは『数値』の判定にはなりません。

たとえば、"-12.4" という文字列が渡された場合を考えてみます。
'-' や '.' は『数値』の一部ですが、「数字」ではありませんよね。


もし、文字列から『数値』にするのであれば、
decimal.TryParse メソッドを使うのがお奨めです。

TextBox の内容を演算子単位で区切るなどして、どこからどこまでが
一つの数値であるのかを事前に切り出しておく必要はありますけれどね。
引用返信 編集キー/
■81388 / inTopicNo.5)  Re[2]: 指定した文字が数値かどうかを判断
□投稿者/ riiiya (7回)-(2016/09/14(Wed) 06:35:45)
No81380 (もりお さん) に返信
> 2016/09/12(Mon) 23:44:30 編集(投稿者)
>

>ありがとうございます。
引用返信 編集キー/
■81389 / inTopicNo.6)  Re[2]: 指定した文字が数値かどうかを判断
□投稿者/ riiiya (8回)-(2016/09/14(Wed) 06:46:13)
No81383 (魔界の仮面弁士 さん) に返信



ありがとうございます。
この問題の続きなのですが、
3.
2桁+2桁の四則演算を行う
4.
演算子が2つ存在する式の1桁の四則演算を行う(例、1+2−3)
5.
複数桁の混合計算を行う。(例、一桁+ 二桁 − 一桁)

も全然わかりません。
よろしければ、1と2を含めたコードを書いてもらえないでしょうか?
よろしくお願い致します。

引用返信 編集キー/
■81390 / inTopicNo.7)  Re[3]: 指定した文字が数値かどうかを判断
□投稿者/ Jitta (212回)-(2016/09/14(Wed) 08:53:44)
No81389 (riiiya さん) に返信

> この問題の続きなのですが、
> 3.
> 2桁+2桁の四則演算を行う
> 4.
> 演算子が2つ存在する式の1桁の四則演算を行う(例、1+2−3)
> 5.
> 複数桁の混合計算を行う。(例、一桁+ 二桁 − 一桁)
>
> も全然わかりません。
> よろしければ、1と2を含めたコードを書いてもらえないでしょうか?
> よろしくお願い致します。
>
課題は自分でするべきです。
苦労したことは長く覚えていますが、
苦労しないことはすぐ忘れます。
ここは課題を代わりにやってもらうところではないので、
そういうことを望んでいるなら他のところへ。

なぜ、いきなり、「桁数を指定しない電卓」ではなく、
1桁と1桁の計算だったのでしょうか。
そこから考え方を広げていくためです。
コードをもらったときに、そういう発展への考え方も失っています。
これ以上失うものを増やさないことを勧めます。
引用返信 編集キー/
■81391 / inTopicNo.8)  Re[3]: 指定した文字が数値かどうかを判断
□投稿者/ 魔界の仮面弁士 (901回)-(2016/09/14(Wed) 09:08:56)
No81389 (riiiya さん) に返信
> よろしければ、1と2を含めたコードを書いてもらえないでしょうか?

質問ではなく、作成依頼に変わってきたということは、
学習目的というわけでは無く、目的が達せられれば良いのでしょうか…?

計算が目的なら、 No81382 で一発ですよ。

// answer1 = 22
object answer1 = new DataTable().Compute("8+17-3", null);

// answer2 = 78.50
object answer2 = new DataTable().Compute("5*5*3.14", null);


学習目的だとしたら、コードそのものを書いては意味が無いので手順だけ示します。


たとえば、「542+1-81」という演算式があったとして、それを
先頭から一文字ずつ解析し、かつ、演算子は左から順に処理するという条件が付く課題なら、

 (1) decimal 型の変数 answer と val を、共に 0 にリセット。answer = val = 0;
 (2) 0文字目…'5' は数字。 val = val * 10 + decimal.Parse("5"); // 0から5になる
 (3) 1文字目…'4' は数字。 val = val * 10 + decimal.Parse("4"); // 5から54になる
 (4) 2文字目…'2' は数字。 val = val * 10 + decimal.Parse("2"); // 54から542になる
 (5) 3文字目…'+' は演算子。加算処理を準備。 answer = val; val = 0;
 (6) 4文字目は'1' は数字。 val = val * 10 + decimal.Parse("1"); // 0から1になる
 (7) 5文字目は'-' は演算子。減算処理を準備。先の加算を実行。answer += val; val = 0;
 (8) 6文字目は'8' は数字。 val = val * 10 + decimal.Parse("8"); // 0から8になる
 (9) 7文字目は'1' は数字。 val = val * 10 + decimal.Parse("1"); // 8から81になる
 (10) 文字列終端。先の減算を実行。answer -= val;

の手順で処理する事で、answer = 462 という結果を導き出せます。
引用返信 編集キー/
■81392 / inTopicNo.9)  Re[4]: 指定した文字が数値かどうかを判断
□投稿者/ Jitta (213回)-(2016/09/14(Wed) 09:44:37)
https://msdn.microsoft.com/ja-jp/library/system.string.split.aspx
これ
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -