目录:
一、求两个集合的交集、并集、差集
二、生成包含三个变量和两个逻辑连接词的真值表
三、等价关系判定
四、关系的闭包运算 warshall算法
五、偏序关系上的最大最小极大极小元
六、图中两个顶点的通路数
推荐阅读:Python基础自学实用笔记(总和篇)-By Ryan_3610
1、题目:求两个集合的交集、并集、差集
1.1代码
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
//集合的交集、并集运算
string quchong(string str) //字符串去重
{
if(str.size()<2) return str;
string tmp_str("\0");
tmp_str += str[0];
string::size_type j;
for(string::size_type i=1 ; i<str.size() ; i++)
{
for(j=0 ; j<tmp_str.size() ; j++)
if(tmp_str[j]==str[i]) break;
if(j==tmp_str.size()) tmp_str+=str[i];
}
return tmp_str;
}
//集合的差集、补集运算
string quziji(string str,string temp) //字符串去子集
{
string result ;
for (int i = 0; i < str.size(); i++)
{
int flag = 0;
for (int j =0;j < temp.size();j++)
if (temp[j] == str[i]) flag = 1;
if (flag == 0) result += str[i];
}
return result;
}
int main()
{
int choice;
printf("若求交集、并集输入1,若求差集输入2,请输入:");
cin>>choice;
string str1,str2,str3;
char temp[128];
int len1,len2,num=0,k;
cout<<"请输入集合1:";
cin>>str1;
cout<<"请输入集合2:";
cin>>str2;
len1 = str1.length();
len2 = str2.length();
str3 = str1 + str2;
for(int i = 0;i < len1; i++)
for(int j = 0;j < len2 ; j++)
if(str1[i] == str2[j]) temp[num++]=str1[i];
temp[num] = '\0';
if(choice == 1) cout<<"两集合交集为:"<<quchong(temp)<<endl;
if(choice == 1) cout<<"两集合并集为:"<<quchong(str3)<<endl;
if(choice == 2)
{
cout<<"集合1对集合2的差集:"<<quchong(quziji(str1,quchong(temp)))<<endl;
cout<<"集合2对集合1的差集:"<<quchong(quziji(str2,quchong(temp)))<<endl;
}
}
1.2测试
453fsdf
Fdg4234
1.3结果
推荐阅读:Python基础自学实用笔记(总和篇)-By Ryan_3610
2、题目:生成包含三个变量和两个逻辑连接词的真值表
2.1代码
#include <iostream>
#include <stdio.h>
using namespace std;
//打印表头
void printtitle(char a,char b,char c,int one,int two)
{
printf("%c %c %c %c",a,b,c,a);
switch(one)
{
case 0:printf("~%c",b);break;
case 1:printf("^%c",b);break;
case 2:printf("\\/%c",b);break;
case 3:printf("->%c",b);break;
case 4:printf("<->%c",b);break;
}
switch(two)
{
case 0:printf("~%c\n",c);break;
case 1:printf("^%c\n",c);break;
case 2:printf("\\/%c\n",c);break;
case 3:printf("->%c\n",c);break;
case 4:printf("<->%c\n",c);break;
}
}
//真值运算
int yunsuan(int p,int q,int connective)
{
if(connective==1)
{
return p*q;
}
else if(connective==2)
{
return ((p+q)/2+(p+q)%2);
}
else if(connective==3)
{
if(p==0)
return 1;
else
{
if(q==1)
return 1;
else
return 0;
}
}
else if(connective==4)
{
if(p==q)
return 1;
else
return 0;
}
}
int main()
{
//输入
char a,b,c;
int m,n;
cout<<"逻辑联结词选择:“非”请输入0,“与”请输入1,“或”请输入2,“蕴涵”请输入3,“双向蕴涵”请输入4!"<<endl;
cout<<"输入第1个变量:"; cin>>a;
cout<<"输入第一个逻辑连接词:"; cin>>m;
cout<<"输入第2个变量:"; cin>>b;
cout<<"输入第二个逻辑连接词:"; cin>>n;
cout<<"输入第3个变量:"; cin>>c;
//输出表头
printtitle(a,b,c,m,n);
//输出格式及运算结果
int i,j,k;
for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
{
for (k=0;k<2;k++)
{
printf("%d %d %d ",i,j,k);
if(m<=n) cout<<yunsuan(yunsuan(i,j,m),k,n)<<endl;
else cout<<yunsuan(i,yunsuan(j,k,n),m)<<endl;
}
}
}
return 0;
}
2.2测试
a
1
b
4
c
2.3结果
推荐阅读:Python基础自学实用笔记(总和篇)-By Ryan_3610
3、题目:等价关系判定
3.1代码
#include <iostream>
#include <stdio.h>
using namespace std;
//等价关系:满足自反对称传递
int main()
{
//输入
int n,num[20][20];
cout<<"请输入该关系矩阵阶数:";
cin>>n;
for (int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin>>num[i][j];
}
//自反判断
for(int i = 0;i<n;i++)
{
if(num[i][i] != 1)
{
cout<<"非等价关系"<<endl;
return 0;
}
}
//对称判断
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if (i != j)
{
if(num[i][j] != num[j][i])
{
cout<<"非等价关系"<<endl;
return 0;
}
}
}
//可传递判断(算法)
int num0[20][20];
//矩阵相乘
int temp=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
temp = 0;
for (int m=0;m<n;m++)
temp += num[i][m]*num[m][j];
num0[i][j] = temp;
}
}
//子集判断
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (num[i][j] == 0)
{
if (num0[i][j] != 0)
{
cout << "非等价关系"<<endl;
return 0;
}
}
}
}
//最后结果
cout<<"是等价关系"<<endl;
return 0;
}
3.2测试
5
1 1 0 0 0
1 1 1 0 1
0 1 1 1 0
0 0 1 1 1
0 1 0 1 1
5
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
3.3结果
推荐阅读:Python基础自学实用笔记(总和篇)-By Ryan_3610
4、题目:关系的闭包运算 warshall算法
4.1代码
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
//输入
int n=0,num[20][20];
char name[20];
cout<<"请输入元素个数:";
cin>>n;
cout<<"请输入关系矩阵:\n";
for (int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin>>num[i][j];
}
//warshall算法
for (int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(num[j][i])
for (int m=0;m<n;m++)
num[j][m] = num[j][m] + num[i][m];
}
}
//输出
cout<<"----------传递闭包关系矩阵----------\n";
for (int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(num[i][j] > 1)
num[i][j] = 1;
cout<<num[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
4.2测试
4
0 1 0 0
1 0 1 0
0 0 0 1
1 0 1 1
4.3结果
推荐阅读:Python基础自学实用笔记(总和篇)-By Ryan_3610
5、题目:偏序关系上的最大最小极大极小元
5.1代码
#include <iostream>
#include <stdio.h>
using namespace std;
//偏序关系上的最大最小极大极小元
//判断除主对角线上的数
int main()
{
int n,num[20][20];
cout<<"请输入集合中元素个数:";
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin>>num[i][j];
}
//最大元判定(列全1)
int flag=0;
cout<<"最大元为:";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if (i!=j)
{
if(num[j][i] == 0)
flag = 1;
}
}
if (flag == 0)
{
cout<<i+1<<" ";
}
flag = 0;
}
cout<<endl;
//极大元判定(行全0)
cout<<"极大元为:";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if (i!=j)
{
if(num[i][j] == 1)
flag = 1;
}
}
if (flag == 0)
{
cout<<i+1<<" ";
}
flag = 0;
}
cout<<endl;
//最小元判定(行全1)
cout<<"最小元为:";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if (i!=j)
{
if(num[i][j] == 0)
flag = 1;
}
}
if (flag == 0)
{
cout<<i+1<<" ";
}
flag = 0;
}
cout<<endl;
//极小元判定(列全0)
cout<<"极小元为:";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if (i!=j)
{
if(num[j][i] == 1)
flag = 1;
}
}
if (flag == 0)
{
cout<<i+1<<" ";
}
flag = 0;
}
cout<<endl;
}
5.2测试
6
1 1 1 0 1 1
0 1 0 0 0 1
0 0 1 0 1 1
0 0 0 1 0 1
0 0 0 0 1 1
0 0 0 0 0 1
5.3结果
推荐阅读:Python基础自学实用笔记(总和篇)-By Ryan_3610
6、题目:图中两个顶点的通路数
6.1代码
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
//输入
int n;
int num1[10][10]={0};
int num[10][10];
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>num[i][j];
}
}
//矩阵乘法
int temp=0;
for(int k=0;k<n-1;k++) //k阶
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
temp = 0;
for (int m=0;m<n;m++)
temp += num[i][m]*num[m][j];
num1[i][j] = temp;
}
}
}
//输出答案
printf("----------------------------------\n");
int sum=0;
int x,y;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<num1[i][j]<<" ";
}
printf("\n");
}
cout<<"输入起始点:";
cin>>x>>y;
cout<<num1[x-1][y-1];
}
6.2测试
4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4