2009-07-13 9 views
0

中のstrcmp(STR1、STR2)機能を実装します。私は、次の宿題の問題を抱えているのC#

1は、関数strcmp()関数を実装することができる多くの方法があります。
str1(str1、str2)は、str1がstr2のアルファベット順にある場合は負の数を返し、str2がstr1のアルファベット順にある場合は両方が等しい場合は0を返します。次のように

はCで実装することができます。

int mystrcmp(const char *s1, const char *s2) 
{ 
    while (*s1==*s2) 
    { 
     if(*s1=='\0') 
      return(0); 
     s1++; 
     s2++; 
    } 
    return(*s1-*s2); 
} 

だから今は、.NETの方法で構築されたのいずれかを使用することなく、C#で、それを実装したいです。どうすればこれを達成できますか?

+4

アルファベット順にすることで、文化の違いを考慮していますか?なぜこれを実装したいのですか? CultureInfo.CompareInfoメンバ、CultureInfo.CurrentUICulture.CompareInfo.Compare(s1、s2)には、すでに完全に優れた実装があります。 –

+0

私はc#を使用していくつかのc型操作を行う方法を学びたいと思っています。 アルファベット順に 'AB'が 'AC'より大きいこれらの2つの文字列が使用されている場合、結果は負の数 – Learner

答えて

0

ポインタの表記ではなく、配列の添字表記を使用してCで記述します。

インデックスを増分します。

+0

になるはずですが...アルファベット順のチェック方法を混乱させます – Learner

5

.NETまたはBCLで​​使用できるメソッドを使用しないようにするには、stringのLengthプロパティを使用しないでください(プロパティは1つまたは2つのメソッドで実装されるため)。同様の理由から、インデクサープロパティも避けなければなりません。

あなたはかなり詰まっています。

数字のコードが人間にとって重要な並べ替え順序を示すことを前提とします。そうではありません - C#の文字コードはUnicodeです。Unicodeはアルファベットが多く、西洋のアルファベット(低い値)とそれ自身の追加文字(高い値)が混在しています。

したがって、大量の文字セット情報を独自のコードで再現できるので、Unicodeから2文字を注文する方法、またはBCLで​​メソッドを呼び出す必要があります。

2

片道はこのようになります。コードをコメントに基づいて編集された...

public static int mystrcmp(string st1, string st2) 
{ 
    int iST1 = 0, iST2=0; 
    for (int i = 0; i < (st1.Length > st2.Length ? st1.Length : st2.Length); i++) 
    { 
     iST1 += (i >= st1.Length ? 0 : st1[i]) - (i >= st2.Length ? 0 : st2[i]); 
     if (iST2 < 0) 
     { 
      if (iST1 < 0) 
       iST2 += iST1; 
      if (iST1 > 0) 
       iST2 += -iST1; 
     } 
     else 
     { 
      iST2 += iST1; 
     } 
    } 
    return iST2; 
} 
+0

このステートメントはどのように 'st1 [i] - st2 [i]; ? – Learner

+0

@Learner - あなたはCでそれを正確に書くことができます、それは同じことを意味します。その関数の中で妥当でないCの唯一のものはst1.lengthです.strlen(st1)は、文字列が 'const char *'になると仮定します。 –

+0

これは.. st1 [i] - st2 [i]を意味します。 ASCIIのchar値の減算を行います.... これは 'A' - 'B'に負の値を与えます..... – Learner

2

.NET Reflectorのコピーを取得し、可能System.StringとSystem.Globalization.CompareInfoの比較()/のCompareTo()メソッドは、mscorlibで実装されているか検査します。

1

これを行う場合はchar*を使用しないでください。 Char*はUnicodeで、asciiが必要です。

ベストベットはbyte*です。次に、現在持っているアルゴリズムを使用することができます。

1

2つの文字列の間にLevenshtein distanceを計算します。それを返す...ここ

dot net Pearlsからのレーベンシュタイン距離の.NET実装である:

using System; 

/// <summary> 
/// Contains approximate string matching 
/// </summary> 
static class LevenshteinDistance 
{ 
    /// <summary> 
    /// Compute the distance between two strings. 
    /// </summary> 
    /// <param name=s>The first of the two strings.</param> 
    /// <param name=t>The second of the two strings.</param> 
    /// <returns>The Levenshtein cost.</returns> 
    public static int Compute(string s, string t) 
    { 
     int n = s.Length; 
     int m = t.Length; 
     int[,] d = new int[n + 1, m + 1]; 

     // Step 1 
     if (n == 0) 
     { 
      return m; 
     } 

     if (m == 0) 
     { 
      return n; 
     } 

     // Step 2 
     for (int i = 0; i <= n; d[i, 0] = i++) 
     { 
     } 

     for (int j = 0; j <= m; d[0, j] = j++) 
     { 
     } 

     // Step 3 
     for (int i = 1; i <= n; i++) 
     { 
      //Step 4 
      for (int j = 1; j <= m; j++) 
      { 
       // Step 5 
       int cost = (t[j - 1] == s[i - 1]) ? 0 : 1; 

       // Step 6 
       d[i, j] = Math.Min(
        Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), 
        d[i - 1, j - 1] + cost); 
      } 
     } 
     // Step 7 
     return d[n, m]; 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     Console.WriteLine(LevenshteinDistance.Compute("aunt", "ant")); 
     Console.WriteLine(LevenshteinDistance.Compute("Sam", "Samantha")); 
     Console.WriteLine(LevenshteinDistance.Compute("flomax", "volmax")); 
    } 
} 
関連する問題