离散数学关系性质的C++或C语言判断实验报告

时间:2024.5.8

1.【实验目的】

对称:

通过算法设计并编程实现对给定集合上的关系是否为对称关系的判断,加深学生对关系性质的理解,掌握用矩阵来判断关系性质的方法

自反:

通过算法设计并编程实现对给定集合上的关系是否为自反关系的判断,加深学生对关系性质的理解,掌握用矩阵来判断关系性质的方法。

2.【实验内容】

已知关系R由关系矩阵M给出,要求判断由M表示的这个关系是否为对称关系。假定R的关系矩阵为:

3.【实验要求】

C语言编程实现

4.【算法描述】

对称:

从给定的关系矩阵来判断关系R是否为对称是很容易的。若M(R的关系矩阵)为对称矩阵,则R是对称关系;若M为反对称矩阵,则R是反对称关系。因为R为对称的是等价关系的必要条件,所以,本算法可以作为判等价关系算法的子程序给出。

算法实现:

(1)  输入关系矩阵M(M为n阶方阵);

(2)  判断对称性,对于i=2,3,….,n;j=1,2,……,i-1,若存在mij=mji,则R是对称的;

(3)  判断反对称性;

(4)  判断既是对称的又是反对称的;

(5)  判断既不是对称的又不是反对称的;

(6)  输出判断结果。

 自反:

从给定的关系矩阵来断判关系R是否为自反是很容易的。若M(R的关系矩阵)的主对角线元素均为1,则R是自反关系;若M(R的关系矩阵)的主对角线元素均为0,则R是反自反关系;若M(R的关系矩阵)的主对角线元素既有1又有0,则R既不是自反关系也不是反自反关系。本算法可以作为判等价关系算法的子程序给出。

算法实现

(1)  输入关系矩阵M(M为n阶方阵)。

(2)  判断自反性,对于i=1,2,….,n;若存在mii=0,则R不是自反的;若存在mii=1,则R是自反的;否则R既不是自反关系也不是反自反关系。

(3)  输出判断结果。

源代码

#include<stdio.h>

void z();

void r();

void main()

{

       int d;

       while(d)

       {

              printf("欢迎使用关系性质的判断系统\n\n 1. 对称关系的判断    2. 自反关系的判断\n\n请输入选项:");

              scanf("%d",&d);

              switch(d){

              case 1: r();break;

              case 2: z();break;

              case 0: break;

              }

              printf("\n");

              printf("是否还继续?    是请输入1,否请输入0:");

              scanf("%d",&d);

              printf("\n\n");

       }return 0;

}

void r()

{

       int a[30][30];

       int m,n,i,j,c,b,d;

       c=0;

       d=0;

       b=0;

       d=1;

       printf("请输入矩阵的行数");

                     scanf("%d",&m);

                     printf("请输入矩阵的列数");

                     scanf("%d",&n);

                     for(i=0;i<m;i++)

                     {

                            for(j=0;j<n;j++)

                            {

                                   printf("请输入矩阵关系中第%d行第%d列的数字:",i,j);

                                   scanf("%d",&a[i][j]);

                            }

                     }

                     printf("关系矩阵M为:\n");

                     for(i=0;i<m;i++)

                     {

                            for(j=0;j<n;j++)

                                   printf("%d ",a[i][j]);

                            printf("\n");

                     }

                     for(i=0;i<m;i++)

                     {

                            for(j=0;j<n;j++)

                            {

                                   if(a[i][j]!=a[j][i])

                                   {

                                          c=1;

                                          break;

                                   }

                            }

                     }

                     if(c==0)

                     {

                            for(i=0;i<m;i++)

                            {

                                   for(j=0;j<n;j++){

                                          if(a[i][j]==1){

                                                 if(a[j][i]!=0){

                                                        c=2;

                                                        break;

                                                 }

                                          }

                                   }

                            }

                            if(c==2) printf("该矩阵是对称性的\n");

                            else

                                   if(c==0) printf("该矩阵是既对称又反对称的\n");

                     }

                     else

                            if(c==1){

                                   for(i=0;i<m;i++){

                                          for(j=0;j<n;j++){

                                                 if(a[i][j]==1){

                                                        if(a[j][i]!=0){

                                                               c=2;

                                                               break;

                                                        }

                                                 }

                                          }

                                   }

                                   if(c==2) printf("该矩阵不是对称的又不是反对称的\n");

                                   else{

                                          printf("该矩阵是反对称性的\n");

                                   }

                            }}

void z()

