所编程序能够通过编译,给定的任意一个关系R的关系矩阵,能够判定关系R 是否为等价关系。 输入说明:首先输入关系R的关系矩阵的维数,回车之后输入矩阵每个元素,以空格或回 车分开。只能输入0或1。 输出说明:输出该关系是否为一个等价关系,若是等价关系,输出yes,否则输出no。 输入样例: 4 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 输出样例: yes 输入方式:控制台。 判定规则:忽略首尾空白、忽略空行、忽略大小写、数据之间只保留一个空白。 问题提示:若关系R具有自反、对称、传递,则关系R为等价关系。
时间: 2024-03-10 19:44:42 浏览: 86
下面是一个判断关系矩阵是否为等价关系的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main() {
int n, i, j, k;
int **R;
char str[100];
printf("请输入关系矩阵的维数:");
fgets(str, 100, stdin);
n = atoi(str);
R = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
R[i] = (int*)malloc(n * sizeof(int));
}
printf("请输入关系矩阵(每个元素以空格或回车分开):\n");
for (i = 0; i < n; i++) {
fgets(str, 100, stdin);
char *p = strtok(str, " \r\n");
for (j = 0; j < n; j++) {
R[i][j] = atoi(p);
p = strtok(NULL, " \r\n");
}
}
// 判断自反性
for (i = 0; i < n; i++) {
if (R[i][i] != 1) {
printf("no\n");
goto end;
}
}
// 判断对称性
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (R[i][j] != R[j][i]) {
printf("no\n");
goto end;
}
}
}
// 判断传递性
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (R[i][j] == 1) {
for (k = 0; k < n; k++) {
if (R[j][k] == 1 && R[i][k] != 1) {
printf("no\n");
goto end;
}
}
}
}
}
printf("yes\n");
end:
for (i = 0; i < n; i++) {
free(R[i]);
}
free(R);
return 0;
}
```
程序首先通过fgets()函数从控制台读取关系矩阵的维数n,然后调用malloc()函数动态分配n*n个元素的二维数组R来存储关系矩阵。接着使用fgets()函数逐行读取关系矩阵的每个元素,并使用strtok()函数将每个元素解析成数字,存储到数组R中。
程序接下来通过三个嵌套循环分别判断关系矩阵R是否具有自反性、对称性和传递性。具体做法如下:
1. 判断自反性:对于每个i,如果R[i][i]不等于1,则关系矩阵R不具有自反性;
2. 判断对称性:对于每个(i, j),如果R[i][j]不等于R[j][i],则关系矩阵R不具有对称性;
3. 判断传递性:对于每个(i, j),如果R[i][j]等于1,且存在一个k,使得R[j][k]等于1而R[i][k]不等于1,则关系矩阵R不具有传递性。
如果关系矩阵R同时具有自反性、对称性和传递性,则关系矩阵R为等价关系,输出"yes";否则输出"no"。
最后,程序使用free()函数释放动态分配的内存空间。
阅读全文