题目描述
集合是由一个或多个确定的元素所构成的整体。集合的运算有并、交、相对补等。
集合A和集合B的交集:由属于A且属于B的相同元素组成的集合。
集合A和集合B的并集:由所有属于集合A或属于集合B的元素所组成的集合。
集合B关于集合A的相对补集,记做A-B:由属于A而不属于B的元素组成的集合。
假设集合A={10,20,30},集合B={1,10,50,8}。则A与B的并是{10,20,30,1,50,8},A与B的交是{10},B关于A的相对补集是{20,30}。
定义整数集合类CSet,属性包括:集合中的元素个数n,整型指针data存储集合中的元素。
主函数输入集合A、B的数据,计算集合的并、交、相对补。
可根据题目,为CSet类添加需要的成员函数。
方法有:重载输出,按样例格式输出集合中的元素。
重载+运算符,求集合A和集合B的并集,并返回结果集合。 重载-运算符,求集合B关于集合A的相对补集,并返回结果集合。 重载*运算符,求集合A和集合B的交集,并返回结果集合。
输入
测试次数
每组测试数据两行,格式如下:
第一行:集合A的元素个数和元素
第二行:集合B的元素个数和元素
输出
每组测试数据输出如下:
第一行:集合A
第二行:集合B
第三行:A和B的并
第四行:A和B的交
第五行:B关于A的相对补集 与 A关于B的相对补集的并,即(A-B)+(B-A)
每组测试数据间以空行分隔。
样例输入 Copy
2
3 10 20 30
4 10 1 2 3
5 100 2 3 4 -10
6 -34 12 2 4 90 100
样例输出 Copy
A:10 20 30
B:10 1 2 3
A+B:10 20 30 1 2 3
A*B:10
(A-B)+(B-A):20 30 1 2 3
A:100 2 3 4 -10
B:-34 12 2 4 90 100
A+B:100 2 3 4 -10 -34 12 90
A*B:100 2 4
(A-B)+(B-A):3 -10 -34 12 90
1 #include<iostream>
2 using namespace std;
3 class cset
4 {
5 private:
6 int n;
7 int* date;
8 public:
9 cset(int a)
10 {
11 n = a; date = new int[n];
12 }
13 void intput();
14 void output();
15 friend void operator+(cset&, cset&);
16 friend cset operator-(cset&, cset&);
17 friend void operator*(cset&, cset&);
18 };
19 void cset::intput()
20 {
21 for (int i = 0; i < n; i++)
22 {
23 int q;
24 cin >> q;
25 *(date + i) = q;
26 }
27 }
28 void cset::output()
29 {
30 for (int i = 0; i < n; i++)
31 {
32 cout << *(date + i) << " ";
33 }
34 }
35 void operator+(cset& a, cset& b)
36 {
37 for (int i = 0; i < a.n; i++)
38 {
39 cout << a.date[i] << " ";
40 }
41 for (int j = 0; j < b.n; j++)
42 {
43 int s = 0;
44 for (int i = 0; i < a.n; i++)
45 {
46 if (b.date[j] == a.date[i])
47 s++;
48 }
49 if (s == 0)
50 cout << b.date[j] << " ";
51 }
52 }
53 void operator*(cset& a, cset& b)
54 {
55 for (int j = 0; j < a.n; j++)
56 {
57 int s = 0;
58 for (int i = 0; i < b.n; i++)
59 {
60 if (a.date[j] == b.date[i])
61 s++;
62 }
63 if (s)
64 cout << a.date[j] << " ";
65 }
66 }
67 cset operator-(cset& a, cset& b)
68 {
69 int s = 0;
70 int ch[20] = { 0 };
71 for (int j = 0; j < a.n; j++)
72 {
73 int x = 0;
74 for (int i = 0; i < b.n; i++)
75 {
76 if (a.date[j] == b.date[i])
77 x++;
78 }
79 if (x == 0)
80 {
81 ch[s] = a.date[j];
82 s++;
83 }
84 }
85 cset q1(s);
86 for (int i = 0; i < s; i++)
87 {
88 q1.date[i] = ch[i];
89 }
90 return q1;
91 }
92 int main()
93 {
94 int num;
95 cin >> num;
96 for (int i = 0; i < num; i++)
97 {
98 int a;
99 cin >> a;
100 cset c1(a);
101 c1.intput();
102 int b;
103 cin >> b;
104 cset c2(b);
105 c2.intput();
106 cout << "A:";
107 c1.output();
108 cout << endl;
109 cout << "B:";
110 c2.output();
111 cout << endl;
112 cout << "A+B:";
113 c1 + c2;
114 cout << endl;
115 cout << "A*B:";
116 c1* c2;
117 cout << endl;
118 cout << "(A-B)+(B-A):";
119 cset x1 = c1 - c2, x2 = c2 - c1;
120 x1 + x2;
121 cout << endl;
122 cout << endl;
123 }
124 }
要点:new,友元函数,运算符的重载
字符串排序(30分)
题目内容:
有5个字符串,首先将它们按照字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。
输入格式:
5个字符串,用回车分隔
输出格式:
输出一个字符串:按5个字符串中字符个数由小到大排序,每个字符串后面有一个空格;再分别取出每个字符串的第三个字母合并成一个新的字符串输出,若少于三个字符的输出空格
输入样例:
test1234
123test
cumt
think
apples
输出样例:
cumt think apples 123test test1234
concatenate string:mip3s
1 #include<string>
2 using namespace std;
3 int main()
4 {
5 string p[5];
6 string box;
7 char a[5];
8 int i,j;
9 for(i=0;i<5;i++)
10 cin>>p[i];
11 for(i=4;i>0;i--)
12 {
13 for(j=0;j<i;j++)
14 {
15 if(p[j+1].size()<p[j].size())
16 {
17 box=p[j];
18 p[j]=p[j+1];
19 p[j+1]=box;
20 }
21 }
22 }
23 for(i=0;i<5;i++)
24 cout<<p[i]<<" ";
25 cout<<endl<<"concatenate string:";
26 for(i=0;i<5;i++)
27 {
28 if(p[i][2]=='\0') cout<<" ";
29 else cout<<p[i][2];
30 }
31 }
要点:字符串数组的表示