#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define M 100
char *get_element(char *p)//输入结点序列函数
{
printf("输入集合的元素(不能有空格):");
gets(p);
fflush(stdin);
return p;
}
int get_position(char ch,char *point)//函数返回字符(结点)ch在point中的位置
{
int i;
for(i=0;*(point+i);i++)
if(*(point+i)==ch)
return i;
return 0;
}
void get_relation(int (*a)[M],char *p)//输入序偶根据第一与第二元素在结点序列中的位置将关系矩阵相应元素置1
{
int k1,k2;
char ch1,ch2;
printf("输入关系的各个序偶(以<*,*>时结束):\n");
while(1)
{
printf("<");
ch1=getche();
printf(",");
ch2=getche();
printf(">\n");
if(ch1=='*')break;
k1=get_position(ch1,p);//取得第一元素在p中的位置序号
k2=get_position(ch2,p);
a[k1][k2]=1;
}
}
void output_relat_array(int (*a)[M],int arry_w)//输出关系矩阵
{
int i,j;
for(i=0;i<arry_w;i++)
{
for(j=0;j<arry_w;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
void output_relate(int (*a)[M],int arry_w,char *p)
//关系矩阵中如果有元素为1,则根据该序号去结点序列中查找其相应结点
{
int i,j;
int count=0;
printf("{");
for(i=0;i<arry_w;i++)
for(j=0;j<arry_w;j++)
if(a[i][j]==1){ printf("<%c,%c>,",*(p+i),*(p+j));count++;}
printf("\b}");
printf("\n");
}
int ZF(int (*a)[M],int n)
{
int flag1 = 1;
for(int i = 0; i <n; i++)
//只要有一个对角元素为0就不具有自反性
{
if(!a[i][i])
{
flag1 = 0;
break;
}
}
return flag1;
}
int FZF(int (*a)[M],int n) //反自反
{
int flag2 = 1;
for(int i = 0; i < n; i++)
{
//只要有一个对角元素为1就不具有反自反性
if(a[i][i])
{
flag2 = 0;
break;
}
}
return flag2;
}
int DC(int (*a)[M],int n) //对称
{
int flag3 = 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{ //矩阵中对称元素都相等则具有对称性
if(a[i][j] != a[j][i])
flag3 = 0;
break;
}
return flag3;
}
int FDC(int (*a)[M],int n) //反对称
{
int flag4 = 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
//矩阵中对称元素中有相等的1则不具有反对称性
if(a[i][j] && a[i][j] == a[j][i] && i != j)
{
flag4 = 0;
break;
}
return flag4;
}
int CD(int (*a)[M],int n) //传递
{
int flag5 = 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
//判断是否满足传递关系
if(a[i][j] && a[j][k] && !a[i][k])
{
flag5 = 0;
break;
}
return flag5;
}
int main()
{
int a[M][M]={0};
char point[M];
int stlen;
char *p;
p=get_element(point);//输入结点p取得其起始位置
stlen=strlen(point);
get_relation(a,p);//根据输入的关系的序偶构建关系矩阵a
output_relate(a,stlen,p);
printf("\n关系矩阵为:\n");
output_relat_array(a,stlen);
cout<<"该关系具有的性质:"<<endl;
if(ZF(a,stlen))
{
cout<<"自反性"<<endl;
}
if(FZF(a,stlen))
{
cout<<"反自反性"<<endl;
}
if(DC(a,stlen))
{
cout<<"对称性"<<endl;
}
if(FDC(a,stlen))
{
cout<<"反对称性"<<endl;
}
if(CD(a,stlen))
{
cout<<"传递性"<<endl;
}
return 0;
}
南邮离散数学实验二
最新推荐文章于 2022-11-12 23:24:25 发布