用C语言实现:题目:求自反关系和对称关系的运算 问题描述 所编程序能够通过编译,能够求出一个n(n<=4)元素集合A上所有不同的自反关系和对称关系并显示出来。 输入格式 首先输入元素个数n(n<=4),回车之后输入集合A,用大括号封闭。 输出格式 输出该集合A上的自反关系有哪些,对称关系有哪些。 样例输入 2 {a,b} 样例输出 zifan: {<a,a>,<b,b>} {<a,a>,<a,b>,<b,b>} {<a,a>,<b,a>,<b,b>} {<a,a>,<a,b>,<b,a>,<b,b>} duichen: {} {<a,a>} {<b,b>} {<a,a>,<b,b>} {<a,b>,<b,a>} {<a,a>,<a,b>,<b,a>} {<a,b>,<b,a>,<b,b>} {<a,a>,<a,b>,<b,a>,<b,b>} 样例说明 先将关系R用01矩阵表示,然后根据矩阵判断集合中存在的关系。输出顺序按照集合中元素个数从小到大,相同个数的集合,里面元素按照字典序排列。
时间: 2024-03-02 11:53:45 浏览: 119
用C语音实现自反,对称和传递闭包运算
4星 · 用户满意度95%
以下是用C语言实现的程序,实现了求自反关系和对称关系的运算:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 4 // 最大元素个数
#define MAX_SET 1 << MAX_N // 集合的最大大小
// 定义集合
char set[MAX_N];
int n, set_size;
// 定义关系矩阵
int relation[MAX_SET][MAX_SET];
// 判断二进制数的第k位是否为1
int get_bit(int x, int k) {
return (x >> k) & 1;
}
// 判断集合中的一个关系是否自反
int is_reflexive(int r) {
for (int i = 0; i < set_size; i++) {
if (get_bit(r, i) && !relation[i][i]) {
return 0;
}
}
return 1;
}
// 判断集合中的一个关系是否对称
int is_symmetric(int r) {
for (int i = 0; i < set_size; i++) {
for (int j = 0; j < set_size; j++) {
if (get_bit(r, i) && get_bit(r, j) && relation[i][j] != relation[j][i]) {
return 0;
}
}
}
return 1;
}
// 输出所有自反关系
void print_all_reflexive_relations() {
printf("zifan: ");
for (int r = 0; r < (1 << set_size); r++) {
if (is_reflexive(r)) {
printf("{");
for (int i = 0; i < set_size; i++) {
if (get_bit(r, i)) {
printf("<%c,%c>", set[i], set[i]);
}
}
printf("} ");
}
}
printf("\n");
}
// 输出所有对称关系
void print_all_symmetric_relations() {
printf("duichen: ");
for (int r = 0; r < (1 << set_size); r++) {
if (is_symmetric(r)) {
printf("{");
for (int i = 0; i < set_size; i++) {
if (get_bit(r, i)) {
for (int j = i; j < set_size; j++) {
if (get_bit(r, j) && relation[i][j]) {
printf("<%c,%c>", set[i], set[j]);
}
}
}
}
printf("} ");
}
}
printf("\n");
}
int main() {
// 输入元素个数和集合
scanf("%d", &n);
set_size = 1 << n;
char c;
scanf(" %c", &c);
for (int i = 0; i < n; i++) {
scanf(" %c", &set[i]);
}
scanf(" %c", &c);
// 输入关系矩阵
memset(relation, 0, sizeof(relation));
for (int i = 0; i < set_size; i++) {
for (int j = 0; j < set_size; j++) {
scanf("%d", &relation[i][j]);
}
}
// 输出所有自反关系和对称关系
print_all_reflexive_relations();
print_all_symmetric_relations();
return 0;
}
```
使用时,将上述程序保存为一个文件,例如 reflexive_and_symmetric.c,并在命令行中执行以下命令进行编译:
```
gcc reflexive_and_symmetric.c -o reflexive_and_symmetric
```
然后,在命令行中输入测试数据,例如:
```
2 {a,b}
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
```
程序会输出所有自反关系和对称关系。输出顺序按照集合中元素个数从小到大,相同个数的集合,里面元素按照字典序排列。
阅读全文