{

       int m,n,i,j,a[80][80],c;

       c=0;

       printf("请输入矩阵的行数");

       scanf("%d",&m);

       printf("请输入矩阵的列数");

       scanf("%d",&n);

       for(i=0;i<m;i++){

              for(j=0;j<n;j++){

                     printf("请输入矩阵关系中第%d行第%d列的数字:",i,j);

                     scanf("%d",&a[i][j]);

              }

       }

       printf("关系矩阵M为:\n");

       for(i=0;i<m;i++)

       {

              for(j=0;j<n;j++)

                     printf("%d ",a[i][j]);

              printf("\n");

       }

       for(i=0;i<m;i++){

              if(a[i][i]!=0){

                     c=1;break;

              }

       }

       if(c==1) printf("该矩阵是自反性的\n");

       if(c==0) printf("该矩阵是反自反性的\n");

}


第二篇:离散数学C语言上机题


广东工业大学 计算机科学与技术 张法光

离散数学C语言上机题

Anyview

可视化编程作业系统

二元关系章节编程题

EX

01

6.01③ 试设计一算法,

实现集合的卡氏积运算。

实现下列函数:

/**

* 进行两个集合的卡氏积运算

* @param pA: 要进行卡氏积运算的集合

* @param pB: 要进行卡氏积运算的集合

* @return: 将pA和pB进行卡氏积运算后得到的集合

*/

pCartersianSet CartesianProduct(pOriginalSet pA, pOriginalSet pB)

{

pCartersianSet pC=createNullCartersianSet(); //空卡

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{ // 空卡 ←序偶插入 ← 建立序偶 ← 条件语句

for(resetOriginalSet(pB);!isEndOfOriginalSet(pB);nextOriginalSetPos(pB))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),g etCurrentOriginalSetElem(pB)));

}

return pC;

}

02

6.02② 试设计一算法,

给定集合A、集合B和集合C,判断集合C是否为A到B的一个二元关系。

实现下列函数:

/**

* 给定集合A、集合B和集合C,判断集合C是否为A到B的一个二元关系。 * @param pA: 集合A

* @param pB: 集合B

* @param pC: 集合C

* @return: 如果集合C是A到B的一个二元关系,则返回true,否则返回false。 */

boolean isBinaryRelation(pOriginalSet pA, pOriginalSet pB, pCartersianSet pC)

{

pCartersianSet pD=createNullCartersianSet();

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{ // 空卡 ←序偶插入 ← 建立序偶 ← 条件语句

for(resetOriginalSet(pB);!isEndOfOriginalSet(pB);nextOriginalSetPos(pB))

OrderedCoupleInsertToCartersianSet(pD,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pB)));

}

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC); nextCartersianSetPos(pC)) {

if(isInCartersianSet(pD,getCurrentCartersianSetElem(pC)))

;//满足条件,执行空语句,继续循环

else return false;

}

return true;

}

03

6.03② 试设计一算法,求集合A上的恒等关系。

实现下列函数:

/**

* 给定集合A,求集合A上的恒等关系。

* @param pSet: 原始集合

* @return: 集合A上的恒等关系。

*/

pCartersianSet IdentityRelation(pOriginalSet pA)

{ pCartersianSet pB=createNullCartersianSet();

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{ // 空卡 ←序偶插入 ← 建立序偶 ← 条件语句

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

if(getCurrentOriginalSetElem(pA)==getCurrentOriginalSetElem(pA))//The same elements

OrderedCoupleInsertToCartersianSet(pB,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

return pB;

}

04

6.04③ 试设计一算法,求两个卡氏积集合的复合运算。

实现下列函数:

/**

* 给定两个集合,求该两个集合的复合运算。

* @param pA: 卡氏积集合

* @param pB: 卡氏积集合

* @return: pA与pB的复合运算结果。

*/

pCartersianSet CompositeOperation(pCartersianSet pA, pCartersianSet pB)

{ pCartersianSet pC=createNullCartersianSet();

for(resetCartersianSet(pA);!isEndOfCartersianSet(pA); nextCartersianSetPos(pA))

{

for(resetCartersianSet(pB);!isEndOfCartersianSet(pB); nextCartersianSetPos(pB))

if(isEqualOriginalSetElem(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pA)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pB))))

//获取A卡氏积中序偶的第二元 //获取第二元

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getFirstElemOfOrderedCouple(get

CurrentCartersianSetElem(pA)),getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(p

B))) );

}

return pC;

}

05

6.05② 试设计一算法,求一个关系的逆运算。

实现下列函数:

/**

* 求一个关系的逆运算。

* @param pA: 卡氏积集合

* @return: pA的逆运算结果。

*/

pCartersianSet InverseOperation(pCartersianSet pA)

