翻译程序
小明初学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;
}