集合的并,交和差运算

合集下载

离散数学重要公式定理汇总分解

离散数学重要公式定理汇总分解

离散数学重要公式定理汇总分解离散数学是计算机科学领域中的一门基础课程,它主要研究离散结构和离散对象之间的关系。

离散数学中有许多重要的公式和定理,这些公式和定理在计算机科学和其他领域中有广泛的应用。

下面是对离散数学中一些重要的公式和定理的汇总。

1.集合:-幂集公式:一个集合的幂集是所有它子集的集合。

一个集合有n个元素,那么它的幂集有2^n个元素。

-集合的并、交、差运算规则:并集运算满足交换律、结合律和分配律;交集运算也满足交换律、结合律和分配律;差集运算不满足交换律和结合律。

2.逻辑:-代数运算规则:多个逻辑表达式的与、或、非运算满足交换律、结合律和分配律。

-归结原理:对于一个给定的只包含“合取”和“析取”的合式公式集合,如果假设集合中的每个合式公式都为真,以及从这些前提出发,不能推导出这个集合中的一个假命题,则称这个假设集合是不一致的。

3.图论:-图的欧拉路径和欧拉回路:对于一个连通的图,如果它存在欧拉路径,那么这个图中最多只有两个度数为奇数的节点;如果一个连通的图存在欧拉回路,那么所有节点的度数都是偶数。

-图的哈密顿路径和哈密顿回路:对于一个图,如果它存在哈密顿路径,那么这个图中任意两个不相邻的节点u和v之间必然存在一条边;如果一个图存在哈密顿回路,那么从任意一个节点开始,可以经过图中的所有节点且最后回到起点。

4.代数结构:-子群定理:如果G是群H的一个子集,并且G是关于群H的运算封闭的,那么G是H的一个子群。

- 同态定理:如果f是从群G到群H的一个满射同态,那么G的核ker(f)是G的一个正规子群,而H是G/ker(f)的同构像。

5.排列组合:-排列公式:从n个元素中取出m个元素进行排列,有P(n,m)=n!/(n-m)!-组合公式:从n个元素中取出m个元素进行组合,有C(n,m)=n!/(m!*(n-m)!)以上只是离散数学中一小部分重要的公式和定理,这些公式和定理在计算机科学、密码学、图形学等领域中有广泛的应用。

三集合标准型公式

三集合标准型公式

三集合标准型公式在数学中,集合是指具有某种特定性质的元素的总体。

而三集合标准型公式则是指在集合理论中,对三个集合进行交、并、差等运算所得到的标准形式的公式。

三集合标准型公式在集合运算中有着重要的应用,可以帮助我们更好地理解集合之间的关系,进行集合的逻辑推理和证明。

首先,我们来看三集合的交集运算。

假设我们有三个集合A、B、C,它们的交集可以表示为A∩B∩C。

这个交集表示的是同时属于A、B和C的元素所构成的集合。

在三集合标准型公式中,交集运算可以用分布律来表示,即A∩(B∩C) = (A∩B)∩C。

这个分布律告诉我们,在进行三个集合的交集运算时,可以先对任意两个集合进行交集运算,然后再与第三个集合进行交集运算,结果是一样的。

其次,我们来看三集合的并集运算。

三个集合A、B、C的并集可以表示为A∪B∪C。

这个并集表示的是属于A、B或C中任意一个或多个集合的元素所构成的集合。

在三集合标准型公式中,并集运算同样可以用分布律来表示,即A∪(B∪C) = (A∪B)∪C。

这个分布律告诉我们,在进行三个集合的并集运算时,可以先对任意两个集合进行并集运算,然后再与第三个集合进行并集运算,结果是一样的。

最后,我们来看三集合的差集运算。

假设我们有三个集合A、B、C,它们的差集可以表示为A (B∪C)。

这个差集表示的是属于A但不属于B和C的元素所构成的集合。

在三集合标准型公式中,差集运算同样可以用分布律来表示,即A (B∪C) = (A B)∩(A C)。

这个分布律告诉我们,在进行三个集合的差集运算时,可以先对任意两个集合进行差集运算,然后再取这两个差集的交集,结果是一样的。

总的来说,三集合标准型公式是集合理论中重要的概念,它可以帮助我们更好地理解集合运算的性质和规律。

