C语言--离散数学实验--集合及二元关系的应用

简介: C语言--离散数学实验--集合及二元关系的应用

 

目录

集合的运算:

题目要求:

代码:

等价关系的判定:

题目要求:

代码:

N元关系

题目描述:

代码:


集合的运算:

题目要求:

一、集合的运算

(1)用数组A,B,C,E表示集合。输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。以下每一个运算都要求先将集合C置成空集。

(2)二个集合的交运算:把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C中,数组C便是集合A和集合B的交集。

(3)二个集合的并运算:把数组A中各个元素先保存在数组C中。将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B的并集。

(4)二个集合的差运算:把数组A中各个元素先保存在数组C中。将数组B中的元素逐一与数组B中的元素进行比较,把相同的元素从数组C中删除,数组C便是集合A和集合B的差A-B。

(5)集合的补运算:将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。

代码:

#include<stdio.h>
void jiao(int a[30], int b[30], int c[30], int p, int q)
{
    int i, j, k = 0;
    for (i = 0; i < p; i++)
    {
        for (j = 0; j < q; j++)
        {
            if (a[i] == b[j])
            {
                c[k] = a[i];
                k++;
            }
        }
    }
    printf("交集:{");
    for (i = 0; i < k; i++)
    {
        if (i == k - 1)
        {
            printf("%d", c[i]);
        }
        else printf("%d,", c[i]);
    }
    printf("}\n");
}
void bing(int a[30], int b[30], int c[30], int p, int q)
{
    int i, j, n = 0, k = 0;
    for (i = 0; i < p; i++)
    {
        c[i] = a[i];
    }
    for (j = 0; j < q; j++)
    {
        c[i] = b[j];
        i++;
    }
    for (i = 0; i < p; i++)
    {
        for (j = 0; j < q; j++)
        {
            if (a[i] == b[j])
            {
                n++;
            }
        }
    }
    for (i = 0; i < p + q; i++)
    {
        for (j = 0; j < p + q; j++)
        {
            if (c[i] == c[j] && i != j)
            {
                for (k = j; k < p + q; k++)
                {
                    c[k] = c[k + 1];
                }
            }
        }
    }
    printf("并集:{");
    for (i = 0; i < k - n; i++)
    {
        if (i == k - n - 1)
        {
            printf("%d", c[i]);
        }
        else printf("%d,", c[i]);
    }
    if (n == 0)
    {
        for (i = 0; i < p + q; i++)
        {
            if (i == p + q - 1)
            {
                printf("%d", c[i]);
            }
            else printf("%d,", c[i]);
        }
    }
    printf("}\n");
}
void cha(int a[30], int b[30], int c[30], int p, int q)
{
    int i, j, k, m = 0;
    for (i = 0; i < p; i++)
    {
        for (j = 0; j < q; j++)
        {
            k = 0;
            if (a[i] == b[j])
            {
                k = 1;
            }
            if (k)
                break;
        }
        if (k == 0)
        {
            c[m] = a[i];
            m++;
        }
    }
    printf("差集{");
    for (i = 0; i < m; i++)
    {
        if (i != m - 1)
            printf("%d,", c[i]);
        else
            printf("%d", c[i]);
    }
    printf("}\n");
}
void bu(int a[30], int e[30], int c[30], int p, int q)
{
    int i, j, n = 0, m = 2;
    for (i = 0; i < q; i++)
    {
        for (j = 0; j < p; j++)
        {
            if (e[i] == a[j])
            {
                break;
            }
            if (e[i] != a[j] && j == p - 1)
            {
                c[n] = e[i];
                n++;
            }
        }
    }
    printf("补集:{");
    for (i = 0; i < n; i++)
    {
        if (i != n - 1)
            printf("%d,", c[i]);
        else
            printf("%d", c[i]);
    }
    printf("}\n");
}
int main()
{
    int n1, n2, i, j, t, s, n, k, m;
    int a[200], b[200], c[200], d[200], e[200];
    printf("集合A元素个数");
    scanf("%d", &n1);
    for (i = 0, j = 0; i < n1; i++, j++) 
    {
        scanf("%d", &a[i]);
        d[j] = a[i];
        for (n = 0; n < i; n++) 
        {
            if (a[i] == a[n]) 
            {
                printf("重新输入");
                for (i = 0, j = 0; i < n1; i++, j++) 
                {
                    scanf("%d", &a[i]);
                    d[j] = a[i];
                }
            }
            break;
        }
    }
    printf("集合B元素个数");
    scanf("%d", &n2);
    for (i = 0, j = n1; i < n2; i++, j++) 
    {
        scanf("%d", &b[i]);
        d[j] = b[i];
        for (k = 0; k < i; k++) 
        {
            if (b[k] == b[i]) 
            {
                printf("重新输入");
                for (i = 0, j = n1; i < n2; i++, j++) 
                {
                    scanf("%d", &b[i]);
                    d[j] = b[i];
                }
                break;
            }
        }
    }
    printf("集合E元素个数");
    scanf("%d", &m);
    for (i = 0; i < m; i++) 
    {
        scanf("%d", &e[i]);
        for (k = 0; k < i; k++) 
        {
            if (e[k] == e[i]) 
            {
                printf("重新输入");
                for (i = 0; i < m; i++) 
                {
                    scanf("%d", &e[i]);
                }
                break;
            }
        }
    }
    jiao(a, b, c, n1, n2);
    bing(a, b, c, n1, n2);
    cha(a, b, c, n1, n2);
    bu(a, e, c, n1, m);
}

