C语言实现集合的交_并_差
【问题描述】
编制一个能演示执行集合的并、交和差运算的程序【基本要求】
(1)集合的元素限定为小写字母字符[ 'a'......'z' ]
(2 )演示程序以用户和计算机对话的方式执行
【测试数据】
【实现提示】
以有序链表表示集合
【代码过程】
1。先定义集合的数据类型notes.h
//notes.h
typedef struct LNode...{
ElemType data;
LNode *next;
}*Link, *Position;
typedef struct...{
Link head,tail;
int len;
}LinkSet;
//~
2。以后要用的一些常量放在constValues.h
#include
#include
#include
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define ElemType int //存放数据的类型
typedef int Status; //函数的返回值//~
3。集合实现函数setsFun.h
/**//****************** 函数定义*********************/ Status InitSets(LinkSet &ls)...{
//初始化集合
ls.head = (Link) malloc( sizeof(Link));
ls.tail = (Link) malloc( sizeof(Link));
if(!ls.head || !ls.tail) exit(OVERFLOW); //如果分配失败
ls.head->next = ls.tail->next = NULL; //头、尾指针为空
ls.len = 0; //长度为0
return OK;
}
Status CreateNode(Link &link,ElemType e)...{
//创建一节点,容为e
link = (Link) malloc( sizeof(Link));
if(!link) exit(OVERFLOW);
link->data = e; //值设定
link->next = NULL; //指向空
return OK;
}
Position PriorInsertNode(LinkSet &ls,Link &link)...{
//找出节点link要插入到ls的前一个节点
if(!ls.head->next) return ls.head;
Link h1 = ls.head->next, h2 = h1->next; //h1:前一节点,h2:前一节点的后一节点
if(link->data < h1->data) return ls.head; //如果比第一个节点小,返回头指针
while(h1 && h2)...{
if(h1->data < (link->data) && h2->data > (link->data) ) //如果>h1 &&
break;
if(h1->data == (link->data) || h2->data ==(link->data) )
return NULL; //如果重复,返回NULL else //否则,顺次往后挪一个节点h1=h2,h2=h1->next;
}
return h1;
}
Status Append(LinkSet &ls, Link &link)...{
//向集合末尾追加节点
if(ls.head->next == NULL) ls.head->next = link;
else ls.tail->next->next = link;
ls.tail->next = link;
ls.len ++;
return OK;
}
Status InsertNode(LinkSet &ls, Link &link)...{
//向集合中插入节点
Position p = PriorInsertNode(ls,link);
if(!p) return ERROR; //如果集合中已有相应元素link->next = p->next;
if(!p->next) ls.tail->next = link; //如果前一节点为尾节点,修改tail p->next = link;
ls.len++;
return OK;
}
Position PriorNode(LinkSet &ls, Link &link)...{
//返回集合中该节点的前一节点,不存在返回NULL
int j=0;
Link pre,h = ls.head;
while(h->next && j<=ls.len && h!=link)...{
pre = h; h=h->next; j++;
}
if(j==0) return NULL;
return pre;
}
Status PrintSets(LinkSet &ls)...{
//打印集合
Link h=ls.head->next;
printf("[ ");
while(h)...{
printf("%c ",h->data);
h = h->next;
}
printf(" ] ");
return OK;
}
Position GetHead(LinkSet &ls)...{
//获得集合的头节点
return ls.head;
}
Position NextPos(Link &link)...{
//获得当前节点的下一个节点
return link?link->next:link;
}
Status Empty(LinkSet &ls)...{
//空为真
return ls.head->next==NULL;
}
ElemType GetCurElem(Link &link)...{
//获得当前节点的数据
return link->data;
}
int Compare(Link &la, Link &lb)...{
//判断两个节点的大小
return la->data - lb->data;
}
int Compare(ElemType e1, ElemType e2)...{
//比较两个数字的大小
return e1-e2;
}
Status DelFirst(LinkSet &ls,Link &q)...{
//已知h为线性链表的头节点,删除表中的第一个节点,并以q返回Link h = ls.head;
if(!h->next) return ERROR;
q = h->next;
h->next = h->next->next;
q->next=NULL;
ls.len--;
return OK;
}
Status FreeNode(Link &l)...{//释放节点,有问题
free(l);
return OK;
}
Status UnionSets(LinkSet lsa, LinkSet &lsb, LinkSet &lsc)...{ //已知集合ls1,ls2的元素按值非递减排列
//将集合ls1,ls2的并集到ls3
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head; //找到两节点的头指针
Link pa = NextPos(ha), pb = NextPos(hb);
while( !Empty(lsa) && !Empty(lsb) )...{
int result = Compare(pa,pb); //比较两节点大小
if( result<0) ...{
DelFirst(lsa,node);Append(lsc,node); pa = NextPos(ha); //向lsc插入lsa 的相关节点
}else if(result>0)...{ //向lsc 插入lsb的相关节点
DelFirst(lsb,node);Append(lsc,node); pb = NextPos(hb);
}else...{
DelFirst(lsb,node); pb = NextPos(hb);//如果两节点相同,删除lsb中重复的节点,即以lsa为标准
}
}
while(!Empty(lsa))...{
DelFirst(lsa,node);Append(lsc,node);
}
while(!Empty(lsb))...{
DelFirst(lsb,node);Append(lsc,node);
}
return OK;
}
Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{
//已知集合ls1,ls2的元素按值非递减排列
//将集合ls1,ls2的交集到ls3
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head;
Link pa = NextPos(ha), pb = NextPos(hb);
while( !Empty(lsa) && !Empty(lsb) )...{
int result = Compare(pa,pb);
if( result<0) ...{
DelFirst(lsa,node);pa = NextPos(ha);
}else if(result>0)...{
DelFirst(lsb,node); pb = NextPos(hb);
}else...{
DelFirst(lsb,node); Append(lsc,node);pb = NextPos(hb);
DelFirst(lsa,node);pa = NextPos(ha);
}
}
while(!Empty(lsa))...{
DelFirst(lsa,node);Append(lsc,node);
}
return OK;
}
Status DifferenceSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{ //已知集合ls1,ls2的元素按值非递减排列
//ls3 = ls1 - ls2
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head;
Link pa = NextPos(ha), pb = NextPos(hb);//,pb2 = NextPos(pb1);
while( !Empty(lsa) && !Empty(lsb) )...{
int result = Compare(pa,pb);
if( result<0) ...{
DelFirst(lsa,node);Append(lsc,node);pa = NextPos(ha);
}else if(result>0)...{
DelFirst(lsb,node); pb = NextPos(hb);
}else...{
DelFirst(lsa,node); pa = NextPos(ha);
DelFirst(lsb,node); pb = NextPos(hb);
}
}
return OK;
}
Status CopySets(LinkSet lsa, LinkSet lsb)...{
//将集合lsa拷贝到lsb中
InitSets(lsb);
Link la = lsa.head->next, lb = lsb.head->next;
while(la)...{
Link node;
CreateNode(node,la->data);
lb=node;
lsb.len++;
la = la->next;
lb = lb->next;
}
lsb.tail = lb;
return OK;
}
//~ 4。测试test.cpp
#include "constValues.h" //常量头文件
#include "notes.h" //节点定义头文件
#include "setsFun.h" //集合操作函数头文件
/**//**************** 测试***********************************/
void Initialization()...{
printf("************************************************************************* *** " );
printf("*MakeSet1-1 MakeSet1-2 Union-u Intersection-i Difference-d Quit-q * " );
printf("************************************************************************* *** " );
}
void main()
...{
LinkSet set1,set2,set3,seta,setb;
InitSets(set1),InitSets(set2); //初始化集合
while(1)...{
Initialization();
printf("集合Set1:");
PrintSets(set1); //打印集合set1
printf("集合Set2:");
PrintSets(set2); //打印集合set1
printf("请键入操作代码:");
fflush(stdin); //清空缓冲区
char oper = getchar();
char setsContent[200];
switch(oper)
...{
case '1': //集合set1 赋值
printf("请输入集合Set1的容:");
fflush(stdin);
gets(setsContent);
InitSets(set1);
SetSets(set1,setsContent);
break;
case '2': //集合set1 赋值
printf("请输入集合Set1的容:");
fflush(stdin);
gets(setsContent);
InitSets(set2);
SetSets(set2,setsContent);
break;
case 'u':
case 'U': //求并
InitSets(set3);
CopySets(set1,seta); //因为求并的算法是添加一个节点,删除set1,set2中对应的节点,
CopySets(set2,setb); //所以要复制一份
UnionSets(seta,setb,set3); //下同
printf("set1 U set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'i':
case 'I': //求交
InitSets(set3);
CopySets(set1,seta);
CopySets(set2,setb);
IntersectionSets(seta,setb,set3);
printf("set1 交set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'd':
case 'D': //求差
InitSets(set3);
CopySets(set1,seta);
CopySets(set2,setb);
DifferenceSets(seta,setb,set3);
printf("set1 - set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'q':
case 'Q':
exit(0);
break;
}
system("cls"); //清屏
}
}
//~
本文来自: 中国自学编程网(https://www.360docs.net/doc/8612301762.html,) 详细出处参考:https://www.360docs.net/doc/8612301762.html,/html/20070424/7423.html
数据结构与算法C语言版期末复习题
《数据结构与算法》期末复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。 A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。 (1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性 (2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i C语言实现集合的交,并, 差 公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI- 【问题描述】 编制一个能演示执行集合的并、交和差运算的程序【基本要求】 (1)集合的元素限定为小写字母字符[ 'a'......'z' ] (2 )演示程序以用户和计算机对话的方式执行 【测试数据】 【实现提示】 以有序链表表示集合 【代码过程】 1。先定义集合的数据类型 .{ ElemType data; LNode *next; }*Link, *Position; typedef struct...{ Link head,tail; int len; }LinkSet; .{ .{ .{ if(h1->data < (link->data) && h2->data > (link->data) ) .{ .{ .{ .{ pre = h; h=h->next; j++; } if(j==0) return NULL; return pre; } Status PrintSets(LinkSet &ls)...{ .{ printf("%c ",h->data); h = h->next; } printf(" ] "); return OK; } Position GetHead(LinkSet &ls)...{ .{ .{ .{ .{ .{ .{.{ .{ int result = Compare(pa,pb); .{ DelFirst(lsa,node);Append(lsc,node); pa = NextPos(ha); .{ .{ DelFirst(lsb,node); pb = NextPos(hb);.{ DelFirst(lsa,node);Append(lsc,node); } while(!Empty(lsb))...{ DelFirst(lsb,node);Append(lsc,node); } return OK; } Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{ .{ int result = Compare(pa,pb); if( result<0) ...{ DelFirst(lsa,node);pa = NextPos(ha); #include 一、基本算法 1.交换(两量交换借助第三者) 例1、任意读入两个整数,将二者的值交换后输出。 main() {int a,b,t; scanf("%d%d",&a,&b); printf("%d,%d\n",a,b); t=a; a=b; b=t; printf("%d,%d\n",a,b);} 【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。 假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。 其中t为中间变量,起到“空杯子”的作用。 注意:三句赋值语句赋值号左右的各量之间的关系! 【应用】 例2、任意读入三个整数,然后按从小到大的顺序输出。 main() {int a,b,c,t; scanf("%d%d%d",&a,&b,&c); /*以下两个if语句使得a中存放的数最小*/ if(a>b){ t=a; a=b; b=t; } if(a>c){ t=a; a=c; c=t; } /*以下if语句使得b中存放的数次小*/ if(b>c) { t=b; b=c; c=t; } printf("%d,%d,%d\n",a,b,c);} 2.累加 累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。例1、求1+2+3+……+100的和。 main() {int i,s; s=0; i=1; while(i<=100) {s=s+i; /*累加式*/ i=i+1; /*特殊的累加式*/ } printf("1+2+3+...+100=%d\n",s);} 【解析】程序中加粗部分为累加式的典型形式,赋值号左右都出现的变量称为累加器,其中“i = i + 1”为特殊的累加式,每次累加的值为1,这样的累加器又称为计数器。 题目一:集合的并、交运算 1设计思想 首先,建立两个带头结点的有序单链表表示集合A和B。须注意的是:利用尾插入法建立有序单链表,输入数值是升序排列。 其次,根据集合的运算规则,利用单链表的有序性,设计交、并和差运算。根据集合的运算规则,集合A∩B中包含所有既属于集合A又属于集合B的元素。因此,须查找单链表A和B中的相同元素并建立一个链表存于此链表中。 根据集合的运算规则,集合A∪B中包含所有或属于集合A或属于集合B的元素。因此,遍历两链表的同时若元素相同时只将集合A中的元素存于链表中,若集合A中的下一个元素小于B中的元素就将A中的元素存于新建的链表中。反之将B中的元素存于链表中。 2所用数据结构 线性结构利用链式存储结构实现集合的基本运算。 3源代码分析 #include typedef int Status; typedef char Elemtype; typedef struct LNode{ 线性表的链式存储结构 Elemtype data; struct LNode *next; }Lnode,*Linklist; #include"text.h" LNode* Greatlist(int *N,int n) //建立一个带有头结点的单链表 { Linklist p,q,L; L=p=(LNode *)malloc(sizeof(LNode)); L->next=NULL; if(n!=0) { for(int i=0;i 2008-02-18 18:48 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } ============================================================== 【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) 数据结构课程设计 学院:信息科学与工程学院 专业:计算机科学与技术 班级: 学号: 学生姓名: 指导教师: 2009 年12 月25 日 一、实验内容 实验题目:编制一个演示集合的并、交和差运算的程序。 需求分析: 1、本演示程序中,集合的元素限定为小写字母字符[“a”…”z”]。集合输入的形 式为一个以“回车符“为结束标志的字符串,串中字符顺序不限。 2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信 息“之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。 3、程序执行的命令包括: 1)构造集合1;2)构造在集合2;3)求并集;4)求交集;5)求差集;6)返回;7)结束。“构造集合1”和“构造集合2”时,需以字符的形式键入集合元素。 二、数据结构设计 为了实现上述程序的功能,应以有序链表表示集合。为此,需要两个抽象数据类型:有序表和集合。 1、有序表的抽象数据类型定义为: readdata(pointer head) 初始条件:head是以head为头节点的空链表。 操作结果:生成以head为头节点的非空链表。 pop(pointer head) 初始条件:head是以head为头节点的非空链表。 操作结果:将以head为头节点的链表中数据逐个输出。 2、集合的抽象数据类型定义为: and(pointer head1,pointer head2,pointer head3) 初始条件:链表head1、head2、head3已存在 操作结果:生成一个由head1和head2的并集构成的集合head3。 or(pointer head1,pointer head2,pointer head3) 初始条件:链表head1、head2、head3已存在 操作结果:生成一个由head1和head2的交集构成的集合head3。 1.定积分近似计算: /*梯形法*/ double integral(double a,double b,long n) { long i;double s,h,x; h=(b-a)/n; s=h*(f(a)+f(b))/2; x=a; for(i=1;i } 3.素数的判断: /*方法一*/ for (t=1,i=2;i 集合的并交运算C语言集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988) 题目一:集合的并、交运算 1设计思想 首先,建立两个带头结点的有序单链表表示集合A和B。须注意的是:利用尾插入法建立有序单链表,输入数值是升序排列。 其次,根据集合的运算规则,利用单链表的有序性,设计交、并和差运算。 根据集合的运算规则,集合A∩B中包含所有既属于集合A又属于集合B的元素。因此,须查找单链表A和B中的相同元素并建立一个链表存于此链表中。 根据集合的运算规则,集合A∪B中包含所有或属于集合A或属于集合B的元素。因此,遍历两链表的同时若元素相同时只将集合A中的元素存于链表中,若集合A中的下一个元素小于B中的元素就将A中的元素存于新建的链表中。反之将B中的元素存于链表中。 2所用数据结构 线性结构利用链式存储结构实现集合的基本运算。 3源代码分析 #include typedef int Status; typedef char Elemtype; typedef struct LNode{ 线性表的链式存储结构 Elemtype data; struct LNode *next; }Lnode,*Linklist; #include"text.h" LNode* Greatlist(int *N,int n) //建立一个带有头结点的单链表{ Linklist p,q,L; L=p=(LNode *)malloc(sizeof(LNode)); L->next=NULL; if(n!=0) { for(int i=0;i 集合的交并差 班级:网工一班姓名:陈小龙学号:14051113 题目:编写一个演示集合的交并差运算的计算机程序 一、需求分析 1. 本次实验中要求输入的集合的元素类型为小写字母a到z,集合输入结束的标志是以“回车符”为标志的,集合的输入不限字符输入的顺序且允许重复输入和输入非法字符。 2. 本次实验中输出的集合中不包含重复的元素,集合中的元 素按ASCII从小到大排列输出且将自动过滤输入的非法字符。 3. 本次实验的程序可以计算用户输入的两个集合的交集、并集和补集; 4. 本次实验的测试数据有: 输入的集合为Set1=“magazine”,Set2=“paper”, 输出的集合为并集为“aegimnprz”, 交集为“ae”, 差集为“gimnz”; 输入的集合为 Set1=“012oper4a6tion89”,Set2=”error data”,输出的集合为并集为“adeinoprt”,并集为“aeort”,差集为“inp”。 二、概要设计 为实现上述程序的功能,用有序链表表示集合。因此,需要有两个抽象数据类型:有序表和集合。 1. 有序表的抽象数据类型定义: ADT OrderedList{ 数据对象:D={ai|ai∈CharSet,i=1,2...,n,n>=0} 数据关系:R1={ C语言常用算法集合 1.定积分近似计算: /*梯形法*/ double integral(double a,double b,long n) { long i;double s,h,x; h=(b-a)/n; s=h*(f(a)+f(b))/2; x=a; for(i=1;i if(n==1||n==2) *s=1; else{ fib(n-1,&f1); fib(n-2,&f2); *s=f1+f2; } } 3.素数的判断: /*方法一*/ for (t=1,i=2;i 用集合的特征函数实现集合间的运算 一、实现功能:利用集合的特征函数实现集合间的运算。 二、实验说明:本程序用C语言编写,具体实现了集合的交并补运算。 三、程序思路(流程图表示): Main()函数 输入全集U元素个 数和各元素 输入全集A元素个数和 各元素 输入全集B元素个数和 各元素 获得A和B的特征函数 值 调用子函数进行交并补 运算 结束 四、子函数功能 Equal()判断集合A和集合B是否相等 Intersect()求集合A和集合B的交集Union()求集合A和集合B的并集Complement()求集合A或集合B的补集五、测试举例 六、程序源码 /*------------------------------------------- -----作者:随心无羁---------------------------- -----编译环境:VC6.0------------------------- -----时间:2013.12.3------------------------*/ #include #include MASM汇编错误信息说明 test.asm(54):error A2000:Block nesting error 1.1.test.asm(54): 说明:此错误信息通常见于一个段定义起始段名和末尾段名不一致。 修改:检查段定义,使段名前后保持一致。 test.asm(5):error A2005:Symbol is multidefined:DATA 2.2.test.asm(5): 说明:此错误信息提示DATA符号重复定义了。 修改:将其中一个符号DATA重新设置。 test.asm(7):error A2009:Symbol not defined:B9H 3.3.test.asm(7): 说明:此错误信息为test.asm中第7行指令出错,查看该指令,源操作数为十六进制数B9H。按规定以字母开始的十六进制数,应在其前面加上数字0以便汇编程序区分常数和符号。另一种出错的可能原因是程序中使用的符号变量没有定义。 修改:以0B9H取代B9H;使用伪指令定义变量。 test.asm(11):error A2009:Symbol not defined:NO 4.4.test.asm(11): 说明:test.asm中第11行指令JLE no-count,符号中使用了中折线,中折线在汇编中是作减号,因此,汇编提示标号NO没有定义。注意,汇编语言规定符号中可以使用下划线。 修改:将no-count改为no_count。 test.asm(28):error A2010:Syntax error 5.5.test.asm(28): 说明:此错误信息提示源程序中第28行的指令语句的语法与任何可识别的语法不匹配,出错。 修改:按照汇编指令的规定格式重新编写。 6.6.test.asm(2): test.asm(2):error A2018:Operand must be register:DX 说明:指定的寄存器不是指令或伪指令所要求的。如:ASSUME DX:DATA 修改:查看汇编指令的规定格式。 集合的并、交、补集 一、单选题(共12道,每道8分) 1.设集合,,则=( ) A.{0} B.{0,2} C.{-2,0} D.{-2,0,2} 答案:D 解题思路: 试题难度:三颗星知识点:并集及其运算 2.若集合,,则=( ) A. B. C. D. 答案:D 解题思路: 试题难度:三颗星知识点:交集及其运算 3.已知集合,,若={2,5},则a+b的值为( ) A.10 B.9 C.7 D.4 答案:C 解题思路: 试题难度:三颗星知识点:交集及其运算 4.设集合,,若,则a的值为( ) A.0 B.1 C.-1 D.±1 答案:C 解题思路: 试题难度:三颗星知识点:交集及其运算 5.已知全集,集合,则( ) A. B. C. D. 答案:C 解题思路: 试题难度:三颗星知识点:补集及其运算 6.若集合,集合,则( ) A.) B. C. D. 答案:B 解题思路: 试题难度:三颗星知识点:补集及其运算 7.设集合,,则满足的集合有( ) A.1个 B.2个 C.3个 D.4个 答案:B 解题思路: 试题难度:三颗星知识点:交集及其运算 8.满足,且的集合M有( ) A.1个 B.2个 C.3个 D.4个 答案:B 解题思路: 试题难度:三颗星知识点:子集与真子集 9.若,则满足条件的集合共有( )个. A.1 B.2 C.3 D.4 答案:D 解题思路: 试题难度:三颗星知识点:并集及其运算 10.如图,U是全集,A,B,C是U的3个子集,则阴影部分所表示的集合是( ) A. B. C. D. 答案:A 解题思路: 试题难度:三颗星知识点:Venn图表达集合的关系及运算 11.已知全集,,那么下列结论中不成立的是( ) A. B. C. D. 答案:D 解题思路: 实验二集合的并、交和差运算 // 在写代码的过程中,没有注意头结点~~~ 导致出现了很多野指针~~~ ,几乎重写. 。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 1、test.asm(54): error A2000: Block nesting error 、 说明:此错误信息通常见于一个段定义起始段名和末尾段名不一 致。说明:此错误信息通常见于一个段定义起始段名和末尾段 名不一致。修改:检查段定义,使段名前后保持一致。修改: 检查段定义,使段名前后保持一致。 2、test.asm(5): error A2005: Symbol is multidefined: DATA 说明:符号重复定义了。说明:此错误信息提示 DATA 符号重 复定义了。修改:重新设置。修改:将其中一个符号 DATA 重 新设置。 3、test.asm(7): error A2009: Symbol not defined: B9H 、 说明:行指令出错,查看该指令,说明:此错误信息为 test.asm 中第 7 行指令出错,查看该指令,源操作数为十六进制 数 B9H。按规定以字母开始的十六进制数,应在其。按规定以 字母开始的十六进制数,以便汇编程序区分常数和符号。前面 加上数字 0 以便汇编程序区分常数和符号。另一种出错的可能 原因是程序中使用的符号变量没有定义。能原因是程序中使用 的符号变量没有定义。修改:修改:以 0B9H 取代 B9H;使用 伪指令定义变量。;使用伪指令定义变量。 4、test.asm(11): error A2009: Symbol not defined: NO 、 说明:说明:test.asm 中第 11 行指令 JLE no-count,符号中使 用了中折线,中,符号中使用了中折线,折线在汇编中是作为 减号,因此,没有定义。折线在汇编中是作为减号,因此,汇 编提示标号 NO 没有定义。注意,汇编语言规定符号中可以使 用下划线。注意,汇编语言规定符号中可以使用下划线。修改:修改:将 no-count 改为 no_count。。 5、test.asm(28): error A2010: Syntax error 、 60.题目:古典问题:有一对兔子,从出生后第3个月 起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总 数 为多少? _________________________________________________________________ _ 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... _________________________________________________________________ __ 程序源代码: main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++) { printf("%12ld %12ld",f1,f2); if(i%2==0) printf("\n");/*控制输出,每行四个*/ f1=f1+f2;/*前两个月加起来赋值给第三个月*/ f2=f1+f2;/*前两个月加起来赋值给第三个月*/ } } 上题还可用一维数组处理,you try! 61.题目:判断101-200之间有多少个素数,并输出所有素数。 _________________________________________________________________ _ 1 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被 整 除,则表明此数不是素数,反之是素数。 _________________________________________________________________ __ 程序源代码: #include "math.h" main() { int m,i,k,h=0,leap=1; 关于集合的交并补运算 我们来看这样一个例题. 【例】已知集合U ={x ∈R |1<x ≤7},A ={x ∈R |2≤x <5},B ={x ∈R |3≤x <7}.求: (1)(U C A )∩(U C B ); (2)U C (A ∩B ); (3)(U C A )∪(乙B ); (4)U C (A ∪B ).. 利用数形结合的思想,将满足条件的集合在数轴上一一表示出来,从而求集合的交集、并集、补集,既简单又直观,这是最基本最常见的方法.本例题可先在数轴上画出集合U 、A 、B ,然后求出A ∩B ,A ∪B ,U C A ,U C B ,就能逐一写出各小题的结果,有条件的还可以设计多媒体教学课件,展现这一全过程. 解:利用数轴工具。画出集合U 、A 、B 的示意图,如下图. 可以得到,A ∩B ={x ∈R |3≤x <5}, A ∪ B ={x ∈R |2≤x <7}, U C A ={x ∈R |1<x <2}∪{x |5≤x ≤7}, U C B ={x ∈R |<x <3}∪{7}. 从而可求得 (1)(U C A )∩(U C B );{x ∈R |1<x <2}∪{7}. (2)U C (A ∪B )={x ∈R |1<x <2}∪{7}. (3)(U C A )∪(U C B )={x ∈R |1<x <3}∪{x ∈R |5≤x ≤7}. (4)U C (A ∩B )={x ∈R |1<x <3}∪{x ∈R |5≤x ≤7}. 认真观察不难发现: U C (A ∪B )=(U C A )∩(U C B ); U C (A ∩B )=(U C A )∪(U C B ). 这个发现是偶然的呢?还是具有普遍的意义呢? 为了提高学生分析问题和解决问题的能力,培养他们探索研究的思维品质和创新意识,同时也让学生体验数形结合思想方法解题的要领和重要性,我们可以做两方面的工作: (1)让学生自己编拟一道集合运算的例题,并验证上述等式是否成立; (2)设计一套韦恩图来验证上述等式(有条件的可设计一多媒体课件来展示并验证). 第(1)方面的工作让学生自己尝试,我们来做第(2)方面的工作. 我们来看四个图: (1) (2) (3) (4) 细心观察、领会,我们能够看出: 图(1)的阴影部分是A ∩B ; 图(2)的阴影部分是B ∩(U C A ); 图(3)的阴影部分是A ∩(U C B ); 图(4)的阴影部分是U C (A ∪B ),或者是(U C A )∩(U C B ). 从图(4)我们已经得到U C (A ∪B )=(U C A )∩(U C B ); 从图(1)我们也可得到U C (A ∩B )=(U C A )∪(U C B ). 一般地,对于任意集合A 、B ,下列等式成立. (1)U C (A ∩B )=(U C A )∪(U C B ); (2)U C (A ∩B )=(U C A )∩(U C B ). 这就是著名的德·摩根定律,它可以叙述为:A 、B 交集的补集等于A 、B 的补集的并集;A 、B 并集的补集等于A 、B 的补集的交集. 《数据结构》 课程设计说明书 题目集合的并交差运算 学号 姓名 指导教师 日期 内蒙古科技大学课程设计任务书 附录:程序代码 #include jihe a[3];jihe b; /*************************长度****************************************/ int jihe::ListLength(int i) { LinkList *p; p = a[i].L; while (p->next != NULL) { p = p->next; a[i].length ++; } return a[i].length; } /****************************输入*************************************/ void jihe::ListCreat(int i) /*尾插法插入元素*/ { cout<<"请为集合输入数值(以回车键结束):"; char c; LinkList *p,*r; a[i].L=(LinkList*)malloc(sizeof(LinkList)); a[i].L->next=NULL; r=a[i].L; cin>>c; while(c!='\n') { p=(LinkList*)malloc(sizeof(LinkList)); if(c==' ') {} else { p->data=c; r->next=p; r=p; } c=cin.get(); } r->next=NULL; cout<<"输入完毕,请按回车键返回主菜单!"<C语言实现集合的交,并,差
集合的交并运算
非常全的C语言常用算法
集合的并、交运算C语言
C语言经典算法100例(1---30)
数据结构课程设计_集合的并、交和差运算
C语言常用算法集合
集合的并交运算C语言
集合的交并差
最新C语言常用算法集合汇总
集合的特征函数交并补运算c语言
集合 的交并和差的运算与实现
MASM汇编错误信息说明 ASM问题汇总
集合的并、交、补集测试题(含答案)
实验 二 集合的并、交和差运算C++
汇编错误总结
c语言经典算法100例
关于集合的交并补运算
集合的交并差运算