#include <string.h>
#include <iostream.h>
#include <stdio.h>char a[100][100];
char s[100];
int max=0;void last(int b[][100]) // 优先关系为空
{
int i,k;
for(k=0;k<max;k++)
{
if(s[k]>='A'&&s[k]<='Z')
for(i=0;i<max;i++)
b[i][k]=0;
}
}void change1(int b[][100]) //
{
int i,j;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
if(b[i][j]>1)
b[i][j]=1;
}
void display(int d[][100])
{
int i,j;
for(i=0;i<max;i++)
{
for(j=0;j<max;j++)
cout<<d[i][j]<<endl;
}
//print
}
void input()//import
{
int l=1,i=0;
while(l)
{
cout<<"请输入文法:"<<endl;
cin>>a[i];
if(a[i][0]=='?')
{
l=0;
strcpy(a[i],"?");
}
else
i++;
}
}
void creat()
{
int i=0;
int j,k,l;
s[0]='?';
while(a[i][0]!='?')
{
j=0;l=0;
while(a[i][j]!='\0')
{
k=0;
if(s[k]!='?')
{
while(s[k]!='\0')
{
if(a[i][j]!=s[k])
l=1;
else
{
l=0;
break;
}
k++;
}
}
else
{
s[max]=a[i][j];
max++;
s[max]='\0';
}
if(l)
if(a[i][j]!=':'&&a[i][j]!='=')
{
s[max]=a[i][j];
s[max+1]='\0';
max++;
}
j++;
}
i++;
}
}
void getbhead(int bhead[][100]) //构造关系HEAD的布尔矩阵
{
int i,j,m;
char t,c;
for(i=0;i<max;i++)
{
t=s[i];
j=0;
while(a[j][0]!='?')
{
if(t==a[j][0])
{
c=a[j][4];
m=0;
for(m=0;m<max;m++)
if(c==s[m])
bhead[i][m]=1;
}
j++;
}
}
}
void tran(int b[][100]) //构造关系
{
int i=0,j,k;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
if(b[j][i]==1)
for(k=0;k<max;k++)
b[j][k]+=b[i][k];
change1(b);
}
void gettail(int btail[][100]) //构造关系TAIL的布尔矩阵
{
int i,j,m,k,label=1;
char t,c;
for(i=0;i<max;i++)
{
t=s[i];
j=0;
while(a[j][0]!='?')
{
if(t==a[j][0])
{
k=0;
while(a[j][k]!='\0')
k++;
c=a[j][k-1];
for(m=0;m<max;m++)
{
if(c==s[m])
{
btail[i][m]=1;
break;
}
}
}
j++;
}
}
}void tranpose(int b[][100]) /*使用WARSHALL算法计算关系TAIL+的布尔矩阵,并将其转置
得到TRANSPOSE*/
{
int a[20][20],i,j;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
a[j][i]=b[i][j];
for(i=0;i<max;i++)
for(j=0;j<max;j++)
b[i][j]=a[i][j];
}void getequal(int b[][100]) //构造优先关系相等的布尔矩阵
{
int i=0,m,ci,cj,k,l;
char c,ch;
while(a[i][0]!='?')
{
k=4;l=5;
while(a[i][l]!='\0')
{
cj=ci=-1;
c=a[i][k];
ch=a[i][l];
for(m=0;m<max;m++)
if(c==s[m])
ci=m;
for(m=0;m<max;m++)
if(ch==s[m])
cj=m;
if(ci>=0&&cj>=0)
b[ci][cj]=1;
k=l;
l++;
}
i++;
}
}
void getbihead(int a[][100],int b[][100])
{
int i,j;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
if(i==j)
b[i][j]=1;
else
b[i][j]=a[i][j];
change1(b);
}
void blittle(int be[][100],int bh[][100],int l[][100])
{
int i,j,k,n=0;
for(i=0;i<max;i++)
for(k=0;k<=max;k++)
{
n=0;
for(j=0;j<max;j++)
n=n+be[i][j]*bh[j][k];
l[i][k]=n;
}
change1(l);
}
void bigger(int g[][100],int t[][100],int be[][100],int bi[][100])
{
blittle( t,be,g);
blittle(g,bi,g);
last(g);
}
void main()
{
int bhead[100][100],btail[100][100],bequa[100][100],bihead[100][100],little[100][100],greater[100][100];
int i,j;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
{
bhead[i][j]=0;
btail[i][j]=0;
bequa[i][j]=0;
bihead[i][j]=0;
little[i][j]=0;
greater[i][j]=0;
}
input();
creat();
getbhead(bhead);
display(bhead);
tran(bhead);
display(bhead);
gettail(btail);
display(btail);
tran(btail);
display(btail);
tranpose(btail);
display(btail);
getequal(bequa);
display(bequa);
getbihead(bhead,bihead);
display(bihead);
blittle(bequa,bhead,little);
display(little);
bigger(greater,btail,bequa,bihead);
display(greater);
}
#include <iostream.h>
#include <stdio.h>char a[100][100];
char s[100];
int max=0;void last(int b[][100]) // 优先关系为空
{
int i,k;
for(k=0;k<max;k++)
{
if(s[k]>='A'&&s[k]<='Z')
for(i=0;i<max;i++)
b[i][k]=0;
}
}void change1(int b[][100]) //
{
int i,j;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
if(b[i][j]>1)
b[i][j]=1;
}
void display(int d[][100])
{
int i,j;
for(i=0;i<max;i++)
{
for(j=0;j<max;j++)
cout<<d[i][j]<<endl;
}
}
void input()//import
{
int l=1,i=0;
while(l)
{
cout<<"请输入文法:"<<endl;
cin>>a[i];
if(a[i][0]=='?')
{
l=0;
strcpy(a[i],"?");
}
else
i++;
}
}
void creat()
{
int i=0;
int j,k,l;
s[0]='?';
while(a[i][0]!='?')
{
j=0;l=0;
while(a[i][j]!='\0')
{
k=0;
if(s[k]!='?')
{
while(s[k]!='\0')
{
if(a[i][j]!=s[k])
l=1;
else
{
l=0;
break;
}
k++;
}
}
else
{
s[max]=a[i][j];
max++;
s[max]='\0';
}
if(l)
if(a[i][j]!=':'&&a[i][j]!='=')
{
s[max]=a[i][j];
s[max+1]='\0';
max++;
}
j++;
}
i++;
}
}
void getbhead(int bhead[][100]) //构造关系HEAD的布尔矩阵
{
int i,j,m;
char t,c;
for(i=0;i<max;i++)
{
t=s[i];
j=0;
while(a[j][0]!='?')
{
if(t==a[j][0])
{
c=a[j][4];
m=0;
for(m=0;m<max;m++)
if(c==s[m])
bhead[i][m]=1;
}
j++;
}
}
}
void tran(int b[][100]) //构造关系
{
int i=0,j,k;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
if(b[j][i]==1)
for(k=0;k<max;k++)
b[j][k]+=b[i][k];
change1(b);
}
void gettail(int btail[][100]) //构造关系TAIL的布尔矩阵
{
int i,j,m,k,label=1;
char t,c;
for(i=0;i<max;i++)
{
t=s[i];
j=0;
while(a[j][0]!='?')
{
if(t==a[j][0])
{
k=0;
while(a[j][k]!='\0')
k++;
c=a[j][k-1];
for(m=0;m<max;m++)
{
if(c==s[m])
{
btail[i][m]=1;
break;
}
}
}
j++;
}
}
}void tranpose(int b[][100]) /*使用WARSHALL算法计算关系TAIL+的布尔矩阵,并将其转置
得到TRANSPOSE*/
{
int a[20][20],i,j;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
a[j][i]=b[i][j];
for(i=0;i<max;i++)
for(j=0;j<max;j++)
b[i][j]=a[i][j];
}void getequal(int b[][100]) //构造优先关系相等的布尔矩阵
{
int i=0,m,ci,cj,k,l;
char c,ch;
while(a[i][0]!='?')
{
k=4;l=5;
while(a[i][l]!='\0')
{
cj=ci=-1;
c=a[i][k];
ch=a[i][l];
for(m=0;m<max;m++)
if(c==s[m])
ci=m;
for(m=0;m<max;m++)
if(ch==s[m])
cj=m;
if(ci>=0&&cj>=0)
b[ci][cj]=1;
k=l;
l++;
}
i++;
}
}
void getbihead(int a[][100],int b[][100])
{
int i,j;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
if(i==j)
b[i][j]=1;
else
b[i][j]=a[i][j];
change1(b);
}
void blittle(int be[][100],int bh[][100],int l[][100])
{
int i,j,k,n=0;
for(i=0;i<max;i++)
for(k=0;k<=max;k++)
{
n=0;
for(j=0;j<max;j++)
n=n+be[i][j]*bh[j][k];
l[i][k]=n;
}
change1(l);
}
void bigger(int g[][100],int t[][100],int be[][100],int bi[][100])
{
blittle( t,be,g);
blittle(g,bi,g);
last(g);
}
void main()
{
int bhead[100][100],btail[100][100],bequa[100][100],bihead[100][100],little[100][100],greater[100][100];
int i,j;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
{
bhead[i][j]=0;
btail[i][j]=0;
bequa[i][j]=0;
bihead[i][j]=0;
little[i][j]=0;
greater[i][j]=0;
}
input();
creat();
getbhead(bhead);
display(bhead);
tran(bhead);
display(bhead);
gettail(btail);
display(btail);
tran(btail);
display(btail);
tranpose(btail);
display(btail);
getequal(bequa);
display(bequa);
getbihead(bhead,bihead);
display(bihead);
blittle(bequa,bhead,little);
display(little);
bigger(greater,btail,bequa,bihead);
display(greater);
}
可能程序很简单,但是不知道C++的关键字的话,还是挺费力的。哪位大哥就帮一下吧?
char s[100];
int max=0;
void last(int b[][100])
{
int i,k;
for(k=0;k<max;k++)
{
if(s[k]>='A'&&s[k]<='Z')
for(i=0;i<max;i++)
b[i][k]=0;
}
}
//----------------------------------------------------
var array a[0..99,0..99] of char;
var array s[0..99] of char;
const integer max = 0;function last(array b[,100] of integer);
var i ,k : integer;
begin
For k:=0 to max do begin
If(s[k]>='A' and s[k]<='Z') then begin
For i:= 0 to max do b[i,k]=0
end;
end;
end;
//---------------------------------------------
你再对照着看吧,不是很难的^_^~
a : array[0..99,0..99] of char;
var
s : array[0..99] of char;
{
blittle( t,be,g);
blittle(g,bi,g);
last(g);
}
--〉
procedure bigger(g[][100]:integer;t[][100]:integer;be[][100]:integer;bi[][100]:integer)begin
bittle(t,be,g);
bittle(g,bi,g);
last(g);
end;