/*
C# A Beginner's Guide
By Schildt
Publisher: Osborne McGraw-Hill
ISBN: 0072133295
*/
using System;
using MyTypes.Set;
/*
Project 12-1
Put the Set class into its own namespace.
*/
namespace MyTypes.Set {
class Set {
char[] members; // this array holds the set
int len; // number of members
// Construct a null set.
public Set() {
len = 0;
}
// Construct an empty set of a given size.
public Set(int size) {
members = new char[size]; // allocate memory for set
len = 0; // no members when constructed
}
// Construct a set from another set.
public Set(Set s) {
members = new char[s.len]; // allocate memory for set
for(int i=0; i < s.len; i++) members[i] = s[i];
len = s.len; // number of members
}
// Implement read-only Length property.
public int Length {
get{
return len;
}
}
// Implement read-only indexer.
public char this[int idx]{
get {
if(idx >= 0 & idx < len) return members[idx];
else return (char)0;
}
}
/* See if an element is in the set.
Return the index of the element
or -1 if not found. */
int find(char ch) {
int i;
for(i=0; i < len; i++)
if(members[i] == ch) return i;
return -1;
}
// Add a unique element to a set.
public static Set operator +(Set ob, char ch) {
Set newset = new Set(ob.len + 1); // make a new set one element larger
// copy elements
for(int i=0; i < ob.len; i++)
newset.members[i] = ob.members[i];
// set len
newset.len = ob.len;
// see if element already exists
if(ob.find(ch) == -1) { // if not found, then add
// add new element to new set
newset.members[newset.len] = ch;
newset.len++;
}
return newset; // return updated set
}
// Remove an element from the set.
public static Set operator -(Set ob, char ch) {
Set newset = new Set();
int i = ob.find(ch); // i will be -1 if element not found
// copy and compress the remaining elements
for(int j=0; j < ob.len; j++)
if(j != i) newset = newset + ob.members[j];
return newset;
}
// Set union.
public static Set operator +(Set ob1, Set ob2) {
Set newset = new Set(ob1); // copy the first set
// add unique elements from second set
for(int i=0; i < ob2.len; i++)
newset = newset + ob2[i];
return newset; // return updated set
}
// Set difference.
public static Set operator -(Set ob1, Set ob2) {
Set newset = new Set(ob1); // copy the first set
// subtract elements from second set
for(int i=0; i < ob2.len; i++)
newset = newset - ob2[i];
return newset; // return updated set
}
}
}
// Demonstrate the Set class.
public class SetDemo10 {
public static void Main() {
// construct 10-element empty Set
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 a1 = 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; // clear s2
s2 = s2 + 'C'; // add ABC in reverse order
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();
}
}