C/C++ 离散数学程序实现(总和篇)

目录:
一、求两个集合的交集、并集、差集
二、生成包含三个变量和两个逻辑连接词的真值表
三、等价关系判定
四、关系的闭包运算 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

6.3结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45879055/article/details/106784436