数据结构课程设计_集合运算(完整).
- 格式:doc
- 大小:258.73 KB
- 文档页数:24
#include<iostream.h>#include<stdlib.h>#include <stdio.h>template <class T>class node{public:node(){link=NULL;}node(T e,node* next){data=e;link=next;}T data;node<T> *link;};template<class T>class set{node<T> * head;public:set(){head=NULL;}~set();set(set<T> & a);void sethead(node<T>* p){head=p;}node<T>* gethead(){return head;}void operator =(set<T> a);void create();set<T> &jiao(set<T> &set1);private:void output(ostream &out);friend ostream &operator<<(ostream &out,set<T> &q); };template <class T>void set<T>::create (){node<T> *p,*q;p=NULL;q=NULL;head=NULL;T e;char c;cout<<"输入数据?(y/n)"<<endl;while ((c=getchar())=='\n');while (tolower(c)!='n'){cin>>e;p=new node<T>(e,NULL);p->link=head;head=p;cout<<"输入数据?(y/n)"<<endl;while ((c=getchar())=='\n');}}template <class T>set<T>::~set (){node<T> *p;p=head;while (head){p=head->link;delete head;head=p;}}template <class T>void set<T>::output (ostream &out){node<T> *p=head;while (p){out<<p->data<<' ';p=p->link;}out<<endl;}template <class T>set<T>::set(set<T> &a){node<T> *q,*h1=NULL;q=a.gethead();while (q){h1=new node<T>(q->data,h1);}head=h1;}template <class T>set<T> &set<T>::jiao (set<T> &set1){node<T> *p,*q,*head1=NULL;p=head;while (p){q=set1.gethead();while(q){if (p->data!=q->data){q=q->link;}else{break;}}if (q!=NULL){head1=new node<T>(p->data,head1);}p=p->link;}p=head;while (head){p=head->link;delete head;head=p;}head=head1;return *this;}template <class T>void set<T>::operator = (set<T> a){node<T> *p=head;while (head){p=head->link;delete head;head=p;}node<T> *q;q=a.gethead();while (q){head=new node<T>(q->data,head);}}template<class T>ostream &operator<<(ostream &out,set<T> &q) {q.output(out);return out;}void main(){set<int> a,b;cout<<"输入a集合数据:"<<endl;a.create();cout<<a;cout<<"输入b集合数据:"<<endl;b.create();cout<<b;cout<<"计算交:"<<endl;cout<<a.jiao (b);}。
集合的基本运算课程设计一、课程目标知识目标:1. 让学生掌握集合的基本运算概念,包括并集、交集、差集和补集。
2. 使学生能够理解和运用集合的运算法则,正确进行集合运算。
3. 让学生理解集合运算在数学及现实生活中的应用。
技能目标:1. 培养学生运用集合运算解决问题的能力,提高逻辑思维和分析能力。
2. 培养学生运用数学语言准确描述集合运算过程,提高表达和沟通能力。
情感态度价值观目标:1. 激发学生对集合运算的兴趣,培养数学学习的积极性。
2. 培养学生合作学习、共同探讨的良好学习习惯,增强团队协作意识。
3. 使学生认识到集合运算在解决实际问题中的价值,提高对数学实用性的认识。
课程性质分析:本课程为数学学科的基础内容,是中学数学的重要组成部分。
集合的基本运算对于培养学生的逻辑思维、抽象思维和解决问题能力具有重要意义。
学生特点分析:本课程面向初中年级学生,该阶段学生具有一定的数学基础,但逻辑思维和抽象思维能力尚需提高。
学生好奇心强,喜欢探索新知识,但学习自觉性有待加强。
教学要求:1. 注重启发式教学,引导学生主动参与课堂,激发学习兴趣。
2. 结合实际例子,讲解集合运算的原理和应用,提高学生的理解能力。
3. 设计丰富的课堂练习,巩固所学知识,提高学生的运用能力。
4. 关注学生个体差异,因材施教,使每个学生都能在课程中收获成长。
二、教学内容1. 集合的基本概念复习:回顾集合的定义、元素的性质以及集合的表示方法。
2. 并集的定义与运算:介绍并集的概念,讲解如何求两个集合的并集,包括图形表示和符号表示。
3. 交集的定义与运算:阐述交集的含义,通过实例演示如何进行集合的交集运算。
4. 差集的定义与运算:解释差集的概念,举例说明如何计算两个集合的差集。
5. 补集的定义与运算:引入补集的概念,讨论在全集给定的情况下如何找到集合的补集。
6. 集合运算的性质:总结并讲解集合运算的基本性质,如交换律、结合律等。
7. 集合运算的应用:通过实际例题,展示集合运算在解决实际问题中的应用。
数据结构与数据库实验仅供参考实验一集合的表示及运算实验名称:集合的表示及运算专业:电气工程姓名:学号:集合的表示及运算一、实验要求1.程序的功能:实现集合的交、并、判断相等运算。
2.输入输出的要求:设计的数据结构应有利于表示任意个数元素组成的集合。
3.测试数据。
(1) {a, b, c}, {b, c, d}(2) {a, b,c}, {x, y}(3) { }, {x, y}(4) {a, x, b}, {a, x, b}二、概要设计1.采用的数据结构的定义及主要功能模块的功能:在本实验中,数据的存储采用数组连续存储方式。
由于本实验相对简单,功能相对较少,只是针对数组进行交并等基础性操作,所以本实验中只采用了函数模板,这样比结构体、类以及类模板都更加简洁、易懂,也更有利于实现对多种数据类型的数据进行操作。
而且,为了满足设计的数据结构应有利于表示任意个数元素组成的集合,在本实验中采用由用户自己输入所需存储空间的最大长度,动态分配所需存储空间。
由于含有动态生成的数据成员,必须自定义析构函数以释放动态分配的内存,本实验中的析构函数为Delete(T*,T*)。
字符串的比较采用string类2、各个函数模板的声明及其功能如下:1、判断集合是否相等的运算:template<typename T>void deng_array(T*A,T*B,int A_mm,int B_mm);//A、B为需要进行判断是否相等的数组,A_mm、B_mm 分别为数组A、B的最大存储空间,由用户在输入数组数据时确定并输入,算法根据用户输入的数据动态建立相应的存储空间。
以下各形式参量的意义均与此相同。
2、集合的交运算:template<typename T>void jiao_array(T*A,T*B,int A_mm,int B_mm);3、集合的并运算:template<typename T>void bing_array(T*A,T*B,int A_mm,int B_mm);4、析构函数:template<typename T>void Delete(T*A,T*B);//释放动态分配的内存5、字符串的交运算template <typename T>string jiao_string(T & A,T &B);6、字符串的并运算template <typename T>string jiao_string(T & A,T &B);7、判断字符串是否相等:采用string中的’=‘if(A==B)cout<<"EQUAL"<<endl;cout<<"NOT EQUAL"<<endl;三、详细设计1、各模块的流程图:1、判断集合是否相等的运算:2、集合的交运算:3、集合的并运算:4、析构函数:释放动态分配的内存:delete[]A;delete[]B;5、字符串的交运算6、字符串的并运算四、调试分析1、在本实验中,集合的数据类型可以实现字符型、整型,用户可根据系统提示进行选择。
实验报告实验课程:数据结构实验项目:实验一集合的并交差运算专业:计算机科学与技术班级:姓名:学号:指导教师:目录一、问题定义及需求分析(1)实验目的(2)实验任务(3)需求分析二、概要设计:(1)抽象数据类型定义(2)主程序流程(3) 模块关系三、详细设计(1)数据类型及存储结构(2)模块设计四、调试分析(1)调试分析(2)算法时空分析(3)经验体会五、使用说明(1)程序使用说明六、测试结果(1)运行测试结果截图七、附录(1)源代码一、问题定义及需求分析(1)实验目的设计一个能演示集合的并、交、差运算程序。
(2)实验任务1)采用顺序表或链表等数据结构。
2)集合的元素限定为数字和小写英文字母。
(3)需求分析:输入形式为:外部输入字符串;输入值限定范围为:数字和小写英文字母;输出形式为:字符集;程序功能:计算两个集合的交、并、差以及重新输入集合功能;二、概要设计:(1)抽象数据类型定义:线性表(2)主程序流程:调用主菜单函数初始化两个线性表作为集合给两个集合输入数据输出集合数据元素信息另初始化两个线性表创建选择功能菜单界面通过不同选项调用不同功能函数在每个功能函数里面加结束选择功能,实现循环调用功能菜单计算完毕退出程序;(3)模块关系:差运算并运算交运算新建集合结束/返回结束三、详细设计抽象数据类型定义:typedef struct{ElemType *elem;int length;int listsize;}SqList;存储结构:顺序表;模块1-在顺序表的逻辑为i的位置插入新元素e的函数;算法如下:/**在顺序表的逻辑为i的位置插入新元素e的函数**/Status ListInsert_Sq(SqList &L,int i,ElemType e){ElemType *newbase,*p,*q;if(i < 1 || i > L.length + 1) return 0; //i的合法值为(1 <= i <= L.length_Sq(L) + 1)if(L.length >= L.listsize){ //当前储存空间已满,增加分配newbase = (ElemType *)realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(ElemType));if(!newbase) exit(-1); //储存分配失败L.elem = newbase; //新基址L.listsize += LISTINCREMENT; //增加储存容量}q = &(L.elem[i - 1]); //q为插入位置for(p = &(L.elem[L.length - 1]); p >= q; --p)(p + 1) = p; //插入位置及之后的元素往右移q = e; //插入e++L.length; //表长加1return 1;}模块二在顺序线性表L中查找第1个与e满足compare()的元素位序,若找到,则返回其在L中的位序,否则返回0算法如下:/**在顺序线性表L中查找第1个与e满足compare()的元素位序,若找到,则返回其在L中的位序,否则返回0**/int LocateElem_Sq(SqList L,ElemType e,Status(* compare)(ElemType,ElemType)){ElemType *p;int i;i = 1; //i的初值为第1个元素的位序p = L.elem; //p的初值为第1个元素的储存位置while(i <= L.length && !(* compare)(*p++,e))++i; //从表L中的第一个元素开始与e比较,直到找到L中与e相等的元素时返回该元素的位置if(i <= L.length) return i; //若i的大小小于表长,则满足条件返回ielsereturn 0; //否则,i值不满足条件,返回0}模块三集合交运算算法如下:/**求集合的交集的函数**/void Mix_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0; //将表Lc的长度设为0for(i = 1; i <= La.length; i++){ //依次查看表La的所有元素elem = La.elem[i-1]; //将表La中i位置的元素赋值给elemif(LocateElem_Sq(Lb,elem,Equal)) //在表Lb中查找是否有与elem相等的元素ListInsert_Sq(Lc,Lc.length+1,elem); //将表La与Lb 中共同的元素放在Lc中}}模块四集合并运算算法如下:/**求集合的并集的函数**/void Union_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length=0; //将表Lc的长度初设为0for(i = 0; i < La.length; i++) //先将表La 的元素全部复制到表Lc中Lc.elem[Lc.length++]=La.elem[i];for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1]; //依次将表Lb 的值赋给elemif(!LocateElem_Sq(La,elem,Equal)) //判断表La 中是否有与elem相同的值ListInsert_Sq(Lc,Lc.length+1,elem); //若有的话将elem放入表Lc中}}模块五集合的差运算算法如下:/**求集合的差集函数**/void Differ_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0;for(i = 1; i <= La.length; i++){elem = La.elem[i-1]; //把表La 中第i个元素赋值给elemif(!LocateElem_Sq(Lb,elem,Equal)) //判断elem在表Lb中是否有相同的元素ListInsert_Sq(Lc,Lc.length+1,elem); //若有,则把elem放入表Lc中,否则,就不存放}for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1]; //把表Lb 中第i个元素赋值给elemif(!LocateElem_Sq(La,elem,Equal)) //判断elem在表La中是否有相同的元素ListInsert_Sq(Lc,Lc.length+1,elem); //若有,则把elem放入表Lc中,否则,就不存放}}四、调试分析问题分析及解决:首先,在编写程序时没有设置线性表的初始长度,导致集合元素输入错误;然后通过#define LIST_INIT_SIZE 100和#define LISTINCREMENT 10解决;时空分析:int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))时间复杂度为O(n);Status ListInsert_Sq(SqList &L,int i,ElemType e) 时间复杂度为O(n);void Union_Sq(SqList La,SqList Lb,SqList &Lc) 时间复杂度为O(m*n);void Mix_Sq(SqList La,SqList Lb,SqList &Lc) 时间复杂度为O(m*n);void Differ_Sq(SqList La,SqList Lb,SqList &Lc) 时间复杂度为O(2*m*n);改进设想:当同时求两个以上的结合间的运算是需要先进性两个集合间的运算,然后在于另外的集合进行运算;若要同事进行多个集合的运算需要建立多个顺序表;经验体会:顺序表使用起来比较简单,但长度不可随意变化,适用于大量访问元素,而不适用于大量增添和删除元素;在内存中存储地址连续;五、使用说明第一步:点击运行按钮;第二步: 根据提示输入集合A(可以连续输入,只限输入小写字母和数字);第三步:程序自动显示输入结果;第四步:输入集合B(同第二步);第五步:跳出主菜单界面;第六步:根据选项输入对应运算项的数字序号;第七步:显示运算结果,并可继续进行选择运算还是退出;第八步:若继续运算则返回主菜单,否则退出;第九步:循环第六、七、八步,直至选择退出;六、测试结果输入界面:并运算结果:交运算结果:差运算结果:重新建立集合并运算:七、附录#include<stdio.h>#include<stdlib.h>#define LIST_INIT_SIZE 100//初始表空间大小#define LISTINCREMENT 10//表长增量typedef int Status; /**Status是函数类型**/typedef char ElemType;/*ElemType类型根据实际情况而定,这里假设为char*/typedef struct{ElemType *elem; /**储存空间基地址**/int length; /**当前长度**/int listsize;/**当前分配的储存容量(以sizeof(Elemtype)为单位)**/}SqList;SqList La,Lb,Lc,Ld;/**定义全局变量**//**构造一个空的线性表L**/Status InitList_Sq(SqList &L){L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));if(!L.elem) exit(-1); /**储存分配失败**/L.length = 0;L.listsize = LIST_INIT_SIZE;/**初始储存容量**/return 1;}/**在顺序表的逻辑为i的位置插入新元素e的函数**/Status ListInsert_Sq(SqList &L,int i,ElemType e){ElemType *newbase,*p,*q;if(i < 1 || i > L.length + 1)return 0;if(L.length >= L.listsize)//当前储存空间已满,增加分配{newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT )*sizeof(ElemType));if(!newbase) exit(-1);//储存分配失败L.elem = newbase;L.listsize += LISTINCREMENT;//增加储存容量}q = &(L.elem[i - 1]);//q为插入位置for(p = &(L.elem[L.length - 1]); p >= q; --p)*(p + 1) = *p;//插入位置及之后的元素往右移*q = e;//插入e++L.length;return 1;}/**创建一个线性表,输入数据**/void CreateList_Sq(SqList &L){ElemType ch='\0';int inlist =0,j;while((ch) != '\n'){scanf("%c",&ch);//输入数据for(j = 0; j < L.length; j++)if(ch == L.elem[j])//判断表L中是否有与ch相等的元素 {inlist = 1; //若有,则inlist置1break; //跳出本轮循环}elseinlist =0; //否则inlist为0if(!inlist && ch != '\n')//若inlist为0且ch不为”\n” ListInsert_Sq(L,L.length+1,ch);//则将ch存入表L中 }}/*判断两元素是否相等,若相等则返回1;否则返回0*/Status Equal(ElemType a,ElemType b){if(a == b)return 1;//相等,返回1elsereturn 0;//否则,返回0}/*在顺序线性表L中查找第1个与e满足compare()的元素位序,若找到,则返回其在L中的位序,否则返回0*/int LocateElem_Sq(SqList L,ElemType e,Status(* compare)(ElemType,ElemType)){ElemType *p;int i;i = 1;p = L.elem;//p的初值为第1个元素的储存位置while(i <= L.length && !(* compare)(*p++,e))//循环查找表L 找出其中与e相等的元素的位置++i;if(i <= L.length)//若i小于表长return i;//则i满足条件,返回i的值elsereturn 0;//否则返回0}/*销毁线性表的函数*/Status Clear_Sq(SqList &L){ElemType elem;free(L.elem);L.elem = NULL;return 1;}/*打印顺序表函数*/void Print_Sq(SqList L){int i;for(i = 0; i < L.length; i++)printf("%2c",L.elem[i]);//通过for循环将表元素全部输出 if(L.length == 0) printf("空集");//若表长为0,则输出空表 printf("\n\t\t\t此集合中的个数 n = %d\n\n",L.length);}/*求集合的并集的函数*/void Union_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length=0; //将表Lc的长度初设为0for(i = 0; i < La.length; i++) //先将表La的元素全部复制到表Lc中Lc.elem[Lc.length++]=La.elem[i];for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1]; //依次将表Lb 的值赋给elemif(!LocateElem_Sq(La,elem,Equal)) //判断表La 中是否有与elem相同的值ListInsert_Sq(Lc,Lc.length+1,elem); //若有的话将elem放入表Lc中}}/*求集合的交集的函数*/void Mix_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0; //将表Lc的长度设为0for(i = 1; i <= La.length; i++){ //依次查看表La的所有元素elem = La.elem[i-1]; //将表La中i位置的元素赋值给elemif(LocateElem_Sq(Lb,elem,Equal)) //在表La中查找是否有与elem相等的元素ListInsert_Sq(Lc,Lc.length+1,elem); //将表La与Lb中共同的元素放在Lc中}}/*求集合的差集函数*/void Differ_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0;for(i = 1; i <= La.length; i++){elem = La.elem[i-1]; //把表La中第i个元素赋值给elemif(!LocateElem_Sq(Lb,elem,Equal)) //判断elem在表Lb中是否有相同的元素ListInsert_Sq(Lc,Lc.length+1,elem);//若有,则把elem放入表Lc中,否则,就不存放}for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1]; //把表Lb中第i个元素赋值给elem if(!LocateElem_Sq(La,elem,Equal)) //判断elem在表La中是否有相同的元素ListInsert_Sq(Lc,Lc.length+1,elem); //若有,则把elem放入表Lc中,否则,就不存放}}void Index_Sq(){//主菜单函数char s;int l=1;InitList_Sq(La);//初始化表Laprintf("\n\t\t 请输入集合A:");CreateList_Sq(La);//创建表Laprintf("\t\t\t集合A为");Print_Sq(La);printf("\n\n");InitList_Sq(Lb);//初始化表Lbprintf("\t\t 请输入集合B:");CreateList_Sq(Lb);//创建表Lbprintf("\t\t\t集合B为");Print_Sq(Lb);printf("\n\n");InitList_Sq(Lc);//初始化表LcInitList_Sq(Ld);//初始化表Ldwhile(l){printf("\t\t ******* 请输入您的操作选项 1、2、3、4. ****** \n\n");printf("\t\t 1、进行集合的并运算\n");printf("\t\t 2、进行集合的交运算\n");printf("\t\t 3、进行集合的差运算\n");printf("\t\t 4、重新建立两个集合\n");printf("\t\t\t");scanf("%c",&s);switch(s){case '1' : system("cls");Union_Sq(La,Lb,Lc);//调用集合的并运算函数printf("\t\t\t集合A与集合B的并集为:");print_Sq(Lc);printf("\n");break;case '2' :system("cls");Mix_Sq(La,Lb,Lc);//调用集合的交集运算函数printf("\t\t\t集合A与集合B的交集为:");print_Sq(Lc);printf("\n");break;case '3' : system("cls");Differ_Sq(La,Lb,Lc);//调用集合的差集运算函数 printf("\t\t\t集合A与集合B的差集为:");print_Sq(Lc);printf("\n");break;case '4' :system("cls");Clear_Sq(La);//销毁表LaClear_Sq(Lb);//销毁表LbClear_Sq(Lc);//销毁表LcClear_Sq(Ld);//销毁表Ldgetchar();Index_Sq();//递归调用此函数break;default : printf("\t\t\t#\tenter data error!\n");printf("\n");}printf("\t\t 继续计算请输入1,停止计算请输入0 \n");printf("\t\t\t");scanf("%d",&l);getchar();system("cls");}printf("\n\t\t**************** 谢谢使用!*****************\n");}int main(){printf("\t\t************* 欢迎使用集合操作运算器************\n");Index_Sq();//调用主菜单函数return 0;}。
数据结构集合运算集合运算集合是离散数学中的重要概念,在数据结构中也有广泛应用。
集合运算是一组对集合进行操作的基本操作,包括求交集、求并集、求补集等。
本文将介绍集合运算的基本概念、算法实现和应用场景。
⒈概述集合是由确定的、互不相同的元素组成的无序组合。
集合运算是指对集合进行操作的过程,包括求两个集合的交集、并集、差集等。
⒉交集交集是指两个集合中共有的元素组成的集合。
求交集的操作可以通过遍历一个集合,判断其中的元素是否同时存在于另一个集合,将共有的元素加入到结果集合中。
算法实现步骤:⒈创建一个空的结果集合。
⒉遍历第一个集合的所有元素。
⒊判断当前元素是否同时存在于第二个集合。
⒋如果存在,则将当前元素加入结果集合。
⒌返回结果集合。
⒊并集并集是指两个集合中所有元素的集合,不包含重复的元素。
求并集的操作可以通过将两个集合中的元素合并到一个新的集合中,并去除重复的元素。
算法实现步骤:⒈创建一个空的结果集合。
⒉遍历第一个集合的所有元素,将每个元素加入结果集合。
⒊遍历第二个集合的所有元素,将每个元素加入结果集合。
⒋返回结果集合。
⒋差集差集是指第一个集合中有而第二个集合中没有的元素构成的集合。
求差集的操作可以通过遍历第一个集合的元素,判断是否存在于第二个集合,不存在则加入结果集合。
算法实现步骤:⒈创建一个空的结果集合。
⒉遍历第一个集合的所有元素。
⒊判断当前元素是否存在于第二个集合。
⒋如果不存在,则将当前元素加入结果集合。
⒌返回结果集合。
⒌应用场景集合运算在实际应用中有着广泛的应用,例如:●数据库查询:通过对多个表进行交、并、差等集合运算,可以实现更复杂的数据查询。
●计算机图形学:对图形对象进行集合运算,可以实现包括求交、并、差等操作的图形合并、裁剪等功能。
●数据分析:对多个数据集合进行交、并、差等运算,可以提取出特定的数据子集合。
1、本文档涉及附件。
本文档所涉及的附件包括相关示例代码和演示文稿,以帮助读者更好地理解集合运算的概念和实现方法。
《Java程序设计》课程设计报告题目:集合运算专业:计算机科学与技术班级:13(3)姓名:指导教师:***成绩:计算机学院2016年3月8日目录一、设计内容及要求 (2)1.1运用java语言实现两个集合的交、并、差运算 (2)二、概要设计 (2)三、设计过程或程序代码 (3)3.1流程图 (3)3.2程序代码 (3)四、设计结果与分析 (7)4.1运行结果 (7)4.2程序分析 (8)4.3总结 (12)五、参考文献 (11)一、设计内容及要求1.1运用java语言实现两个集合的交、并、差运算(1) 输出两个集合的交集(2) 输出两个集合的并集(3) 输出两个集合的差集二、概要设计集合的运算是常用的数学计算,为了更加方便的进行此类运算,在此设计了一个简单的集合运算java程序,用于对集合间的交、并、差运算。
本程序运用数组代表集合,主要运用循环语句和方法调用,通过对集合元素间的逐个比较,输出符合条件的元素,从而实现运算结果输出。
该java程序简单,清晰,明了,用户易懂易用,能较好得实现集合间的简单运算。
三、设计过程或程序代码3.1流程图图3.1.13.2程序代码public class Collect {private int arr1[],arr2[];public Collect(int arrayNumber1[],int arrayNumber2[]){arr1=arrayNumber1;arr2=arrayNumber2;}Collect(Collect d){arr1=d.arr1;arr2=d.arr2;}public static void methodPrint(int[] arr,int len){int i;for(i=0;i<len-1;i++)System.out.print(arr[i]+",");//除最后一个元素外,其他每个元素后面应该加一个逗号以示间隔System.out.println(arr[i]);//最后一个元素不要加逗号}Public void methodJiaoji(int[]arrayFirst,int[]arraySecond){int k=0;int newArray[];newArray=new int[20];for(int i=0;i<arrayFirst.length;i++){for(int j=0;j<arraySecond.length;j++){if(arraySecond[j]==arrayFirst[i]){newArray[k++]=arraySecond[j];}}} methodPrint(newArray,k);}public void methodBingji(int[] arrayFirst,int[] arraySecond){int k=0;int newArray[];newArray=new int[20];boolean yes;for(int i=0;i<arrayFirst.length;i++){newArray[k++]=arrayFirst[i];}for(int i=0;i<arraySecond.length;i++){yes=true;for(int j=0;j<arrayFirst.length;j++){if(arraySecond[i]==arrayFirst[j]){yes=false;break;}}if(yes)newArray[k++]=arraySecond[i];}methodPrint(newArray,k);}public void methodChaji(int[] arrayFirst,int[] arraySecond){ int k=0;int newArray[];newArray=new int[20];boolean yes;for(int i=0;i<arrayFirst.length;i++){yes=true;for(int j=0;j<arraySecond.length;j++){if(arraySecond[j]==arrayFirst[i]){yes=false;break; }}if(yes)newArray[k++]=arrayFirst[i];}methodPrint(newArray,k);}public static void main(String[] args){int array1[]={1,2,3,4,5,6,7,8,9,10};int array2[]={5,6,7,8,9,10,11,12,13,14,15};int i,j;Collect number=new Collect(array1,array2);System.out.print("集合A为:"); /*输出集合A*/ for(i=0;i<array1.length;i++)System.out.print(array1[i]+" ");System.out.println();System.out.print("集合B为:"); /*输出集合B*/ for(j=0;j<array2.length;j++)System.out.print(array2[j]+" ");System.out.println();System.out.print("交集A∩B为:"); /*输出集合A∩B*/ number.methodJiaoji(array1,array2);System.out.print("并集A∪B为:"); /*输出集合A∪B*/number.methodBingji(array1,array2);System.out.print("差集A-B为:"); /*输出集合A-B*/number.methodChaji(array1,array2);System.out.print("差集B-A为:"); /*输出集合B-A*/number.methodChaji(array2,array1);}}四、设计结果与分析4.1运行结果图4.1.14.2程序分析(1)程序:public class Collect {private int arr1[],arr2[];public Collect(int arrayNumber[],int arrayNumber2[]){arrayNumber1=arr1;arrayNumber2=arr2; }Collect(Collect d){arr1=d.arr1;arr2=d.arr2; }功能:首先定义一个Collect类,然后定义了两个私有的类对象。
集合的基本运算教案第一章:集合的基本概念1.1 集合的定义引入集合的概念,解释集合是由明确的、相互区别的对象组成的整体。
通过实例讲解集合的表示方法,如列举法、描述法等。
1.2 集合的元素介绍集合中元素的性质,如确定性、互异性、无序性。
解释元素与集合之间的关系,明确元素属于或不属于一个集合。
1.3 集合的类型分类介绍集合的常见类型,如自然数集、整数集、实数集等。
讲解集合的子集概念,即一个集合的所有元素都是另一个集合的元素。
第二章:集合的运算2.1 集合的并集介绍并集的定义,即两个集合中所有元素的集合。
讲解并集的表示方法,如用符号“∪”表示。
举例说明并集的运算规则和性质。
2.2 集合的交集解释交集的定义,即两个集合共有的元素的集合。
展示交集的表示方法,如用符号“∩”表示。
分析交集的运算规则和性质。
2.3 集合的补集引入补集的概念,即在全集范围内不属于某个集合的元素的集合。
讲解补集的表示方法,如用符号“∁”表示。
探讨补集的运算规则和性质。
第三章:集合的运算规则3.1 集合的德摩根定理讲解德摩根定理的内容,包括德摩根律的两种形式。
分析德摩根定理在集合运算中的应用。
3.2 集合分配律介绍分配律的概念,即集合的并集和交集的运算规律。
解释分配律在集合运算中的重要性。
3.3 集合恒等律讲解集合恒等律,即集合的并集和交集与集合本身的关系。
探讨集合恒等律在集合运算中的应用。
第四章:集合的应用4.1 集合的划分介绍集合的划分概念,即把一个集合分成几个子集。
讲解集合划分的表示方法,如用符号“÷”表示。
举例说明集合划分的应用。
4.2 集合的包含关系解释集合的包含关系,即一个集合是否包含另一个集合的所有元素。
探讨集合包含关系的性质和运算规则。
4.3 集合在数学中的应用分析集合在数学领域中的应用,如几何、代数等。
通过实例讲解集合在其他学科领域的应用。
第五章:集合的练习题及解答5.1 集合的基本概念练习题及解答设计关于集合定义、元素、类型等基本概念的练习题。
集合并集、交集和差集是数据结构中非常基础的操作。
这些操作可以在各种数据结构上实现,如数组、链表、哈希表等。
这里我将给出一个基于Python的简单实现。
首先,我们需要一个数据结构来存储我们的集合。
Python的内置数据类型list可以很好地完成这个任务。
pythonclass Set:def __init__(self):self.elements = []def add(self, element):if element not in self.elements:self.elements.append(element)def remove(self, element):if element in self.elements:self.elements.remove(element)def __contains__(self, element):return element in self.elements现在我们有了表示集合的方法,我们可以实现并集、交集和差集的操作:pythondef union(set1, set2):result = Set()for element in set1.elements + set2.elements:result.add(element)return resultdef intersection(set1, set2):result = Set()for element in set1.elements:if element in set2:result.add(element)return resultdef difference(set1, set2):result = Set()for element in set1.elements:if element not in set2:result.add(element)return result这些函数的时间复杂度都是O(n),其中n是集合中元素的数量。
集合运算 1 电子与信息工程学院数据结构
实 验 报 告
实验名称: 集合的运算 实验类型: 设 计 (验 证、设 计、创 新) 班 级: 2013级电信三班 学 号: 201307014327 姓名: 陆杰 实验时间: 2015 年 6 月 16 日 指导教师: 余先伦 成绩: 集合运算 2 目录 一 课程设计目的和要求 二 问题描述及分析 三 算法思想和程序的实现概述 3.1 算法思想 3.2 程序的实现概述 四 程序流程图
流程图 五 程序的实现
5.1 主函数 5.2 链表的生成 5.3 集合的输出 5.4 并运算函数 5.5交运算函数 5.6 差函数 六 运行结果分析
6.1 程序主界面 6.2整数集合并运算 6.3 整数集合交运算 6.4 整数集合差运算 6.5 字母集合并运算 6.6 字母集合交运算 6.7 字母集合差运算 6.8 字母和数据集合并运算 6.9 字母和数据集合交运算 6.10 字母和数据集合差运算 6.11 退出程序 七 源代码
八 总结 九 参考文献 集合运算
3 一 课程设计目的和要求 目的:深入理解数据结构的基本理论,掌握数据存储结构的设计方法,掌握基于数据结构的各种操作的实现方法,训练对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。在实践中培养独立分析问题和解决问题的作风和能力。
要求:熟练运用C++语言、基本数据结构和算法的基础知识,独立编制一个具有中等难度的、解决实际应用问题的应用程序。通过题意分析、选择数据结构、算法设计、编制程序、调试程序、软件测试、结果分析、撰写课程设计报告等环节完成软件设计的全过程,不断地完善程序以提高程序的性能。
二 问题描述及分析 问题描述: 本课程设计中,集合的元素可以是字母[a,b,…z],也可以是整数[0,1,…9],集合的大小集合输入的形式为一个以“回车符”为结束标志的字符,允许出现重复字符或非法字符,程序应能自动滤去。输出的运算结果字符串中将不含重复字符或非法字符。 问题描述: 有两个集合A、B,要求它的交集、并集和差集C。用两个链表p、q存储集合A、B,用链表r存储集合C。描述该问题的存储结构,算法,并通过编写程序来实现。
问题分析: 集合运算 4 1. 定义一个链表来存储集合元素; 2. 链表L包括数据域和指针域,数据域中存储集合元素,指针域中存储下一个集合元素的位置; 3. 创建若干个基本函数,通过函数调用对链表进行操作,实现集合的交、并、差运算。
三 算法思想和程序的实现概述 3.1 算法思想 定义一个链表,链表有整型数据和一个指向链表的指针,程序包含定义一个新链表的函数,集合并函数,集合交函数,集合差函数。求两集合交集并集差集从两集合的头结点开始,比较两集合元素大小,进行对应的操作,直到读取到两集合的末尾元素。主程序先定义三个集合,创建集合A读入A数据,创建集合B读入B数据,然后输出集合A,B的元素,求出两集合并集并输出。求两集合的交集和差集的运算与求并集的步骤类似,只需按提示输入即可。 3.2 程序的实现概述 (1)输入的形式和输入值的范围: 输入是从键盘输入的,输入的内容为整数。 (2)输出的形式 从屏幕输出,显示用户输入集合的元素,并显示进行运算后的值。 (3)存储结构 在这次设计中开始我是采用链式存储结构,使得集合的算法定义十分简洁。 (4)算法实现 定义链表,创建链表,输出链表。利用链表的来存储集合。利用三个函数分别实现课程要求程序实现的求并、求交和差三中运算。现分述如下:
A)并运算函数 集合运算 5 该函数采取了用新集合存储两集合并后的新集合,利用一个for循环来消除新集合中相同的元素,使其在屏幕上只显示一次。
B)交运算函数 该函数用于实现集合的并运算,利用for嵌套实现两链表中数据的比较,输出两链表中相同的元素。
C)差函数 该函数用于实现集合的差运算,利用链表中的数据域进行判断。输出不同于被减集合中不存在的元素。
四 程序流程图 流程图: 开始
创建链表 定义链表
求两集合的并集 求两集合的交集
输入数据
输入数据 集合运算
6 五 程序的实现 改程序的实现步骤是定义链表,创建链表,输出链表。利用链表的来存储集合。利用三个函数分别实现课程要求程序实现的求并、求交和差三中运算。现分述如下:
5.1 主函数 void bangzhu(){ printf("\n\t\t\t***********************************"); printf("\n\t\t\t* 求集合的交并差 *"); printf("\n\t\t\t*********************************\n"); } void main() /* 主函数 */ { struct set *p,*q,*r;
int m,n,node; bangzhu();
for(;;)
输入数据 求两集合的差集 集合运算
7 { do{ printf("请输入您要选择操作的代码:\n");
printf("1:求两集合的并A∪B\n");
printf("2:求两集合的交A∩B\n"); printf("3:求两集合的差A-B\n"); printf("0:退出该程序\n"); scanf("%d",&node); } while(node<0||node>3); if(node==0) exit(1); printf("\t\t\t/*请输入集合A中元素的个数:*/\n");
scanf("%d",&m);
createlist_p(p,m); /* 调用链表生成函数生成A链表 */ printf("\t\t\t/*请输入集合B中元素的个数:*/\n"); scanf("%d",&n); /* 调用链表生成函数生成B链表 */ createlist_p(q,n);
printf("集合A中元素为:");
printlist_p(p); /* 调用集合输出函数输出集合A */
printf("集合B中元素为:"); printlist_p(q); /* 调用集合输出函数输出集合A */ while(node<0||node>3); switch(node) { case 1: Addset( p,q,r);printf("A∪B:\n");printlist_p(r);break; 集合运算 8 case 2: Subset( p,q,r);printf("A∩B:\n");printlist_p(r);break; case 3: Intset(p,q,r); printf("A-B:\n");printlist_p(r);break; } printf("\n");
} } 5.2 链表的生成
void createlist_p(struct set *&p,int n) { int i;
struct set *L;
p=(struct set *)malloc(sizeof(set)); /* 申请结点p */
p->next=NULL; /* 定义p的next指针为空 */
for(i=n;i>0;i--)
{ L=(struct set *)malloc(sizeof(set)); /* 申请结点L*/
printf("请输入该集合中第%d个整数元素:",n-i+1);
scanf("%s",&L->coef);
L->next=p->next;
p->next=L; } }//生成新链表用于存放两集合中的元素
5.3 集合的输出 void printlist_p(struct set *&p) { 集合运算 9 struct set *L;
int i;
L=p->next; if(!L) printf("该表为空!\n"); while(L!=NULL) { printf("%c ",L->coef);
L=L->next;
i++; }
printf("\n"); }//打印输入的两集合中的元素
5.4 并运算函数 void Addset(struct set *&p,struct set *&q,struct set *&r) { struct set *k,*m,*n;
r=(struct set *)malloc(sizeof(set)); /* 申请结点r */
r->next=NULL; /* 定义r的next指针为空 */
k=p->next; /* k指向p的下一个结点 */ for(;k;) { m=(struct set *)malloc(sizeof(set)); /* 申请结点m */
m->next=r->next; r->next=m; m->coef=k->coef;
k=k->next;