数据结构课程实验 -> 翻译程序

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loganer

感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值