(1)实验目的
通过该实验,让学生复习巩固C语言中的循环结构、循环控制条件、分支结构和数组/链表、函数的调用等有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。
(2)实验内容
通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。
(3)实验要求
从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能,每个集合中不允许有重复的元素。集合可以用数组也可以用链表存储。
实现交、并、差运算时,分别把代码写成函数的形式,即实现交运算的函数,实现并运算的函数,实现差运算的函数,在主函数中分别调用三个函数。
使用菜单形式对应各个操作,应允许用户反复查看结果,想结束程序时,输入负数结束,使其编成一个完整的小软件。菜单参考示例如下:
1—输入集合A和B
2—求集合A交B
3—求集合A并B
4—求集合A-B
退出,输入一个负数!
(4)验收/测试用例
输入: A={1,2,3,4,5} B={3,4,5,6,7}
要注意输入的过程中,每输入一个元素都要检查输入的这个元素是否和前面的元素重复,如果重复,要求用户重新输入当前元素。
验收测试时要测试这种重复的情况。
输出 A交B={3, 4, 5} A并B={1,2,3,4,5,6,7} A-B={1, 2}
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int showMain();
void input(vector<int> &, vector<int> &);
void input(vector<int> &);
bool checkDuplicated(const vector<int> &, int);
void setAnd(const vector<int> &a, const vector<int> &b);
void setIntersaction(const vector<int> &, const vector<int> &);
void SetDifference(const vector<int> &, const vector<int> &);
int main()
{
vector<int> a, b;
while (true)
{
int opt = showMain();
if (opt < 0)
break;
switch (opt)
{
case 1:
input(a, b);
break;
case 3:
setAnd(a, b);
break;
case 2:
setIntersaction(a, b);
break;
case 4:
SetDifference(a, b);
break;
default:
break;
}
}
}
int showMain()
{
cout << "1---输入集合A和B" << endl
<< "2---求集合A交B" << endl
<< "3---求集合A并B" << endl
<< "4---求集合A-B" << endl;
int selection;
cin >> selection;
return selection;
}
void input(vector<int> &v)
{
int n = 0;
while (cin >> n)
{
if (n < 0)
break;
if (checkDuplicated(v, n))
{
cout << "输入的值重复了,请重新输入!" << endl;
continue;
}
v.push_back(n);
}
cin.clear();
cin.sync();
}
void input(vector<int> &a, vector<int> &b)
{
cout << "请输入集合A:";
input(a);
sort(a.begin(), a.end());
cout << "请输入集合B:";
input(b);
sort(b.begin(), b.end());
}
bool checkDuplicated(const vector<int> &v, int n)
{
for (auto &&i : v)
if (i == n)
return true;
return false;
}
void setAnd(const vector<int> &a, const vector<int> &b)
{
static vector<int> setAnd;
size_t i = 0;
size_t j = 0;
while (i != a.size() && j != b.size())
{
if (a[i] <= b[j])
{
setAnd.push_back(a[i]);
if (a[i] == b[j])
j++;
i++;
}
else
setAnd.push_back(b[j++]);
}
while (i != a.size())
setAnd.push_back(a[i++]);
while (j != b.size())
setAnd.push_back(b[j++]);
for (auto &&i : setAnd)
cout << i << " ";
cout << endl;
}
void setIntersaction(const vector<int> &a, const vector<int> &b)
{
static vector<int> setI;
for (size_t i = 0; i < a.size(); i++)
{
for (size_t j = 0; j < b.size(); j++)
{
if (a[i] == b[j])
{
setI.push_back(a[i]);
j++;
break;
}
}
}
for (auto &&i : setI)
cout << i << " ";
cout << endl;
}
void SetDifference(const vector<int> &a, const vector<int> &b)
{
static vector<int> setD;
for (size_t i = 0; i < a.size(); i++)
if (!checkDuplicated(b, a[i]))
setD.push_back(a[i]);
for (auto &&i : setD)
cout << i << " ";
cout << endl;
}