{ pCartersianSet pB=createNullCartersianSet();

for(resetCartersianSet(pA);!isEndOfCartersianSet(pA); nextCartersianSetPos(pA))

{OrderedCoupleInsertToCartersianSet(pB,createOrderedCouple(getSecondElemOfOrderedCouple

(getCurrentCartersianSetElem(pA)),getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(

pA))) );

}

return pB;

}

06

6.06④ 试设计一算法,对某集合A上的一个二元关系,求该关系的幂运算。

实现下列函数:

/**

* 求一个关系的幂运算。

* @param pA: 原始集合

* @param pBinaryRelationR: pA上的关系R

* @param n: 幂运算的次数,且n >= 0

* @return: pBinaryRelationSet的n次幂运算结果。

*/

pCartersianSet CompositeOperation(pCartersianSet pA, pCartersianSet pB)

{ pCartersianSet pC=createNullCartersianSet();

for(resetCartersianSet(pA);!isEndOfCartersianSet(pA); nextCartersianSetPos(pA))

{

for(resetCartersianSet(pB);!isEndOfCartersianSet(pB); nextCartersianSetPos(pB))

if(isEqualOriginalSetElem(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pA)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pB))))

//获取A卡氏积中序偶的第二元 //获取第二元

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getFirstElemOfOrderedCouple(get

CurrentCartersianSetElem(pA)),getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(p

B))) );

}

return pC;

}

pCartersianSet PowOperation(pOriginalSet pA,

pCartersianSet pBinaryRelationR,

int n)

{

pCartersianSet pC=createNullCartersianSet();

pC=copyCartersianSet(pBinaryRelationR);

if(n==0)

{

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

return pC;

}

if(n==1)

{return pBinaryRelationR;}

for(int i=1;i<n;i++)

{pC=CompositeOperation(pC,pBinaryRelationR); }

return pC;

}

07

6.02② 试设计一算法,对某集合A上的一个二元关系R,判断R是否具有自反性。

实现下列函数:

/**

* 判断一个关系是否具有自反性。

* @param pA: 原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: 如果pBinaryRelationSet具有自反性;则返回true,否则返回false。 */

boolean IsReflexivity(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{ pCartersianSet pC=createNullCartersianSet();

//获取 IA

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC); nextCartersianSetPos(pC)) {

if(isInCartersianSet(pBinaryRelationR,getCurrentCartersianSetElem(pC)))

;//满足条件,执行空语句,继续循环

else return false;

}

return true;

}

08

6.08② 试设计一算法,对某集合A上的一个二元关系R,判断R是否具有反自反性。

实现下列函数:

/**

* 判断一个关系是否具有反自反性。

* @param pA: 原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: 如果pBinaryRelationSet具有反自反性;则返回true,否则返回false。 */

boolean IsAntiReflexivity(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{ pCartersianSet pC=createNullCartersianSet();

//获取 IA

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC); nextCartersianSetPos(pC)) {

if(!isInCartersianSet(pBinaryRelationR,getCurrentCartersianSetElem(pC)))

;//满足条件,执行空语句,继续循环

else return false;

}

return true;

}

09

6.09③ 试设计一算法,对某集合A上的一个二元关系R,判断R是否具有自反性或者反自反性。

在实际运算中,A无需给出。

实现下列函数:

/**

* 判断一个关系是否具有自反性或者反自反性。对一个关系R是否具有自反性或者反自反性,

* 有四种可能:是自反的;是反自反的;既是自反的也是反自反的、

* 既不是自反的也不是反自反的。

* @param pA: 原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: 返回一个Reflexivity_Type枚举类型值。

* 如果pBinaryRelationSet具有自反性,则返回REFLEXIVITY;

* 如果pBinaryRelationSet具有反自反性,则返回ANTI_REFLEXIVITY; * 如果pBinaryRelationSet既具有自反性,也具有反自反性,则返回 * REFLEXIVITY_AND_ANTI_REFLEXIVITY;

* 如果pBinaryRelationSet既不具有自反性,也不具有反自反性,则返回 * NOT_REFLEXIVITY_AND_NOT_ANTI_REFLEXIVITY;

*/

//自反函数

boolean IsReflexivity(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{ pCartersianSet pC=createNullCartersianSet();

//获取 IA

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC); nextCartersianSetPos(pC)) {

if(isInCartersianSet(pBinaryRelationR,getCurrentCartersianSetElem(pC)))

;//满足条件,执行空语句,继续循环

else return false;

}

return true;

}

//反自反函数

