离散数学之集合上关系的判断

这次实验由于自己这周遇到了太多了的事情所以没有认真的完成,但还是把代码拿出来和大家分享分享

这周太挫败了

1.acm校赛没能拿奖(这点对我打击太大了,不过我这样的人总是当时心情不爽,过了几天也就好了)

2.linux误删两个文件系统崩溃,重装了系统

3.写了一年的代码放在了移动硬盘里,结果被我摔坏了(由于重装系统的原因,代码电脑里没有。。。一年的代码。。。)

不过从中学到了许多面对事情的态度和方法,感觉这是我大学学到的东西最多的一天。

PS:由于换成了linux系统,这份代码是在linux写的(貌似和windows没啥区别啊)但上机提交时打开正常,运行时cmd中文都是乱码(都是utf-8编码)。。。不懂为什么

下面是我在网上找到的方法

在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容。在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集。 
如果想正确显示UTF-8字符,可以按照以下步骤操作: 
1、打开CMD.exe命令行窗口 
2、通过 chcp命令改变代码页,UTF-8的代码页为65001 
chcp 65001 

执行该操作后,代码页就被变成UTF-8了。但是,在窗口中仍旧不能正确显示UTF-8字符。 
3、修改窗口属性,改变字体 
在命令行标题栏上点击右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida Console",然后点击确定将属性应用到当前窗口。 
这时使用type命令就可以显示UTF-8文本文件的内容了: 
type filename.txt 
4、通过以上操作并不能完全解决问题,因为显示出来的内容有可能不完全。可以先最小化,然后最大化命令行窗口,文件的内容就完整的显示出来了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[10][10];
int a1, a2, Max=1;
char c1, c2;
void menu();
void input();
void output();
void jude();
void jude_Reflexivity();
void jude_Symmetry();
void jude_Transitive();
void jude_Antisymmetry();
void jude_Irreflexivity();
int  main()
{
    menu();
	  input();
	  output();
	  jude();
    return 0;
}

void menu()
{
    cout<<"\t\t\t"<<"离散数学之二元性质判定"<<endl;
    cout<<"1.集合元素依次为a,b,c,d,e"<<endl;
    cout<<"2.每行输入两个字母代表关系的一个元素,以0 0作为输入输入结束标记"<<endl;
}

void input()
{
	memset(a, 0, sizeof(a));
	while(scanf("%c %c", &c1, &c2)!=EOF)
    {
		getchar();
		if(c1=='0'&&c2=='0')
			break;
		a1=c1-96;
		a2=c2-96;
		a[a1][a2]=1;
		Max=max(max(a1, a2), Max);
	}
}

void output()
{
	cout<<"关系矩阵为:"<<endl;
	for(int i=1;i<=Max;i++)
	{
		for(int j=1;j<=Max;j++)
			cout<<a[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;

}

void jude()
{
	jude_Reflexivity();
	cout<<endl;
	jude_Symmetry();
	cout<<endl;
	jude_Transitive();
	cout<<endl;
	jude_Antisymmetry();
	cout<<endl;
	jude_Irreflexivity();
	cout<<endl;

}

void jude_Reflexivity()
{
	cout<<"1.自反性判断"<<endl;
	bool flag=true;
	int Case=0;
	for(int i=1, j=1;i<=Max;i++, j++)
	{
		if(a[i][j]==0)
		{
			printf("第%d组反例:%c %c\n", ++Case, i+96, j+96);
			flag=false;
		}
	}
	if(flag)
		cout<<"该关系满足自反性"<<endl;
}

void jude_Symmetry()
{
	cout<<"2.对称性判断"<<endl;
	bool flag=true;
	int Case=0;
	for(int i=1;i<=Max;i++)
	{
		for(int j=1;j<=Max;j++)
		{
			if(i>=j)
				continue;
			if(a[i][j]!=a[j][i])
			{
				printf("第%d组反例:\n%c %c\n%c %c\n",++Case, i+96, j+96, j+96, i+96);
				flag=false;
			}
		}
	}
	if(flag)
		cout<<"该关系满足对称性"<<endl;
}
void jude_Transitive()
{
	cout<<"3.传递性判断"<<endl;
    bool flag=true;
    int Case=0;
    for(int i=1;i<=Max;i++)
    {
		for(int j=1;j<=Max;j++)
		{
			for(int k=1;k<=Max;k++)
                if(a[i][j]&&a[j][k]&&!a[i][k])
                {
                    printf("第%d组反例:\n%c %c\n%c %c\n",++Case, i+96, j+96, j+96, k+96);
                    flag=false;
                }
		}
	}
    if(flag)
		cout<<"该关系满足传递性"<<endl;
}

void jude_Antisymmetry()
{
	cout<<"4.反对称性判断"<<endl;
	bool flag=true;
	int Case=0;
	for(int i=1;i<=Max;i++)
	{
		for(int j=1;j<=Max;j++)
		{
			if(i>=j)
				continue;
			if(a[i][j]&&a[j][i])
			{
				printf("第%d组反例:\n%c %c\n%c %c\n",++Case, i+96, j+96, j+96, i+96);
				flag=false;
			}
		}
	}
	if(flag)
		cout<<"该关系满足反对称性"<<endl;
}

void jude_Irreflexivity()
{
	cout<<"5.反自反性判断"<<endl;
	bool flag=true;
	int Case=0;
	for(int i=1, j=1;i<=Max;i++, j++)
	{
		if(a[i][j]==1)
		{
			printf("第%d组反例:%c %c\n", ++Case, i+96, j+96);
			flag=false;
		}
	}
	if(flag)
		cout<<"该关系满足反自反性"<<endl;
}


你可能感兴趣的:(离散数学)