通过对交、并、差集运算的分布律的理解,我们可以更加灵活地运用集合运算来解决实际问题,进行集合的逻辑推理和证明。

因此,掌握三集合标准型公式对于数学学习和应用都具有重要的意义。

数学中的集合运算法则

数学中的集合运算法则

数学中的集合运算法则数学作为一门精确而又抽象的学科,涉及到众多的概念和运算法则。

其中,集合运算法则是数学中一个重要的分支,它研究的是集合之间的关系和运算规律。

本文将探讨数学中的集合运算法则,以及它们的应用。

一、交集运算法则交集运算是指将两个集合中所有共有的元素组成一个新的集合。

在数学中,交集运算有以下几个法则:1. 交换律:对于任意两个集合A和B,A∩B=B∩A。

这意味着,交集运算的结果与操作数的顺序无关。

2. 结合律:对于任意三个集合A、B和C,(A∩B)∩C=A∩(B∩C)。

这意味着,交集运算可以连续进行,结果不会受到括号的影响。

3. 吸收律:对于任意两个集合A和B,如果A是B的子集,则A∩B=A。

这意味着,如果一个集合是另一个集合的子集,它们的交集就是自身。

交集运算法则在实际应用中有着广泛的应用。

例如,在数据库查询中,可以使用交集运算来找出同时满足多个条件的数据。

二、并集运算法则并集运算是指将两个集合中的所有元素组成一个新的集合。

在数学中,并集运算有以下几个法则:1. 交换律:对于任意两个集合A和B,A∪B=B∪A。

这意味着,并集运算的结果与操作数的顺序无关。

2. 结合律:对于任意三个集合A、B和C,(A∪B)∪C=A∪(B∪C)。

这意味着,并集运算可以连续进行,结果不会受到括号的影响。

3. 吸收律:对于任意两个集合A和B,如果A是B的子集,则A∪B=B。

这意味着,如果一个集合是另一个集合的子集,它们的并集就是另一个集合。

并集运算法则在实际应用中也有着广泛的应用。

例如,在概率论中,可以使用并集运算来计算两个事件同时发生的概率。

三、差集运算法则差集运算是指从一个集合中去除另一个集合中的元素,得到一个新的集合。

在数学中,差集运算有以下几个法则:1. 差运算:对于任意两个集合A和B,A-B表示从A中去除B中的元素得到的新集合。

2. 吸收律:对于任意两个集合A和B,如果A是B的子集,则A-B=∅。

实验 二 集合的并、交和差运算C++

实验 二  集合的并、交和差运算C++

实验二集合的并、交和差运算// 在写代码的过程中,没有注意头结点~~~ 导致出现了很多野指针~~~ ,几乎重写. 。

