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

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

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

Re[3]: 電卓プログラムでの四則演算


(過去ログ 178 を表示中)

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

■101999 / inTopicNo.1)  電卓プログラムでの四則演算
  
□投稿者/ goz (1回)-(2023/05/25(Thu) 19:28:00)

分類:[C#] 

C#初心者ですがよろしくお願いします。

C#で電卓で四則演算ができるアプリを作っております。

通常の括弧の計算はデータテーブルに入れて計算をしているのですが、下記のような()を省略した計算をがうまくいきません。

A(B+C)

(A+B)(C+D)

(A+B)C

現状は省略した箇所に*を置換して処理をしております。

hug = hug.Replace(")(",")*(");
hug = hug.Replace(@"\d(", @"\d*(");
hug = hug.Replace(@")\d", @")*\d");

上2つはうまくいくのですが、一番下がうまくいきません。
なにかアドバイスを頂けるとたかります。

引用返信 編集キー/
■102000 / inTopicNo.2)  Re[1]: 電卓プログラムでの四則演算
□投稿者/ 伝説のカレー (110回)-(2023/05/25(Thu) 20:45:05)
No101999 (goz さん) に返信

String.Replaceでは正規表現を使えないような…
hugが独自のクラスとも考えられますけど
標準ライブラリでやるならこうじゃないですかね

static void Main(string[] args)
{
  Console.WriteLine(replace("2(3+5)"));
  Console.WriteLine(replace("(2+3)(5+7)"));
  Console.WriteLine(replace("(2+3)5"));
}

static string replace(string src)
{
  var dst = src;
  dst = Regex.Replace(dst, @"\)\(", @")*(");
  dst = Regex.Replace(dst, @"(\d)\(", @"$1*(");
  dst = Regex.Replace(dst, @"\)(\d)", @")*$1");
  return dst;
}

引用返信 編集キー/
■102002 / inTopicNo.3)  Re[2]: 電卓プログラムでの四則演算
□投稿者/ goz (3回)-(2023/05/26(Fri) 11:39:32)
No102000 (伝説のカレー さん) に返信

アドバイス有難うございます。

早速試してみたのですが、反映されませんでした。

独自の変数名で申し訳ありません。

全体のコードはこんな感じです。

namespace cal
{

public partial class mainfm : Form
{

StringBuilder fml = new StringBuilder();//計算式用
DataTable dt = new DataTable();//データテーブル用
string hug;//()置換用一時格納


public mainfm()
{
InitializeComponent();
}

private void btent_Click(object sender, EventArgs e)
{

//前数値のクリア
fml.Clear();
dt.Clear();

      //テキスト移動
hug = txfml.Text;

//略式計算のチェック ループ予定 処理後ブレイク

hug = hug.Replace(")(",")*(");
hug = hug.Replace(@"\d(", @"\d*(");
hug = hug.Replace(@")\d", @")*\d");

fml.Append(hug);


try
{
//デシマル型に変化して計算
txans.Text = Convert.ToDecimal(dt.Compute(fml.ToString(), "")).ToString();
}

catch
{
//誤入力の確認
txans.Text = "式に誤りがあります。";
}
}


}
}
引用返信 編集キー/
■102003 / inTopicNo.4)  Re[3]: 電卓プログラムでの四則演算
□投稿者/ furu (209回)-(2023/05/26(Fri) 13:45:55)
No102002 (goz さん) に返信
> ■No102000 (伝説のカレー さん) に返信
> 早速試してみたのですが、反映されませんでした。
> 独自の変数名で申し訳ありません。
伝説のカレーさんが書かれているように
String.Replaceは正規表現が使えません。

> 上2つはうまくいくのですが、一番下がうまくいきません。
真ん中もうまくいっていないと思います。

hug.ReplaceのReplaceはstringクラスのReplaceメソッドです。
Regex.Replace(hug, )はRegexクラスのReplaceメソッドです。

