資料結構課程實驗 -> 翻譯程式
翻譯程式
小明初學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;
}