基于C语言的集合运算程序实现

合集下载

C语言实验五实验报告——数组

C语言实验五实验报告——数组

C语言实验五实验报告——数组一、实验目的:1.了解数组的概念和基本使用方法;2.掌握一维数组和二维数组的定义、初始化、赋值及基本运算实现;二、实验内容与方法1.理论部分数组是一些具有相同类型的数据元素按一定顺序排列组合而成的集合,在程序设计中它是一个变量列表,由若干相同数据类型的元素组成。

通常用一个名字和一个下标来表示,下标可理解为数组元素在数组中的位置编号。

数组的特点:数组是根据顺序排列的元素的集合;所有的元素必须是相同类型。

数组的定义方法:1. 定义数组,数组元素类型 + 数组名[元素的个数];2. 元素的个数必须是整型常量或变量,定义时必须明确、指定元素的个数;3. 声明一个数组时,除了要指定数组的类型外,还要指定数组的名称;4. 数组定义完后,需要对其中的每个元素进行初始化。

可以在定义数组时赋初值,也可以通过赋值符号,对数组元素逐个进行赋值。

数组的初始化:1. 元素个数之间用逗号分开,最后1个元素后无逗号;2. 支持部分元素初始化;3. 定义和初始化可以一步完成。

二维数组数组可分为一维和多维数组。

一维数组可以看作是包含多个元素的向量,而二维数组可以看做是包含了多个一维数组的矩阵。

二维数组有行号和列号,因此,它同样需要两个下标。

数组元素类型数组名[行数][列数];数组元素类型数组名[ ][ ] = { {元素1, 元素2, ……}, {元素1, 元素2, ……}, ……{元素1, 元素2, ……}}2.实验代码**问题1:**定义一个一维数组a,包含有5个元素,分别为1,2,3,4,5;**问题2:**定义一个一维数组a,接收用户从键盘输入的5个数值,分别打印存储的各个元素。

三、实验结果与分析结果分析:定义了一个5个元素的一维数组a,并初始化了各个元素的值,其元素分别为1,2,3,4,5.循环遍历一遍数组a,并打印数组元素。

程序执行正常。

3.针对问题3:定义一个二维数组a,由4行3列组成,每个元素初始化为0,打印存储的各个元素;程序运行结果如下:四、实验总结:该实验主要是通过对C语言数组的理论知识和基本操作进行练习,加深了对数组的了解和掌握。

C语言中的位运算的技巧

C语言中的位运算的技巧

C语⾔中的位运算的技巧⼀、位运算实例1、⽤⼀个表达式,判断⼀个数X是否是2的N次⽅(2,4,8,16.....),不可⽤循环语句。

X:2,4,8,16转化成⼆进制是10,100,1000,10000。

如果减1则变成01,011,0111,01111。

两者做按位与运算,结果如果为0,则X是2的N次⽅。

2、统计⼀个整数的⼆进制中1的个数int count_number_of_one(int number){ int counter = 0; while (number) { counter++; number &= number - 1 ; } return counter;}⼆、位运算基础很多⾼级的动态规划题⽬或者⼀些基础的运算往往需要较⾼的执⾏效率和较低的空间需求,或者需要表⽰⼀些状态集合,⽽位运算刚好能满⾜这⼀切。

很多的时候,恰当的位运算使⽤也能使程序变得更加简洁和优美。

1、位运算法则位运算是各位互不影响的,⽐如A为1010⽽B为1100,那么有A&B=1000A|B=1110A^B=0110~A=11110101 (1的个数是取决于A的类型的,这⾥认为A的类型是8位整型)另外两种位运算是位移运算a<<b,a>>b。

前者表⽰将a的所有位向左移动b位,后者则表⽰将a的所有位向右移动b位。

对于⾮负整数(往往这也是我们最关⼼的),新空出的位将会被0取代。

⽐如A为1001,⽽B为3,那么A>>B则为1。

⼤多数情况下可以简单地认为左移b位就是乘以2b,⽽右移b位则是除以(整除)2b。

当然这是存在例外的——对于负数是不能这么简单认为的:⽐如在GNU GCC/G++ 编译条件下,若A=-1,你会发现对于任何位移运算A<<B,⽆论B的取值如何,其结果均为-1。

