南邮离散数学实验(输入序列,判断是否具有自反性,反自反性,对称性等相关性质)...

本文介绍了一个使用C语言实现的关系矩阵构建及自反性、反自反性、对称性、反对称性和传递性的检测程序。用户可以输入集合元素及序偶来构建关系矩阵,并通过程序检查这些重要的数学关系特性。
  1 #include<iostream.h>
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<conio.h>
  5 #include<string.h>
  6 #define M  100
  7 char *get_element(char *p)//输入结点序列函数
  8 {
  9     printf("输入集合的元素(不能有空格):");
 10     gets(p);
 11     fflush(stdin);
 12     return p;
 13 }
 14 int get_position(char ch,char *point)//函数返回字符(结点)ch在point中的位置
 15 {
 16     int i;
 17     for(i=0;*(point+i);i++)
 18         if(*(point+i)==ch)
 19             return i;
 20         return 0;
 21 }
 22 
 23 
 24 void get_relation(int (*a)[M],char *p)//输入序偶根据第一与第二元素在结点序列中的位置将关系矩阵相应元素置1
 25 {
 26     int k1,k2;
 27     char ch1,ch2;
 28     printf("输入关系的各个序偶(以<*,*>时结束):\n");
 29     while(1)
 30     {
 31         printf("<");
 32         ch1=getche();
 33         printf(",");
 34         ch2=getche();
 35         printf(">\n");
 36         if(ch1=='*')break;
 37         k1=get_position(ch1,p);//取得第一元素在p中的位置序号
 38         k2=get_position(ch2,p);
 39         a[k1][k2]=1;
 40     }
 41 }
 42 
 43 
 44 void output_relat_array(int (*a)[M],int arry_w)//输出关系矩阵
 45 {
 46     int i,j;
 47     for(i=0;i<arry_w;i++)
 48     {
 49         for(j=0;j<arry_w;j++)
 50             printf("%4d",a[i][j]);
 51         printf("\n");
 52     }
 53 }
 54 
 55 void output_relate(int (*a)[M],int arry_w,char *p)
 56 //关系矩阵中如果有元素为1,则根据该序号去结点序列中查找其相应结点
 57 {
 58     int i,j;
 59     int count=0;
 60     
 61     printf("{");
 62     for(i=0;i<arry_w;i++)
 63         for(j=0;j<arry_w;j++)
 64            if(a[i][j]==1){ printf("<%c,%c>,",*(p+i),*(p+j));count++;}
 65     printf("\b}");
 66     printf("\n");
 67 }
 68 
 69 int ZF(int (*a)[M],int n)
 70 {
 71     int flag1 = 1;  
 72     for(int i = 0; i <n; i++)  
 73      //只要有一个对角元素为0就不具有自反性  
 74     {
 75         if(!a[i][i])  
 76         {    
 77             flag1 = 0;  
 78             break;
 79         }
 80     }
 81     return flag1;
 82 }
 83 int FZF(int (*a)[M],int n) //反自反  
 84 {  
 85     int flag2 = 1;  
 86     for(int i = 0; i < n; i++)  
 87     {  
 88         //只要有一个对角元素为1就不具有反自反性  
 89         if(a[i][i])  
 90         {  
 91             flag2 = 0;  
 92                    break;
 93         }  
 94     }  
 95     return flag2;
 96 }  
 97   
 98 int  DC(int (*a)[M],int n)  //对称  
 99 {  
100     int flag3 = 1;  
101     for(int i = 0; i < n; i++)  
102         for(int j = 0; j < n; j++)  
103         { //矩阵中对称元素都相等则具有对称性  
104             if(a[i][j] != a[j][i])  
105                  flag3 = 0;  
106                 break;
107         }  
108             return flag3;
109 }  
110   
111 int FDC(int (*a)[M],int n) //反对称  
112 {  
113     int flag4 = 1;  
114     for(int i = 0; i < n; i++)  
115         for(int j = 0; j < n; j++)  
116             //矩阵中对称元素中有相等的1则不具有反对称性  
117             if(a[i][j] && a[i][j] == a[j][i] && i != j)  
118             {  
119                 flag4 = 0;  
120                 break;
121             }  
122             return flag4;
123 }  
124   
125 int CD(int (*a)[M],int n) //传递  
126 {  
127    int flag5 = 1;  
128     for(int i = 0; i < n; i++)  
129         for(int j = 0; j < n; j++)  
130             for(int k = 0; k < n; k++)  
131                 //判断是否满足传递关系  
132                 if(a[i][j] && a[j][k] && !a[i][k])  
133                 {  
134                     flag5 = 0;  
135                     break;
136                 }  
137                 return flag5;
138 }  
139 
140 
141 
142 
143  int main()
144 {
145      int a[M][M]={0};
146     char point[M];
147     int stlen;
148     char *p;
149    
150     p=get_element(point);//输入结点p取得其起始位置
151     stlen=strlen(point);
152 
153     get_relation(a,p);//根据输入的关系的序偶构建关系矩阵a
154    
155  
156     output_relate(a,stlen,p);
157     printf("\n关系矩阵为:\n");
158     output_relat_array(a,stlen);
159     cout<<"该关系具有的性质:"<<endl;
160 
161     if(ZF(a,stlen))
162        {
163            cout<<"自反性"<<endl;
164        }
165 
166     if(FZF(a,stlen))
167         {
168             cout<<"反自反性"<<endl;
169         }
170     if(DC(a,stlen))
171     {
172         cout<<"对称性"<<endl;
173     }
174     if(FDC(a,stlen))
175     {
176         cout<<"反对称性"<<endl;
177     }
178     if(CD(a,stlen))
179     {
180         cout<<"传递性"<<endl;
181     }
182     return 0; 
183 }

 

转载于:https://www.cnblogs.com/jamylu/p/4906667.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值