Regex.Replaceを使ってやってみてください。
引用返信 編集キー/
■102011 / inTopicNo.5)  Re[3]: 電卓プログラムでの四則演算
□投稿者/ WebSurfer (2698回)-(2023/05/26(Fri) 18:41:37)
No102002 (goz さん) に返信

DataTable.Compute メソッドを使って起算する際ユーザーが * を省略することがあるので、
ユーザーが入力した計算対象の文字列に * を追加する、例えば、

1. "2(3+4)" ⇒ "2*(3+4)"
2. "(1+2)(3+4)" ⇒ "(1+2)*(3+4)"
3. "(1+2)3" ⇒ "(1+2)*3"

のようにしたいのですよね?

であれば、正規表現を勉強して使えるようになりましょう。正規表現を使う以外に現実的な
解決策はないと思います。

上の 2 については、質問者さんがやっているように String.Replace メソッドでもなんとか
なるかもしれませんが、1, 3 はお手上げです。

2 の場合でも、) と ( の間に空白を許すとそこで破綻します。

具体例は、Regex.Replace メソッドを使うと、

Replace(String, String, String)
https://learn.microsoft.com/ja-jp/dotnet/api/system.text.regularexpressions.regex.replace?view=netframework-4.8#system-text-regularexpressions-regex-replace(system-string-system-string-system-string)

以下のようにできます。

using System;
using System.Data;
using System.Text.RegularExpressions;

namespace ConsoleAppDataTableCompute
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var table = new DataTable();

            string s1 = Rewrite("2 (3 + 4)");
            string s2 = Rewrite("(1 + 2) (3 + 4)");
            string s3 = Rewrite("(1 + 2) 3");

            object result1 = table.Compute(s1, "");
            object result2 = table.Compute(s2, "");
            object result3 = table.Compute(s3, "");

            Console.WriteLine($"{s1} = {result1}");
            Console.WriteLine($"{s2} = {result2}");
            Console.WriteLine($"{s3} = {result3}");
        }

        static string Rewrite(string input)
        {
            string output = Regex.Replace(input, @"\)\s*\(", ")*(");
            output = Regex.Replace(output, @"(?<val>\d+)\s*\(", @"${val}*(");
            output = Regex.Replace(output, @"\)\s*(?<val>\d+)", @")*${val}");
            return output;
        }
    }
}

結果は:

2*(3 + 4) = 14
(1 + 2)*(3 + 4) = 21
(1 + 2)*3 = 9

.NET の正規表現については、自分的には以下の記事が非常に分かりやすかったので紹介
しておきます。タイトルに「ASP.NET の・・・」とついてますが .NET 全般に有効です。

ASP.NET の正規表現
https://learn.microsoft.com/ja-jp/previous-versions/dotnet/articles/ms972966(v=msdn.10)?redirectedfrom=MSDN

上のサンプルコードの、* とか + は「量指定子」、\d とか \s は「定義済みの Set 
Metacharacters」、?<val> とか ${val} は「高度なトピック」のセクションを見てく
ださい。

引用返信 編集キー/
■102012 / inTopicNo.6)  Re[3]: 電卓プログラムでの四則演算
□投稿者/ WebSurfer (2699回)-(2023/05/26(Fri) 18:54:18)
No102002 (goz さん) に返信

No102011 のリンクの URL ですが、ここは URL の文字列に ( と ) は受け付けないよう
なので、張り直しておきます。

Replace(String, String, String)
https://learn.microsoft.com/ja-jp/dotnet/api/system.text.regularexpressions.regex.replace?view=netframework-4.8#system-text-regularexpressions-regex-replace%28system-string-system-string-system-string%29

ASP.NET の正規表現
https://learn.microsoft.com/ja-jp/previous-versions/dotnet/articles/ms972966%28v=msdn.10%29?redirectedfrom=MSDN

引用返信 編集キー/
■102014 / inTopicNo.7)  Re[4]: 電卓プログラムでの四則演算
□投稿者/ goz (4回)-(2023/05/26(Fri) 19:38:01)
No102011 (WebSurfer さん) に返信

アドバイス有難うございます。

正規表現のところ確認させていただき、無事に修正することができました。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -