用c++实现正整数集合的交、并、差
程序员文章站
2022-05-22 19:22:18
...
用c++实现正整数集合的交、并、差
(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}
代码实现
(编译环境:vs2017)
#include "pch.h"
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int array01[50];
int array02[50];
//检查重复的方法
bool CheckRepeat(int array[], int newNumber)
{
int length = 50;
for (int i = 0; i < length; i++)
{
if (newNumber == array[i])
{
return false;
}
}
return true;
}
//交集
void IN(int array1[], int array2[],int length1,int length2)
{
int newLength = length1 > length2 ? length1 : length2;
int newArray[50];
int a = 0;
for (int i = 0; i < length1; i++)
{
if (!CheckRepeat(array2, array1[i]))
{
newArray[a++] = array1[i];
}
}
cout << "交集的结果为" << endl;
for (int i = 0; i < length1; i++)
{
if (newArray[i] <= 0)break;
cout << newArray[i] <<" ";
}
}
//并集
void Union(int array1[], int array2[],int length1,int length2)
{
int newLength = length1 + length2;
int newArray[100];
for (int i = 0; i < length1; i++)
{
newArray[i] = array1[i];
}
for (int i = 0,j=0; i < length2; i++)
{
if (CheckRepeat(array1, array2[i]))
{
newArray[length1 + j] = array2[i];
j++;
}
}
cout << "并集的结果为" << endl;
for (int i = 0; i < newLength; i++)
{
if (newArray[i] <= 0)break;
cout << newArray[i] << " ";
}
}
//差
void Difference(int array1[], int array2[],int length1,int length2)
{
int number = 0;
int array01[50];
for (int i = 0; i <length1; i++)
{
array01[i] = array1[i];
}
//以下是获取交集数组的过程
int newArray[50];
int a = 0;
for (int i = 0; i < length1; i++)
{
if (!CheckRepeat(array2, array1[i]))
{
newArray[a++] = array1[i];
}
}
//获取newArray为交集数组
for (int i = 0; i < length1; i++)
{
if (!CheckRepeat(newArray,array01[i]))
{
array01[i] = 0;
continue;
}
}
cout << "差的结果为" << endl;
for (int i = 0; i < length1; i++)
{
if (array01[i] > 0)
cout << array01[i] << " ";
}
}
void MAIN(int array1[],int array2[],int length1,int length2)
{
int inputNum=1;
system("cls");
while (inputNum != 0)
{
cout << "2---求集合A交B" << endl;
cout << "3---求集合A并B" << endl;
cout << "4---求集合A-B" << endl;
cout << "输入0---退出" << endl;
cin >> inputNum;
switch (inputNum)
{
case 2:
IN(array1, array2, length1, length2); break;
case 3:
Union(array1, array2, length1, length2); break;
case 4:
Difference(array1, array2, length1, length2); break;
default:
break;
}
cout << "输入数字回车跳转进入下一步" << endl;
cin >> inputNum;
system("cls");
}
}
int main()
{int nums1=0;
int nums2=0;
//第一个集合输入
while (true)
{
cout << "请输入第一个集合的元素个数" << endl;
cin >> nums1;
if (nums1 < 49 && nums1 > 0)
{
break;
}
else
cout << "我只支持0~50的,这样不行哦" << endl;
}
int i = 0;
while (true)
{
int num = 0;
cout << "请输入元素" << endl;
cin >> num;
if (i ==nums1-1)
{
cout << "已经够多了,容不下了" << endl;
cout << "程序输入结束!" << endl;
array01[i] = num;
break;
}
if(num<0)
{
cout << "程序输入结束!" << endl;
break;
}
array01[i] = num;
i++;
}
cout << "第一个集合如下" << endl;
for (int i = 0; i < nums1; i++)
{
cout << array01[i]<<" ";
}
//第二个集合输入
while (true)
{
cout << "请输入第二个集合的元素个数" << endl;
cin >> nums2;
if (nums2 < 49 && nums2 >= 0)
{
break;
}
else
cout << "我只支持0~50的,这样不行哦" << endl;
}
i = 0;
while (true)
{
int num = 0;
cout << "请输入元素" << endl;
cin >> num;
if (i == nums2-1)
{
cout << "已经够多了,容不下了" << endl;
cout << "程序输入结束!" << endl;
array02[i] = num;
break;
}
if (num < 0)
{
cout << "程序输入结束!" << endl;
break;
}
array02[i] = num;
i++;
}
cout << "第二个集合如下" << endl;
for (int i = 0; i < nums2; i++)
{
cout << array02[i] << " ";
}
MAIN( array01,array02, nums1, nums2);
}
运行页面部分截图
输入2: