问题描述:
魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂,但他的语言是可以逐步解释成人能听懂的语言的,因为它的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1) α→β1β2 ••• βn
(2)(θδ1δ2 •••δn)→θδnθδn-1 ••• θδ1θ
在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把它的话解释成人能听懂的话。
(1)基本要求:
规则条数、规则内容固定(设定小写字母为终结符,大写字母为非终结符)
例如: (1) B→tAdA (2) A→sae
B(ehnxgz)B=tsaedsaeezegexenehetsaedsae
(2)扩展要求:
1)规则条数、内容不固定;
2)将终结符与汉字建立对应关系进行翻译
例如:
t | d | s | a | e | z | g | x | n | h |
---|---|---|---|---|---|---|---|---|---|
天 | 地 | 上 | 一只 | 鹅 | 追 | 赶 | 下 | 蛋 | 恨 |
则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
解题思路
先将魔王语言逆序入栈,入栈同时处理大写字母,这时候要一次性处理到无法再处理,然后出栈入队列,并且在入队列的同时按规则转换形式。
最后将队列里的英文翻译为对应汉字即可,有对应的译文则翻译,否则直接输出。
所用函数
void pushstack(char s[], char origin[], int *top);//入栈
void intoquene(char s[], int *top,char quene[]);//入队
void begin_translate();//开始翻译
void translate(char s[]);//翻译为最终语言
void see_rule();//列出当前规则
void see_language();//列出当前最终语言的解释
int find_rule(char ch,char s[20]);//查找规则是否已存在
int find_end_rule(char s1[20],char s2[20]);//找到最终规则
int find_endlanguage(char ch,char s[20]);//查找最终语言有无解释
void print_help();//打印帮助信息
int clear_rule();//清空规则
int add_rule();//添加规则
int delete_rule();//删除规则
int update_rule();//修改规则
void rule_UI();//管理规则界面
void Main_UI();//主界面
文件
源代码:
mowang.c
存储目前规则的文件
Rule
存取最终语言的文件
endlanguage
源代码
/*************************************************************************
> File Name: mowang.c
> Author:limeng
> Mail: ldx19980108@gmail.com
> Created Time: 2017年10月21日 星期六 21时52分31秒
************************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h> //exit
#define MAX 256
//思路:
//先将魔王语言逆序入栈,入栈同时处理大写字母,然后出栈入队列,并且在入队列的同时按规则转换形式。
//最后将队列里的英文翻译为对应汉字即可。
void pushstack(char s[], char origin[], int *top);//入栈
void intoquene(char s[], int *top,char quene[]);//入队
void begin_translate();//开始翻译
void translate(char s[]);//翻译为最终语言
void see_rule();//列出当前规则
void see_language();//列出当前最终语言的解释
int find_rule(char ch,char s[20]);//查找规则是否已存在
int find_endlanguage(char ch,char s[20]);//查找最终语言有无解释
void print_help();//打印帮助信息
int clear_rule();//清空规则
int add_rule();//添加规则
int delete_rule();//删除规则
int update_rule();//修改规则
void rule_UI();//管理规则界面
void Main_UI();//主界面
typedef struct Rule{
char ch;//大写字母
char s[20];//小写字母组成序列
}rule;
//查找规则是否已存在
int find_rule(char ch,char s[20]){
FILE *fp;
fp = fopen("Rule","r");
if(!fp){
//printf("open file fail\n");
return 0;
}
rule tmp;
int flag = 0;
while(fscanf(fp,"%c %s\n",&tmp.ch,tmp.s)>0)
{
if(ch == tmp.ch){
strcpy(s,tmp.s);
flag = 1;
break;
}
}
fclose(fp);
if(flag){
return 1;
}else
return 0;
}
void find_end_rule(char s1[20],char s2[20]