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 #include <crtdbg.h>
23 using namespace std;
24 class Set
25 {
26 int *member;
27 int SETSIZE;//存放数组a中最大的整型元素
28 int *a;
29 int an;
30 public:
31 Set() { a = 0; member = 0; }
32 Set(int n, int p[]);
33 Set(int n) { member = 0; a = new int[n]; }
34 void Insert(unsigned int n);
35 void Delete(unsigned int n);
36 int* geta() { return a; }
37 friend Set operator+(Set x, Set y);//并集
38 friend Set operator*(Set x, Set y);//交集
39 bool operator^(int op);
40 void showa();
41 void showm();
42 void Delete() { delete[]a; delete[]member; }
43 //~Set() { delete []a; delete []member; }//两个友元函数中定义了实例对象,由编译器析构的话,对象的内存不存在,
44 //计算得出的集合也就无法输出
45 };
46 bool Set::operator^(int op)
47 {
48 for (int i = 0; i < an; i++)
49 if (a[i] == op)
50 return true;
51 return false;
52 }
53 void Set::showa()
54 {
55 for (int i = 0; i < an; i++)
56 cout << a[i] << endl;
57 }
58 void Set::showm()
59 {
60 for (int i = 0; i < SETSIZE; i++)
61 cout << member[i] << endl;
62 }
63 Set::Set(int n, int p[])
64 {
65 int max = p[0];
66 for (int i = 0; i < n; i++)
67 if (p[i]>max)
68 max = p[i];
69 SETSIZE = max + 1;//多一个放0
70 member = new int[SETSIZE];
71 an = 0;
72
73 for (int i = 0; i < SETSIZE; i++)
74 member[i] = 0;
75 for (int i = 0; i < SETSIZE; i++)
76 for (int j = 0; j < n; j++)//right
77 if (i == p[j])
78 member[i] = 1;
79 for (int i = 0; i < SETSIZE; i++)
80 if (member[i])
81 an++;
82
83 a = new int[an];
84 int ai = 0;
85 for (int i = 0; i < SETSIZE; i++)//错误在这里,已改正
86 if (member[i])
87 {
88 a[ai] = i;
89 ai++;
90 }
91 //delete[]p;
92
93 }
94 void Set::Insert(unsigned int n)
95 {
96 if (n <= SETSIZE)
97 member[n] = 1;
98 else
99 cout << "溢出错误!" << endl;
100 }
101 void Set::Delete(unsigned int n)
102 {
103 if (n <= SETSIZE)
104 member[n] = 0;
105 else
106 cout << "不存在你要删除的对象!" << endl;
107 }
108 Set operator+(Set x, Set y)
109 {
110 int suman = x.an + y.an;
111 int *tran = new int[suman];
112 for (int i = 0; i < x.an; i++)
113 tran[i] = x.a[i];
114 for (int i = x.an; i < suman; i++)
115 tran[i] = y.a[i - x.an];
116 Set t(suman, tran);
117 return t;
118 }
119 Set operator*(Set x, Set y)
120 {
121 int minan;
122 x.an < y.an ? minan = x.an : minan = y.an;
123 int*p = new int[minan];
124 int mi = 0;
125 for (int i = 0; i <x.an; i++)
126 for (int j = 0; j < y.an; j++)
127 if (x.a[i] == y.a[j])
128 {
129 p[mi] = x.a[i];
130 mi++;
131 }
132
133 int*np = new int[mi];
134 for (int i = 0; i < mi; i++)
135 np[i] = p[i];
136 //delete[]p;//嗯,在函数体中,应该调用完毕就撤销了内存吧?
137 Set t(mi, np);
138 return t;
139 }
140 int main()
141 {
142 int n;
143 cin >> n;
144 int *p = new int[n];
145 for (int i = 0; i < n; i++)
146 cin >> p[i];
147 Set A(n, p);
148 cout << "判断" << A.operator^(3) << endl;
149 //delete[]p;//成功人肉delete
150 cin >> n;
151 int *t = new int[n];
152 for (int i = 0; i < n; i++)
153 cin >> t[i];
154 cout << endl;
155 Set B(n, t);
156 //delete[]t;//成功人肉delete
157 Set C = A + B;
158 C.showa();
159 cout << endl;
160 Set D = A*B;
161 D.showa();
162 //A.Delete();
163 //B.Delete();
164 //C.Delete();
165 //D.Delete();
166
167 _CrtDumpMemoryLeaks();//这个函数不干活啊= =,莫非不是输出使用?
168 return 0;
169 }