实验2

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

实验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<iostream>
  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<num1;i++)
  8         for(int j=0;j<num2;j++)
  9         {
 10             if(a[i]==b[j])
 11             {
 12                 c[num]=a[i];
 13                 num++;
 14             }                
 15         }
 16     for(int i=0;i<num;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<num1;i++)
 24     {
 25         m=0;
 26         for(int j=0;j<num2;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<num;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<num2;j++)
 48     {
 49         m=0;
 50         for(int i=0;i<num1;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<num;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<num1;i++)
 71         for(int j=0;j<num2;j++)
 72             {
 73                 if(a[i]==b[j])
 74                     {
 75                             a[i]=-1;
 76                             continue;
 77                     }
 78             
 79             }
 80     for(int i=0;i<num1;i++)
 81     for(int j=0;j<i;j++)
 82     if(a[j]==a[i])
 83     a[i]=-1;
 84     for(int i=0;i<num1;i++)
 85     if(a[i]!=-1)
 86     printf("%d ", a[i]);    
 87     
 88     for(int i=0;i<num2;i++)
 89     for(int j=0;j<i;j++)
 90     if(b[j]==b[i])
 91     b[i]=-1;
 92     for(int i=0;i<num2;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<N;i++)
101     {
102         scanf("%d", &a[i]);
103         num1=i;
104         if(a[i]<0)
105             break;
106     }
107     for(int i=0;i<N;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<num1;i++)
 5         c[i]=a[i];
 6     for(int j=0;j<num2;j++)
 7         c[j+num1]=b[j];--
    /*上面是为了让a,b两个数组都弄到c数组中*/
    /*下面的代码是用来查重*/
8 for (int i=0;i<num1+num2-1;i++) 9 for(int j=i+1;j<num1+num2;j++)// 10 { 11 if(c[i]==c[j]) 12 c[i]=-1; 13 } 14 for(int i=0;i<num1+num2;i++) 15 if(c[i]>=0) 16 { 17 printf("%d ",c[i]); 18 } 19 printf("\n"); 20 21 }

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

 

目录
相关文章
|
Web App开发 存储 C++
C++程序设计实验5
C++程序设计实验5
58 0
|
C++
C++程序设计实验6
C++程序设计实验6
83 0
|
C++
C++程序设计实验1
C++程序设计实验1
84 0
|
机器学习/深度学习 Serverless C++
C++程序设计实验2
C++程序设计实验2
227 0
|
C++
C++程序设计实验8
C++程序设计实验8
79 0
|
弹性计算 网络协议 Linux
实验1 常用网络命令-1
实验1 常用网络命令-1
213 0
|
Serverless Scala
Scala编程实验一
Scala编程实验一
195 0
|
关系型数据库 MySQL 索引
我做了一天的实验!
对记录加锁时,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间。但是,next-key lock 在一些场景下会退化成记录锁或间隙锁。 那到底是什么场景呢?今天,我们就以下面这个表来进行实验说明。
我做了一天的实验!
|
缓存 Linux
我做了个实验!
这次我们就以 malloc 动态内存分配为切入点,我在文中也做了小实验: • malloc 是如何分配内存的? • malloc 分配的是物理内存吗? • malloc(1) 会分配多大的内存? • free 释放内存,会归还给操作系统吗? • free() 函数只传入一个内存地址,为什么能知道要释放多大的内存?
我做了个实验!
|
存储
实验三
这个实验三顺序表的实现历经了从前天下午开始在实验室研究标准答案到昨天上午开始写代码并且大概今天才调试成功也是一把鼻涕一把泪的 实验3、顺序表的基本操作 (6学时) (1)实验目的 通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的强壮性,熟练掌握通过函数参数返回函数结果的办法。
1040 0