image.gif

等价关系的判定:

题目要求:

等价关系:集合A上的二元关系R同时具有自反性、对称性和传递性,则称R是A上的等价关系。

(1)A上的二元关系用一个n×n关系矩阵R=

表示,定义一个n×n数组r[n][n]表  示n×n矩阵关系。

(2)若R对角线上的元素都是1,则R具有自反性。

(3)若R是对称矩阵,则R具有对称性。对称矩阵的判断方法是:。

(4)关系的传递性判断方法:对任意i,j,k,若。

(5)求商集的方法:商集是由等价类组成的集合。

image.gif编辑

代码:

#include<stdio.h>
char a[10][10];
int i, j, n;
void f1()
{
  printf("二元关系的域的个数:\n");
  scanf("%d", &n);
  printf("输入关系矩阵\n");
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      scanf("%d", &a[i][j]);
    }
  }
}
int f2()
{
  for (int i = 0; i < n; i++)
  {
    if (a[i][i] == 1)
    {
      printf("具有自反性\n");
      return 1;
    }
    else if (a[i][i] != 1)
    {
      printf("不具有自反性\n");
      return 0;
    }
  }
  return 1;
}
int f3()
{
  for (int i = 0; i < n; ++i)
  {
    for (int j = 1; j < n; ++j)
    {
      if (a[i][j] == a[j][i])
      {
        printf("具有对称性\n");
        return 1;
      }
      else if (a[i][j] != a[j][i])
      {
        printf("不具有对称性\n");
        return 0;
      }
      break;
    }
  }
  return 1;
}
int f4()
{
  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])
        {
          printf("不具有传递性\n");
          return 0;
        }
        else
        {
          printf("具有传递性\n");
          return 1;
        }
      }
    }
  }
  return 1;
}
int main()
{
  f1();
  if (f2() && f3() && f4())
  {
    printf("具有等价关系\n");
  }
  else
  {
    printf("不具有等价关系\n");
  }
  return 0;
}

image.gif

N元关系

题目描述:

三、设N元关元系用r[N][N]表示,c[N][N]表示各个闭包,函数initc(r)表示将c[N][N]初始化为r[N][N]。

(1)自反闭包:

(2)对称闭包:

(3)传递闭包:,或用warshall方法。

方法1:,下面求得的关系矩阵T=就是。

方法2:warshall方法

image.gif编辑

代码:

