输出二元关系a的性质,如果具有自反性性,则显示“a is reflexive”,如果具有对称性,则显示“a is transitive”,如果具有传递性,则显示“a is transitive”,如果具有自反性、对称性、传递性,则显示具有等价性“a is equivalent”。如果输入的n大于10,或者输入的数组元素下标i,j大于等于n(数组元素的下标应小于n),则显示"error",并结束程序。注意每个显示前后无空格,末尾回车。
时间: 2024-02-18 22:01:00 浏览: 82
以下是补全代码,实现上述要求:
```
#include <stdio.h>
const int N = 10;
// 返回1,具有自反性
int reflexive(int** r, int n) {
for (int i = 0; i < n; i++) {
if (r[i][i] != 1) {
return 0;
}
}
return 1;
}
// 返回1,具有对称性
int symmetrical(int** r, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (r[i][j] != r[j][i]) {
return 0;
}
}
}
return 1;
}
// 返回1,具有传递性
int transitive(int** r, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (r[i][j] == 1) {
for (int k = 0; k < n; k++) {
if (r[j][k] == 1 && r[i][k] != 1) {
return 0;
}
}
}
}
}
return 1;
}
// 返回1,具有等价性
int equivalent(int** r, int n) {
if (reflexive(r, n) && symmetrical(r, n) && transitive(r, n)) {
return 1;
}
return 0;
}
int main() {
int** a;
int n, i, j;
scanf("%d", &n);
if (n > 10) {
printf("error\n");
return 0;
}
a = new int*[n];
for (i = 0; i < n; i++) {
a[i] = new int[n];
for (j = 0; j < n; j++) {
a[i][j] = 0;
}
}
while (1) {
scanf("%d%d", &i, &j);
if (i < 0 || j < 0) {
break;
}
if (i > n-1 || j > n-1) {
printf("error\n");
return 0;
}
a[i][j] = 1;
}
if (reflexive(a, n)) {
printf("a is reflexive\n");
}
if (symmetrical(a, n)) {
printf("a is symmetrical\n");
}
if (transitive(a, n)) {
printf("a is transitive\n");
}
if (equivalent(a, n)) {
printf("a is equivalent\n");
}
return 0;
}
```
注意,补全代码中的 `equivalent` 函数实现了判断矩阵关系是否具有等价性的功能,并在 `main` 函数中调用。