标签:
1 /* 2 要求: 1. 定义一个整数集合类 Set,要求该类包含如下属性和操作: 3 属性: 4 ① 元素表属性 member[SETSIZE]:是从 0 … SETSIZE –1 范围内的整数中选出 的元素表,其中 SETSIZE 指定整数元素值和表中可以容纳的元素个数的范围, 5 例如,可以在类外定义: const int SETSIZE = 500;。 注意,元素表 member 的元素值只有两种状态(非 true 即 false)。如果元素 n 对应的元素表的元素值为真(true), 6 则表示 n 在集合中,即 n∈X 当且仅当 member[n] 为真。 例如,集合 X = {1,4,5,7}对应的元素表中,只有元素 member[1],member[4], member[5],member[7]为真, 7 而其余元素均为假。 8 操作: 9 ① 构造函数:构造 Set 类对象分两种情况: 10 ·如果不通过参数传递初值,则在集合对象的构造过程中,元素表 member 的各 个元素被缺省设置为 false,即空元素表。 11 ·如果将一个整型数组 a[]和数组的元素个数 n 作为参数传递初值,则在集合对象 的构造过程中,元素表中由数组 a[]的元素值作为下标的元素值被设置为 true, 12 而其他元素设置为 false。 13 ② 插入元素操作 Insert:通过参数将一个在 0 … SETSIZE –1 范围内的整数 n 插 入集合中,即 member[n] = true。 14 ③ 删除元素操作 Delete:通过参数将一个在 0 … SETSIZE –1 范围内的整数 n 从集合中删除,即 member[n] = false。 15 ④ 并集运算操作 operator+:将两个 Set 对象表示的整数集合进行并集运算,并返 回结果集合。 16 ⑤ 交集运算操作 operator*:将两个 Set 对象表示的整数集合进行交集运算,并返 回结果集合。 17 ⑥ 属于集合运算操作 operator^:判断一个整数元素是否属于一个指定的 Set 对象 表示的整数集合,并返回结果标志(非 true 即 false)。 18 被判断的整数元素和整数 集合通过参数传递给操作。 19 ⑦ 输出操作:通过标准输出流 cout,按集合的表示格式输出显示整数集合 20 */ 21 #include<iostream> 22 using namespace std; 23 class Set 24 { 25 int *member; 26 int SETSIZE;//存放数组a中最大的整型元素 27 int *a; 28 int an; 29 public: 30 Set() { a = 0; member = 0; } 31 Set(int n, int p[]); 32 Set(int n) { member = 0; a = new int[n]; } 33 void Insert(unsigned int n); 34 void Delete(unsigned int n); 35 int* geta() { return a; } 36 friend Set operator+(Set x, Set y);//并集 37 friend Set operator*(Set x, Set y);//交集 38 bool operator^(int op); 39 void showa(); 40 void showm(); 41 //~Set() { delete[]a; delete[]member; } 42 }; 43 bool Set::operator^(int op) 44 { 45 for (int i = 0; i < an; i++) 46 if (a[i] == op) 47 return true; 48 return false; 49 } 50 void Set::showa() 51 { 52 for (int i = 0; i < an; i++) 53 cout << a[i] << endl; 54 } 55 void Set::showm() 56 { 57 for (int i = 0; i < SETSIZE; i++) 58 cout << member[i] << endl; 59 } 60 Set::Set(int n, int p[]) 61 { 62 int max = p[0]; 63 for (int i = 0; i < n; i++) 64 if (p[i]>max) 65 max = p[i]; 66 SETSIZE = max + 1;//多一个放0 67 member = new int[SETSIZE]; 68 an = 0; 69 70 for (int i = 0; i < SETSIZE; i++) 71 member[i] = 0; 72 for (int i = 0; i < SETSIZE; i++) 73 for (int j =0; j < n; j++)//right 74 if (i == p[j]) 75 member[i] = 1; 76 for (int i = 0; i < SETSIZE; i++) 77 if (member[i]) 78 an++; 79 80 a = new int[an]; 81 int ai = 0; 82 for (int i = 0; i < SETSIZE; i++)//错误在这里 83 if (member[i]) 84 { 85 a[ai] = i; 86 ai++; 87 } 88 89 90 } 91 void Set::Insert(unsigned int n) 92 { 93 if (n <= SETSIZE) 94 member[n] = 1; 95 else 96 cout << "溢出错误!" << endl; 97 } 98 void Set::Delete(unsigned int n) 99 { 100 if (n <= SETSIZE) 101 member[n] = 0; 102 else 103 cout << "不存在你要删除的对象!" << endl; 104 } 105 Set operator+(Set x, Set y) 106 { 107 int suman = x.an + y.an; 108 int *tran = new int[suman]; 109 for (int i = 0; i < x.an; i++) 110 tran[i] = x.a[i]; 111 for (int i = x.an; i < suman; i++) 112 tran[i] = y.a[i - x.an]; 113 Set t(suman, tran); 114 //delete[]tran;//局部调用完了应该没有内存?? 115 return t; 116 } 117 Set operator*(Set x, Set y)//wrong 118 { 119 int minan; 120 x.an < y.an ? minan = x.an : minan = y.an; 121 int*p = new int[minan]; 122 int mi = 0; 123 for (int i = 0; i <x.an; i++) 124 for (int j = 0; j < y.an;j++) 125 if (x.a[i] = y.a[j]) 126 { 127 p[mi] = x.a[i]; 128 mi++; 129 } 130 int*np = new int[mi]; 131 for (int i = 0; i < mi; i++) 132 np[i] = p[i]; 133 //delete[]p;// 134 Set t(mi, np); 135 //delete[]np;// 136 return t; 137 } 138 void main() 139 { 140 int n; 141 cin >> n; 142 int *p = new int[n]; 143 for (int i = 0; i < n; i++) 144 cin >> p[i]; 145 Set A(n, p); 146 cout<<"判断"<<A.operator^(3)<<endl; 147 //delete[]p;// 148 cin >> n; 149 int *t = new int[n]; 150 for (int i = 0; i < n; i++) 151 cin >> t[i]; 152 cout << endl; 153 Set B(n, t); 154 //delete[]t;// 155 Set C=A+B; 156 C.showa(); 157 cout << endl; 158 Set D = A*B; 159 D.showa(); 160 161 }
标签:
原文地址:http://www.cnblogs.com/yuelien/p/5402204.html