离散第三次实验闭包文档格式.docx
《离散第三次实验闭包文档格式.docx》由会员分享,可在线阅读,更多相关《离散第三次实验闭包文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
constintE_L_Kuo=60,E_R_Kuo=62;
//C_L_Kuo[]="
《"
constintC_L_Kuo1=-95,C_L_Kuo2=-74;
//C_R_Kuo[]="
》"
constintC_R_Kuo1=-95,C_R_Kuo2=-73;
unsignedintstringcmp(constchar*p1,constchar*p2);
voidwelcome();
voidget_s(char**p,charg);
unsignedintjie_qu(constchar*x1,constchar*x2,char*f_jq,char*s_jq);
voidRsame(char**R,char**R_S);
charchoice();
voidprint(char**p);
voidfree_all(char**p);
voidI(char**x,char**I_x);
voidRc(char**R,char**Rc);
voidnew_Xuou_Fu_He(char**pa,char**pb,char**pc);
voidDele_Same_Str(char**pc);
unsignedintstringcmp(constchar*p1,constchar*p2)
{
//如果不同,那么就返回1,如果相同就返回0
inti1,i2;
for(i1=0,i2=0;
p1[i1]!
='
\0'
i1++,i2++)
{
if(p1[i1]==p2[i2])
continue;
//E_Dou=44,C_Dou1=-93,C_Dou2=-84
if(p1[i1]==C_Dou1&
&
p1[i1+1]==C_Dou2)
{
if(p2[i2]==E_Dou)
{
i1++;
continue;
}
}
if(p2[i2]==C_Dou1&
p2[i2+1]==C_Dou2)
if(p1[i1]==E_Dou)
i2++;
//E_L_Kuo=60C_L_Kuo1=-95,C_L_Kuo2=-74;
if(p1[i1]==C_L_Kuo1&
p1[i1+1]==C_L_Kuo2)
if(p2[i2]==E_L_Kuo)
if(p2[i2]==C_L_Kuo1&
p2[i2+1]==C_L_Kuo2)
if(p1[i1]==E_L_Kuo)
//E_R_Kuo=62C_R_Kuo1=-95,C_R_Kuo2=-73;
if(p1[i1]==C_R_Kuo1&
p1[i1+1]==C_R_Kuo2)
if(p2[i2]==E_R_Kuo)
if(p2[i2]==C_R_Kuo1&
p2[i2+1]==C_R_Kuo2)
if(p1[i1]==E_R_Kuo)
return1;
}
return0;
}
voidwelcome()
//在这里说明集合X元素不得多余10个,二元关系R能的序偶不得多余15
printf("
************************************************************\n"
);
****\n"
**欢迎进入逻辑运算软件**\n"
**(可进行关系的闭包运算。
)**\n"
**(包括:
自反闭包r(R),对称闭包s(R),可传递闭包t(R))**\n"
**用∪表示并**\n"
**用<
null>
表示集合为空**\n"
**集合X元素不得多于10个**\n"
**集合X的二元关系R元素不得多于15个**\n"
**元素长度不得多于15个字节**\n"
**每个元素间用分号;
或者是;
隔开**\n"
**eg:
…2;
3…或者…2;
3…**\n"
**序偶自身之间用,或是,分开**\n"
**eg:
…《1,2》;
《2,3》…**\n"
************************************************************\n\n"
voidget_s(char**p,charg)
char*s=NULL;
chart[LONG]={'
};
ints_i,p_k,t_j,t_m;
if((s=(char*)calloc(LONG*NUMBER,sizeof(char)))==NULL)
printf("
内存分配失败!
\n"
exit
(1);
if(g=='
X'
)
请输入集合%c元素:
\n%c={"
g,g);
R'
请输入二元关系%c的元素:
gets(s);
putchar('
}'
\n'
s_i=strlen(s);
s[s_i]='
p_k=0;
//E_Fen=59,C_Fen1=-93,C_Fen2=-69
for(s_i=0,t_j=0;
s[s_i]!
s_i++,t_j++)
if(s[s_i]!
=E_Fen)
if(s[s_i]!
=C_Fen1&
s[s_i]!
=C_Fen2)
t[t_j]=s[s_i];
//切记条件多时,就用if一个个表示出来,不可妄想省if,那样只会把逻辑搞的很混乱
if(s[s_i]==C_Fen1&
s[s_i+1]!
if((s[s_i]==E_Fen)||(s[s_i]==C_Fen2&
s[s_i-1]==C_Fen1))
if((p[p_k]=(char*)calloc(LONG,sizeof(char)))==NULL)
//总感觉这里对于这个空间的分配要把X与R进行区分开。
printf("
exit
(1);
strcpy(p[p_k],t);
t_j=-1;
p_k++;
for(t_m=0;
t_m<
LONG;
t_m++)
t[t_m]='
if(p_k>
NUMBER)
printf("
集合元素多于%ud!
存储失败。
NUMBER);
exit
(1);
free(s);
unsignedintjie_qu(constchar*x1,constchar*x2,char*f_jq,char*s_jq)
inti,k;
//x1序偶前半部分给f_jq
i=0;
if(x1[0]!
=E_L_Kuo)
if(x1[0]!
=C_L_Kuo1)
return1;
if(x1[0]==E_L_Kuo)
i=1;
if(x1[0]==C_L_Kuo1)
i=2;
k=0;
//如果出现<
1>
或是《,1》就会导致截取数组为空,
//不过没关系在Bi_Bao函数中有如果为空报警并结束函数.
while
(1)
if((x1[i]==E_Dou)||(x1[i]==C_Dou1))
break;
f_jq[k]=x1[i];
k++;
i++;
//x2序偶后半部分给s_jq
for(i=0;
i++)
if((x2[i]==E_Dou)||(x2[i]==C_Dou2))
i=i+1;
if(x2[i]==E_R_Kuo)
if(x2[i]==C_R_Kuo1)
s_jq[k]=x2[i];
voidRsame(char**R,char**R_S)
charf_jq[LONG]={'
},s_jq[LONG]={'
inti_R,i_RS,j,k;
i_RS=0;
for(i_R=0;
R[i_R]!
=NULL;
i_R++)
k=jie_qu(R[i_R],R[i_R],f_jq,s_jq);
if(k)
}\n"
序偶输入有误!
return;
if((f_jq[0]=='
)||(s_jq[0]=='
))
序偶输入有误!
k=stringcmp(f_jq,s_jq);
for(j=0;
j<
HALF_LONG;
j++)
f_jq[j]='
s_jq[j]='
if((R_S[i_RS]=(char*)calloc(LONG,sizeof(char)))==NULL)
strcpy(R_S[i_RS],R[i_R]);
i_RS++;
free(R[i_R]);
for(j=i_R;
R[j]!
R[j]=R[j+1];
i_R=i_R-1;
charchoice()
charc,s;
请输入选项:
while(!
(scanf("
%[0-3]c"
&
c)))
while((s=getchar())!
s!
=EOF);
输入有误!
请重新输入。
returnc;
voidprint(char**p)
inti;
p[i+1]!
%s;
p[i]);
%s"
voidfree_all(char**p)
p[i]!
free(p[i]);
voidmain()
char*X[NUMBER]={NULL},*R[NUMBER]={NULL},*R_Same[NUMBER]={NULL};
char*I_x[NUMBER]={NULL},*R_c[NUMBER]={NULL};
char*t_R[NUMBER*7]={NULL};
char*R_R_1[NUMBER*2]={NULL},*R_R_2[NUMBER*3]={NULL};
charc;
inti,t_r,n;
t_r=0;
n=0;
welcome();
get_s(X,'
get_s(R,'
Rsame(R,R_Same);
I(X,I_x);
Rc(R,R_c);
new_Xuou_Fu_He(R,R,R_R_1);
new_Xuou_Fu_He(R_R_1,R,R_R_2);
R_Same[i]!
t_R[t_r]=R_Same[i];
t_r++;
R[i]!
t_R[t_r]=R[i];
R_R_1[i]!
t_R[t_r]=R_R_1[i];
R_R_2[i]!
t_R[t_r]=R_R_2[i];
Dele_Same_Str(t_R);
*******************************************\n"
1:
自反闭包r(R)=R∪I(x)\n"
2:
对称闭包S(R)=R∪R(c)\n"
3:
可传递闭包t(R)=R∪R^2∪R^3∪…\n"
0:
Exit!
c=choice();
if(c!
0'
n++;
if(n==1)
X={"
print(X);
R={"
print(R_Same);
print(R);
}
if(c=='
elseif(c=='
1'
r(R)={"
print(I_x);
print(R);
2'
S(R)={"
print(R_Same);
print(R_c);
3'
t(R)={"
print(t_R);
free_all(t_R);
free_all(I_x);
free_all(R_c);
voidI(char**x,char**I_x)
chard[]="
"
charR_Kuo_Hao[]="
inti,j;
j=0;
x[i]!
if((s=(char*)calloc(LONG,sizeof(char)))==NULL)
s[0]=E_L_Kuo;
strcat(s,x[i]);
strcat(s,d);
strcat(s,R_Kuo_Hao);
I_x[j]=s;
j++;
s=NULL;
voidRc(char**R,char**Rc)
inti_R,i_Rc,j,k;
i_Rc=0;
strcat(s,s_jq);
strcat(s,f_jq);
Rc[i_Rc]=s;
i_Rc++;
voidnew_Xuou_Fu_He(char**pa,char**pb,char**pc)
//f_jq是用于截取一个序偶的前半部分,s_jq是截取另一个序偶的后半部分
charf_jq[HALF_LONG]={'
},s_jq[HALF_LONG]={'
intia,ib,ic;
intj;
unsignedintk;
ic=0;
for(ia=0;
pa[ia]!
ia++)
for(ib=0;
pb[ib]!
ib++)
k=jie_qu(pb[ib],pa[ia],f_jq,s_jq);
//小心前面两个参数别传错了
if(k)
return;
if((f_jq[0]=='
k=stringcmp(f_jq,s_jq);
for(j=0;
f_jq[j]='
s_jq[j]='
k=jie_qu(pa[ia],pb[ib],f_jq,s_jq);
//注意这个传参数的顺序.
if((pc[ic]=(char*)calloc(LONG,sizeof(char)))==NULL)
for(j=HALF_LONG-2;
j>
0;
j--)
f_jq[j]=f_jq[j-1];
f_jq[j]=E_L_Kuo;
s_jq[j]!
j++);
s_jq[j]=E_R_Kuo;
strcpy(pc[ic],f_jq);
strcat(pc[ic],d);
strcat(pc[ic],s_jq);
ic++;
Dele_Same_Str(pc);
voidDele_Same_Str(char**pc)
inti,j,k,m;
char*p;
pc[i]!
for(j=i+1;
pc[j]!
m=stringcmp(pc[i],pc[j]);
if(m)
p=pc[j];
free(p);
for(k=j;
pc[k]!
k++)