第一个实验 集合的交、并差

本文介绍了一个C++实现的编程实验,涉及数组存储的集合操作,包括交集、并集和差集的计算。作者分享了编程过程中的挑战和解决方法,强调了代码清晰性和错误检查的重要性,并提供了详细的测试用例。程序中使用了cin和cout进行输入输出,实现了集合元素的重复检查。
摘要由CSDN通过智能技术生成

第一个实验 集合的交、并差

(1)实验目的
通过该实验,进一步让学生熟练掌握循环结构、循环控制条件、分支结构和数组/链表基本操作的实现,掌握函数参数设定的有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。
(2)实验内容
通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能。集合可以用数组也可以用链表存储。

程序可以运行,第一次写这个程序花了我整整2天时间,当时代码总会出现各种问题,和同学讨论过后终于能够运行起来。之后老师检查程序时又跳出来一些程序上的问题。程序健壮行不强,有些数据过不去。之后有和通过的同学进行了讨论,最终程序通过了老师的检查。之后我会陆陆续续更新数据结构这门课所有的代码作业。编写不易,留个赞吧

**小Tip:程序是自己写的话,老师会给的平时分更高哦!!**先读懂程序,按照程序写一边,能运行出来,搞懂每一步,能可以在老师的问题下回答出来,就算是自己写出来的。

(3)验收/测试用例
输入: 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}

以下是我的代码,因为我刚开始当时学习的时候也是不太熟悉编程的方法,**我每写一行代码都会加上一行注释,标明作用,所以代码真的很清晰很详细,**但是现在已经是编程比赛省奖选手了。
此外,我当时比较喜欢C艹里面的cin和cout我觉得比scanf和printf更加简单和方便(主要是好敲和不用考虑数据类型)
在这里插入图片描述

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
#define N 1000
void jiaoji(int a[],int b[],int num1,int num2)  //求交集函数 
{
	int c[N];//定义一个新的数组 
	int num,i,j;
	num = 0;
	for(i = 0;i < num1;i++)  //遍历一遍数组a中的元素 
	{
		for(j = 0;j < num2;j++)//遍历一遍数组b中的元素 
		{
			if(a[i] == b[j])  //当a中元素与b中元素相等时,将a中元素放入数组c中 
			{
				c[num] = a[i];
				num++;
			}
		}
		/*for(i = 0;i < num;i++) //输入交集数组 
		{
			cout<<a[i]<<"  ";
		}*/
	}
	for(i = 0;i < num;i++) //输入交集数组 
		{
			cout<<c[i]<<"  ";
		}
}

void achaji(int a[],int b[],int num1,int num2) //求a-b差集函数 
{
	int c[N]; //定义一个新的数组
	int num,m,i,j;
	num = 0;
	//m = 0;
	for(i = 0;i < num1;i++) //遍历一遍数组a中的元素 
	{
		m = 0;//将m的值进行重置 
		for(j = 0;j < num2;j++) //遍历一遍数组b中的元素 
		{
			if(a[i] == b[j] ) //当a中元素与b中元素相等时,令数组m等于-1,并跳出循环 
			{
				m = -1;
				break;
			}
		}
		if(m == 0) //若m不等于 -1,则将a中元素放入数组c中 ,数组长度(num1)+1 
		{
			c[num] = a[i];
			num++;
		}
	}
	for(i = 0;i < num;i++)//输入a-b差集数组 
	{
		cout<<c[i]<<"  ";
	}
}

void bchaji(int a[],int b[],int num1,int num2)//求b-a差集函数
{
	int c[N];//定义一个新的数组
	int num,m,i,j;
	num = 0;
	//m = 0;
	for(j = 0;j < num2;j++)//遍历一遍数组b中的元素 
	{
		m = 0;//每进行一次循环,对m进行一次重置 
		for(i = 0;i < num1;i++) //遍历一遍数组a中的元素 
		{
			if(b[j] == a[i])//当a中元素与b中元素相等时,令数组m等于-1,并跳出循环 
			{
				m = -1;
				break;
			}
		}
		if(m == 0)  //若m不等于 -1,则将b中元素放入数组c中 ,数组长度(num1)+1 
		{
			c[num] = b[j];
			num++;
		}
	}
	for(i = 0;i < num;i++)//输入b-a差集数组 
	{
		cout<<c[i]<<"  ";
	}
}

