//真值运算
#include<stdio.h>
int main(){
int p,q;
char t='y';
while(t)
{
printf("是否运算程序(y/n):\n");
scanf("%c",&t);
if('y'==t || 'Y' == t)
{
printf("输入p,q的真值(0或1):");
scanf("%d%d",&p,&q);
getchar();
/* if((p != 1)&&(p != 0))
{
printf("请重新输入p值");
scanf("%d",&q);
getchar();
}
if((q != 1)&&(q != 0))
{
printf("请重新输入q值");
scanf("%d",&q);
getchar();
}
*/
if(!!q == 0 && !!p == 0)
{
printf("﹁p = 1\n");
printf("﹁q = 1\n");
printf("p∧q =0\n");
printf("p∨q = 0\n");
printf("p^q = 0\n");
printf("p→q = 1\n");
printf("p<->q = 1\n");
}
else if(!!p == 0 && !!q == 1)
{
printf("﹁p = 1\n");
printf("﹁q = 0\n");
printf("p∧q = 0\n");
printf("p∨q = 1\n");
printf("p^q = 1\n");
printf("p→q = 1\n");
printf("p<->q = 0\n");
}
else if(!!p == 1&&!!q == 0)
{
printf("﹁p = 0\n");
printf("﹁q = 1\n");
printf("p∧q = 0\n");
printf("p∨q = 1\n");
printf("p^q = 1\n");
printf("p→q = 0\n");
printf("p<->q = 0\n");
}
else if(!!p == 1&&!!q == 1)
{
printf("﹁p = 0\n");
printf("﹁q = 0\n");
printf("p∧q = 1\n");
printf("p∨q = 1\n");
printf("p^q = 0\n");
printf("p→q = 1\n");
printf("p<->q = 1\n");
}
continue;
}
if('n' == t || 'N' == t)
break;
}
return 0;
}
//集合的运算
#include <stdio.h>
int disc;
int jj(int a[],int b[],int n,int m) //交集
{
int i,j,k=0;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{ if (a[i]==b[j]) //如果相同就输出并计数
{
printf("%d,",a[i]);
k++;
}
}
}
return k;
}
void xd(int a[],int b[],int n,int m) //判断集合是否相等
{
if (n==m&&jj(a,b,n,m)==n)
{
printf("相等!\n");
}
else
printf("不相等!\n");
}
void bj(int a[],int b[],int n,int m) //并集
{
int i,j,x,k,find=0;
int p[100];
for (i=0;i<n;i++) //复制a集合
{
p[i]=a[i];
}
for (j=0;j<m;j++)
{
for (k=0;k<n;k++)
{
if (a[k]==b[j])
find=1;
}
if (find==0) //从b集合中复制与a集合中不同的数
{
p[i]=b[j];
i++;
}
find=0;
}
x=i;
for(i=0;i<x;i++)
{
printf("%d,",p[i]);
}
}
int* xb(int a[],int b[],int n,int m) //相对补
{
int i=0,j,k,find=0;
int p[100];
for (j=0;j<m;j++)
{
for (k=0;k<n;k++) //在a集合中找 与b集合相等的数
{
if (a[k]==b[j])
find=1;
}
if (find==0) //复制a集合中与b集合不相等的数
{
p[i]=b[j];
i++;
}
find=0;
}
disc=i; //全局变量记录个数
return p; //返回指针p
}
int main()
{
int a[10],b[10];
int i,j,e=0,f=0;
int x,y;
int * q;
int * p;
int aa[100];
int bb[100];
printf ("请输入的A集合的个数N:");
scanf("%d",&x);
printf("请输入B集合的个数M:");
scanf("%d",&y);
printf("集合A:\n");
for (i=0;i<x;i++)
{
scanf("%d",&a[i]);
}
printf("集合B:\n");
for (j=0;j<y;j++)
{
scanf("%d",&b[j]);
}
printf("该两集合是否相等:\n");
xd(a,b,x,y);
printf("\n");
printf("该两个集合的并集结果如下:\n");
bj(a,b,x,y);
printf("\n");
printf("该两个集合的交集结果如下:\n");
jj(a,b,x,y);
printf("\n");
printf("该A-B集合的相对补集结果如下:\n");
q=xb(b,a,y,x);
for(i=0;i<disc;i++)
{
aa[i]=q[i]; //aa复制 A-B
printf("%d ",q[i]);
e++;
}
printf("\n");
printf("该B-A集合的相对补集结果如下:\n");
p=xb(a,b,x,y);
for(i=0;i<disc;i++)
{
bb[i]=p[i]; //bb复制B-A
printf("%d ",p[i]);
f++;
}
printf("\n");
printf("该两个集合的相对差集结果如下:\n"); //对称差即 两个相对补的 并集
bj(aa,bb,e,f);
}
//矩阵的表示
#include<stdio.h>
#define LEN 100
int num;
int relation_num;
int relation_L[LEN][LEN]; //关系集合,邻接矩阵
int relation_K[LEN][LEN]; //可达矩阵
int relation_G[LEN][LEN]; //关系矩阵
void Prit_L(void);
void Prit_K(void);
void Prit_G(void);
int main(void)
{
while(1)
{
int tmp1, tmp2;
int i,j;
for(i = 0; i < LEN;i++) //初始化 0
{
for(j = 0; j < LEN; j++)
{
relation_G[i][j] = relation_L[i][j] = relation_K[i][j] = 0;
}
}
// memset(relation, 0, sizeof(relation));
// memset(A, 0, sizeof(A));
printf("输入元素个数(0--结束):");
scanf("%d",&num);
printf("输入关系个数(0--结束):");
scanf("%d",&relation_num);
if(!num && !relation_num) break;
printf("输入元素关系:\n");
for(i = 1; i <= relation_num; i++)
{
scanf("%d%d",&tmp1,&tmp2); //输入他们的关系,存在为1,不存在为0
relation_L[tmp1][tmp2] = 1;
}
Prit_L();
Prit_K();
Prit_G();
}
return 0;
}
void Prit_L(void)
{
int i,j;
printf("邻接矩阵为:\n");
for(i = 1; i <= num; i++)
{
for( j = 1; j <= num; j++)
{
printf("%d",relation_L[i][j]); //邻接矩阵就是输入的矩阵
}
printf("\n");
}
}
void Prit_K(void)
{
int i,j;
for(i = 1; i <= num; i++) //复制
{
for( j = 1; j <= num; j++)
{
relation_K[i][j] = relation_L[i][j];
}
}
for(i = 1; i <= num; i++) //warshll算法求传递闭包
{
for( j = 1; j <= num; j++)
{
if(relation_K[j][i] == 1)
{
for(int k = 1; k <= num; k++)
{
relation_K[j][k] = relation_K[j][k] + relation_K[i][k];
if(relation_K[j][k] >= 1)
{
relation_K[j][k] = 1;
}
}
}
}
}
printf("可达矩阵为:\n"); //可达矩阵就是它的传递闭包
for(i = 1; i <= num; i++)
{
for( j = 1; j <= num; j++)
{
printf("%d",relation_K[i][j]);
}
printf("\n");
}
}
void Prit_G()
{
int i,j,t = 1;
printf("关联矩阵为:\n");
for(i = 1; i <= num; i++)
{
for( j = 1; j <= num; j++)
{
if(relation_L[i][j] > 0)
{
relation_G[i][t]++; //如果改边存在 他的前结点,后结点都与这条边有关,所以加1
relation_G[j][t]++;
t++; //边数加1
}
}
}
for(i = 1; i <= num; i++)
{
for( j = 1; j < t; j++)
{
printf("%d",relation_G[i][j]);
}
printf("\n");
}
}
//二元关系的判断
#include<stdio.h>
#define LEN 100
int Reflexivity(); //自反性
int Symmetry(); //对称性
int Transmission(); //传递性
int Irreflexivity(); //反自反性
int Irsymmetry(); //反对称性
void Warshall(); //Warshall算法
int num;
int relation_num;
int relation[LEN][LEN]; //关系集合
int A[LEN][LEN]; //传递闭包
int main()
{
while(1) //输入元素个数和他们的关系的个数
{
int tmp1, tmp2;
int i,j;
for(i = 0; i < LEN;i++) //初始化 0
{
for(j = 0; j < LEN; j++)
{
relation[i][j] = A[i][j] = 0;
}
}
// memset(relation, 0, sizeof(relation));
// memset(A, 0, sizeof(A));
printf("输入元素个数(0--结束):");
scanf("%d",&num);
printf("输入关系个数(0--结束):");
scanf("%d",&relation_num);
if(!num && !relation_num) break;
printf("输入元素关系:\n");
for(i = 1; i <= relation_num; i++)
{
scanf("%d%d",&tmp1,&tmp2); //输入他们的关系
relation[tmp1][tmp2] = 1;
}
if(Reflexivity()) //自反性
{
printf("具有自反性\n");
}
else
{
printf("不具有自反性\n");
}
if(Symmetry()) //对称性
{
printf("具有对称性\n");
}
else
{
printf("不具有对称性\n");
}
if(Transmission()) //传递性
{
printf("具有传递性\n");
}
else
{
printf("不具有传递性\n");
}
if(Irreflexivity()) //反自反性
{
printf("具有反自反性\n");
}
else
{
printf("不具有反自反性\n");
}
if(Irsymmetry()) //反对称性
{
printf("具有反对称性\n");
}
else
{
printf("不具有反对称性\n");
}
}
return 0;
}
int Reflexivity() //自反性 看 11 22 33 44 等位置上是否为1
{
int i;
for(i = 1; i <= num; i++)
{
if(relation[i][i] != 1)
{
return 0;
}
}
return 1;
}
int Symmetry() //对称性 看对应位置是否相等
{
int i,j;
for(i = 1; i <= num; i++)
{
for( j = 1; j <= num; j++)
{
if(relation[i][j] != relation[j][i])
{
return 0;
}
}
}
return 1;
}
int Transmission() //传递性 如果具有传递性 即本身就是传递闭包
{
int i,j;
Warshall();
for( i = 1; i <= num; i++)
{
for(j = 1; j <= num; j++)
{
if(A[i][j] != relation[i][j]) //具有传递性的集合 传递闭包就是自己
{
return 0;
}
}
}
return 1;
}
int Irreflexivity() //反自反性 和自反性一样
{
int i;
for(i = 1; i <= num; i++)
{
if(relation[i][i] == 1)
{
return 0;
}
}
return 1;
}
int Irsymmetry() //反对称性 和反对称性一样
{
int i,j;
for(i = 1; i <= num - 1; i++)
{
for(j = i + 1; j <= num; j++)
{
if(relation[i][j] == 1 && relation[j][i] == 1)
{
if(i != j)
{
return 0;
}
}
}
}
return 1;
}
void Warshall() //Warshall算法
{
int i,j;
for(i = 1; i <= num; i++)
{
for( j = 1; j <= num; j++)
{
A[i][j] = relation[i][j];
}
}
for(i = 1; i <= num; i++)
{
for( j = 1; j <= num; j++)
{
if(A[j][i] == 1)
{
for(int k = 1; k <= num; k++)
{
A[j][k] = A[j][k] + A[i][k];
if(A[j][k] >= 1)
{
A[j][k] = 1;
}
}
}
}
}
}