实验2

实验2、集合的交、并、差 (1学时)

(1)实验目的

通过该实验,进一步让学生熟练掌握循环结构、循环控制条件、分支结构和数组/链表基本操作的实现,掌握函数参数设定的有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。

(2)实验内容

通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能。集合可以用数组也可以用链表存储。

(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},B-A={6,7}

  1 #include
  2 using namespace std;
  3 #define N 1000
  4 void jiaoji(int a[N],int b[N],int num1,int num2)
  5 {
  6     int c[N],num=0;
  7     for(int i=0;i)
  8         for(int j=0;j)
  9         {
 10             if(a[i]==b[j])
 11             {
 12                 c[num]=a[i];
 13                 num++;
 14             }                
 15         }
 16     for(int i=0;i)
 17     printf("%d ",c[i]);
 18     printf("\n");
 19 }
 20 void acha(int a[N],int b[N],int num1,int num2)
 21 {
 22     int c[N],num=0,m;
 23     for(int i=0;i)
 24     {
 25         m=0;
 26         for(int j=0;j)
 27         {
 28             if(a[i]==b[j])
 29             {
 30                 m=1;
 31                 break;    
 32             }                
 33         }
 34         if(m==0)
 35         {
 36             c[num]=a[i];
 37             num++;
 38         }
 39     }
 40     for(int i=0;i)
 41     printf("%d ",c[i]);
 42     printf("\n");
 43 }
 44 void bcha(int a[N],int b[N],int num1,int num2)
 45 {
 46     int c[N],num=0,m;
 47     for(int j=0;j)
 48     {
 49         m=0;
 50         for(int i=0;i)
 51         {
 52             if(a[i]==b[j])
 53             {
 54                 m=1;
 55                 break;    
 56             }                
 57         }
 58         if(m==0)
 59         {
 60             c[num]=b[j];
 61             num++;
 62         }
 63     }
 64     for(int j=0;j)
 65     printf("%d ",c[j]);
 66     printf("\n");
 67 }
 68 void bingji(int a[N],int b[N],int num1,int num2)  
 69 {
 70     for(int i=0;i)
 71         for(int j=0;j)
 72             {
 73                 if(a[i]==b[j])
 74                     {
 75                             a[i]=-1;
 76                             continue;
 77                     }
 78             
 79             }
 80     for(int i=0;i)
 81     for(int j=0;j)
 82     if(a[j]==a[i])
 83     a[i]=-1;
 84     for(int i=0;i)
 85     if(a[i]!=-1)
 86     printf("%d ", a[i]);    
 87     
 88     for(int i=0;i)
 89     for(int j=0;j)
 90     if(b[j]==b[i])
 91     b[i]=-1;
 92     for(int i=0;i)
 93     if(b[i]!=-1)
 94     printf("%d ", b[i]);
 95 
 96 }
 97 int main()
 98 {
 99     int a[N],b[N],num1,num2;
100     for(int i=0;i)
101     {
102         scanf("%d", &a[i]);
103         num1=i;
104         if(a[i]<0)
105             break;
106     }
107     for(int i=0;i)
108     {
109         scanf("%d", &b[i]);
110         num2=i;
111         if(b[i]<0)
112             break;
113     }
114     jiaoji(a,b,num1,num2);
115     acha(a,b,num1,num2);//a-b的差
116     bcha(a,b,num1,num2);//b-a的差
117     bingji(a,b,num1,num2);//为什么不能放到115行 ??? 
118 
119     
120 } 

 求并集在我的CSDN博客上也有https://blog.csdn.net/acmer6s/article/details/80435334

CSDN上的并集是我上学期在学习C++时而用到的两种方法,但第二种方法中的并集查重是一个重点!

缺陷1:目前疑问就是bingji(a,b,num1,num2)为什么放到115行就发生bug,bug出现是如果移动到115行的话,那么a-b便会输出1,2,-1,-1,-1类似这个,可能是数组越界但是也不应该啊,下午上课问问老师吧

缺陷2:在集合输入中自己并没有用查重的功能,所以会出现集合中有相同的元素

 

----------------------------------------------------------

16:30:05刚才老师讲了一个求并集的方法解决了我的缺陷1

并集核心代码如下

 

 1 void bingji(int a[N],int b[N],int num1,int num2)
 2 {
 3     int c[N];
 4     for(int i=0;i)
 5         c[i]=a[i];
 6     for(int j=0;j)
 7         c[j+num1]=b[j];--
    /*上面是为了让a,b两个数组都弄到c数组中*/
    /*下面的代码是用来查重*/
8 for (int i=0;i1;i++) 9 for(int j=i+1;j)// 10 { 11 if(c[i]==c[j]) 12 c[i]=-1; 13 } 14 for(int i=0;i) 15 if(c[i]>=0) 16 { 17 printf("%d ",c[i]); 18 } 19 printf("\n"); 20 21 }

 刚才经过老师的讲解,我发现了我的并集是追求表现形式,先把两个数组的相同项标记出来,然后分别对两个数组各自查重,有重的都标记出来,最后分别输出没有标记的两个数组中的元素,但这实际上是还是两个集合,虽然输出的也是并集,但是思路逻辑上,我还是把它们当成两个数组来输出,而不符合题目的要求并集,这代表了一个集合,所以我第一种方法只是追求了形式的正确,而没有真正用并集的思想,一个集合,第二种方法是让他们合成一个集合是正确的

 

你可能感兴趣的:(实验2)