o 0 ~~~// 经同学检查,发现有错误~~~ 红色部分代码已经修正//集合的并、交和差运算/*选作内容(1)集合元素的判定和子集判定运算(2)求集合的补集(3)集合的混合式运算表达求值(4)集合的元素类型推广到其他类型,甚至任意类型*//*测试数据:(1)Set1 ="magazine",Set2 ="paper",Set1∪Set2 ="aegimnpra",Set1∩Set2 ="ae",Set1 - Set2 ="gimnz"(2)Set1 =012oper4a6tion89",Set2 ="error date",Set1∪Set2 ="adeinoprt",Set1∩Set2 ="aeort",Set1 - Set2 ="inp"*/#include<iostream>#include<cstdlib>#include<cstdio>using namespace std;#define Elem Type chartypedef struct ElemNode{Elem Type elem;struct ElemNode *next;}ElemNode, *Set;//-------------FunctionList------------------------------//---------------函数原型--------------------------------int LengthOf(Set src);//返回一个集合的长度void CreateSet(Set dest);//创建一个新的字母集合,限定a-zvoid EmptySet(Set dest);//清空一个集合,保留头结点void DestroySet(Set dest);//销毁集合void SortSet(Set dest);//对一个集合进行从小到大的排序void DisplaySet(Set src);//打印集合的所有元素int ExistElem(Set dest, Elem Type e);//判断元素是否存在于集合中void DelElem(Set dest, ElemType e);//删除集合中的一个元素一次void AddElem(Set dest, Elem Type e);//在链表尾部追加一个元素void ContactSet(Set dest, Set src);//连接一个集合到另一个集合void AddSet(Set dest, Set src1, Set src2);//集合并运算void MulSet(Set dest, Set src1, Set src2);//集合交运算void SubSet(Set dest, Set src1, Set src2);//集合差运算int ExistSubset(Set dest, Set src);//子集判断void NegSet(Set dest, Set src);//求补集int m ain(){Set dest=(Set)m alloc(sizeof(ElemNode));Set src1=(Set)m alloc(sizeof(ElemNode));Set src2=(Set)m alloc(sizeof(ElemNode));dest->next=NULL;cout<<"输入两个集合:"<<endl;CreateSet(src1);CreateSet(src2);cout<<endl;cout<<"Set1 =";DisplaySet(src1);cout<<"\t";cout<<"Set2 =";DisplaySet(src2);cout<<endl<<endl;int item;cout<<"1->集合并"<<" "<<"2->集合交"<<" "<<"3->集合差"<<" "<<"非零整数->错误!重输"<<" "<<"0->进入下一步演示"<<endl;while(cin>>item){if(item)switch(item){case 1: cout<<"集合并运算:Set1∪Set2 =";AddSet(dest, src1, src2);DisplaySet(dest);Em ptySet(dest);cout<<endl;break;case 2: cout<<"集合交运算:Set1∩Set2 =";MulSet(dest, src1, src2);DisplaySet(dest);Em ptySet(dest);cout<<endl;break;case 3: cout<<"集合差运算:Set1-Set2 =";SubSet(dest, src1, src2);DisplaySet(dest);Em ptySet(dest);cout<<endl;break;default: cout<<"输入错误!重输!!!"<<endl;break;}else {cout<<"进入下一步演示..."<<endl;break;} // 此处在VC++ 6.0 运行与CFree 中有点不同(在CFree中要按下回车~~~)}getchar();cout<<"输入一个集合:"<<endl;CreateSet(dest);cout<<"原集合为:";DisplaySet(dest);cout<<endl<<endl;char ch;cout<<"在链表尾部添加一个元素ch =";cin>>ch;AddElem(dest, ch);DisplaySet(dest);cout<<endl<<endl;cout<<"删除集合中的存在的某个元素ch ="; cin>>c h;DelElem(dest, ch);DisplaySet(dest);cout<<endl<<endl;cout<<"再创建一个集合src =";Set src=(Set)malloc(sizeof(ElemNode));getchar();CreateSet(src);cout<<"将src集合链接到集合dest中..."<<endl;ContactSet(dest, src);cout<<"此时dest为:";DisplaySet(dest);cout<<endl;if(ExistSubset(dest, src))cout<<"此时src是dest的子集..."<<endl;elsecout<<"此时src不是dest的子集..."<<endl;cout<<endl<<"dest =";DisplaySet(dest);cout<<endl;cout<<"dest的补集是:";Set p=(Set)m alloc(sizeof(ElemNode));p->next=NULL;NegSet(p, dest);DisplaySet(p);cout<<endl<<"演示结束!!!"<<endl;DestroySet(dest);return 0;}//---------------BasicFunctions----------------------- //------------------函数实现-------------------------- int LengthOf(Set src){//返回一个集合的长度int i=0;while(src->next!=NULL){i++;src=src->next;}return i;}//LengthOfvoid CreateSet(Set dest){//创建一个新的字母集合,限定a-zElem Type ch;Set p=dest,n;for(;;){ch=getchar();if(ch=='\n') break;if(ch<97||ch>122) continue;n=(Set)m alloc(sizeof(ElemNode)); p->next=n;n->elem=c h;n->next=NULL;p=n;}return ;}//CreateSetvoid EmptySet(Set dest){//清空一个集合,保留头结点Set p,n;while(dest->next!=NULL){p=dest;n=p->next;for(;n->next!=NULL;){p=n;n=n->next;}free(n);p->next=NULL;}}//EmptySetvoid DestroySet(Set dest){//销毁集合Em ptySet(dest);free(dest);}//DestroySetvoid SortSet(Set dest){//对一个字母集合进行从小到大的排序 int i,j,l,flag;Set p,q,n;l=LengthOf(dest);if(l<2) return;flag=1;for(i=l-1;i>0&&flag==1;i--) {flag=0;p=dest;q=p->next;n=q->next;for(j=0;j<i;j++){if(q->elem>n->elem){flag=1;p->next=n;q->next=n->next;n->next=q;q=p->next;n=q->next;}p=q;q=n;n=n->next;}}}//SortSetvoid DisplaySet(Set src) {//打印集合的所有元素Set p;if(src->next==NULL){printf("φ");return ;}p=src;dop=p->next;putchar(p->elem);} while(p->next!=NULL);}//DisplaySetint ExistElem(Set dest, Elem Type e) {//判断元素是否存在于集合中Set p=dest;if(LengthOf(p)==0)return 0;else{p=p->next;while(p->elem!=e){if(p->next==NULL)return 0;p=p->next;}return 1;}}//ExistElemvoid DelElem(Set dest, ElemType e) {//删除集合中的一个元素一次Set p=dest,q;if(LengthOf(p)==0)return ;q=p->next;if(LengthOf(p)==1){p->next=NULL;free(q);}while(q->elem!=e){p=p->next;q=q->next;if(q->next==NULL){p->next=NULL;free(q);}elsep->next=q->next;}//DelElemvoid AddElem(Set dest, Elem Type e){//在链表尾部追加一个元素Set p=dest, n;while(p->next!=NULL)p=p->next;n=(Set)m alloc(sizeof(ElemNode));p->next=n;n->elem=e;n->next=NULL;}//AddElemvoid ContactSet(Set dest, Set src){//连接一个集合到另一个集合Set p=dest;while(p->next!=NULL)p=p->next;p->next=src->next;}//ContactSetvoid AddSet(Set dest, Set src1, Set src2){//集合并运算SortSet(src1);SortSet(src2);int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2); src1=src1->next;src2=src2->next;while(i<len1&&j<len2){if(src1->elem<=src2->elem){i++;if(!ExistElem(dest, src1->elem)) {AddElem(dest, src1->elem);src1=src1->next;}else{src1=src1->next;}}else{j++;if(!ExistElem(dest, src2->elem)) {AddElem(dest, src2->elem);src2=src2->next;}else{src2=src2->next;}}}while(i<len1){i++;if(!ExistElem(dest, src1->elem)) {AddElem(dest, src1->elem);src1=src1->next;}}while(j<len2){j++;if(!ExistElem(dest, src2->elem)){AddElem(dest, src2->elem);src2=src2->next;}}}//AddSetvoid MulSet(Set dest, Set src1, Set src2){//集合交运算SortSet(src1);SortSet(src2);int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2);src1=src1->next;src2=src2->next;while(i<len1&&j<len2){if(src1->elem<src2->elem) {i++;src1=src1->next;}else if(src1->elem>src2->elem) {j++;src2=src2->next;} else{i++;j++;if(!ExistElem(dest, src1->elem)){AddElem(dest, src1->elem);src1=src1->next;src2=src2->next;}}}}//MulSetvoid SubSet(Set dest, Set src1, Set src2){//集合差运算SortSet(src1);SortSet(src2);int i=0,len=LengthOf(src1);src1=src1->next;while(i<len){i++;if(!ExistElem(src2, src1->elem))if(!ExistElem(dest, src1->elem)) {AddElem(dest, src1->elem);src1=src1->next;}}else{src1=src1->next;}}}//SubSetint ExistSubset(Set dest, Set src) {//子集判断int i=0,len=LengthOf(src);src=src->next;while(i<len){if(!ExistElem(dest, src->elem)) return 0;i++;src=src->next;}return 1;}//ExistSubsetvoid NegSet(Set dest, Set src) {//求补集SortSet(src);int i=0;while(i<26){if(!ExistElem(src, i+97))AddElem(dest, i+97);i++;}//NegSet 运行示意图:。

离散数学 实验四 编程实现集合的交、并、差和补运算。

离散数学 实验四 	编程实现集合的交、并、差和补运算。

离散数学实验报告专业班级:姓名:学号:实验成绩:1.【实验题目】集合运算2.【实验目的】编程实现集合的交、并、差和补运算。

3.【实验内容】从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。

4. 【实验要求】通过以下界面提示实现相应的集合运算**************************************************************** 请分别输入集合A与集合B的元素:请选择(1—5)要进行的集合运算:1.集合的交运算(A⋂B)2.集合的并运算(A⋃B)3.集合的差运算(A-B)4.集合的补运算(~A=E-A)5.继续/退出(y/n)****************************************************************5. 【算法描述】(1)用数组A,B,C,E表示集合。

假定A={1,3,4,5,6,7,9,10}, B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。

以下每一个运算都要求先将集合C置成空集。

(2)二个集合的交运算:A⋂B={x|x∈A且x∈B}把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。

C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]= =b[j]) c[k++]=a[i];(3)二个集合的并运算:A⋃B={x|x∈A或x∈B}把数组A中各个元素先保存在数组C中。

将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B 的并。

C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]= =c[j]) break;if(j= =m){ c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={x|x∈A且x∉B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。

集合的并、交和差运算

集合的并、交和差运算

集合的并、交和差运算题目:编制一个演示集合的并、交和差运算的程序班级:姓名:学号:完成日期:一、需求分析1.本演示程序中,集合的元素限制在小写字母‘a’-‘z’之间。

集合的大小不限制,集合的输入形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。

2.演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。

3.程序的执行命令有:1)选择操作2)任意键清屏4.数据测试(1)Set1=”magazine”, Set2=’paper”,Set1∪Set2=”aegimnprz”,Set1∩Set2=”ae”,Set1-Set2=”gimnz”;(2) Set1=”012oper4a6tion89”,Set2=”error data”,Set1∪Set2=”adeinoprt”,Set1∩Set2=”aeort”, Set1-Set2=”inp”.二、概要设计为实现上述功能,需要顺序表这个抽象数据类型。