因此请注意,在位移运算下务必确保对⾮负整数进⾏运算,以免发⽣不必要的问题。

对于位移运算最常⽤的操作就是取⼀个特定的位——⽐如1< xx>2、对于集合的表⽰⼤多数时候,我们可以⽤⼀个整数来表⽰⼀个包含不超过32(当然如果使⽤64位整型变量也可以是64个)个元素的集合——对于每⼀个位,如果元素为1,则表⽰存在当前位所对应的集合成员,如果是0,则表⽰这个集合成员是不存在的。

c语言程序求集合的并集,交集,差集运算

c语言程序求集合的并集,交集,差集运算

C语言是一种广泛应用的计算机程序设计语言,它具有高效、灵活、可移植等特点,因此在计算机科学领域被广泛应用。

本篇文章将探讨在C语言中如何求集合的并集、交集和差集运算。

一、集合的概念集合是数学中重要的概念,它是由元素组成的无序的集合体。

在计算机科学中,我们常常需要对集合进行各种操作,比如求并集、交集、差集等。

二、集合的表示方法在C语言中,我们可以使用数组来表示集合。

数组是一种非常基础的数据结构,它由相同类型的元素组成的有序集合。

我们可以通过定义数组来表示一个集合,并通过遍历数组来进行各种集合运算。

三、集合的并集运算集合A和集合B的并集运算是指将A和B中的所有元素放在一起组成一个新的集合。

在C语言中,我们可以通过遍历两个数组,将它们的元素放在一个新的数组中即可实现并集运算。

下面是C语言中求两个集合的并集运算的示例代码:```#include <stdio.h>int m本人n() {int setA[] = {1, 2, 3, 4, 5};int setB[] = {3, 4, 5, 6, 7};int setSize = 5;int setUnion[10];int unionSize = 0;for (int i = 0; i < setSize; i++) {setUnion[unionSize++] = setA[i]; }for (int i = 0; i < setSize; i++) {int found = 0;for (int j = 0; j < setSize; j++) {if (setB[i] == setA[j]) {found = 1;break;}}if (!found) {setUnion[unionSize++] = setB[i];}}// 输出并集for (int i = 0; i < unionSize; i++) {printf("d ", setUnion[i]);}return 0;}```以上代码中,我们定义了两个集合setA和setB,分别表示集合A和集合B,然后通过遍历这两个数组,将它们的元素放入一个新的数组setUnion中。

两个任意长的整数的求和运算

两个任意长的整数的求和运算

软件综合课程设计两个任意长的整数的求和运算进制的转换2014 年6月目录一、问题陈述二、需求分析三、概要设计四、详细设计五、程序代码六、运行结果与测试七、设计体会与总结两个任意长的整数的求和运算一、问题陈述设计一个程序实现两个任意长的整数的求和运算。

利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。

要求输入和输出每四位一组,组间用逗号隔开。

如:1,0000,0000,0000,0000。

二、需求分析1、本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。

2、本演示程序中,集合的元素限定为数字字符[‘0’~’9’],输入字符可以任意长,输入形式以“#”为结束标志,串中字符顺序不限,且允许出现重复字符。

3、利用双向循环链表现实长整数的存储,每个结点含一个整形变量。

输入的形式以#结束,每四位一组。

三、概要设计在此说明数据结构设计和关键的算法设计思想Add()函数是实现该问题的主要函数即相加。

typedef struct et 定义双循环链表的存储结构.void setin(dtp *a) 读入数据存储在双链表中的函数;void print1(dtp *w,int len) 原样输出输入的数,略去结束符"#";void print2(dtp a,int len) 输出运算结果,以每四位一个","样式;四、详细设计程序流程图五、程序代码#include<iostream>using namespace std;#define null 0typedef struct et {int data;struct et * pr,* next;} dtp;void setin(dtp *a) {t= new dtp;t->data=k;w=w+1;if(c->next)c->next->pr=t;t->next=c->next;c->next=t;t->pr=c;}*len=w;}void print1(dtp *w,int len)'#'表示输入结束: "<<endl;cout<<"请输入第一个数a: "<<endl;setin(&la);cout<<"请输入第二个数b: "<<endl;setin(&lb);add (la,lb,&lc,&length);cout<<"你输入的两个数的和为: ";cout<<endl<<" ";print1 (&la,length);cout<<"+ ";print1 (&lb,length);cout<<"---------------";cout<<endl<<" ";print2(lc,length);for(;2;){cin>>ma;if (ma=='\n')continue ;else break;}}}六、运行结果与测试进制的转换一、问题陈述任意给定一个M进制的数x ,请实现如下要求1)求出此数x的10进制值(用MD表示)2)实现对x向任意的一个非M进制的数的转换。

