一、题目要求:
(一)输入:
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;
}
六、运行截图:
七、学习感受:
这次的程序设计明显比前两次思路清晰许多,不那么吃力了,继续加油!