离散数学实验

//真值运算

#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;  
                    }  
                }  
            }  
        }  
    }  
  
}  

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值