离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]

离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]

离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]实验成绩:202212202201016学号:【实验题目】1.命题逻辑实验四【实验目的】2.掌握用计算机求集合的交、并、差和补运算的方法。

【实验内容】3.编程实现集合的交、并、差和补运算。

【实验要求】4、++语言编程实现C或C【算法描述】5.10},,,9,6,7,,C,E表示集合。

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

B是集合E,要求集合数据要求不重复)A,置成空集。

以下每一个运算都要求先将集合CB}且某)二个集合的交运算:AB={某|某A(2C中的元素进行比较,将相同的元素放在数组中元素逐一与数组B把数组AB的交。

便是集合中,数组CA和集合C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]==b[j])c[k++]=a[i];B}或某3)二个集合的并运算:AB={某|某A(中中的元素逐一与数组AC中。

将数组B中各个元素先保存在数组把数组AB和集合C便是集合A 的元素进行比较,把不相同的元素添加到数组C中,数组的并。

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={某|某A且某B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。

C语言算法:for(j=0;j<m;j++){for(i=0;i<n;i++){if(A[j]==B[i]){C[k]=A[j];k++;break;}if(j==n){C[k]=A[i];k++;}}A}且~A=B-A={某|某B某)集合的补运算:(5把不相同的元素保存到中的元素进行比较,E中的元素逐一与数组A将数组关于集合中,数组数组CC便是集合AE的补集。

差集运算实验报告

差集运算实验报告

一、实验目的1. 理解差集运算的概念和性质。

2. 掌握使用C语言实现差集运算的方法。

3. 通过实验加深对集合运算的理解,提高编程能力。

二、实验原理差集运算,也称为集合的减法运算,是指从一个集合中去除另一个集合中包含的元素,得到的结果称为差集。

假设有两个集合A和B,A-B表示从集合A中去除所有属于集合B的元素,得到的集合称为A与B的差集。

差集运算的性质如下:1. 交换律:A-B = B-A2. 结合律:(A-B)-C = A-(B∪C)3. 分配律:A-(B∪C) = (A-B)∩(A-C)三、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019四、实验步骤1. 定义差集运算函数:实现差集运算的核心是定义一个函数,该函数接收两个集合作为参数,返回它们的差集。

```cvoid differenceSet(int setA, int setASize, int setB, int setBSize, int result, int resultSize) {int i, j, k = 0;for (i = 0; i < setASize; i++) {int flag = 0;for (j = 0; j < setBSize; j++) {if (setA[i] == setB[j]) {flag = 1;break;}}if (flag == 0) {result[k++] = setA[i];}}resultSize = k;}```2. 创建两个集合:为了进行差集运算,我们需要创建两个集合A和B,并分别存储它们的元素。

```cint setA[] = {1, 2, 3, 4, 5};int setB[] = {4, 5, 6, 7, 8};int setASize = sizeof(setA) / sizeof(setA[0]);int setBSize = sizeof(setB) / sizeof(setB[0]);```3. 计算差集:调用差集运算函数,计算集合A与B的差集。

离散数学(集合的运算)实验报告

离散数学(集合的运算)实验报告

大连民族学院计算机科学与工程学院实验报告实验题目:集合的运算课程名称:离散数学实验类型:□演示性□验证性□操作性□设计性□综合性专业:网络工程班级:网络111班学生姓名:张山学号:2011083123实验日期:2013年12月22日实验地点:I区实验机房实验学时:8小时实验成绩:指导教师签字:年月日老师评语:实验题目:集合的运算实验原理:1、实验内容与要求:实验内容:本实验求两个集合间的运算,给定两个集合A、B,求集合A与集合B之间的交集、并集、差集、对称差集和笛卡尔乘积。

实验要求:对于给定的集合A、B。

用C++/C语言设计一个程序(本实验采用C++),该程序能够完成两个集合间的各种运算,可根据需要选择输出某种运算结果,也可一次输出所有运算结果。

2、实验算法:实验算法分为如下几步:(1)、设计整体框架该程序采取操作、打印分离(求解和输出分开)的思想。

即先设计函数求解各部分运算并将相应结果传入数组(所求集合)中,然后根据需要打印运算结果。

(2)、建立一个集合类(Gather)类体包括的数组a、b、c、d、e、f、g分别存储集合A、B以及所求各种运算的集合。

接口(实现操作的函数)包括构造函数,菜单显示函数,求解操作函数,打印各种运算结果等函数。

(3)、设计类体中的接口构造函数:对对象进行初始化,建立集合A与集合B。

菜单显示函数:设计提示选项,给使用者操作提示。

操作函数:该函数是程序的主题部分,完成对集合的所有运算的求解过程,并将结果弹入(存入)对应数组(集合)中,用于打印。

具体操作如下:1*求交集:根据集合中交集的定义,将数组a、b中元素挨个比较,把共同元素选出来,并存入数组c(交集集合)中,即求得集合A、B的交集。

2*求并集:根据集合中并集的定义,先将数组a中元素依次存入数组g(并集集合)中,存储集合A中某元素前,先将其与已存入g中的元素依次比较,若相同则存入下一个元素,否则直接存入g中,直到所有A中元素存储完毕。

《C语言程序设计》第5章数组、字符串、指针

《C语言程序设计》第5章数组、字符串、指针

相当于声明了5个整型变量
说明: ① 数组的所有元素的数据类型都是相同的。 ② 数组取名规则应符合标识符的规定,数组 名不能与同一函数中其它变量名相同: int a; float a[10]; 是错误的。
③ C语言中规定数组的下标从0开始,方括号 中常量表达式表示数组元素的个数。
④ 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如: int n=5,a[n]; 是错误的。
二维数组在内存的存放顺序是“先行后列”
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0]

a[2][3]
5.3.2 二维数组元素的引用
二维数组的元素的引用形式为: 数组名[下标][下标] 使用二维数组的情况举例: 学生多门功课的成绩,如: a[100][3]可以用来记录100个学生3门功 课的成绩。 矩阵,如: a[3][3]可以用来记录3×3的矩阵。一个 数组元素正好存放一个矩阵的元素。
5.2.2 一维数组的初始化
1、数组声明时初始化 在编译阶段进行的。这样将减少运行时间, 提高效率。 数组初始化的一般形式为: 类型符 数组名[常量表达式]={值,值…值}; 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0; a[1]=1;... a[9]=9;

a[9]
#include <stdio.h> 声明有10个元素 void main() 的一维数组a {int n,i; float s=0, ave, a[10]; a[0] a[1] … a[9] for(i=0;i<10;i++) a[i] { scanf("%f",&a[i]); a[i] s=s+a[i]; } ave=s/10; for(i=0;i<10;i++) a[i] a[i] if (a[i]>ave) printf("%f ",a[i]); }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

现有如下要求:对于一个集合,要求用计算机编码表示出来,其原则是:对一个元素个数确定的集合将其抽象为一个0、1代码组成的计算机编码,集合中存在的元素i其对应编码的第i个位置为1,若没有则为0,要求编写程序来实现集合间的运算,并且将结果用计算机编码表示出来!
例如:{1,4,6}假设元素个数确定为8;则其计算机编码对应的为10010100
代码部分:
#include<stdio.h>
#include<string.h>
#define Ture 1
#define False 0
//输出一个集合对应的计算机编码
void print(int arr[])
{
int i;
for(i=0;i<8;i++)
{
if(arr[i])
printf("%d",Ture);
else
printf("%d",False);
}
printf("\n\n");
}
//输出集合元素
void printing(int arr[])
{
int i;
printf("{");
for(i=0;i<8;i++)
if(arr[i])
printf("%d ",arr[i]);
printf("}\b\n\n");
//求一个集合的绝对补集
void different(int arr[])
{
int i;
printf("A的绝对补集={");
for(i=0;i<8;i++)
if(!arr[i])
printf("%d ",i+1); //输出补集对应的元素项printf("\b}");
printf("\n\n");
printf("补集对应的计算机编码为:\t");
for(i=0;i<8;i++)
{
if(arr[i])
printf("%d",False);
else
printf("%d",Ture);
}
printf("\n\n");
}
//输入第二个集合的元素
void scan(int arr[])
{
int i;
while(1)
{
scanf("%d",&i);
if(i>=1&&i<=8)
arr[i-1]=i;
if(i==-1) ////以负1为结束标志
break;
}
printf("集合B={");
for(i=0;i<8;i++)
if(arr[i])
printf("%d ",i+1); //输出补集对应的元素项printf("\b}");
printf("\n\n");
printf("该集合对应的计算机编码为:\t");
print(arr);
}
//求已知两个集合的并集
void plus(int arr[],int arr1[])
int i,arry[8]={0};//对数组进行初始化时,先将数组中的元素全部置零for(i=0;i<8;i++)
{
if(arr[i]!=0)
arry[i]=arr[i];
if(arr1[i]!=0)
arry[i]=arr1[i];
}
// printf("输出俩个集合的并集:\n");
printf("为={");
for(i=0;i<8;i++)
{
if(arry[i]) //对应位置不为0,说明集合中有该项元素
printf("%d ",arry[i]);
}
printf("\b}\n\n");
printf("该集合对应的计算机编码为:\t");
print(arry);
}
//求两个集合的交集
void same(int arr[],int arr1[])
{
int j,thesame[8]={0};
for(j=0;j<8;j++)
if(arr[j]!=0&&arr1[j]!=0)
thesame[j]=arr[j];
printf("输出俩个集合的交集:\n");
printf("A和B的交集={");
for(j=0;j<8;j++)
if(thesame[j]) //对应位置不为0,说明集合中有该项元素printf("%d ",thesame[j]);
printf("\b}\n\n");
printf("该集合对应的计算机编码为:\t");
print(thesame);
}
//求两个集合的相对补集
void xdiffer(int arr[],int arr1[])
{
int k,xdiffer[8]={0};
for(k=0;k<8;k++)
if(arr[k]!=0&&arr1[k]==0)
xdiffer[k]=arr[k];
printf("B对A的相对补集为(即A-B):{");
for(k=0;k<8;k++)
if(xdiffer[k]) //对应位置不为0,说明集合中有该项元素
printf("%d ",xdiffer[k]);
printf("\b}\n\n");
printf("对应的计算机编码为:\t");
print(xdiffer);
}
void main()
{
int i,arry[8]={0},arry1[8]={0};//对数组进行初始化时,先将数组中的元素全部置零
int differ[8]={0},differ1[8]={0};//定义两个数组,来存放求得的相对补集
printf("输入集合元素:\n");
while(1)
{
scanf("%d",&i);
if(i>=1&&i<=8)
arry[i-1]=i;
if(i==-1) //以负1为结束标志
break;
}
printf("集合A={");
for(i=0;i<8;i++)
if(arry[i])
printf("%d ",i+1); //输出补集对应的元素项
printf("\b}");
printf("\n\n");
printf("该集合对应的计算机编码为:\t");
print(arry);
printf("输出原集合的绝对补集:\t");
different(arry);
printf("输入第二个集合元素:\n");
scan(arry1);
printf("集合A和B的并集");
plus(arry,arry1);
same(arry,arry1);
xdiffer(arry,arry1);
//xdiffer(arry1,arry);
for(i=0;i<8;i++)
if(arry[i]!=0&&arry1[i]==0)
differ[i]=arry[i];
//printf("B对A的相对补集为(即A-B):");
//printing(differ);
//printf("该集合对应的计算机编码为:\t");
//print(differ);
for(i=0;i<8;i++)
if(arry[i]==0&&arry1[i]!=0)
differ1[i]=arry1[i];
printf("A对B的相对补集为(即B-A):");
printing(differ1);
printf("该集合对应的计算机编码为:\t");
print(differ1);
printf("集A和B的对称差");
plus(differ,differ1);
}
下面是一次运行的结果:。

相关文档
最新文档