boolean IsAntiReflexivity(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{ pCartersianSet pC=createNullCartersianSet();

//获取 IA

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC); nextCartersianSetPos(pC)) {

if(!isInCartersianSet(pBinaryRelationR,getCurrentCartersianSetElem(pC)))

;//满足条件,执行空语句,继续循环

else return false;

}

return true;

}

Reflexivity_Type DetermineReflexivity(pOriginalSet pA,

pCartersianSet pBinaryRelationR)

{

if(IsReflexivity(pA,pBinaryRelationR)&&IsAntiReflexivity(pA,pBinaryRelationR)) return REFLEXIVITY_AND_ANTI_REFLEXIVITY;

else if(!IsReflexivity(pA,pBinaryRelationR)&&!IsAntiReflexivity(pA,pBinaryRelationR)) return NOT_REFLEXIVITY_AND_NOT_ANTI_REFLEXIVITY;

else if(IsReflexivity(pA,pBinaryRelationR))

return REFLEXIVITY;

else

return ANTI_REFLEXIVITY;

}

10

6.10④ 试设计一算法,对某集合A上的一个二元关系R,判断R是否具有对称性或者反对称性。

实现下列函数:

/**

* 判断一个关系是否具有对称性或者反对称性。对一个关系R是否具有对称性或者反对称性,

* 有四种可能:是对称的;是反对称的;;既是对称的也是反对称的;既不是对称的也不是 * 反对称的。

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: 返回一个Symmetry_Type枚举类型值。

* 如果pBinaryRelationSet具有对称性,则返回SYMMETRY;

* 如果pBinaryRelationSet具有反对称性,则返回ANTI_SYMMETRY; * 如果pBinaryRelationSet既具有对称性,也具有对称性,则返回

* SYMMETRY_AND_ANTI_SYMMETRY;

* 如果pBinaryRelationSet既不具有对称性,也不具有反对称性,则返回 * NOT_SYMMETRY_AND_NOT_ANTI_SYMMETRY;

*/

Symmetry_Type DetermineSymmetry(pCartersianSet pBinaryRelationR)

{int a,b,c; a=b=c=0;

if(!isNullCartersianSet(pBinaryRelationR))

{

for(resetCartersianSet(pBinaryRelationR);!isEndOfCartersianSet(pBinaryRelationR);nextCartersianSetPos(pBinaryRelationR))

{

if(isInCartersianSet(pBinaryRelationR,createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR))))

&&!isEqualOriginalSetElem(getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))) {a++;}

if(isInCartersianSet(pBinaryRelationR,createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR))))

&&isEqualOriginalSetElem(getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))) {b++;}

if(!isInCartersianSet(pBinaryRelationR,createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))))

{c++;}

}

{

if(c==0&&a!=0)return SYMMETRY;

if(a==0&&c==0)return SYMMETRY_AND_ANTI_SYMMETRY;

if(a==0&&c!=0)return ANTI_SYMMETRY;

else return NOT_SYMMETRY_AND_NOT_ANTI_SYMMETRY;

}

}

if(isNullCartersianSet(pBinaryRelationR))

return SYMMETRY_AND_ANTI_SYMMETRY;

}

11

6.11④ 试设计一算法,对某集合A上的一个二元关系R,判断R是否具有传递性。

实现下列函数:

/**

* 判断一个关系是否具有传递性。

* @param pA: 原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系 * @return: 如果pBinaryRelationR具有传递性,则返回true,否则返回false */

boolean IsTransitive(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{

pOriginalSetElem First1,Second1;

pOriginalSetElem First2,Second2;

pCartersianSet pB=copyCartersianSet(pBinaryRelationR);

pCartersianSet pC=copyCartersianSet(pBinaryRelationR);

if(!isNullCartersianSet(pBinaryRelationR))

{

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC);nextCartersianSetPos(pC)) {

First1=getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pC));

Second1=getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pC)); for(resetCartersianSet(pB);!isEndOfCartersianSet(pB);nextCartersianSetPos(pB)) {

First2=getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pB));

Second2=getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pB)); if(isEqualOriginalSetElem(First2,Second1))

{

if(!isInCartersianSet(pBinaryRelationR,createOrderedCouple(First1,Second2))) return false;}

}

}

}

else return true;

return true;

}

12

6.12③ 试设计一算法,对某集合A上的一个二元关系R,求R的自反闭包。

实现下列函数:

/**

* 判断一个关系R的自反闭包

* @param pA: 原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: pBinaryRelationR的自反闭包

*/ 方法://A的自反关系加上R即可

pCartersianSet ReflexiveClosure(pOriginalSet pA, pCartersianSet pBinaryRelationR) {

pCartersianSet pC=copyCartersianSet(pBinaryRelationR);

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{ // 空卡 ←序偶插入 ← 建立序偶 ← 条件语句

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

return pC;

}

13

6.13③ 试设计一算法,对某集合A上的一个二元关系R,求R的对称闭包。 在实际计算中,无需给出集合A。

实现下列函数:

/**

* 判断一个关系R的对称闭包

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: pBinaryRelationR的自反闭包

*/

// 方法:把<y,x>插入 pD即可 其中pD为R的复制函数值

易错点:因为无需给出A。所以循环利用 pBinaryRelationR 即可。双重循环出错。 pCartersianSet SymmetricClosure(pCartersianSet pBinaryRelationR)

{

pCartersianSet pD=copyCartersianSet(pBinaryRelationR);

for(resetCartersianSet(pBinaryRelationR);!isEndOfCartersianSet(pBinaryRelationR);nextCartersianSetPos(pBinaryRelationR))

{

pOrderedCouple

xuou=createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR))); // 定义xuou为序偶<y,x>

if(!isInCartersianSet(pBinaryRelationR,xuou)) // 判断序偶<y,x>是否在pR

{

OrderedCoupleInsertToCartersianSet(pD,xuou); // 插入序偶<y,x>

}

}

return pD;

}

14

6.14⑤ 试设计一算法,对某集合A上的一个二元关系R,求R的传递闭包。

实现下列函数:

/**

* 判断一个关系R的传递闭包

* @param pA: 原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: pBinaryRelationR的传递闭包

*/

pCartersianSet TransitiveClosure(pOriginalSet pA, pCartersianSet pBinaryRelationR) {

pCartersianSet pB=copyCartersianSet(pBinaryRelationR);

pCartersianSet pD=copyCartersianSet(pBinaryRelationR);

if(!isNullCartersianSet(pBinaryRelationR)) //非空

{

//假定:R为<x,y> ; pD为 <y,z>

for(resetCartersianSet(pBinaryRelationR);!isEndOfCartersianSet(pBinaryRelationR);nextCartersianSetPos(pBinaryRelationR))

{

if(!isEqualOriginalSetElem(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR))))

//R中序偶第二元不等于第一元 即y!=x; 排除两元相等的情况

{

for(resetCartersianSet(pD);!isEndOfCartersianSet(pD);nextCartersianSetPos(pD))

if(isEqualOriginalSetElem(getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pD)), getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))

// R中序偶的第二元相等和pD中序偶第一元相等 即 R为<x,y> ; pD为 <y,z> 中 Ry=pDy ;

&&!isInCartersianSet(pD,createOrderedCouple(getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pD)))))

//xuou 不在pD 即<x,z>不属于pD ; */

OrderedCoupleInsertToCartersianSet(pB,createOrderedCouple(getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pD))));

// 把符合条件的<x,z>插入到pB ;

}

}

}

return pB;

}

15

6.15③ 实现Warshall算法,求某关系的传递闭包。

实现下列函数:

/**

* 对某集合A上的一个二元关系,求该关系的传递闭包。该关系使用矩阵表示。 * @param pM:二元关系矩阵

* @return: pM的传递闭包的关系矩阵

*/

pMatrix Warshall(pMatrix pM)

{

int i,j,a,b;

int n=getDim(pM);//维数

pMatrixBase p;

p=outToBuffer(pM);//首元素

if(n>=1)//非一维

{

for(i=0;i<n ;i++)

for(j=0;j<n;j++)

{

a=converToInt(*(p+(i*n+j)));

if(a==1)

for(b=0;b<n;b++)

if(converToInt(*(p+(j*n+b)))==1)

putValue(p+(i*n+b),1);

}

for(i=0;i<n ;i++)

{

for(j=0;j<n;j++)

{

a=converToInt(*(p+(i*n+j)));

if(a==1)

for(b=0;b<n;b++)

if(converToInt(*(p+(j*n+b)))==1)

putValue(p+(i*n+b),1);}

}

return createMatrix(p,n);

}

return pM;

}

第七章题目

7.01③ 试设计一算法,对某集合A上的一个二元关系R,判断R是否为等价关系。

实现下列函数:

/**

* 对某集合A上的一个二元关系R,判断R是否为等价关系

* @param pA: 原始集合

* @param pBinaryRelationR:卡氏积集合,该集合是一个pA上的二元关系

* @return: 如果R是A上的等价关系,则返回true;否则返回false

*/

boolean IsReflexivity(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{ pCartersianSet pC=createNullCartersianSet();

//获取 IA

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC); nextCartersianSetPos(pC)) {

if(isInCartersianSet(pBinaryRelationR,getCurrentCartersianSetElem(pC)))

;//满足条件,执行空语句,继续循环

else return false;

}

