カテゴリー
C

独習C#第3版 P276 Setクラスを作成する

C#のこーどならシンタックスハイライターが効きますか?

/* 
   例7-1 
 
   char型データ用のSetクラス
*/ 
using System;  
  
class Set {     
  char[] members; // この配列がセットの値を保持する

  // 実質的に読み取り専用の、自動実装する Length プロパティ 
  public int Length { get; private set; }

  // ヌルのセット(配列の実体がないセット)を作る
  public Set() {  
    Length = 0; 
  }

  // 指定されたサイズの領域を持つ空のセットを作る
  public Set(int size) {     
    members = new char[size]; // セットのためにメモリを確保
    Length = 0; // 実質的な要素はない
  }     
   
  // セットから別のセットを作る
  public Set(Set s) {     
    members = new char[s.Length]; // セットのためにメモリ確保    
    for(int i=0; i < s.Length; i++) members[i] = s[i];
    Length = s.Length; // 実質的な要素の数 
  }     
 
  // 読み取り専用のインデクサ
  public char this[int idx]{  
    get {  
      if(idx >= 0 & idx < Length) return members[idx];
      else return (char)0; 
    }  
  }  
 
  /* 引数で指定されたデータがセットの中に
     存在するかチェックする
     あればそのインデックスを返し、なければ-1を返す */ 
  int find(char ch) {  
    int i; 
     
    for(i=0; i < Length; i++)
      if(members[i] == ch) return i; 
 
    return -1; 
  }

  // ユニークな要素をセットに追加する
  public static Set operator +(Set ob, char ch)
  {

    // もし、セットの中にchと同じものが既に存在していた場合は、
    // 元のセットのコピーを返す
    if (ob.find(ch) != -1)
    {

      // 元のセットのコピーを返す
      return new Set(ob);

    } else { // 新しい要素を含む新しいセットを返す

      // 元のセットよりも、要素1つ分だけ大きいセットを新規作成する
      Set newset = new Set(ob.Length + 1);

      // 新しいセットに要素をコピーする 
      for (int i = 0; i < ob.Length; i++)
        newset.members[i] = ob.members[i];

      // Length プロパティを設定する
      newset.Length = ob.Length + 1;

      // 新しいセットに新しい要素を追加する
      newset.members[newset.Length - 1] = ch;

      return newset; // 新しいセットを返す
    }
  } 
 
  // セットから要素を取り除く
  public static Set operator -(Set ob, char ch) {   
    Set newset = new Set();
    int i = ob.find(ch); // もし見つからなければ、変数iは-1になる
 
    // 残りの要素をコピーする
    for(int j=0; j < ob.Length; j++)
      if(j != i) newset = newset + ob.members[j]; 
 
    return newset; 
  }     
 
  // 和集合
  public static Set operator +(Set ob1, Set ob2) {
    Set newset = new Set(ob1); // 1番目のセットをコピーする
 
    // 2番目のセットの要素を追加する
    for(int i=0; i < ob2.Length; i++)
        newset = newset + ob2[i]; 
 
    return newset; // 更新されたセットを返す
  }  
 
  // 差集合
  public static Set operator -(Set ob1, Set ob2) {
    Set newset = new Set(ob1); // 1番目のセットをコピーする 
 
    // 2番目のセットの要素を1番目のセットから引く 
    for(int i=0; i < ob2.Length; i++)
        newset = newset - ob2[i]; 
 
    return newset; // 更新されたセットを返す
  }  
}     
  
// セットクラスの使用例
class SetDemo {     
  static void Main() {     
    // ヌルのセットを作成する
    Set s1 = new Set();    
    Set s2 = new Set(); 
    Set s3 = new Set(); 
  
    s1 = s1 + 'A'; 
    s1 = s1 + 'B'; 
    s1 = s1 + 'C'; 
 
    Console.Write("s1 after adding A B C: ");  
    for(int i=0; i<s1.Length; i++)
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    s1 = s1 - 'B'; 
    Console.Write("s1 after s1 = s1 - 'B': ");  
    for(int i=0; i<s1.Length; i++)
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    s1 = s1 - 'A'; 
    Console.Write("s1 after s1 = s1 - 'A': ");  
    for(int i=0; i<s1.Length; i++)
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    s1 = s1 - 'C'; 
    Console.Write("s1 after s1 = s1 - 'C': ");  
    for(int i=0; i<s1.Length; i++)   
      Console.Write(s1[i] + " ");    
    Console.WriteLine("\n"); 
 
    s1 = s1 + 'A'; 
    s1 = s1 + 'B'; 
    s1 = s1 + 'C'; 
    Console.Write("s1 after adding A B C: ");  
    for(int i=0; i<s1.Length; i++)   
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    s2 = s2 + 'A'; 
    s2 = s2 + 'X'; 
    s2 = s2 + 'W'; 
 
    Console.Write("s2 after adding A X W: ");  
    for(int i=0; i<s2.Length; i++)
      Console.Write(s2[i] + " ");    
    Console.WriteLine(); 
 
    s3 = s1 + s2; 
    Console.Write("s3 after s3 = s1 + s2: ");  
    for(int i=0; i<s3.Length; i++)
      Console.Write(s3[i] + " ");    
    Console.WriteLine(); 
 
    s3 = s3 - s1; 
    Console.Write("s3 after s3 - s1: ");  
    for(int i=0; i<s3.Length; i++)
      Console.Write(s3[i] + " ");    
    Console.WriteLine("\n"); 
 
    s2 = s2 - s2;  // s2のクリア
    s2 = s2 + 'C'; // 逆の順番にABCを加える
    s2 = s2 + 'B'; 
    s2 = s2 + 'A'; 
 
    Console.Write("s1 is now: ");  
    for(int i=0; i<s1.Length; i++)
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    Console.Write("s2 is now: ");  
    for(int i=0; i<s2.Length; i++)
      Console.Write(s2[i] + " ");    
    Console.WriteLine(); 
 
    Console.Write("s3 is now: ");  
    for(int i=0; i<s3.Length; i++)
      Console.Write(s3[i] + " ");    
    Console.WriteLine(); 
   }     
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

inserted by FC2 system