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 }