离散数学实验二c语言(输出关系矩阵,输出矩阵性质,输出自反闭包,对称闭包,传递闭包,判断矩阵是否为等价关系,相容关系,偏序关系)

离散数学实验二

一、算法描述,算法思想

(一)相关数据结构
typedef struct Set *S; //存放集合
struct Set
{int size; //集合的元素个数char *A;   //存放该集合的元素
};

Set存放有限集合A,该集合的元素个数为size,size可以用来判断该集合是否为空集,然后集合中的元素就放在A数组里。

typedef struct Confirm *C; //存放关系的序偶<x, y>
struct Confirm
{int x, y;
};

Confirm存放一个序偶<x, y>。

typedef struct Relation *R; //存放关系矩阵
struct Relation
{int n, size;   // n行 n列矩阵,序偶个数为sizeint r[10][10]; //关系矩阵C c;           //存放该关系的序偶
};

Relation存放集合A的关系,r为一个n行,n列的关系矩阵,size为其中的序偶数,c即存放该关系的所有序偶。

int flagz = 1, flagfz = 1, flagd = 1, flagfd = 1, flagc = 1; // flagz判断是否为自反,flagfz判断是否为反自反,
// flagd判断是否为对称,flagfd判断是否为反对称,flagc判断是否为传递

设置全局变量,方便判断矩阵关系。

(二)相关算法实现
1、输出关系矩阵R
void PrintRelation(R re) //打印关系矩阵
{printf("关系矩阵如下:\n");for (int i = 0; i < re->n; i++){for (int j = 0; j < re->n; j++)printf("%d ", re->r[i][j]);printf("\n");}printf("\n");
}

用户输入的为一个关系矩阵,只要将其存储下,然后直接输出即可,注意换行。

2、输出R具有的性质
void PrintCharacter(S s, R re) //判断该矩阵的性质
if (s->size == 0) //空集,关系具有所有性质{printf("该关系具有以下性质:\n");printf("自反性\n");printf("反自反性\n");printf("对称性\n");printf("反对称性\n");printf("传递性\n");return;}

(1)首先是判断该集合是否为空,如果集合为空集,则具有所有的性质。

for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i == j && !re->r[i][j]) //不可能为自反关系flagz = 0;if (i == j && re->r[i][j]) //不可能为反自反关系flagfz = 0;if (re->r[i][j] && !re->r[j][i] && i != j) //不可能为对称关系flagd = 0;if (re->r[i][j] && re->r[j][i] && i != j) //不可能为反对称关系flagfd = 0;}}

(2)确定该集合不为空后,接下来先根据矩阵来判断自反性,反自反性,对称性,反对称性。

如果出现横纵坐标相同的点,但是其不为1,说明该集合存在a属于集合s,但不具有<a, a>序偶,则该矩阵不可能具有自反关系,将flagz = 0;

如果出现横纵坐标相同的点,但是其为1,说明该集合存在a属于该集合,且有<a, a>序偶,则该矩阵不可能具有反自反关系,将flagfz = 0;

如果出现横纵坐标不相同,且相反的两点,但是其为1,说明该集合存在a,b属于该集合,且有<a, b>,<b,a>序偶,则该矩阵不可能具有反对称关系,将flagfd = 0;

如果出现横纵坐标不相同,且相反的两点,但是其只有一个为1,说明该集合存在a,b属于该集合,且有<a, b>,没有<b,a>序偶,则该矩阵不可能具有对称关系,将flagd = 0;

    for (int i = 1; i <= re->size; i++) //判断是否具有传递性{if (!flagc)break;int x = re->c[i].x, y = re->c[i].y; //若存在<x, y>if (x == y)continue;for (int j = 0; j < n; j++) //找<y, j>{if (re->r[y][j] && !re->r[x][j]) //是否存在<x, j>{flagc = 0;break;}}}

(3)接下来是根据矩阵中为1的点,即该集合所具有的序偶来判断是否具有传递关系。

若存在<x, y>,我们去找<y, j>,看是否存在<x, j>,如果不存在则不具有传递关系,flagc = 0。

(4)最后将所有关系输出即可。

3、输出R的自反闭包,对称闭包,传递闭包
void PrintBibao(R re) //计算自反闭包,对称闭包,传递闭包矩阵
    //自反闭包int n = re->n;R tmp = CopyRelation(re);for (int i = 0; i < n; i++)tmp->r[i][i] = 1;printf("自反闭包矩阵:\n");PrintRelation(tmp);DestoryRelation(tmp);