#include <stdio.h>
#define ROW 4
#define COL 4
void warshall(int arr[ROW][COL],int row,int col)
{
  int i=0,j=0,k=0;
  for(i=0;i<row;i++)
  {
    for(j=0;j<col;j++)
    {
      if(arr[j][i]==1)
      {
      for(k=0;k<col;k++)
      {
        arr[k][k]=(arr[j][k]||arr[i][k]);
      }
    }
  }
}
}
void printf(int arr[ROW][COL],int row,int col)
{
  int i=0,j=0;
  for(i=0;i<row;i++)
  {
    for(j=0;j<col;j++)
    {
      printf("%d",arr[i][j]);
    }
    printf("\n");
  }
}
int main()
{
  int arr[ROW][COL]={{0,1,0,1},{0,1,1,0},{0,0,0,0},{1,0,1,0}};
  printf(arr,4,4);
  printf("\n");
  warshall(arr,4,4);
  printf(arr,4,4);
  return 0;
}

image.gif

相关文章
|
4天前
|
存储 算法 程序员
C语言:基础与应用的双重魅力
C语言:基础与应用的双重魅力
|
4天前
|
机器学习/深度学习 算法 数据挖掘
【C 言专栏】C 语言与机器学习的应用
【5月更文挑战第6天】C语言在机器学习中扮演关键角色,以其高效性、灵活性和可移植性实现底层算法、嵌入式系统和高性能计算。在神经网络、决策树和聚类算法等领域的实现中不可或缺。C语言被用于TensorFlow和OpenCV等知名库的底层,常与C++、Python结合使用。尽管面临开发难度和适应新算法的挑战,但C语言在机器学习领域的价值和潜力将持续展现,为科技进步贡献力量。
【C 言专栏】C 语言与机器学习的应用
|
4天前
|
存储 缓存 算法
【C 言专栏】C 语言中的数据结构应用
【5月更文挑战第4天】本文探讨了C语言中的核心数据结构,包括数组、链表(单链表和双链表)、栈、队列、二叉树(如二叉搜索树和二叉堆)以及图结构。这些数据结构在程序设计中扮演着关键角色,如数组的快速访问、链表的动态管理、栈和队列的处理流程控制、树和图的复杂关系表示。理解并选择适当的数据结构可优化程序性能,而内存管理和算法优化则进一步提升效率。通过案例分析和展望未来发展趋势,本文旨在帮助读者深化对C语言数据结构的理解和应用。
【C 言专栏】C 语言中的数据结构应用
|
4天前
|
机器学习/深度学习 算法 C语言
【C言专栏】递归算法在 C 语言中的应用
【4月更文挑战第30天】本文介绍了递归算法在C语言中的应用,包括基本概念(通过调用自身解决子问题)、特点(调用自身、终止条件、栈空间)和实现步骤(定义递归函数、分解问题、设置终止条件、组合解)。文中通过阶乘计算和斐波那契数列两个案例展示了递归的使用,强调了递归可能导致的栈溢出问题及优化需求。学习递归有助于理解和应用“分而治之”策略。
|
4天前
|
存储 算法 程序员
【C言专栏】C 语言结构体的应用与实践
【4月更文挑战第30天】C语言中的结构体是自定义数据类型的关键,它组合不同类型的數據以创建新类型,尤其适合处理复杂对象如学生信息。通过定义结构体如`struct Student`,包含名字、学号和成绩,可以方便地实例化和访问成员。结构体在链表实现、函数参数传递和数组中都有广泛应用,如表示链表节点和处理批量数据。理解并熟练运用结构体对于C语言编程至关重要,能提升代码效率和可读性。
|
4天前
|
存储 算法 程序员
C语言:深入探索与实战应用
C语言:深入探索与实战应用
13 0
|
4天前
|
C语言
if语句的应用(C语言零基础教程)
if语句的应用(C语言零基础教程)
|
4天前
|
C语言 索引
基于C语言的函数指针应用-消息命令处理框架
基于C语言的函数指针应用-消息命令处理框架
13 0
|
4天前
|
Linux 测试技术 C语言
【Linux】应用编程之C语言文件操作
【Linux】应用编程之C语言文件操作
|
4天前
|
小程序 C语言
【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。
【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。
38 0