数据结构 实验1 集合的交、并、差

(1)实验目的

通过该实验,让学生复习巩固C语言中的分支结构、循环结构、数组、链表、函数的调用等有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。

(2)实验内容

通过键盘,分别输入集合A和B中的数据元素,要求数据元素类型为整数类型,输出两个集合的交、并、差。

(3)实验要求

a)从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能,每个集合中不允许有重复的元素。集合可以用数组存储,也可以用链表存储。

b)实现交、并、差运算时,分别把代码写成函数的形式,即实现交运算的函数,实现并运算的函数,实现差运算的函数,在主函数中分别调用三个函数。

c)使用菜单形式对应各个操作,应允许用户反复查看结果,想结束程序时,输入负数结束,使其编成一个完整的小软件。菜单参考示例如下:

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<iostream>
using namespace std;
int menu1();
int menu2(int i);//多级菜单 

void shuru();
void jiao();
void bing();
void jian();//功能函数 

int a[100],b[100];
int n=0,m=0,g=0;//定义全局变量

int main()
{
	int a=0;
	while(a>=0)
	{
		a=menu2(menu1());
	}
}
int menu1()
{
	int i;
	cout<<"**************************************"<<endl;
	cout<<"**1---输入集合A和B                  **"<<endl;
	cout<<"**2---求集合A交B                    **"<<endl;
	cout<<"**3---求集合A并B                    **"<<endl;
	cout<<"**4---求集合A-B                     **"<<endl;
	cout<<"**       退出,输入一个负数!       **"<<endl;
	cout<<"**请您选择(输入数字):"<<endl;
	cin>>i;
	return i;
} 
int menu2(int i)
{
	switch(i)
	{
		case 1:shuru();break;
		case 2:jiao();break;
		case 3:bing();break;
		case 4:jian();break;
		default:cout<<"程序已退出.......";break; 
	}
	return i;
}
void shuru()
{
	char k,l;
	cout<<"请输入集合a"<<endl;
	for(n;k!='\n';n++)
	{
		cin>>a[n];
		k=getchar();
	}
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			if(a[i]==a[j])
			{
				cout<<"错误...集合a中元素重复......"<<endl;
			    return; 
			}
		}
	}
	cout<<"请输入集合b"<<endl;
	for(m;l!='\n';m++)
	{
		cin>>b[m];
		l=getchar();
	}
	for(int i=0;i<m;i++)
	{
		for(int j=i+1;j<m;j++)
		{
			if(b[i]==b[j])
			{
				cout<<"错误...集合b中元素重复......"<<endl;
			    return; 
			}
		}
	}
	g=1;
}
void jiao()
{ 
    if(g==0)
    {
    	cout<<"请先输入ab集合的值"<<endl;
		return; 
	}
    cout<<"ab两个集合的交集为:"<<endl; 
    for(int i=0;i<n;i++)
    {
    	for(int j=0;j<m;j++)
    	{
    		if(a[i]==b[j])
    		cout<<a[i]<<" ";
		}
	}
	cout<<endl;
}
void bing()
{
	if(g==0)
    {
    	cout<<"请先输入ab集合的值"<<endl;
		return; 
	}
	int temp;
	int c[n+m];
	for(int i=0;i<n;i++)
	c[i]=a[i];
	for(int i=n;i<n+m;i++)
	c[i]=b[i-n];//将两个集合组合成一个数组 
	for(int i=1;i<n+m;i++)
	{
		for(int j=0;j<n+m-i;j++)
		{
			if(c[j]>c[j+1])
			{
				temp=c[j];
				c[j]=c[j+1];
				c[j+1]=temp;
			}
		}
	} //冒泡排序
	cout<<"ab两个集合的并集为:"<<endl; 
	for(int i=0;i<n+m;i++)
	{
		if(c[i]!=c[i+1])
		cout<<c[i]<<" ";
	}
	cout<<endl;
}
void jian()
{
	if(g==0)
    {
    	cout<<"请先输入ab集合的值"<<endl;
		return; 
	}
	cout<<"a集合减b集合的结果为:";
	for(int i=0;i<n;i++)
	{
		int x=0;
		for(int j=0;j<m;j++)
		{
			if(a[i]==b[j])
			x=1;
		}
		if(x==0)
		cout<<a[i]<<" ";
	} 
	cout<<endl;
}

代码仅作参考 切勿照搬 避免查重QAQ

Guess you like

Origin blog.csdn.net/qq_64628470/article/details/126643893