#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);
}

解决方案 »

  1.   

    请莫笑话,我没有接触过C++,所以不敢乱翻译,而身边懂C++的又不会Pascal,所以只有到这里来寻求帮助了。
    可能程序很简单,但是不知道C++的关键字的话,还是挺费力的。哪位大哥就帮一下吧?
      

  2.   

    太长了!!如果短一点,很多人会帮你的。自己去看看 Pascal 的书,现学现用,也很快的
      

  3.   

    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;
    }
    }     
     //----------------------------------------------------        
    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;
    //---------------------------------------------
    你再对照着看吧,不是很难的^_^~
         
      

  4.   

    不好意思,错了。应该是:var 
     a : array[0..99,0..99] of char;
    var 
     s : array[0..99] of char;
      

  5.   

    的确太长了,再说你就给了20分,不过友情客串一下void bigger(int g[][100],int t[][100],int be[][100],int bi[][100])
    {

        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;