判断

  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 }

 

posted @ 2013-10-16 20:43  herizai007  阅读(225)  评论(0编辑  收藏  举报