离散数学第三次程序设计(代数系统)

一、题目要求:

(一)输入:

1.集合A

2.集合A上的运算

(二)输出:

1.运算的性质(封闭、结合、幺元、零元、逆元、交换)

2.元素的阶

3.是否为半群、独异点、群、交换群、循环群

二、算法思想:

(一)模块化设计,按照输出要求分成三大模块进行;

(二)由大到小,将三大模块细分;

(三)充分利用循环筛选数据,得出数据的性质等;

三、算法描述:

该题目充分利用模块化设计思路,分为判断运算性质函数、元素的阶函数、代数系统的类型函数,充分模块化设计。

四、流程图:

 

五、函数说明:

(一)变量说明:

    //输入
    int n;//集合A中的元素个数
    scanf("%d",&n);
    getchar();//对于字符读取的处理 
    char A[n];//集合A
    int i;
    for (i=0;i<n;i++)
       scanf("%c",&A[i]);
    getchar();
    char ch;//运算符
    scanf("%c",&ch);
    getchar();
    char result[n][50];//运算表中的结果
    int j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
          scanf("%c",&result[i][j]);
        getchar();
    } 

(二)主函数:

int main()
{
    //输入
    int n;//集合A中的元素个数
    scanf("%d",&n);
    getchar();//对于字符读取的处理 
    char A[n];//集合A
    int i;
    for (i=0;i<n;i++)
       scanf("%c",&A[i]);
    getchar();
    char ch;//运算符
    scanf("%c",&ch);
    getchar();
    char result[n][50];//运算表中的结果
    int j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
          scanf("%c",&result[i][j]);
        getchar();
    } 
​
    ch_judge(n,A,result);//运算的性质(封闭,结合,幺元,零元,逆元,交换)
    result_jie(n,A,result);//元素的阶
    A_ch(n,A,result);//代数系统的类型
​
    return 0;
​
}

(三)运算性质函数:

1.主要函数:
void ch_judge(int n,char A[50],char result[][50])//运算的性质(封闭,结合,幺元,零元,逆元,交换)
{
    if(fengbi(n,A,result))
       printf("运算具有封闭性\n");
    if(jiehe(n,A,result))
       printf("运算具有结合性\n");
    if(yaoyuan(n,A,result))
       printf("运算有幺元\n");
    if(lingyuan(n,A,result))
       printf("运算有零元\n");
    if(niyuan(n,A,result))
       printf("运算有逆元\n");
    if(jiaohuan(n,A,result))
       printf("运算可交换\n"); 
}
2.封闭性:
int fengbi(int n,char A[50],char result[][50])//封闭性
{
    int i,j,k;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            int flag=0;
            for(k=0;k<n;k++)
            {
                if(result[i][j]==A[k])
                   flag=1;
            }
            if(!flag)
               return 0;
        }
    }
    return 1;
}
3.结合性:
int jiehe(int n,char A[50],char result[][50])//结合性
{
    int i,j,k;
    int a,b;
    int one,two;
    if(fengbi(n,A,result))
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                for(k=0;k<n;k++)
                {
                    if(i!=j&&j!=k)
                    {
                        for(a=0;a<n;a++)
                        {
                            if(result[i][j]==A[a])//(a*b)*c中a*b;
                            {
                              one=a;
                            }
                            if(result[j][k]==A[a])//a*(b*c)中b*c; 
                            {
                                two=a;
                            }
                        }
                        if(result[one][k]!=result[i][two])
                            return 0;
                    }
                }
            }
        }
        return 1;
    }
    return 0;
}
4.幺元:
int yaoyuan(int n,char A[50],char result[][50])//幺元 
{
    int i,j;
    int sum=0;
    for(i=0;i<n;i++)
    {
        sum=0;
        for(j=0;j<n;j++)
        {
            if(result[i][j]==A[j]&&result[j][i]==A[j])
               sum+=1;
        }
        if(sum==n)
        {
            return i+1;
        }
    }
    return 0;
}
5.零元:
int lingyuan(int n,char A[50],char result[][50])//零元 
{
    int i,j;
    int sum=0;
    for(i=0;i<n;i++)
    {
        sum=0;
        for(j=0;j<n;j++)
        {
            if(result[i][j]==A[i]&&result[j][i]==A[i])
               sum+=1;
        }
        if(sum==n)
        {
            return 1;
        }
    }
    return 0;
}
6.逆元:
int niyuan(int n,char A[50],char result[][50])//逆元 
{
    int i,j,k;
    int m=yaoyuan(n,A,result);
    if(m)
    {
        char p=A[m-1];
        int sum=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(result[i][j]==p&&result[j][i]==p)
                   sum+=1;
            }
        }
        if(sum==n)
           return n;
        else if(sum>0)
           return 1;
    }
    return 0;
}
7.交换:
int jiaohuan(int n,char A[50],char result[][50])//交换 
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(result[i][j]!=result[j][i])
			   return 0;
		}
	}
	return 1;
}

