如何用C语言表示离散数学上的集合,并输出输入?

Python013

如何用C语言表示离散数学上的集合,并输出输入?,第1张

最简单的是bit set(又称为Bit array、bit vector),例如用 typedef unsigned bitset[N / sizeof(unsigned)]表示一个集合(其全集的元素量为N),每个bit代表某个元素是否存在于该集合中。

这个数据结构的好处是,可用位操作(&、|、~)实现并集、交集、补集,非常适合计算机运作。

缺点是空间和时间复杂度和全集的元素数量 N 成正比,而不是集合实际的元素量。例如全集是32位整数,每个集合就需要2^32 bit = 512MB的空间。如果集合中的元素比较少,可以使用有序序列,例如排序数组(Sorted array)、二叉查找树等实现集合。它们的缺点是修改集合不是常数时间。

数据类型关键字

short:修饰int,短整型数据,可省略被修饰的int。(K&R时期引入)

long:修饰int,长整型数据,可省略被修饰的int。(K&R时期引入)

long long:修饰int,超长整型数据,可省略被修饰的int。(C99标准新增)

signed:修饰整型数据,有符号数据类型。(C89标准新增)

unsigned:修饰整型数据,无符号数据类型。(K&R时期引入)

restrict:用于限定和约束指针,并表明指针是访问一个数据对象的初始且唯一的方式。

#include <stdio.h>#include <stdlib.h>#define N 20#define M 20main(){ int i,j,k,m,nint r1[M],r2[M],a[N],mr[N][N]={0}FILE * fpprintf("程序自动调用c:/stone2.txt文件内相应数据\n")fp=fopen("c:\\stone2.txt","r")fscanf(fp,"%d",&n); /*读取集合元素个数*/ for(i=0i<ni++) /*读取集合元素*/ fscanf(fp,"%d",&a[i])fscanf(fp,"%d",&m); /*读取关系个数*/ for(k=0k<mk++) fscanf(fp,"%d,%d",&r1[k],&r2[k]); /*读取关系*/ fclose(fp)printf("自反闭包r(R):\n{")for(i=0i<ni++) printf("<%d,%d>,",a[i],a[i]); /*输出自反闭包*/ for(k=0k<mk++) { if(r1[k]!=r2[k]) printf("<%d,%d>,",r1[k],r2[k])else continue} printf("\b}\n")printf("对称闭包s(R):\n{"); /*输出对称闭包*/ for(k=0k<mk++) { if(r1[k]!=r2[k]) printf("<%d,%d>,<%d,%d>,",r1[k],r2[k],r2[k],r1[k])else printf("<%d,%d>,",r1[k],r2[k])} printf("\b}\n")k=0for(i=0i<n,k<mi++) { if(r1[k]!=a[i]) continueelse { for(j=0j<n,k<mj++) /*关系转换成矩阵*/ { if(r2[k]!=a[j]) continueelse { mr[i][j]=1k++i=0j=0break} } } } printf("关系所对应的关系矩阵:\n")for(i=0i<ni++) { /*打印关系矩阵*/ for(j=0j<nj++) printf("%5d",mr[i][j])printf("\n")} for(k=0k<nk++) for(i=0i<ni++) /*warshall*/ for(j=0j<nj++) mr[i][j]+=mr[i][j]+mr[i][k]*mr[k][j]for(i=0i<ni++) for(j=0j<nj++) { /*把mr[]非0项赋值为1*/ if(!mr[i][j]) continueelse mr[i][j]=1} printf("传递闭包对应关系矩阵:\n")for(i=0i<ni++) { /*输出传递闭包对应的关系矩阵*/ for(j=0j<nj++) printf("%5d",mr[i][j])printf("\n")} system("PAUSE");}自己写的,三个闭包都有,包括传递闭包,看注释就知道了,还是用文件读写,方便数据输入