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. "); 89 exit(0); 90 } 91 } 92 } 93 printf("transitive. ");/*否则,输出传递*/ 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 : <程序名> <input-file-name> "); 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: "); 143 for(i = 0; i < n; i++) 144 { 145 for(j = 0; j < n; j++) 146 printf("%-3d", a[i][j]); 147 printf(" "); 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> "); 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 : <程序名> <input-file-name> "); 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: "); 123 for(i = 0; i < n; i++){ 124 for(j = 0; j < n; j++) 125 printf("%-3d", a[i][j]); 126 printf(" "); 127 } 128 129 if(isEmptySet(a,n)) 130 printf("<Empty Set> "); 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. "); 137 } 138 return 1; 139 }