魔王语言翻译
2017-12-27 21:32
513 查看
魔王语言翻译
计算机实现
魔王的语言是由以下两种形式的规则由人的语言逐步抽象上去的。
(1)α–>β(1)β(2)β(3)….β(m)
(2)(θδ(1)δ(2)δ(3)…δ(n))–>θδ(n)θδ(n-1)…θδ(1)θ
(括号内数字为下标),上面的规则中,从左到右表示将魔王的语言翻译成人类的语言。魔王语言和人类语言按照该语法规则进行转换。设大写字母表示魔王语言词汇,小写字母表示人类语言词汇。上述的希腊文法式中,希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可以包含人类词汇。
(1)B–>tAdA
(2)A–>sae
编写一个魔王语言的翻译系统,把魔王的话翻译成人类语言。
题目分析:
魔王的语言组成是这样的:由大写字母组成;由小写字母组成;由大写小写字母混合组成;由包括括号的字母组成。其中大写字母与小写字母的关系为:B–>tAdA,A–>sae。因此魔王语言中的大写字母只能包含A和B两个。
例如:
B翻译为:tsaedsae;
(abc)翻译为:acaba;
A(Aasc)B翻译为:sae saec saes saea sae tsaedsae(没有空格,只是为了看着更清晰明了)
计算机实现
我们可以这样考虑,将输入的魔王语言从右至左进栈,每次从栈顶弹出一个元素,进而对该元素处理,重点是对括号内的元素进行处理。
如果遇到左括号(,则要将括号里的内容从栈中取出,按语法规定的顺序从右至左进入一个新栈,在每次从栈顶弹出一个元素,递归调用该处理过程。
程序如下:
计算机实现
魔王语言翻译
问题描述:魔王的语言是由以下两种形式的规则由人的语言逐步抽象上去的。
(1)α–>β(1)β(2)β(3)….β(m)
(2)(θδ(1)δ(2)δ(3)…δ(n))–>θδ(n)θδ(n-1)…θδ(1)θ
(括号内数字为下标),上面的规则中,从左到右表示将魔王的语言翻译成人类的语言。魔王语言和人类语言按照该语法规则进行转换。设大写字母表示魔王语言词汇,小写字母表示人类语言词汇。上述的希腊文法式中,希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可以包含人类词汇。
(1)B–>tAdA
(2)A–>sae
编写一个魔王语言的翻译系统,把魔王的话翻译成人类语言。
题目分析:
魔王的语言组成是这样的:由大写字母组成;由小写字母组成;由大写小写字母混合组成;由包括括号的字母组成。其中大写字母与小写字母的关系为:B–>tAdA,A–>sae。因此魔王语言中的大写字母只能包含A和B两个。
例如:
B翻译为:tsaedsae;
(abc)翻译为:acaba;
A(Aasc)B翻译为:sae saec saes saea sae tsaedsae(没有空格,只是为了看着更清晰明了)
计算机实现
我们可以这样考虑,将输入的魔王语言从右至左进栈,每次从栈顶弹出一个元素,进而对该元素处理,重点是对括号内的元素进行处理。
如果遇到左括号(,则要将括号里的内容从栈中取出,按语法规定的顺序从右至左进入一个新栈,在每次从栈顶弹出一个元素,递归调用该处理过程。
程序如下:
#include"stdio.h" #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef char Elemtype; typedef struct{ //定义一个栈类型 Elemtype *top; Elemtype *base; int stacksize; }sqstack; initstack(sqstack *s) { /*在内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/ s->base=(Elemtype *)malloc(sizeof(Elemtype)* STACK_INIT_SIZE ); if(!s->base) exit(0); //分配内存失败 s->top=s->base; //最开始栈顶就是栈底 s->stacksize=STACK_INIT_SIZE; } //进栈操作 Push(sqstack *s,Elemtype e) { if(s->top-s->base>=stscksize) //栈满,追加空间 s->base=(Elemtype *)realloc(s->base,sizeeof(Elemtype)*(s->stacksize+STACKINCREMENT)); if(!s->base) exit(0); s->top=s->base+s->stacksize; s->stacksize=s->stacksize+STACKINCREMENT; *(s->top)=e; s->top++; } //出栈操作 Pop(sqstack *s,Elemtype *e) { if(s->top==s->base) return; *e=*--(s->top); //修改栈顶指针,栈顶指针不指向元素,指在栈中最高元素的上面 } //获得栈的大小 int stacklen(sqstack *s) { return (s->top-s->base); } void translate(Elemtype e,sqstack *s) { Elemtype c,a; sqstack ss1; if(e>=97&&e<=122) printf("%c",e); else if(e=='A') printf("%s","sae"); else if(e=='B') printf("%s","tsaedsae"); else if(e=='(') { intistack(&ss1); //初始化栈ss1 Pop(&(*s),&c); //注意*s相当于主函数中的s a=c; //保留括号后的第一个元素 Pop(&(*s),&c); while(c!=')') { Push(&ss1,a); Push(&ss1,c); Pop(&(*s),&c); } Push(&ss1,a); //翻译括号里的内容 while(stacklen(ss1)) { Pop(&(*ss1),&c); translate(c,*ss1); } } } main() { Elemtype e; sqstack s1,s2; initstack(&s1); printf("Please input Devil language:\n"); scanf("%c",&e); while(e!='#') { if(e=='A'||e=='B'||(e>=97&&e<=122)||e=='('||e==')') { Push(&s1,e); } scanf("%c",&e); } initstack(&s2); //初始化s2 while(stacklen(s1)) { Pop(&s1,&e); Push(&s2,e); //重点:将魔王语言从右至左入栈s2,在输入时无法一步达到从右至左入栈,所以要用两个栈导一下 } printf("The mankind language is:\n"); //最终输入的魔王语言存放在栈s2中,处理栈顶元素进行翻译 while(stacklen(s2)) { Pop(&s2,&e); translate(e,&s2); } getche(); }
相关文章推荐
- 在salesforce中利用Translation Workbench为不同语言使用者提供翻译功能(智能翻译)
- [翻译Joel On Software]选择一门语言/Choosing a language
- 首次试用 NeoSwiff ,用C#开发FLASH版的多国语言翻译
- 将C语言的声明翻译成通俗的语言
- js通过googleAIP翻译PHP系统的语言配置的实现代码
- amazon的一个大牛谈各种语言,包括c、c++、java、python、ruby、lisp、perl(翻译后的中文版)
- Android 多语言翻译文件导入和检查
- 推荐谷歌翻译小工具实现网站多语言
- js利用google翻译接口把网页翻译成各国语言
- SAP 语言翻译大师系列2-屏幕文本的翻译
- Android Interface Definition Language (AIDL) android接口定义语言 开发文档翻译 - 2
- 使用DOT语言和Graphviz绘图(翻译)
- 数据结构 魔王语言C++
- 自动机理论,语言和计算导论1.1节翻译
- 语言和音频圣经翻译
- googleAIP翻译PHP系统的语言配置
- Qt的多语言翻译功能及步骤
- js利用google翻译接口把网页翻译成各国语言
- VS中使用QT,多国语言翻译问题
- 保存查看翻译:Thrift: Scalable Cross-Language Services Implementation中文翻译(Thrift:可扩展的跨语言服务实现)