初心者のためのC#プログラミング本格入門32 - 繰り返し使用できるメソッドを考えよう
前回「自由に計算式を指定して計算するプログラム」を作りましたが一つ問題があります。その問題とは、2つの数値しか考慮されていない事です。これでは「 1 + 2 + 3 」の様な式は計算できません。実力アップを目指して、この問題を解決してみましょう。
先ず原因を考えてみます。原因はMainメソッド内でGetValueメソッドを2回読みだしているからです。従って、GetValueメソッドが任意の回数呼び出せるようにすれば問題解決の第1歩となります。
早速GetValueメソッドの改良を考えます。GetValueメソッドを任意の回数呼び出せるようにするには、エラー処理の部分を変えなくてはなりません。そうしないと、プログラムが強制終了されてしまいます。エラー処理を呼び出し側が判断する様にすればこの問題は解決できます。
しかし、ここで新しい問題が生じました。どうやって呼び出し元へ伝えればよいでしょうか?今まで学習してきた事を踏まえれば、メソッドが返せばよいという事になります。しかしこの方法は、3つの値を返す事を意味します。どうすればよいのでしょうか?
答えは簡単です。System.Tuple型は3つの値を保持できるように指定できます。例えば今回の場合、bool(数値の有無)、int(取り出した数値)、string(残りの式)の3つを指定するSystem.Tuple<bool, int, string>を使えば良いという事になります。
それを踏まえて、新しいGetValueを定義します。新しいGetValueとその使い方を示したプログラムを掲載します。
class Test
{
static void Main()
{
string inputValue = " 0 + 1 + 2 + 3 + 4 + 5 ";
string message = "文字列" + inputValue + "に含まれる数字は";
System.Console.WriteLine( message );
bool loopFlag = true;
do
{
System.Tuple<bool, int, string> value =
GetValue( inputValue );
loopFlag = value.Item1;
if ( loopFlag == true )
{
System.Console.Write( value.Item2 + " " );
inputValue = value.Item3;
}
} while ( loopFlag == true );
System.Console.WriteLine("です。");
}
static System.Tuple<bool, int, string> GetValue(
string inputValue )
{
//各種変数を準備
int startIndex = 0;
int endIndex = inputValue.Length;
bool startFlag = false;
//数字の初めと終わりを記録
for ( int i = 0; i < inputValue.Length; i++ )
{
if ( System.Char.IsDigit( inputValue[ i ] ) )
{
//初めて数字が出たら位置を記録
if ( startFlag == false )
{
startIndex = i;
startFlag = true;
}
}
else if ( startFlag == true )
{
//数字が途切れたら位置を記録してループ終了
endIndex = i;
break;
}
}
//数値を取り出す
int count = endIndex - startIndex;
string outputValueString =
inputValue.Substring( startIndex, count );
int outputValue = 0;
bool success =
int.TryParse( outputValueString, out outputValue );
if ( success == false )
{
//数字がない!
System.Tuple<bool, int, string> result =
new System.Tuple<bool, int, string>(
false, 0, inputValue );
return result;
}
//取り出した数値以外の文字列を取得
string remain = inputValue.Remove( startIndex, count );
//結果を返す
System.Tuple<bool, int, string> result1 =
new System.Tuple<bool, int, string>(
true, outputValue, remain );
return result1;
}
}
System.Tuple<bool, int, string>を使っている部分以外は以前と同じです。ちょっとした変更でメソッドが使える範囲が変化する事が分かります。なおこのGetValueメソッドは、int型のTryParseメソッドと合わしてTryValueと改名した方がよいでしょう。何故ならばGetValueという名前は、使う人に必ず値が取得できるとの誤解を与える恐れがあるからです。プログラミングは名前の付け方が大切です。
次は取得した任意の数値を保持する方法を知る必要があります。その方法は次回解説します。