南邮离散数学实验二

#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define M  100
char *get_element(char *p)//输入结点序列函数
{
    printf("输入集合的元素(不能有空格):");
    gets(p);
    fflush(stdin);
    return p;
}
int get_position(char ch,char *point)//函数返回字符(结点)ch在point中的位置
{
    int i;
    for(i=0;*(point+i);i++)
        if(*(point+i)==ch)
            return i;
        return 0;
}


void get_relation(int (*a)[M],char *p)//输入序偶根据第一与第二元素在结点序列中的位置将关系矩阵相应元素置1
{
    int k1,k2;
    char ch1,ch2;
    printf("输入关系的各个序偶(以<*,*>时结束):\n");
    while(1)
    {
        printf("<");
        ch1=getche();
        printf(",");
        ch2=getche();
        printf(">\n");
        if(ch1=='*')break;
        k1=get_position(ch1,p);//取得第一元素在p中的位置序号
        k2=get_position(ch2,p);
        a[k1][k2]=1;
    }
}


void output_relat_array(int (*a)[M],int arry_w)//输出关系矩阵
{
    int i,j;
    for(i=0;i<arry_w;i++)
    {
        for(j=0;j<arry_w;j++)
            printf("%4d",a[i][j]);
        printf("\n");
    }
}

void output_relate(int (*a)[M],int arry_w,char *p)
//关系矩阵中如果有元素为1,则根据该序号去结点序列中查找其相应结点
{
    int i,j;
    int count=0;
    
    printf("{");
    for(i=0;i<arry_w;i++)
        for(j=0;j<arry_w;j++)
           if(a[i][j]==1){ printf("<%c,%c>,",*(p+i),*(p+j));count++;}
    printf("\b}");
    printf("\n");
}

int ZF(int (*a)[M],int n)
{
    int flag1 = 1;  
    for(int i = 0; i <n; i++)  
     //只要有一个对角元素为0就不具有自反性  
    {
        if(!a[i][i])  
        {    
            flag1 = 0;  
            break;
        }
    }
    return flag1;
}
int FZF(int (*a)[M],int n) //反自反  
{  
    int flag2 = 1;  
    for(int i = 0; i < n; i++)  
    {  
        //只要有一个对角元素为1就不具有反自反性  
        if(a[i][i])  
        {  
            flag2 = 0;  
                   break;
        }  
    }  
    return flag2;
}  
  
int  DC(int (*a)[M],int n)  //对称  
{  
    int flag3 = 1;  
    for(int i = 0; i < n; i++)  
        for(int j = 0; j < n; j++)  
        { //矩阵中对称元素都相等则具有对称性  
            if(a[i][j] != a[j][i])  
                 flag3 = 0;  
                break;
        }  
            return flag3;
}  
  
int FDC(int (*a)[M],int n) //反对称  
{  
    int flag4 = 1;  
    for(int i = 0; i < n; i++)  
        for(int j = 0; j < n; j++)  
            //矩阵中对称元素中有相等的1则不具有反对称性  
            if(a[i][j] && a[i][j] == a[j][i] && i != j)  
            {  
                flag4 = 0;  
                break;
            }  
            return flag4;
}  
  
int CD(int (*a)[M],int n) //传递  
{  
   int flag5 = 1;  
    for(int i = 0; i < n; i++)  
        for(int j = 0; j < n; j++)  
            for(int k = 0; k < n; k++)  
                //判断是否满足传递关系  
                if(a[i][j] && a[j][k] && !a[i][k])  
                {  
                    flag5 = 0;  
                    break;
                }  
                return flag5;
}  




 int main()
{
     int a[M][M]={0};
    char point[M];
    int stlen;
    char *p;
   
    p=get_element(point);//输入结点p取得其起始位置
    stlen=strlen(point);

    get_relation(a,p);//根据输入的关系的序偶构建关系矩阵a
   
 
    output_relate(a,stlen,p);
    printf("\n关系矩阵为:\n");
    output_relat_array(a,stlen);
    cout<<"该关系具有的性质:"<<endl;

    if(ZF(a,stlen))
       {
           cout<<"自反性"<<endl;
       }

    if(FZF(a,stlen))
        {
            cout<<"反自反性"<<endl;
        }
    if(DC(a,stlen))
    {
        cout<<"对称性"<<endl;
    }
    if(FDC(a,stlen))
    {
        cout<<"反对称性"<<endl;
    }
    if(CD(a,stlen))
    {
        cout<<"传递性"<<endl;
    }
    return 0; 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值