C语言--离散数学实验--群的判定(已更新)

简介: C语言--离散数学实验--群的判定(已更新)

@[TOC]

群的判定

实验目的

掌握群的判定方法

实验内容

输入代数系统(A,)的集合A和运算的运算表,判断(A,*)是否是群

实验原理和方法

(1)用一维数组a[n]存贮集合A。
(2)用二维数组op[n][n]存贮运算表。
(3)根据群的定义,代数系统(A,)若为群,除运算表已表明运算封闭外,还应该满足下列三个条件:*运算可结合、有幺元e、 A中任何元素都有逆元。

算法提示

运算可结合

    for(i=0;i<N;i++) 
        for(j=0;j<N;j++) 
            for(k=0;k<N;k++) 
            {
    
                for(l=0;l<N;l++) 
                {
    
                    if(op[i][j]==a[l]) x=l;/*op[i][j] 代表a*b*/ 
                    if(op[j][k]==a[l]) y=l;/*op[j][k] 代表b*c*/ 
                } 
                if(op[i][y]!=op[x][k])/*op[i][y]代表a*(b*c)*/ 
                {
    
                    printf("(%d*%d)*%d=%d,%d*(%d*%d)=%d,运算是不可结合!\n", 
a[i],a[j],a[k],op[x][k],a[i],a[j],a[k],op[i][y]); 
                    flag=0;/*不满足结合性*/ 
                } 
            } 
    if(flag) printf("运算是可结合!\n");

有幺元

flag=0; 
    for(i=0;i<N;i++) 
    {
    
        for(j=0;j<N;j++) 
            if(op[i][j]!=a[j] || op[j][i]!=a[j]) break; 
        if(j==N)  
        {
    
            printf("群有幺元%d!\n",a[i]);  
            e=a[i]; 
            flag=1; break; 
        } 
    }         
    if(!flag) printf("群没有幺元!\n");

A中任何元素都有逆元

flag=1; 
    for(i=0;i<N;i++) 
    {
    
        for(j=0;j<N;j++) 
            if(op[i][j]==e && op[j][i]==e) break;/*e是幺元*/ 
        if(j==N)  
            {
    
                flag=0;     
                printf("A中元素%d没有逆元!\n",a[j]); 
        } 
    } 
    if(flag) printf("A中任何元素都有逆元!\n");

源码实现

#include <stdio.h>

#define N 5

int main()
{
   
    int a[N];
    int i, j;
    for (i = 0; i < N; i++)
    {
   
        printf("Number %d :", i + 1);
        scanf("%d", &a[i]);
    }
    int op[N][N];
    int e;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            op[i][j] = a[i] * a[j];
        }
    }
    int  flag = 1;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            for (int k = 0; k < N; k++)
            {
   
                if (op[i][j] * a[k] != a[i] * op[j][k])
                {
   
                    printf("运算是不可结合\n");
                    flag = 0;
                }
            }
        }
    }
    if (flag)
    {
   
        printf("运算是可结合\n");
    }
    flag = 0;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            if (op[i][j] != a[j] || op[j][i] != a[j])
            {
   
                break;
            }
        }
        if (j == N)
        {
   
            printf("群有幺元%d\n", a[i]);
            e = a[i];
            flag = 1;
            break;
        }
    }
    if (!flag)
    {
   
        printf("群没有幺元\n");
    }
    flag = 1;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            if (op[i][j] == e && op[j][i] == e)
            {
   
                break;
            }
        }
        if (j == N - 1)
        {
   
            flag = 0;
            printf("A中元素%d没有逆元\n", a[j]);
        }
    }
    if (flag)
    {
   
        printf("A中任何元素都有逆元\n");
    }
}

==下面代码和上面是一样的==

#include <stdio.h>

#define N 5