(1)计算自反闭包,首先将原矩阵复制到tmp中,将所有横纵坐标相同的点都该为1,即为自反闭包。

    //对称闭包tmp = CopyRelation(re);for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i != j && tmp->r[i][j]){tmp->r[j][i] = 1;}}}printf("对称闭包矩阵:\n");PrintRelation(tmp);DestoryRelation(tmp);

(2)计算对称闭包,首先将原矩阵复制到tmp中,将横纵坐标不同的的,原矩阵中存在的为1的点,将其的对称点也改为1,即为对称闭包。

    //传递闭包tmp = CopyRelation(re);R ans = InitRelationTmp(n);AddRelation(ans, re);for (int i = 0; i < n-1; i++){tmp = Multiply(tmp, re); //最多乘n次AddRelation(ans, tmp);}printf("传递闭包矩阵:\n");PrintRelation(ans);DestoryRelation(tmp);free(ans);

(3)计算传递闭包,首先将原矩阵复制到tmp中,将tmp与原矩阵乘矩阵的行(列)数次,将每次计算的大于1的数改为1,每次将矩阵相加,返回即可。

4、判断R是否为等价关系,相容关系,偏序关系
void PanRelation(R re) //判断矩阵的关系
{printf("具有的关系为:\n");if (flagz == 1 && flagd == 1 && flagc == 1) //如果为自反,对称,传递则为等价关系printf("等价关系\n");if (flagz == 1 && flagd == 1) //若为自反,对称则为相容关系printf("相容关系\n");if (flagz == 1 && flagfd == 1 && flagc == 1) //若为自反,反对称,传递为偏序关系printf("偏序关系\n");
}

(1)等价关系:若R具有自反性,对称性,传递性。

(2)相容关系:若R具有自反性,对称性。

(3)偏序关系:若R具有自反性,反对称性,传递性。

(三)流程图

main()函数

void PrintRelation(R re) 打印关系矩阵

void PrintCharacter(S s, R re) 判断该关系矩阵的性质

void PrintBibao(R re) 计算自反闭包,对称闭包,传递闭包矩阵

void PanRelation(R re) 判断矩阵的关系

(四)程序运行截图与样例说明

输入:元素个数、集合的每个元素(用单个字符表示)、该集合的关系矩阵。

输出:关系矩阵、关系矩阵性质、自反闭包、对称闭包、传递闭包矩阵、关系矩阵的关系。

分析:该关系矩阵的序偶为<1,2>,<2,1>,<2,3>,<3,4>。

可以看出该关系矩阵不具有自反性,对称性,反对称性,传递性。

具有反自反性。

且计算的自反闭包,对称闭包,传递闭包与答案相同。

判断的关系也正确。

(五)代码

