1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4
5 void Reflexive(int a[100][100], int n)
6 {
7 int i;
8 for(i = 0; i < n; i++)
9 if(a[i][i] == 0)
10 {
11 printf("not reflexive, ");/*主对角线有一个为0即输出不是自反,跳出循环*/
12 break;
13 }
14 if(i == n)
15 printf("reflexive, ");/*如果循环全作一遍,则为自反*/
16 }
17 /*判断自反*/
18
19 void Reflexiveness(int a[100][100], int n)
20 {
21 int i;
22 for(i = 0; i < n; i++)
23 if(a[i][i] == 1)
24 {
25 printf("not reflexiveness, ");/*主对角线有一个为q即输出不是反自反,跳出循环*/
26 break;
27 }
28 if(i == n)
29 printf("reflexiveness, ");/*如果循环全作一遍,则为反自反*/
30 }
31 /*判断反自反*/
32
33 void Symmetry(int a[100][100], int n)
34 {
35 int i, j;
36 for(i = 0; i < n; i++)
37 {
38 for(j = 0; j < n; j++)
39 {
40 if(a[i][j] == a[j][i])/*如果关于主对角线对称的元素相等,则跳过下面的语句,继续循环*/
41 continue;
42 printf("not symmetry, ");/*上面的条件不符,即关于主对角线对称的元素不等,则输出不是对称,跳出循环*/
43 break;
44 }
45 if(j != n)
46 break;/*不是对称,跳出循环*/
47 else if(i == n-1 && j == n)
48 printf("symmetry, ");/*所有的元素都遍历了,没有不合对称条件的,输出对称*/
49 }
50 }
51 /*判断是否对称*/
52
53 void Antisymmetry(int a[100][100], int n)
54 {
55 int i, j, s = 1;/*用s作为不合条件时的标记*/
56 for(i = 0; i < n; i++)
57 {
58 for(j = 0; j < n; j++)
59 {
60 if((a[i][j] == 1 && a[j][i] == 1) && (i != j))
61 {
62 s = 0;/*s = 0 时,不是反对称,跳出循环*/
63 break;
64 }
65 }
66 if(s == 0)
67 {
68 printf("not antisymmetry, ");/*判断s的值,为0,则输出不是反对称*/
69 break;
70 }
71 }
72 if(s == 1)/*s = 1时,输出反对称*/
73 printf("antisymmetry, ");
74 }
75 /*判断是否反对称*/
76
77 void Transitive(int a[100][100], int n)
78 {
79 int i, j, k;
80 for(i = 0; i < n; i++)
81 {
82 for(j = 0; j < n; j++)
83 if(a[i][j] == 0)/*对所有元素一一遍历,等于0时作下面的工作*/
84 {
85 for(k = 1; k < n; k++)
86 if(a[i][k] == 1 && a[k][j] == 1)/*不是传递的判断,输出不是传递,推出整个程序*/
87 {
88 printf("not transitive.\n");
89 exit(0);
90 }
91 }
92 }
93 printf("transitive.\n");/*否则,输出传递*/
94 }
95 /*判断是否传递*/
96
97 /*
98 * 带命令行参数的 main: argc 参数个数, argv 各个参数的值(字符串)
99 void main()
100 */
101 int main(int argc,char *argv[])
102 {
103 FILE *fp;
104 int i = 0, j, n, k, s = 0;
105 int b[10000], a[100][100];
106
107 /*
108 * 添加命令行参数处理
109 */
110 if(argc < 2){
111 printf("Usage :\n<程序名> <input-file-name>\n\n");
112 exit(1);
113 }
114 fp = fopen(argv[1], "r");
115
116 if(!fp)
117 {
118 printf("Can not open !");
119 exit(0);
120 }
121 while(!feof(fp))
122 {
123 b[i] = fscanf(fp, "%d", &k);
124 i = i + 1;
125 }
126
127 n = (int)sqrt(i);
128
129 /*
130 * 如果要从头再次读取,不必这样关闭再打开
131 fclose(fp);
132 fp = fopen("a.txt", "r");
133 */
134 fseek(fp,0,SEEK_SET); /* 这样就可以从头再读 */
135 while(!feof(fp))
136 {
137 for(i = 0; i < n; i++)
138 for(j = 0; j < n; j++)
139 fscanf(fp, "%d", &a[i][j]);
140 }
141
142 printf("The relation is:\n");
143 for(i = 0; i < n; i++)
144 {
145 for(j = 0; j < n; j++)
146 printf("%-3d", a[i][j]);
147 printf("\n");
148 }
149 /*
150 * 这里的循环是做什么的?
151 * 判断关系集合是否为空?
152 */
153 for(i = 0; i < n; i++)
154 {
155 for(j = 0; j < n; j++)
156 if(a[i][j] == 1)
157 {
158 s = 1;
159 break;
160 }
161 if(j != n)
162 break;
163 }
164 /*
165 * 如果前面是判断关系集是否为空
166 * 那么这里要改一下
167 */
168 if(s)//if(!s)
169 printf("<Empty Set>\n");
170 else{ // 这里需要放在一对“{}”中
171 Reflexive(a, n);
172 Reflexiveness(a, n);
173 Symmetry(a, n);
174 Antisymmetry(a, n);
175 Transitive(a, n);
176 }
177 }
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4
5
6 /*
7 * 判断自反
8 */
9 bool Reflexive(int a[100][100], int n)
10 {
11 int i;
12 for(i = 0; i < n; i++)
13 if(a[i][i] == 0)
14 return false;
15 return true;
16 }
17
18 /*
19 * 判断反自反
20 */
21 bool Reflexiveness(int a[100][100], int n)
22 {
23 int i;
24 for(i = 0; i < n; i++)
25 if(a[i][i] == 1)
26 return false;
27 return true;
28 }
29
30 /*
31 * 判断是否对称
32 */
33 bool Symmetry(int a[100][100], int n)
34 {
35 int i, j;
36 for(i = 0; i < n - 1; i++){
37 for(j = i + 1; j < n; j++){
38 if(a[i][j] != a[j][i])
39 return false;
40 }
41 }
42 return true;
43 }
44
45 /*
46 * 判断是否反对称
47 */
48 bool Antisymmetry(int a[100][100], int n)
49 {
50 int i, j;
51 for(i = 0; i < n - 1; i++){
52 for(j = i + 1; j < n; j++){
53 if((a[i][j] == 1 && a[j][i] == 1) && (i != j))
54 return false;
55 }
56 }
57 return true;
58 }
59
60 /*
61 * 判断是否传递
62 */
63 bool Transitive(int a[100][100], int n)
64 {
65 int i, j, k;
66 for(i = 0; i < n; i++){
67 for(j = 0; j < n; j++){
68 if(a[i][j] == 1){ /* 若ij存在关系,则对所有与 j 存在关系的必与 i 存在关系,是为传递 */
69 for(k = 0; k < n;k++){
70 if(a[j][k] == 1 && a[i][k] != 1)
71 return false;
72 }
73 }
74 }
75 }
76 return true;
77 }
78
79 /*
80 * 判断是否为空
81 */
82 bool isEmptySet(int a[100][100], int n){
83 int i,j;
84 for(i = 0;i < n;i++){
85 for(j = 0;j < n;j++)
86 if(a[i][j])
87 return false;
88 }
89 return true;
90 }
91
92
93 int main(int argc,char *argv[])
94 {
95 FILE *fp;
96 int i = 0, j, n;
97 int b[10000], a[100][100];
98
99 if(argc < 2){
100 printf("Usage :\n<程序名> <input-file-name>\n\n");
101 exit(0);
102 }
103 fp = fopen(argv[1], "r");
104
105 if(!fp){
106 printf("Can not open !");
107 exit(0);
108 }
109
110 while(!feof(fp)){
111 fscanf(fp, "%d", b + i++);
112 }
113 fclose(fp);
114
115 n = (int)sqrt(i);
116
117 /* 直接用坐标映射,不需要再次读取文件 */
118 for(j = 0;j < i;j++){
119 a[j/n][j % n] = b[j];
120 }
121
122 printf("The relation is:\n");
123 for(i = 0; i < n; i++){
124 for(j = 0; j < n; j++)
125 printf("%-3d", a[i][j]);
126 printf("\n");
127 }
128
129 if(isEmptySet(a,n))
130 printf("<Empty Set>\n");
131 else{
132 if(!Reflexive(a, n)) printf("not "); printf("reflexive, ");
133 if(!Reflexiveness(a, n))printf("not "); printf("reflexiveneww, ");
134 if(!Symmetry(a, n)) printf("not "); printf("symmetry, ");
135 if(!Antisymmetry(a, n)) printf("not "); printf("antisymmetry, ");
136 if(!Transitive(a, n)) printf("not "); printf("transitive.\n");
137 }
138 return 1;
139 }