void bingji(int a[],int b[],int num1,int num2)//求并集函数 
{
	int c[N];//新建数组c
	int d[N]; 
	int i,j,num;
	num = 0;
	for(i = 0;i < num1;i++) //将数组a中的元素放入c中 
	{
		c[i] = a[i];
	}
	for(j = 0;j < num2;j++)//将数组b中的元素放入数组c中 
	{
		c[j + num1] = b[j];//将b中元素放到a的后面 
	}
	
	for(i = 0;i < num1 + num2 ;i++)//新数组进行查重 
	{
		//for(j = i+1;j < num1 + num2;j++)//当a中元素与b中元素相等时,令数组c中元素等于-1
		for(j = 0;j < i;j++)
		{
			if(c[i] == c[j])
			{
				c[i] = -1;
			}
		}
		if(c[i] != -1)  //如果c中元素不等于-1 
		{
			d[num] = c[i];//将c中不重复元素放入d中 
			num++;
		}
		/*for(i = 0;i < num1 + num2;i++)//遍历c中元素,若大于0则将该元素输出 
		{
			if(c[i] >= 0)
			{
				cout<<c[i]<<"  ";
			}
		}*/ 
	}
	for(i = 0;i < num;i++)//jiangd中元素输出 
		{
			
			cout<<d[i]<<"  ";
			
		}
}

int main( )
{
	int a[N],b[N];
	int i,j,num1,num2,n;cout<<"请输入数组A:"<<endl;
	for(i = 0;i < N;i++)//输入数组A 
	{
		cin>>a[i];
		num1 = i;//用num1记录i的值即数组长度 
		if(a[i] == -1)//如果输入-1则结束输入 但是在函数调用的时候,我令i小于num1,则在程序运行的时候就刚好将-1避开不参与集合之间的运算 
		{
			break;
		}
	}
	cout<<"输出此时数组长度:"<<num1<<endl;; 
	
	for(i = 0;i < num1;i++)//数组查重程序 
	{
		for(j = 0;j < i;j++)
		{
			if(a[i] == a[j])
			{
				cout<<"重复的数为:"<<a[i]<<endl;;
				cout<<"请输入一个新的数:";
				cin>>a[i];
				j = -1;
			}
		}
	}
	cout<<"数组A为:"<<endl;
	for(i = 0;i < num1;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	
	cout<<"请输入数组B:"<<endl;
   for(i = 0;i < N;i++)//输入数组AB
	{
		cin>>b[i];
		num2 = i;//用num1记录i的值即数组长度 
		if(b[i] == -1)//如果输入-1则结束输入 但是在函数调用的时候,我令i小于num1,则在程序运行的时候就刚好将-1避开不参与集合之间的运算
		{
			break;
		}
	}
	cout<<"输出此时数组长度:"<<num2<<endl;; 
	
	for(i = 0;i < num2;i++)//数组查重程序 
	{
		for(j = 0;j < i;j++)
		{
			if(b[i] == b[j])
			{
				cout<<"重复的数为:"<<b[i]<<endl;
				cout<<"请输入一个新的数:";
				cin>>b[i];
				j = -1;
			}
		}
	}
	cout<<"数组B为:"<<endl;
	for(i = 0;i < num2;i++)
	{
		cout<<b[i]<<" ";
	}
	
	do{
		system("cls");
	cout<<"*****************"<<endl;
	cout<<"1.求AB交集"<<endl;
	cout<<"2.求a-b差集"<<endl;
	cout<<"3.求b-a差集"<<endl;
	cout<<"4.求AB并集"<<endl;
	cout<<"5.输入一个负数退出菜单"<<endl;
	cout<<"*****************"<<endl;
	
	cout<<"请输入数字:"<<endl;
	cin>>n;
	switch(n)
	{
	case 1:jiaoji(a,b,num1,num2);//调用交集函数 
	break;
	cout<<endl;
	case 2:achaji(a,b,num1,num2);//调用a-b差集函数 
	break;
	cout<<endl;
	case 3:bchaji(a,b,num1,num2);//调用b-a差集函数 
	break;
	cout<<endl;
	case 4:bingji(a,b,num1,num2);//调用并集函数 
	break;
	cout<<endl;
	default :cout<<"请输入1~4的数字"<<endl;break;
	return 0;
    }
	cout<<"输入任意正数继续:"<<endl;
	cin>>n;
	}while(n > 0);
}

下面手把手演示一下数据的输入:
第一张图片和第二章图片测试的集合中重复元素的问题,因为集合中不能有重复的元素,但是你在程序输入时,可以输入重复元素,老师检查程序时可能会以此为数据,来证明你的问题有问题。但是这个查重程序是我和同学讨论过后改了好几遍的程序,没有问题
第一张图片和第二章图片测试的集合中重复元素的问题,因为集合中不能有重复的元素,但是你在程序输入时,可以输入重复元素,老师检查程序时可能会以此为数据,来证明你的问题有问题。但是这个查重程序是我和同学讨论过后改了好几遍的程序,没有问题!
正片开始:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
制作不易,看到这里点个赞吧
在这里插入图片描述

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henu-于笨笨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值