return true;

}

Symmetry_Type DetermineSymmetry(pCartersianSet pBinaryRelationR)

{int a,c; a=c=0;

if(!isNullCartersianSet(pBinaryRelationR))

{

for(resetCartersianSet(pBinaryRelationR);!isEndOfCartersianSet(pBinaryRelationR);nextCartersianSetPos(pBinaryRelationR))

{

if(isInCartersianSet(pBinaryRelationR,createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR))))

&&!isEqualOriginalSetElem(getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))) {a++;}

if(!isInCartersianSet(pBinaryRelationR,createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))))

{c++;}

}

if(c==0&&a!=0)return SYMMETRY;

}

if(isNullCartersianSet(pBinaryRelationR))

return SYMMETRY_AND_ANTI_SYMMETRY;

}

boolean IsTransitive(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{ int i=1;int j=1;int k=1;int d=0;

pOriginalSet pB=copyOriginalSet(pA);

pOriginalSet pC=copyOriginalSet(pA);

{

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{

for(resetOriginalSet(pB);!isEndOfOriginalSet(pB);nextOriginalSetPos(pB))

{if(!isInCartersianSet(pBinaryRelationR,createOrderedCouple(getCurrentOriginalSetElem(pA),ge

tCurrentOriginalSetElem(pB)) ) )

i++; }

}

for(resetOriginalSet(pB);!isEndOfOriginalSet(pB);nextOriginalSetPos(pB))

{

for(resetOriginalSet(pC);!isEndOfOriginalSet(pC);nextOriginalSetPos(pC))

{if(!isInCartersianSet(pBinaryRelationR,createOrderedCouple(getCurrentOriginalSetElem(pB),getCurrentOriginalSetElem(pC)) ) )

j++;}

}

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{

for(resetOriginalSet(pC);!isEndOfOriginalSet(pC);nextOriginalSetPos(pC))

{if(!isInCartersianSet(pBinaryRelationR,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pC)) ) )

k++;

}

}

}

if(i==1&&j==1&&k==1) //<x,y>?R ,<y,z>?R , <x,z>?R 均属于R

return true;

else if(i!=1||j!=1) //<x,y>或<y,z>不属于R

return true;

else

return false;

}

boolean isEquivalentRelation(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{if(isNullCartersianSet(pBinaryRelationR)&&isNullOriginalSet(pA))

return true;

if(!isNullCartersianSet(pBinaryRelationR))

{

if(IsReflexivity(pA,pBinaryRelationR)==true

&&DetermineSymmetry(pBinaryRelationR)==SYMMETRY

&&IsTransitive(pA,pBinaryRelationR)==true)

{return true;

}

return false;

}

}

7.02⑤ 试设计一算法,对某集合A上的一个二元关系R,求商集A/R。

实现下列函数:

/**

* 对某集合A上的一个二元关系R,判断R是否为等价关系

* @param pSetA:原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: 商集A/R。商集中的每一个元素都是等价类集合。是pCompoundSet复合集合 类型;其元素是原始集合,即等价类集合是pOriginalSet类型。

* 注意:在求解过程中,请勿对pSetA和pBinaryRelationR进行任何的加工型操作。 * 即请勿修改该集合的结构,包括增加或删除集合中的元素,或者对

* pSetA和pBinaryRelationR进行赋值操作。

*/

pCompoundSet QuotientSet(pOriginalSet pSetA, pCartersianSet pBinaryRelationR)

{

pOriginalSet pA=createNullOriginalSet();

pCompoundSet pB=createNullCompoundSet();

if(!isNullCartersianSet(pBinaryRelationR))

for(resetOriginalSet(pSetA);!isEndOfOriginalSet(pSetA);nextOriginalSetPos(pSetA)) {

pA=createNullOriginalSet();

for(resetCartersianSet(pBinaryRelationR);!isEndOfCartersianSet(pBinaryRelationR);nextCartersianSetPos(pBinaryRelationR))

{

if(isEqualOriginalSetElem(getCurrentOriginalSetElem(pSetA),getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR))))

//条件插入

elemInsertToOriginalSet(pA,getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)));

}

if(!isNullOriginalSet(pA))

originalSetInsertToCompoundSet(pB,pA);

}

return pB;

}

7.02⑤ 试设计一算法,对某集合A上的一个二元关系R,求商集A/R。

实现下列函数:

/**

* 对某集合A上的一个二元关系R,判断R是否为等价关系

* @param pSetA:原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: 商集A/R。商集中的每一个元素都是等价类集合。是pCompoundSet复合集合 类型;其元素是原始集合,即等价类集合是pOriginalSet类型。

* 注意:在求解过程中,请勿对pSetA和pBinaryRelationR进行任何的加工型操作。 * 即请勿修改该集合的结构,包括增加或删除集合中的元素,或者对

* pSetA和pBinaryRelationR进行赋值操作。

*/

7.03⑤ 试设计一算法,求某集合A上的模n同余关系。

实现下列函数:

/**

* 对某集合A上的一个二元关系R,判断R是否为等价关系

* @param pSet:原始集合

* @param n: 模

* @return: 集合A上的模n同余关系

* 注意:在求解过程中,请勿对pSetA和pBinaryRelationR进行任何的加工型操作。 * 即请勿修改该集合的结构,包括增加或删除集合中的元素。

*/

pCartersianSet CongruenceRelation(pOriginalSet pSet, int n)

{

pOriginalSet A=copyOriginalSet(pSet);

pOriginalSet B=copyOriginalSet(pSet);

pCartersianSet pC=createNullCartersianSet();

pOrderedCouple xuou;

if(!isNullCartersianSet(pSet))

for(resetOriginalSet(B);!isEndOfOriginalSet(B);nextOriginalSetPos(B))

{

for(resetOriginalSet(A);!isEndOfOriginalSet(A);nextOriginalSetPos(A))

{

if((originalSetElemToInt(getCurrentOriginalSetElem(B))-originalSetElemToInt(getCurrentOriginalSetElem(A)))%n==0)

{

if(!isInCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(B),getCurrentOriginalSetElem(A))))

xuou=createOrderedCouple(getCurrentOriginalSetElem(B),getCurrentOriginalSetElem(A)); OrderedCoupleInsertToCartersianSet(pC,xuou);

}

}

}

return pC;

}

7.04③ 试设计一算法,对某集合A上的一个二元关系R,判断R是否为偏序关系。

实现下列函数:

/**

* 对某集合A上的一个二元关系R,判断R是否为偏序关系

* @param pA: 原始集合

* @param pBinaryRelationR: 卡氏积集合,该集合是一个pA上的二元关系

* @return: 如果R是A上的偏序关系,则返回true;否则返回false

*/

// R为自反,反对称和传递的 则R为偏序关系 调用三者函数

boolean IsReflexivity(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{ pCartersianSet pC=createNullCartersianSet();

//获取 IA

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

{

for(resetOriginalSet(pA);!isEndOfOriginalSet(pA);nextOriginalSetPos(pA))

OrderedCoupleInsertToCartersianSet(pC,createOrderedCouple(getCurrentOriginalSetElem(pA),getCurrentOriginalSetElem(pA)));

}

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC); nextCartersianSetPos(pC)) {

if(isInCartersianSet(pBinaryRelationR,getCurrentCartersianSetElem(pC)))

;//满足条件,执行空语句,继续循环

else return false;

}

return true;

}

Symmetry_Type DetermineSymmetry(pCartersianSet pBinaryRelationR)

{int a,b,c; a=b=c=0;

if(!isNullCartersianSet(pBinaryRelationR))

{

for(resetCartersianSet(pBinaryRelationR);!isEndOfCartersianSet(pBinaryRelationR);nextCartersianSetPos(pBinaryRelationR))

{

if(isInCartersianSet(pBinaryRelationR,createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR))))

&&!isEqualOriginalSetElem(getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))) {a++;}

if(isInCartersianSet(pBinaryRelationR,createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR))))

&&isEqualOriginalSetElem(getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))) {b++;}

if(!isInCartersianSet(pBinaryRelationR,createOrderedCouple(getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)),

getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pBinaryRelationR)))))

{c++;}

}

{

if(c==0&&a!=0)return SYMMETRY;

if(a==0&&c==0)return SYMMETRY_AND_ANTI_SYMMETRY;

if(a==0&&c!=0)return ANTI_SYMMETRY;

else return NOT_SYMMETRY_AND_NOT_ANTI_SYMMETRY;

}

}

if(isNullCartersianSet(pBinaryRelationR))

return SYMMETRY_AND_ANTI_SYMMETRY;

}

boolean IsTransitive(pOriginalSet pA, pCartersianSet pBinaryRelationR)

{

pOriginalSetElem First1,Second1;

pOriginalSetElem First2,Second2;

pCartersianSet pB=copyCartersianSet(pBinaryRelationR);

pCartersianSet pC=copyCartersianSet(pBinaryRelationR);

if(!isNullCartersianSet(pBinaryRelationR))

{

for(resetCartersianSet(pC);!isEndOfCartersianSet(pC);nextCartersianSetPos(pC))

{

First1=getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pC));

Second1=getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pC));

