1. 程式人生 > >資料結構課程實驗 -> 翻譯程式

資料結構課程實驗 -> 翻譯程式

翻譯程式
    小明初學C++,已明白了四則運算、關係運算、邏輯運算、賦值運算、輸入輸出、簡單選擇和迴圈結構的用法,但他的英語不太好,記不住太多的保留字,於是他利用漢語拼音做保留字,山寨C++,發明了一種表達自己思想的演算法描述規則。
    規則很簡單:他將開始程式頭部以一個拼音名字標記,C++程式中的"{,}"用拼音“kaishi,jieshu”直觀表示;選擇和迴圈只採用一種單一的結構,且保留字也分別用對應的拼音表示,不過在表示選擇或迴圈條件時他去掉了多餘的小括號;輸入輸出也用拼音表示;資料型別只保留了整型(int)和實型(float),並用拼音表示,且按他的習慣變數在前,型別在後。
    現在小明想請熟悉C++的你幫他寫一個程式,將用他設計的演算法描述規則寫成的演算法,翻譯成C++原始碼。輸入副檔名為.ming,輸出副檔名為.cpp,如下例:

小明演算法(test.ming):
chengxu1
kaishi
   i,j zhengxing;
   k   shixing;
   i=1;j=0;
   shuru k;  
   xunhuan i<10
   kaishi
      j=j+i;
      i++;
   jieshu
   ruguo j>10
   kaishi
     k=j*1.0/i;    
   jieshu  
   shuchu k,j;
jieshu

翻譯成的C++原始碼(test.cpp):
#include <iostream>
using namespace std;
int main()
{
    int i,j;
    float k;
    i=1;j=0;
    cin>>k;
    while( i<10)
    {
       j=j+i;
       i++;
    } 
 if(j>10)
  k=j*1.0/i; 
 cout<<k<<j;
    return 0;
}

要求:字串操作需自己實現。

 

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int next1[10000];
int kuohao=0;
typedef long long int ll;
int place =0;
bool translate1=false;
string str;
void syso()
{
    cout<<str;
}
void GetNext(string ch,ll m,int next[1000])
{
    int i,j;
    i=j=next[0]=-1;
    i=0;
    while(i<m)
    {
        while(-1!=j&&ch[i]!=ch[j])
            j=next[j];
        next[++i]=++j;
    }
    return;
}
bool KMP(string ch,ll m,string sh,ll n)
{
    int i,j;
    GetNext(ch, m, next1);
    i=j=0;
    while(i<n)
    {
        while(j!=-1&&sh[i]!=ch[j])
            j=next1[j];
        i++;
        j++;
        if(j>=m)
        {
            place =i-j;
            return true;
        }
    }
    return false;
}
void tranhead(string sh)
{
    string ch="chengxu";
    if(KMP(ch,ch.length(),sh,sh.length()))
    {
        //cout<<"#include<iostream>"<<endl;
        //cout<<"using namespace std;"<<endl;
        str+="#include<iostream>\nusing namespace std;\nint main()\n";
        translate1=true;
    }
}
void transtart_end(string sh)
{
    string ch1="kaishi";
    string ch2="jieshu";
    if(KMP(ch1, ch1.length(), sh, sh.length()))
    {
        kuohao ++;
        //cout<<"{"<<endl;
        str+="{\n";
        translate1=true;
    }
    else if(KMP(ch2, ch2.length(), sh, sh.length()))
    {
        kuohao --;
        if(kuohao!=0)
            /*cout<<"}"<<endl,*/str+="}\n";
        else
            /*cout<<"return 0;"<<endl<<"}",*/str+="return 0;\n}\n";
        translate1=true;
    }

}
void trantype(string sh)
{
    string  ch1="shixing";
    string  ch2="zhengxing";
    if(KMP(ch1, ch1.length(), sh, sh.length()))
    {
        /*cout<<"    float ";*/
        str+="    float ";
        for(int i=0;i<place;i++)
        {
            //cout<<sh[i];
            str+=sh[i];
        }
        /*cout<<";"<<endl;*/
        str+=";\n";
        translate1=true;
    }
    else if(KMP(ch2, ch2.length(), sh, sh.length()))
    {
        /*cout<<"    int  ";*/
        str+="    int  ";
        for(int i=0;i<place;i++)
        {
            /*cout<<sh[i];*/
            str+=sh[i];
        }
        /*cout<<";"<<endl;*/
        str+=";\n";
        translate1=true;
    }
}
void input(string sh)
{
    string ch="shuru";

    if(KMP(ch, ch.length(), sh, sh.length()))
    {
        /*cout<<"cin >> ";*/
        str+="    cin >> ";
        for(int i=place +(int)ch.length();i<=sh.length();i++)
        {
            if(ch[i]!=',')
                /*cout<<sh[i],*/str+=sh[i];
            else
                /*cout<<" >> ",*/str+=" >> ";
        }
        str+="\n";
        translate1=true;
    }
}
void output(string sh)
{
    string ch="shuchu";
    if(KMP(ch, ch.length(), sh, sh.length()))
    {
        /*cout<<"cout << ";*/
        str+="cout << ";
        for(int i=place+(int)ch.length();i<sh.length();i++)
        {
            if(sh[i]!=',')
                /*cout<<sh[i],*/str+=sh[i];
            else
                /*cout<<" << ",*/str+=" << ";
        }
        str+="\n";
        translate1=true;
    }
}
void Loop(string sh)
{
    string ch="xunhuan";
    if(KMP(ch, ch.length(), sh, sh.length()))
    {
        /*cout<<"while (";*/
        str+="    while (";
        for(int i=place+(int)ch.length();i<=sh.length();i++)
            /*cout<<sh[i],*/str+=sh[i];
        /*cout<<")";*/
        str+=")\n";
        translate1=true;
    }
}
void judge(string sh)
{
    string ch="ruguo";
    if(KMP(ch, ch.length(), sh, sh.length()))
    {
        /*cout<<"   if (";*/
        str+="   if (";
        for(int i=place+(int)ch.length();i<sh.length();i++)
            /*cout<<sh[i],*/str+=sh[i];
        /*cout<<")"<<endl;*/
        str+=")\n";
        translate1=true;
    }
}
void translate(string sh)
{
    tranhead(sh);
    transtart_end(sh);
    trantype(sh);
    input(sh);
    Loop(sh);
    output(sh);
    judge(sh);
    if(!translate1)
    {
        for(int i=0;i<sh.length();i++)
            str+=sh[i];
        str+="\n";
    }
}
int main()
{
    string ch;
    while(getline(cin,ch))
    {
        translate1=false;
        translate(ch);
    }
    syso();
    return 0;
}