1.顺序表抽象数据类型定义ADT sqlist{数据对象:D={ai|a i∈Elemset,i=1,2,3,…n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2, … n}基本操作:InitList(&l)操作结果:构造一个空的顺序表l。

ListLength(l)初始条件:顺序表l已存在。

操作结果:返回l中的元素个数。

ListInsert_Sq(&L, i, e)初始条件:顺序表l已存在。

操作结果:在l中第i个元素前面插入元素e。

CreatSqList(&l, a[],n)初始条件:顺序表l已存在。

操作结果:将数组a[n]每个元素赋给顺序表l。

GetElem(L, i, &e)初始条件:顺序表l已存在。

高一数学知识点大全:集合的几种运算法则

高一数学知识点大全:集合的几种运算法则

高一数学知识点大全:集合的几种运算法则 高一数学知识点大全:集合的几种运算法则并集:以属于A或属于B的元素为元素的集合称为A与B的并(集),记作A∪B(或B∪A ),读作“A并B”(或“B并A”),即A∪B={x|x∈A,或x∈B}交集:以属于A且属于B的元差集表示素为元素的集合称为A与B的交(集),记作A∩B(或B∩A),读作“A交B”(或“B交A”),即A∩B={x|x∈A,且x∈B}例如,全集U={1,2,3,4,5}A={1,3,5}B={1,2,5}。

那么因为A和B中都有1,5,所以A∩B={1,5}。

再来看看,他们两个中含有1,2,3,5这些个元素,不管多少,反正不是你有,就是我有。

那么说A∪B={1,2,3,5}。

图中的阴影部分就是A∩B。

有趣的是;例如在1到105中不是3,5,7的整倍数的数有多少个。

结果是3,5,7每项减集合1再相乘。

48个。

对称差集:设A,B为集合,A与B的对称差集A?B定义为:A?B=(A-B)∪(B-A)例如:A={a,b,c},B={b,d},则A?B={a,c,d}对称差运算的另一种定义是:A?B=(A∪B)-(A∩B)无限集:定义:集合里含有无限个元素的集合叫做无限集有限集:令N*是正整数的全体,且N_n={1,2,3,……,n},如果存在一个正整数n,使得集合A与N_n一一对应,那么A叫做有限集合。

差:以属于A而不属于B的元素为元素的集合称为A与B 的差(集)。

记作:A\B={x│x∈A,x不属于B}。

注:空集包含于任何集合,但不能说“空集属于任何集合”。

补集:是从差集中引出的概念,指属于全集U不属于集合A的元素组成的集合称为集合A的补集,记作CuA,即CuA={x|x∈U,且x不属于A}空集也被认为是有限集合。

例如,全集U={1,2,3,4,5}而A={1,2,5}那么全集有而A中没有的3,4就是CuA,是A的补集。

CuA={3,4}。

在信息技术当中,常常把CuA写成~A。

集合的交并差补与代数的加减乘除

集合的交并差补与代数的加减乘除

集合的交并差补与代数的加减乘除wsyAugust13,2015我们都知道,集合的运算和代数的运算是独立的,一般没有太大的关联。

集合的基本的运算法则有:•交集:A B;•并集:A B;•补集:A;•差集:A−B.但是,我们通过如下的定义,可以建立一个集合的代数运算关系:令全集Ω表示为1,空集∅表示为0•交集:A∩B=ab;•并集:A∪B=a+b−ab;•补集:A=1−a;•差集:A−B=A−A∩B=a−ab=a(1−b).其中,集合A,B在代数运算中,用相应的小写字母a,b表示。

注意到,因为A∩A=A,所以根据定义可以推导出,我们的定义满足幂等律a·a=a2=a.除了,这一点有差异之外,其它运算与代数运算都相同。

接下来,我们可以看到,集合的对偶律和结合律,使用上述定义之后,也是吻合的。

下列代数式子在化简后是显然成立的,我们减去了化简的步骤。

1.对偶律:1•对于A∩B=A∪B,代入上述定义,有1−ab=(1−a)+(1−b)−(1−a)(1−b).•对于A∪B=A∩B,代入上述定义,有1−(a+b−ab)=(1−a)(1−b).2.结合律:•对于(A∩B)∪C=(A∪C)∩(B∪C),代入上述定义,有ab+c−abc=(a+c−ac)(b+c−bc).•对于(A∪B)∩C=(A∩C)∪(B∩C),代入上述定义,有(a+b−ab)c=ac+bc−ac·bc.综上可知,我们的定义是满足集合运算的要求的。

之所以要把集合的运算,转化为代数的运算,是因为一般的人,对于代数运算的熟悉程度远远高于集合运算。

这为我们验证,求解,推断复杂的集合运算的式子提供了另外的一种新的更加简便快速的方式。

2。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

石河子大学
《集合的并,交和差运算》程序设计基础课程设计报告
二OO八年六月二十一日
目录
一.编程目的: (2)
二.设计要求 (2)
三.各函数功能说明: (2)
四.函数框架图: (6)
五.总结: (7)
参考书目……………………………………………………………….8.
一.编程目的:
编写数学程序,能够演示执行集合的集合的并,交和差运算的程序,可以任意对两个集合进行集合之间的运算。

通过该程序的编写,我学会了如何更加熟练的掌握类和动态链表,我觉得程序设计很有难度,同时我学会了不会的一定要自己去找资料和问自己的同学或者询问自己的师兄师姐,那样有助于自己的自主学习。

经过自己的查找和询问,让自己对书上的知识理解的更加透彻一点了,该程序让我们把书上的知识灵活运用,让我们把书上的知识变活了,不至于掌握死的知识。

二.设计要求:
用类、数组建立数据库(最少包含3条记录以及具有下列功能)
1.集合的限定:集合元素必须为小写字母(元素为小写字母‘a~z’)2.能够进行集合之间的并集,交集以及差集运算。

3.可以进行最简单的提示(例如输入数据有误时候会进行提示)
三.各函数功能说明:
函数源代码以及函数的功能:
#include<stdio.h>
#include<stdlib.h>
typedef struct pointer
{
//定义一个结构体变量pointer
char dat;
struct pointer *link;
} pointer;
void readdata(pointer *head){
//读集合
pointer *p;
char tmp;
printf("input data ('0' for end):");
//输出结果以‘0’结尾
scanf("%c",&tmp);
while(tmp!='0')
{
if((tmp<'a')||(tmp>'z'))
{
printf("输入错误!必须为小写字母!\n");
return;
}
p=(pointer *)malloc(sizeof(struct pointer));
p->dat=tmp;
p->link=head->link;
head->link=p;
scanf("%c",&tmp);
}
}
void disp(pointer *head){
//显示集合数据
pointer *p;
p=head->link;
while(p!=NULL)
{
printf("%c ",p->dat);
p=p->link;
}
printf("\n");
}
void bing(pointer *head1,pointer *head2, pointer *head3){ //计算集合1与集合2的并
pointer *p1,*p2,*p3;
p1=head1->link;
while(p1!=NULL)
{
p3=(pointer *)malloc(sizeof(struct pointer));
p3->dat=p1->dat;
p3->link=head3->link;
head3->link=p3;
p1=p1->link;
}
p2=head2->link;
while(p2!=NULL)
{
p1=head1->link;
while((p1!=NULL)&&(p1->dat!=p2->dat))
p1=p1->link;
if(p1==NULL)
{
p3=(pointer *)malloc(sizeof(struct pointer));
p3->dat=p2->dat;
p3->link=head3->link;
head3->link=p3;
}
p2=p2->link;
}
}
void jiao(pointer *head1,pointer *head2, pointer *head3) {
//计算集合1与集合2的交
pointer *p1,*p2,*p3;
p1=head1->link;
while(p1!=NULL)
{
p2=head2->link;
while((p2!=NULL)&&(p2->dat!=p1->dat))
p2=p2->link;
if((p2!=NULL)&&(p2->dat=p1->dat))
{
p3=(pointer *)malloc(sizeof(struct pointer));
p3->dat=p1->dat;
p3->link=head3->link;
head3->link=p3;
}
p1=p1->link;
}
}
void cha(pointer *head1,pointer *head2, pointer *head3){ //计算集合1与集合2的差
pointer *p1,*p2,*p3;
p1=head1->link;
while(p1!=NULL)
{
p2=head2->link;
while((p2!=NULL)&&(p2->dat!=p1->dat))
p2=p2->link;
if(p2==NULL)
{
p3=(pointer *)malloc(sizeof(struct pointer));
p3->dat=p1->dat;
p3->link=head3->link;
head3->link=p3;
}
p1=p1->link;
}
}
main(){
pointer *head1,*head2,*head3;
head1=(pointer *)malloc(sizeof(struct pointer));
head1->link=NULL;
head2=(pointer *)malloc(sizeof(struct pointer));
head2->link=NULL;
head3=(pointer *)malloc(sizeof(struct pointer));
head3->link=NULL;
printf("输入集合1和2:\n");
readdata(head1);
readdata(head2);
printf("集合1为:\n");
disp(head1);
printf("集合2为:\n");
disp(head2);
printf("集合1与集合2的并为:\n"); bing(head1,head2,head3);
disp(head3);
head3->link=NULL;
printf("集合1与集合2的交为:\n");
jiao(head1,head2,head3);
disp(head3);
head3->link=NULL;
printf("集合1与集合2的差为:\n");
cha(head1,head2,head3);
disp(head3);
}
运行结果:
四.函数框架图:
五.总结:
在做程序设计前就已经感觉到我设计的《集合的并,交和差运算》比较复杂,不仅要写出实现各种功能的函数还要保证函数之间的连接,怎样通过函数之间的关系能很好的把函数连接起来,还要保证程序能够很好的而且有效的运行。

还有可能遇到一些以前没有用到的知识,像怎样在输入有误的情况下进行异常处理,这些都要通过函数的功能来实现,这些对我来说都是新的知识,而且觉得很有难度。

在做程序设计前还必须把书本上的基本知识搞懂,程序设计会用到书中的类做,对类的理解也不是很到位,一些概念的知识还没有很好的理解,所以还需要借助书中的知识来加深对类的理解。

在编写该程序期间,我遇到了非常多的问题,感谢我们班的同学一遍一遍的讲解和演练,让我明白了许多自己以前不懂的问题,我明白了自己知道的是很少的一部分,我们应该自己多抓住时间进行自主学习,不然自己课堂
上学的东西是在是不够自己使用。

在编程的过程中我遇到了非常多的困难,但是通过同学的和师兄帮助渐渐对于程序有更深一步的理解,而且他们也帮我编一个对异常处理的函数,这样在异常处理的过程中就能很好的处理因为在输入有误的情况的错误。

工程完成日期:2008-6-21
高祥
07电信参考书目:
[1]谭浩强,《C++程序设计》,北京,清华大学出版社,2006年.
[2]高涛,陆丽娜《C语言程序设计——实验指导》,西安,西安交通大学出版社,2006.。

相关文档
最新文档