for(resetCartersianSet(pB);!isEndOfCartersianSet(pB);nextCartersianSetPos(pB)) {

First2=getFirstElemOfOrderedCouple(getCurrentCartersianSetElem(pB));

Second2=getSecondElemOfOrderedCouple(getCurrentCartersianSetElem(pB)); if(isEqualOriginalSetElem(First2,Second1))

{

if(!isInCartersianSet(pBinaryRelationR,createOrderedCouple(First1,Second2))) return false;}

}

}

}

else return true;

return true;

}

boolean isPartialOrderRelation(pOriginalSet pA, pCartersianSet pBinaryRelationR) {

if(isNullCartersianSet(pBinaryRelationR)&&isNullOriginalSet(pA))

return true;

if(!isNullCartersianSet(pBinaryRelationR))

{

if(IsReflexivity(pA,pBinaryRelationR)==true

&&DetermineSymmetry(pBinaryRelationR)==ANTI_SYMMETRY

&&IsTransitive(pA,pBinaryRelationR)==true)

{return true;

}

return false;

}

}

更多相关推荐:
数学实验报告

西安交通大学数学实验报告高等数学实验报告MATLAB实验操作报告同组人髙加西20xx年04月10日电气工程学院电气工程与自动化专业电气12崔彧菲西安交通大学数学实验报告实验一非线性方程组求解一实验目的1熟悉MA...

数学实验实验报告

数学实验实验报告20xx20xx学年第1学期学生姓名学号院部数理学院专业班级任课教师实验报告1实验目的熟悉Mathematica软件包的使用实验内容1用两种方式编写如下自定义函数并求其导数fx在x20x10x5...

数学实验实验报告六答案

实验六实验项目名称优化实验时间20xx52620xx6220xx69实验地点理学实验楼525实验目的1掌握Matlab优化工具箱的基本用法利用优化工具包解线性规划和非线性规划的问题对不同算法作初步分析比较2练习...

数学实验实验报告模板

天水师范学院数学与统计学院实验报告实验项目名称所属课程名称实验类型线性代数实验实验日期班级学号姓名成绩12附录1源程序附录2实验报告填写说明1实验项目名称要求与实验教学大纲一致2实验目的目的要明确要抓住重点符合...

数学实验实验报告

数学与计算科学学院实验报告实验项目名称油价与船速的优化问题所属课程名称数学实验实验类型综合实验日期20xx922班级学号姓名成绩123附录2实验报告填写说明1实验项目名称要求与实验教学大纲一致2实验目的目的要明...

数学实验报告格式

《数学实验》实验报告(20##年03月30日)

《数学实验》实验报告

数学实验实验报告20xx年4月8日一实验问题1指派问题考虑指定n个人完成n项任务每人单独承担一项任务使所需的总完成时间成本尽可能短已知某指派问题的有关数据每人完成各任务所需的时间如下表所示试建模并求解该指派问题...

20xx秋数学实验 实验报告(1) 电子版

年级专业信息与计算科学10级姓名学号名单序号62实验时间20xx年10月16日使用设备软件PCMATLAB注实验报告的最后一部分是实验小结与收获实验1数据的统计描述与分析1计算1均值为2方差为025的正态分布在...

西安交大数学实验报告

数学实验报告题目四种特殊自然数编程作者学号班级1题目四种特殊自然数编程计算出所有的水仙花数完美数亲和数回文数2环境Windows系统PCMATLAB软件3问题分析1水仙花数若一个自然数的各位数字的立方和等于该数...

数学实验报告要求格式

数学实验与数学软件实验报告要求1实验成绩占总评成绩的202实验报告的内容实验报告中要求打表格手写或打印均可实验报告的格式实验名称姓名学号实验日期3实验报告的上交1实验报告要写学号格式要符合规范2学号不要分单双号

数学实验“矩阵特征值及相应特征向量的Jacobi法,QR法”实验报告(内含matlab程序)

西京学院数学软件实验任务书实验十三实验报告一实验名称矩阵特征值及相应特征向量的Jacobi法QR法二实验目的熟悉矩阵特征值及相应特征向量的Jacobi法QR法三实验要求运用MatlabCCJavaMapleMa...

第一学期数学实验报告

Matlab数学实验实验报告1目录一第一次实验3二第二次实验三第三次实验四实验反思291317第一次作业一熟悉Matlab环境在计算机上运行试验一中示例1至示例11理解各条语句及指令的含义二编写程序解决下列问题...

数学实验实验报告(35篇)