※本篇文章是在上一篇文章的基础上进行改进,新增加了s(r(R))和t(s(r(R)))的运算,不想看具体实现而想要源码的可以直接到文章最后。
※建议看一下上篇文章再来了解
一、运行结果
二、新增代码
1.类的新变化
class All
{
public:
All()
{
for (int i = 0; i < ch; i++)
{
for (int j = 0; j < cl; j++)
{
matrix[i][j] = 0;
mat[i][j] = 0;
add[i][j] = 0;
msr[i][j] = 0;
addtsr[i][j] = 0;
mtsr[i][j] = 0;
}
}
along = 0;
}
//输入的关系
string a;
//矩阵元素
string First[5];
//传递闭包运算的矩阵
int mat[ch][cl];
//矩阵相加运算结果
int add[ch][cl];
//最长元素的长度
int along;
//矩阵
int matrix[ch][cl];
//关系元素个数
int number = 0;
//判断输入是否正确
bool a_judge();
//获取集合元素个数
void a_number();
//所有元素中最长的元素长度
void setalong();
//判断元素是否存在
bool exist(string c,string d);
//将元素存入数组
void enter(string d);
//将矩阵进行赋值
void setmatrix();
//输出矩阵
void get(int(*b)[cl]);
//自反闭包
void rR();
//对称闭包
void sR();
//传递闭包
void tR();
//判断数据是否重复
bool nk(int(*b)[cl*ch], int(*d)[cl]);
//将传递闭包出现的情况存入相应数组
void N_add(int(*b)[cl*ch], int(*d)[cl]);
//存储所有传递闭包出现过的情况
int N[20][cl * ch];
//N存入的数组数量
int NM = 0;
//存储tsrR所有传递闭包出现的情况
int Ntsr[20][cl * ch];
//计算t(s(r(R)))
void tsrR();
//存储s(r(R)))
int msr[ch][cl];
//计算s(r(R)))
void srR();
//t(s(r(R)))相关矩阵相加运算结果
int addtsr[ch][cl];
//存储t(s(r(R))))当前运算的矩阵
int mtsr[ch][cl];
};
主要是修改了析构函数,新增了一些变量和方法,还有对原有的nk方法和N_add方法的修改
2.nk方法和N_add方法的修改
bool All::nk(int(*b)[cl*ch],int(*d)[cl])
{
int n = 0;
int k = 0;
int l = 0;
while (1)
{
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
if (b[l][k] == d[i][j])
{
n++;
}
k++;
}
}
k = 0;
if (n == (number * number))return true;
n = 0;
l++;
if (l == NM)break;
}
return false;
}
void All::N_add(int(*b)[cl*ch], int(*d)[cl])
{
int k = 0;
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
b[NM][k] = d[i][j];
k++;
}
}
NM++;
}
主要修改方面是将无参改为了有参,使函数更加灵活,减少一些不必要的重复代码
3.srR方法(新增)用于计算s(r(R))
void All::srR()
{
cout << "s(r(R))运算结果" << endl;
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
msr[i][j] = matrix[i][j];
}
}
for (int i = 0; i < number; i++)
{
msr[i][i] = 1;
}
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
if (matrix[i][j] == 1)
{
msr[j][i] = 1;
}
}
}
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
mtsr[i][j] = msr[i][j];
}
}
get(msr);
}
4.tsrR方法(新增)用于计算t(s(r(R)))
void All::tsrR()
{
N_add(Ntsr,mtsr);
int n[ch][cl];
int m[ch][cl];
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
n[i][j] = msr[i][j];
m[i][j] = mtsr[i][j];
}
}
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
if (m[i][j])
{
for (int k = 0; k < number; k++)
{
if (n[j][k])
{
mtsr[i][k] = 1;
}
}
}
}
}
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
if (msr[i][j] == 1 || mtsr[i][j] == 1)
{
addtsr[i][j] = 1;
}
}
}
if (nk(Ntsr,mtsr))
{
get(addtsr);
}
else tsrR();
}
这个方法主要是在tR的方法上进行一些小修改,主要是我懒得再修改原函数(๑•́₃ •̀๑)
三、最后
总体来说代码改动不算大,但我放在下面的源码是完整的,谢谢你的观看。
源码及exe文件
百度网盘:
链接:https://pan.baidu.com/s/1sojVlq4RTUwU48Vfiq8vgg
提取码:1234
夸克网盘:
我用夸克网盘分享了「闭包运算修改版.zip」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/439ebab34428