#include <stdio.h>
#include <stdlib.h>
typedef struct Confirm *C; //存放关系的序偶<x, y>
struct Confirm
{int x, y;
};
typedef struct Relation *R; //存放关系矩阵
struct Relation
{int n, size;   // n行 n列矩阵,序偶个数为sizeint r[10][10]; //关系矩阵C c;           //存放该关系的序偶
};
typedef struct Set *S; //存放集合
struct Set
{int size; //集合的元素个数char *A;   //存放该集合的元素
};
int flagz = 1, flagfz = 1, flagd = 1, flagfd = 1, flagc = 1; // flagz判断是否为自反,flagfz判断是否为反自反,
// flagd判断是否为对称,flagfd判断是否为反对称,flagc判断是否为传递S InitSet(int size) //创建集合
{S s = (S)malloc(sizeof(struct Set));s->A = (char *)malloc(sizeof(char) * size);s->size = size;printf("注意:集合的每个元素用单个字符来表示\n");for (int i = 0; i < size; i++)scanf("%d", &s->A[i]);return s;
}
R InitRelation(int n) //创建关系矩阵
{int now = 0;R re = (R)malloc(sizeof(struct Relation));re->n = n;re->c = (C)malloc(sizeof(struct Confirm) * n);printf("请输入该集合的关系矩阵(n*n):\n");for (int i = 0; i < re->n; i++){for (int j = 0; j < re->n; j++){scanf("%d", &re->r[i][j]);if (re->r[i][j]){re->c[++now].x = i;re->c[now].y = j;}}}re->size = now;return re;
}
R InitRelationTmp(int n)
{R tmp = (R)malloc(sizeof(struct Relation));tmp->n = n;for (int i=0; i<tmp->n; i++){for (int j=0; j<tmp->n; j++)tmp->r[i][j] = 0;}return tmp;
}void DestorySet(S s) //释放集合内存
{free(s->A);free(s);
}
void DestoryRelation(R re) //释放关系矩阵内存
{free(re->c);free(re);
}void PrintRelation(R re) //打印关系矩阵
{printf("关系矩阵如下:\n");for (int i = 0; i < re->n; i++){for (int j = 0; j < re->n; j++)printf("%d ", re->r[i][j]);printf("\n");}printf("\n");
}
R Multiply(R re, R re2) //计算两矩阵相乘,且将相乘后的大于1的数改为1
{int n = re->n, tmp = 0, i, j;R ans = InitRelationTmp(n);for (i = 0; i < n; i++) //每一行{for (j = 0; j < n; j++) //该行的列{tmp = 0;for (int k = 0; k < n; k++){tmp += re->r[i][k] * re2->r[k][j];}if (tmp >= 1){ans->r[i][j] = 1;}}}return ans; //返回得出的矩阵
}
void AddRelation(R re1, R re2)
{int n = re1->n;for (int i=0; i<n; i++){for (int j=0; j<n; j++){re1->r[i][j] += re2->r[i][j];if (re1->r[i][j]>1)re1->r[i][j] = 1;}}
}void PrintCharacter(S s, R re) //判断该矩阵的性质
{int n = re->n;if (s->size == 0) //空集,关系具有所有性质{printf("该关系具有以下性质:\n");printf("自反性\n");printf("反自反性\n");printf("对称性\n");printf("反对称性\n");printf("传递性\n");return;}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i == j && !re->r[i][j]) //不可能为自反关系flagz = 0;if (i == j && re->r[i][j]) //不可能为反自反关系flagfz = 0;if (re->r[i][j] && !re->r[j][i] && i != j) //不可能为对称关系flagd = 0;if (re->r[i][j] && re->r[j][i] && i != j) //不可能为反对称关系flagfd = 0;}}for (int i = 1; i <= re->size; i++) //判断是否具有传递性{if (!flagc)break;int x = re->c[i].x, y = re->c[i].y; //若存在<x, y>if (x == y)continue;for (int j = 0; j < n; j++) //找<y, j>{if (re->r[y][j] && !re->r[x][j]) //是否存在<x, j>{flagc = 0;break;}}}//输出性质printf("该关系具有以下性质:\n");if (flagz == 1)printf("自反性\n");if (flagfz == 1)printf("反自反性\n");if (flagd == 1)printf("对称性\n");if (flagfd == 1)printf("反对称性\n");if (flagc == 1)printf("传递性\n");if (!flagz&&!flagfz&&!flagd&&!flagfd&&!flagc)printf("该关系矩阵不具有自反、反自反、对称、反对称、传递性\n");
}
R CopyRelation(R re) //复制关系矩阵,方便计算
{R tmp = (R)malloc(sizeof(struct Relation));tmp->n = re->n;tmp->size = re->size;tmp->c = (C)malloc(sizeof(struct Confirm) * tmp->size);for (int i = 0; i < tmp->n; i++){for (int j = 0; j < tmp->n; j++)tmp->r[i][j] = re->r[i][j];}for (int i = 1; i <= tmp->size; i++){tmp->c[i].x = re->c[i].x;tmp->c[i].y = re->c[i].y;}return tmp; //返回该复制的矩阵
}
void PrintBibao(R re) //计算自反闭包,对称闭包,传递闭包矩阵
{//自反闭包int n = re->n;R tmp = CopyRelation(re);for (int i = 0; i < n; i++)tmp->r[i][i] = 1;printf("自反闭包矩阵:\n");PrintRelation(tmp);DestoryRelation(tmp);//对称闭包tmp = CopyRelation(re);for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i != j && tmp->r[i][j]){tmp->r[j][i] = 1;}}}printf("对称闭包矩阵:\n");PrintRelation(tmp);DestoryRelation(tmp);//传递闭包tmp = CopyRelation(re);R ans = InitRelationTmp(n);AddRelation(ans, re);for (int i = 0; i < n-1; i++){tmp = Multiply(tmp, re); //最多乘n次AddRelation(ans, tmp);}printf("传递闭包矩阵:\n");PrintRelation(ans);DestoryRelation(tmp);free(ans);
}
void PanRelation(R re) //判断矩阵的关系
{int flag = 0;printf("具有的关系为:\n");if (flagz == 1 && flagd == 1 && flagc == 1) //如果为自反,对称,传递则为等价关系{printf("等价关系\n");flag = 1;}if (flagz == 1 && flagd == 1) //若为自反,对称则为相容关系{printf("相容关系\n");flag = 1;}if (flagz == 1 && flagfd == 1 && flagc == 1) //若为自反,反对称,传递为偏序关系{printf("偏序关系\n");flag = 1;}if (!flag)printf("该关系矩阵不具有等价、相容、偏序关系\n");
}int main()
{int size;printf("请输入该集合的元素个数:\n");scanf("%d", &size);S s = InitSet(size);       //输入集合R re = InitRelation(size); //输入关系矩阵PrintRelation(re);     //打印关系矩阵PrintCharacter(s, re); //打印矩阵性质PrintBibao(re);        //打印闭包矩阵PanRelation(re);       //判断矩阵的关系DestorySet(s); //释放内存DestoryRelation(re);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka-Windows搭建全流程(环境,安装包,编译,消费案例,远程连接,服务自启,可视化工具)

目录 一. Kafka安装包获取 1. 官网地址 2. 百度网盘链接 二. 环境要求 1. Java 运行环境 (1) 对 java 环境变量进行配置 (2) 下载完毕之后进行解压 三. 启动Zookeeper 四. 启动Kafka (1) 修改Conf下的server.properties文件&#xff0c;修改kafka的日志文件路径 (2)…

海外云手机实现高效的海外社交媒体营销

随着全球化的深入发展&#xff0c;越来越多的中国企业走向国际市场&#xff0c;尤其是B2B外贸企业&#xff0c;海外社交媒体营销已成为其扩大市场的重要手段。在复杂多变的海外市场环境中&#xff0c;如何有效提高营销效率并降低运营风险&#xff0c;成为了众多企业的首要任务。…

无人机悬停精度算法!

一、主要算法类型 PID控制算法&#xff1a; PID控制算法是一种常用的闭环控制算法&#xff0c;通过计算目标值与当前值的误差&#xff0c;并根据比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;、微分&#xff08;D&#xff09;三个参数来调整控制输出&#x…

SQL高级查询03

SQL查询语句的下载脚本链接&#xff01;&#xff01;&#xff01; 【免费】SQL练习资源-具体练习操作可以查看我发布的文章资源-CSDN文库​编辑https://download.csdn.net/download/Z0412_J0103/89908378https://download.csdn.net/download/Z0412_J0103/89908378 1 查询employ…

聚链成网,趣链科技参与 “跨链创新联合体”建设

近日&#xff0c;2024全球数商大会在上海举办。大会由上海数据集团和上海市数商协会联合主办&#xff0c;上海市数据局和浦东新区人民政府支持&#xff0c;以“数联全球&#xff0c;商通未来——‘链’接数字经济新未来”为主题&#xff0c;聚焦区块链技术和应用场景展开。 会上…

PostGis空间(下):空间连接与空间索引

目录 1、简介2、空间连接3、空间索引3.1 索引操作3.2 空间索引的工作原理3.2.1 R-Tree 3.3 空间索引函数3.4 仅索引查询3.5 ANALYZE3.6 VACUUMing3.7 函数列表 PS 1024到啦&#xff01;&#xff01;&#xff01; 先祝各位程序员或者想成为程序员正在奋斗中的伙伴1024程序员节快…

JavaScript进阶:手写代码挑战(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript手写代码篇 在现代Web开发中&#xff0c;JavaScript 是不可或缺的编程语言…

Linux系统基础-进程间通信(5)_模拟实现命名管道和共享内存

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-进程间通信(5)_模拟实现命名管道和共享内存 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…

Mac 使用 zsh 终端提示 zsh: killed 的问题

我的脚本的内容为&#xff1a; #!/bin/bashset -epids$(ps -ef | grep consul | grep -v grep | awk {print $2})for pid in $pids; doecho "kill process: $pid"kill -9 $pid donecd $(dirname $0)nohup ./consul agent -dev > nohup.log &可以看到这是一个…

阿里云项目启动OOM问题解决

问题描述 随着项目业务的增长&#xff0c;系统启动时内存紧张&#xff0c;每次第一次启动的时候就会出现oom第二次或者第n的时候&#xff0c;就启动成功了。 带着这个疑问&#xff0c;我就在阿里云上提交了工单&#xff0c;咨询为什么第一次提交失败但是后面却能提交成功尼&a…

Matlab学习01-矩阵

目录 一&#xff0c;矩阵的创建 1&#xff0c;直接输入法创建矩阵 2&#xff0c;利用M文件创建矩阵 3&#xff0c;利用其它文本编辑器创建矩阵 二&#xff0c;矩阵的拼接 1&#xff0c;基本拼接 1&#xff09; 水平方向的拼接 2&#xff09;垂直方向的拼接 3&#xf…

shell脚本-函数

文章目录 一、函数介绍什么是函数、为什么使用函数、如何使用函数 二、shell脚本中如何定义函数Way1Way2Way3 三、shell脚本中如何调用函数四、shell脚本中使用内置变量(1、#、?、2等等)五、函数的返回值、shell脚本中函数的返回值函数的返回值概念shell脚本中函数的返回值ret…

梦金园三闯港交所上市:年营收200亿元,靠加盟模式取胜

近日&#xff0c;梦金园黄金珠宝集团股份有限公司&#xff08;以下简称“梦金园”&#xff09;向港交所递交IPO申请&#xff0c;中信证券为其独家保荐人。贝多财经了解到&#xff0c;这已经是梦金园第三次向港股发起冲击&#xff0c;此前曾于2023年9月、2024年4月两度递表。 继…

刷题 - 图论

1 | bfs/dfs | 网格染色 200. 岛屿数量 访问到马上就染色&#xff08;将visited标为 true)auto [cur_x, cur_y] que.front(); 结构化绑定&#xff08;C17&#xff09;也可以不使用 visited数组&#xff0c;直接修改原始数组时间复杂度: O(n * m)&#xff0c;最多将 visited 数…

Deepinteraction 深度交互:通过模态交互的3D对象检测

一.前提 为什么要采用跨模态的信息融合? 点云在低分辨率下提供必要的定位和几何信息&#xff0c;而图像在高分辨率下提供丰富的外观信息。 -->因此必须采用跨模态的信息融合 提出的原因? 传统的融合办法可能会由于信息融合到统一表示中的不太完美而丢失很大一部分特定…

磁珠的工作原理:【图文讲解】

1&#xff1a;什么是磁珠 磁珠是一种被动组件&#xff0c;用来抑制电路中的高频噪声。磁珠是一种特别的扼流圈&#xff0c;其成分多半为铁氧体&#xff0c;利用其高频电流产生的热耗散来抑制高频噪声。磁珠有时也称为磁环、EMI滤波器、铁芯等。 磁珠是滤波常用的器件&#xf…

SpringMVC常用注解

RequestMapping接口的映射&#xff0c;可以将HTTP请求映射到控制器方法上&#xff0c;通过这个注解使用不同的映射&#xff0c;就可以区分不同的控制器&#xff0c;其中RequestMapping中还有不同的属性&#xff0c;比如method&#xff0c;params&#xff0c;produces等在这里我…

快速搭建SpringBoot3+Prometheus+Grafana

快速搭建SpringBoot3PrometheusGrafana 一、搭建SpringBoot项目 1.1 创建SpringBoot项目 1.2 修改pom文件配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://…

25年山东高考报名时间为10月23日-29日

今日&#xff0c;山东省招生考试院发布关于《山东省2025年普通高等学校招生考试报名工作的通知》 其中高考报名时间定为&#xff1a;2024年10月23日29日&#xff08;每天9&#xff1a;0018&#xff1a;00&#xff09; 资格审查时间为&#xff1a;10月30日~11月11日 网上缴费时间…

Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0

文章目录 前言开发环境问题描述问题分析1. 适配Java 212. 适配AGP 8.0 解决方案补充内容最后 前言 Android Studio版本从Koala Feature Drop升级到Ladybug&#xff0c;出现了一系列报错。 开发环境 Flutter: 3.24.3Android Studio: 2024.2.1 Patch 1Java: 21.0.3Gradle: 7.4…