int main()
{
   
    int a[N];
    int i, j;
    for (i = 0; i < N; i++)
    {
   
        printf("Number %d :", i + 1);
        scanf("%d", &a[i]);
    }
    int op[N][N];
    int e;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            op[i][j] = a[i] * a[j];
        }
    }
    int  flag = 1;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            for (int k = 0; k < N; k++)
            {
   
                if (op[i][j] * a[k] != a[i] * op[j][k])
                {
   
                    printf("运算是不可结合\n");
                    flag = 0;
                }
            }
        }
    }
    if (flag)
    {
   
        printf("运算是可结合\n");
    }
    flag = 0;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            if (op[i][j] != a[j] || op[j][i] != a[j])
            {
   
                break;
            }
        }
        if (j == N)
        {
   
            printf("群有幺元%d\n", a[i]);
            e = a[i];
            flag = 1;
            break;
        }
    }
    if (!flag)
    {
   
        printf("群没有幺元\n");
    }
    flag = 1;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            if (op[i][j] == e && op[j][i] == e)
            {
   
                break;
            }
        }
        if (j == N - 1)
        {
   
            flag = 0;
            printf("A中元素%d没有逆元\n", a[j]);
        }
    }
    if (flag)
    {
   
        printf("A中任何元素都有逆元\n");
    }
}

#include <stdio.h>

#define N 5

int main()
{
   
    int a[N];
    int i, j;
    for (i = 0; i < N; i++)
    {
   
        printf("Number %d :", i + 1);
        scanf("%d", &a[i]);
    }
    int op[N][N];
    int e;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            op[i][j] = a[i] * a[j];
        }
    }
    int  flag = 1;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            for (int k = 0; k < N; k++)
            {
   
                if (op[i][j] * a[k] != a[i] * op[j][k])
                {
   
                    printf("运算是不可结合\n");
                    flag = 0;
                }
            }
        }
    }
    if (flag)
    {
   
        printf("运算是可结合\n");
    }
    flag = 0;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            if (op[i][j] != a[j] || op[j][i] != a[j])
            {
   
                break;
            }
        }
        if (j == N)
        {
   
            printf("群有幺元%d\n", a[i]);
            e = a[i];
            flag = 1;
            break;
        }
    }
    if (!flag)
    {
   
        printf("群没有幺元\n");
    }
    flag = 1;
    for (i = 0; i < N; i++)
    {
   
        for (j = 0; j < N; j++)
        {
   
            if (op[i][j] == e && op[j][i] == e)
            {
   
                break;
            }
        }
        if (j == N - 1)
        {
   
            flag = 0;
            printf("A中元素%d没有逆元\n", a[j]);
        }
    }
    if (flag)
    {
   
        printf("A中任何元素都有逆元\n");
    }
}

gitee链接及下载链接

https://gitee.com/zhaobohan/c_language_exercises/blob/master/%E7%BE%A4%E7%9A%84%E5%88%A4%E5%AE%9A/%E7%BE%A4%E7%9A%84%E5%88%A4%E5%AE%9A/test.c

相关文章
|
7月前
|
Java C语言
C语言实验——输出字符串-java
C语言实验——输出字符串-java
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
56 4
|
2月前
|
C语言
大学生期末C语言实验(学生成绩和鞍点)
大学生期末C语言实验(学生成绩和鞍点)
267 0
大学生期末C语言实验(学生成绩和鞍点)
|
5月前
|
人工智能 C语言
7-5 sdut -C语言实验-节约用电
7-5 sdut -C语言实验-节约用电
54 3
|
5月前
|
Linux C语言
【编程小实验】C语言实现:无限循环写入文本文件,支持Ctrl+C中断与数据追加(附完整源码)
在Linux中,文件I/O(输入/输出)是程序与文件进行交互的基本方式,包括读取文件内容和向文件写入数据。这通常通过标准的C库函数来实现,下面是一些基本的文件读写操作和代码示例。
272 0
|
7月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(二)
在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
60 2
|
7月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(一)
本文介绍了使用C语言模拟实现通讯录的步骤,包括使用动态顺序表存储联系人信息,每个联系人包含姓名、性别、电话和住址。功能包括新增、查找、删除、修改和查看联系人信息,以及按关键词排序。代码示例展示了如何定义联系人结构体、通讯录顺序表,以及主函数中的菜单选择和输入处理。文章还强调了在读取用户输入时避免出现死循环的问题,并提供了初始化和销毁通讯录的函数,以及如何判断和增加通讯录容量的方法。
86 1
|
7月前
|
存储 大数据 程序员
实验验证C语言中结构体与共用体的差异
实验验证C语言中结构体与共用体的差异
64 0
|
7月前
|
安全 BI 数据安全/隐私保护
每天一道C语言编程:合格密码的判定
每天一道C语言编程:合格密码的判定
56 0
|
7月前
|
存储 编译器 C语言
C语言巧用联合体union判定数据的存储格式(大小端)
C语言巧用联合体union判定数据的存储格式(大小端)
62 1