zoukankan      html  css  js  c++  java
  • 帮助小明翻译他的编程语言

    翻译程序
    小明初学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<stdio.h>
    #include<string.h>
    #define MaxSize 1000
    static int point=0;                                    //记录执行到被翻译字符串位置
    int pointBefore=0;
    typedef struct
    {
    	char data[MaxSize];     //存放字符串
    	int length;             //存放串长
    }SqString;
    
    
    //将伪代码中的标志字符转化成SqString的形式
    SqString changeSign(char sign[])
    {
    	int i;
    	SqString str;
    	for(i=0;sign[i]!='';i++)
    	{
    		str.data[i]=sign[i];
    	}
    	str.length=i;
    	return str;
    }
    void StrAssign(SqString &s,char cstr[])     //将一个字符串常量赋给串s(s为引用型参数)
    {
    	int i;
    	for(i=0;cstr[i]!='';i++)
    	{
    		s.data[i]=cstr[i];
    	}
    	s.length=i;
    }
    
    int index(SqString s,SqString t)            //BF算法 串的模式皮匹配
    {
    	int i=0,j=0;
    	while(i<s.length&&j<t.length)
    	{
    		if(s.data[i]==t.data[j])           //继续匹配下一个字符
    		{
    			i++;                           //主串和字串依次匹配下一个节点
    			j++;
    			point++;
    		}
    		else
    		{
    			i=i-j+1;
    			j=0;
    		}
    	}
    		if(j>=t.length)
    			return (i-t.length);
    		else
    			return(-1);
    	
    }
    
    /*******用于第一次匹配时出现while和if情况时对后面条件语句范围的确定*/
    int indexKaishi(SqString s,SqString t)            //BF算法 串的模式皮匹配
    {
    	int i=point,j=0;
    	while(i<s.length&&j<t.length)
    	{
    		if(s.data[i]==t.data[j])           //继续匹配下一个字符
    		{
    			i++;                           //主串和字串依次匹配下一个节点
    			j++;
    		}
    		else
    		{
    			i=i-j+1;
    			j=0;
    		}
    	}
    		if(j>=t.length)
    			return (i-t.length);
    		else
    			return(-1);
    	
    }
    
    bool piPei(SqString s,SqString t)            //BF算法 串的模式皮匹配
    {
    	int i=point,j=0;int startAddres=point;
    	while(i<s.length&&j<t.length)
    	{
    		if(s.data[i]==t.data[j])           //继续匹配下一个字符
    		{
    			i++;                           //主串和字串依次匹配下一个节点
    			j++;
    			point++;
    		}
    		else
    		{
    			point=startAddres;
    			return false;
    		}
    	}
    		if(j>=t.length)
    			return true;// (i-t.length);下标
    		else
    			return false;
    	
    }
    
    //主要用在第二种情况匹配时,获取分号的下标
    int indexFenhao(SqString s)            
    {
    	int i=point;
        SqString ex;
    	char exe[]={";"};
    	StrAssign(ex,exe);
    	while(i<s.length)
    	{
    		if(s.data[i]==ex.data[0])        
    			break;                          
    		else
    			i++;
    	}
        return i-1;
    	
    }
    /*当在第一遍查找没有符合匹配规则的标志字符串时,开始从分号前面截取特定长度的字符串,进行第二次字符匹配*/
    //返回串s中从下标为(1<=i<=StrLength(s))的字符开始的到下标为j的字符组成的子串。参数不正确时返回一个空串
    SqString SubStr(SqString s,int i,int j)
    {
    	SqString str;
    	int k,n;
    	str.length=0;
    	if(i<0||i>s.length||j<0)
    		return str;
    	for(n=0,k=i;k<=j;k++,n++)
    		str.data[n]=s.data[k];
    	str.length=n;
    //	point=point+str.length+1;    //为修补第三次匹配时出现的BUG增加的语句,第二次匹配完成时没有此条语句,因为不止在第三种匹配时调用此函数所以结果修补错误,将语句放在了piPeiSame3中
    	return str;
    }
    
    bool secondPiPei(SqString s,SqString t)            //BF算法 串的模式皮匹配
    {
    	int i=0,j=0;
    	while(i<s.length&&j<t.length)
    	{
    		if(s.data[i]==t.data[j])           //继续匹配下一个字符
    		{
    			i++;                           //主串和字串依次匹配下一个节点
    			j++;
    		}
    		else
    		{
    		return false;
    		}
    	}
    		if(j>=t.length)
    		{
    			return true;
    		}
    		else
    			return false;
    	
    }
    
    
    
    //输出串
    
    void DispStr(SqString s)                    //输出串S中的所有值
    {
    	int i;
    	if(s.length>0)
    	{
    		for(i=0;i<s.length;i++)
    			printf("%c",s.data[i]);
    	}
    	return;
    }
    
    
    //伪代码中,输入输出语句的优化处理,如果出现“,”则将其转换成“<<”或者“>>”;
    void input(SqString s)
    {
    	int i;
    	SqString ex;
    	char exe[]={","};
    	StrAssign(ex,exe);
    	for(i=0;i<s.length;i++)
    	{
    		if(s.data[i]==ex.data[0])
    			printf(">>");
    		else
    			printf("%c",s.data[i]);
    	}
    	printf(";
    ");
    }
    void output(SqString s)
    {
    	int i;
    	SqString ex;
    	char exe[]={","};
    	StrAssign(ex,exe);
    	for(i=0;i<s.length;i++)
    	{
    		if(s.data[i]==ex.data[0])
    			printf("<<");
    		else
    			printf("%c",s.data[i]);
    	}
    	printf(";
    ");
    }
    
    //遍历串
    void BianLiTxt()
    {
    
    }
    
    /*******************************匹配规则
    chengxu1 => #include<iostream> using namespace std;
    kaishi   => {
    ,        => ,
    jieshu   => }
    zhengxing=> int 
    shixing  => float
    xunhuan  => while      输出while之后,需要自行输出()和kaishi 之前的内容
    ruguo    => if         输出if之后,需要自行输出()和kaishi 之前的内容
    shuchu   => cout<<
    ***************************************************/
    //实现翻译程序的主要部分的函数
    
    void judgeSame3(SqString s){   //在第二次匹配失败的情况下,进行第三种方式匹配
       
        DispStr(SubStr(s,pointBefore,indexFenhao(s)));
        printf(";");
    	printf("
    ");
    	point=indexFenhao(s)+2;                
    
    }
    void judgeSame2(SqString s)    //在第一次匹配失败的情况下,进行第二种方式匹配
    {
        if(secondPiPei(SubStr(s,indexFenhao(s)-8,indexFenhao(s)),changeSign("zhengxing"))==true)      //截取分号前9个字符与zhengxing比较判断
    	{
             printf("int ");
             DispStr(SubStr(s,pointBefore,indexFenhao(s)-9));
    		  printf(";");
    	      printf("
    ");
       		 point=indexFenhao(s)+2;
    	}
    	else if(secondPiPei(SubStr(s,indexFenhao(s)-6,indexFenhao(s)),changeSign("shixing"))==true)
    	{
             printf("float ");
             DispStr(SubStr(s,pointBefore,indexFenhao(s)-7));
    		 printf(";");
    	     printf("
    ");
       		 point=indexFenhao(s)+2;
    	}
        else
    	  judgeSame3(s);
    
    }
    void judgeSame1(SqString s)    //第一次匹配
    {
    	
    	while(point<s.length)
    	{
         	if(piPei(s,changeSign("chengxu1"))==true)                       //chengxu1
    		{
    			pointBefore=point;                                          //用于记录匹配之后的point的位置,方便出现第二种情况时,输出数据类型与上一次匹配位置之间的字符串     
    			printf("#include<iostream>
    using namespace std;
    int main()
    ");
    			
    		}
    	   else if(piPei(s,changeSign("kaishi"))==true)                     //kaishi
    		{
    		    pointBefore=point;
    			printf("{
    ");
    		
    		}
    	 /*  else if(piPei(s,changeSign(","))==true)                          //,      
    	   {
    		   printf(",");
                   
    	   }*/
    	   else if(piPei(s,changeSign("xunhuan"))==true)                    //xunhuan
    	   {
    		   pointBefore=point;  
    		   printf("while(");                                           //需要对while 和if情况单独处理
               DispStr(SubStr(s,pointBefore,indexKaishi(s,changeSign("kaishi"))-1));
    		   printf(")
    ");
    		   point=indexKaishi(s,changeSign("kaishi"));
    	   }
    	   else if(piPei(s,changeSign("ruguo"))==true)                      //ruguo
    	   {
    		   pointBefore=point;  
    		   printf("if(");
    		   DispStr(SubStr(s,pointBefore,indexKaishi(s,changeSign("kaishi"))-1));
    		   printf(")
    ");
    		   point=indexKaishi(s,changeSign("kaishi"));
    	   }
    	    else if(piPei(s,changeSign("shuru"))==true)                    //需要对输入后面的内容进行判断是否含有,   
    	   {
    	       pointBefore=point;  
    		   printf("cin>>");
    		   input(SubStr(s,pointBefore,indexFenhao(s)));
    		   point=indexFenhao(s)+2;
    
    	   }
    	   else if(piPei(s,changeSign("shuchu"))==true)                    //需要对输出后面的内容进行判断是否含有,
    	   {
    		   pointBefore=point;  
    		   printf("cout<<");
    		   output(SubStr(s,pointBefore,indexFenhao(s)));
    		   point=indexFenhao(s)+2;
    	   }
    	   else if(piPei(s,changeSign("jieshu"))==true)
    	   {
    		   pointBefore=point;  
    		   if(pointBefore+2>s.length)
    		   {
    			   printf("return 0;
    }
    ");
    		   }
    		   else
    		     printf("}
    ");
    	   }
    	   else
    	   {
    		   pointBefore=point;  
    		   judgeSame2(s);
    	   }
    		   
        }
    }
    
    int main()
    {
    	SqString s;
        char cstr[MaxSize]={"chengxu1kaishii,j zhengxing;k shixing;i=1;j=0;shuru k;xunhuan i<10kaishij=j+i;i++;jieshuruguo j>10kaishik=j*1.0/i;jieshushuchu k,j;jieshu"};
    	StrAssign(s,cstr);
        judgeSame1(s);
    	
    	return 0;
    }
    


  • 相关阅读:
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Python位运算符
  • 原文地址:https://www.cnblogs.com/chxuan/p/8232126.html
Copyright © 2011-2022 走看看