(四)元素的阶函数:

void result_jie(int n,char A[50],char result[][50])//元素的阶
{
	int m=yaoyuan(n,A,result);
	if(m)
	{
		char e=A[m-1];
		printf("e=%c\n",e);
		int i,j,k;
		for(i=0;i<n;i++)
		{
			if(A[i]==e)
			  printf("元素%c的阶:%d\n",A[i],1);
			else 
			{
				k=i;
				for(j=2;j<=n;j++)
				{
					if(result[k][i]==e)
					{
						printf("元素%c的阶:%d\n",A[i],j);
						break;
					}
					else if(i!=k&&(result[k][i]==A[i]||result[k][i]==A[k]))
					{
						break; 
					}
					k=yuansu_step(n,A,result[k][i]);
					if(k==n+1)
					{
						break;
					}
				}
			}
		}
    }
}

(五)代数系统类型函数:

1.主要函数:
void A_ch(int n,char A[50],char result[][50])//代数系统的类型(半群、独异点、群、交换群、循环群)
{
	if(fengbi(n,A,result)&&jiehe(n,A,result))
	{
	   printf("代数系统是半群\n");
	   if(yaoyuan(n,A,result))
	   {
	        printf("代数系统是独异点\n");
	        if(niyuan(n,A,result)==n)
	        {
	        	printf("代数系统是群\n");
	        	if(jiaohuan(n,A,result))
	        	{
	        		printf("代数系统是交换群\n");
				}
				if(shengchengyuan(n,A,result))
				{
					printf("代数系统是循环群\n");
				}
			}
	    }
    }
}
2.是否有生成元:
int shengchengyuan(int n,char A[50],char result[][50])//是否有生成元 
{
	int i,j,k,l;
	char B[50];//存储生成元的生成元素 
    int flag;
	for(i=0;i<n;i++)
	{
		B[0]=A[i];
		k=i;
		for(j=2;j<=n;j++)
		{
			B[j-1]=result[k][i];
			k=yuansu_step(n,A,result[k][i]);
		    flag=0;
			for(l=0;l<j-1;l++)//判断生成数组中是否有重复元素 
			{
				if(B[j-1]==B[l])
				{
					flag=1;
					break;
				}
			}
			if(flag)
			  break;
		}
	    if(!flag)
	    {
	    	return equal(n,A,B);
		}
	}
    return 0;
}
3.定位元素位置:
int yuansu_step(int n,char A[50],char e)//定位元素位置
{
	int i;
	for(i=0;i<n;i++)
	{
		if(e==A[i])
		   return i;
	}
	return n+1;
} 
4.数组是否相同:
int equal(int n,char A[50],char B[50])//判断数组是否相同
{
    int i,j;
    int sum=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(B[i]==A[j])
			{
				sum+=1;
			}
		}
	}	
	if(sum==n)
	  return 1;
	else 
	  return 0;
} 

六、运行截图:

 

 七、学习感受:

这次的程序设计明显比前两次思路清晰许多,不那么吃力了,继续加油!

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值