第一个实验 集合的交、并差
(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);
}
下面手把手演示一下数据的输入:
第一张图片和第二章图片测试的集合中重复元素的问题,因为集合中不能有重复的元素,但是你在程序输入时,可以输入重复元素,老师检查程序时可能会以此为数据,来证明你的问题有问题。但是这个查重程序是我和同学讨论过后改了好几遍的程序,没有问题!
正片开始:
制作不易,看到这里点个赞吧