R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

C#3.0の新機能を使ってみる(その4)

http://blogs.wankuma.com/rti/archive/2007/11/27/110508.aspx
C#3.0の新機能を使ってみる(その3)

http://blogs.wankuma.com/rti/archive/2007/11/21/109625.aspx
C#3.0の新機能を使ってみる(その2)

http://blogs.wankuma.com/rti/archive/2007/11/20/109453.aspx
C#3.0の新機能を使ってみる(その1)

http://blogs.wankuma.com/rti/archive/2007/11/19/109158.aspx
お疲れ様でした

・・・の続きです。
前回は足し算と引き算の2つのコードを書いてみました。


public static string CalcAdd(string value1, string value2) {
  // ループカウンタの最大値を取得
  var count = value1.Length > value2.Length ? value1.Length : value2.Length;

  var r  = String.Empty; // 計算結果を記録するための変数
  var n = 0m; // 次の位への連絡用変数
  for (var i = 0; i < count; ++i) {
    // 各位ごとに足し算を行う
    n = value1.GetOneDigit(i) + value2.GetOneDigit(i) + n;

    // 結果を 1 と 10 の位の値に分離。(10 → 1, 0)
    r =  (n % 10).ToString() + r; // 1 の位は、結果の文字列の右に付け加える
    n = Math.Floor(n / 10);  // 10 の位の値は、次の位で加算される
  }
  if (n > 0) r = n.ToString() + r;
  return r.TrimStart('0');
}

public static string CalcSub(string value1, string value2) {
  // ループカウンタの最大値を取得
  var count = value1.Length > value2.Length ? value1.Length : value2.Length;

  var r  = String.Empty; // 計算結果を記録するための変数
  var n = 0m; // 次の位への連絡用変数
  for (var i = 0; i < count; ++i) {
    // 各位ごとに引き算を行う
    var t = value1.GetOneDigit(i) - value2.GetOneDigit(i) - n;
    n = t < 0 ? t + 20: t; // 結果がマイナスなら、20を加算する

    // 結果を 1 と 10 の位の値に分離。(10 → 1, 0)
    r =  (n % 10).ToString() + r; // 1 の位は、結果の文字列の右に付け加える
    n = Math.Floor(n / 10);  // 10 の位の値は、次の位で減算される
  }
  if (n > 0) r = n.ToString() + r;
  return r.TrimStart('0');
}


赤字の部分を除いて同じ処理なのでメソッドアウトします。
異なる処理部分は、

ラムダ式

を使います。


public static string CalcAdd(string value1, string value2) {
  return Simplecalculation(value1, value2, (n, d1, d2) => n + d1 + d2);
}
public static string CalcSub(string value1, string value2) {
  return Simplecalculation(
    value1, value2,
    (n, d1, d2) => {
      var r = d1 - d2 - n;
      return r < 0 ? r + 20: r;
    }
  );
}
private static string Simplecalculation(string value1, string value2, Func<decimal, decimal, decimal, decimal> func){
  // ループカウンタの最大値を取得
  var count = Math.Max(value1.Length, value2.Length); // 今回は Math.Max を使ってみます

  var r  = String.Empty; // 計算結果を記録するための変数
  var n = 0m; // 次の位への連絡用変数
  for (var i = 0; i < count; ++i) {
    // 各位ごとに適切な演算を行う処理を委譲する
    n = func(n, value1.GetOneDigit(i), value2.GetOneDigit(i));

    // 結果を 1 と 10 の位の値に分離。(10 → 1, 0)
    r =  (n % 10).ToString() + r; // 1 の位は、結果の文字列の右に付け加える
    n = Math.Floor(n / 10);  // 10 の位の値は、次の位で減算される
  }
  if (n > 0) r = n.ToString() + r;
  return r.TrimStart('0');
}


こんな感じになります。
詳細は次回から少しずつ触れていこうかと思っています。

・・・(つづく)

投稿日時 : 2007年11月28日 13:24

Feedback

# hatfwypbSO 2011/12/13 18:23 http://www.d4women.net/alesse.php

Uh, well, explain me a please, I am not quite in the subject, how can it be?!...

タイトル
名前
Url
コメント