1、需求分析
1.1、问题阐述
有一个魔王总是用自己一种非常精练而抽象的语言讲话,没有人能听懂,但他的语言可以逐步的转换成人的语言,他的语言由以下两种转换规则由人的语言逐步抽象上去的:
(1)α->β1β2……βm
(2)(θδ1δ2……δn)->θδnθδn-1θ……θδ1θ
在这两种形式中从左到右表解释。要求编写一个魔王语言解释系统,把他的话转换成人能听懂的语言
1.2、基本要求
实现用下述两条具体规则和上述规则,编写魔语解释系统。设大写字母表示魔王语言的词汇;小写字母表示人的词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可以含人的词汇。(1)B->tAdA;(2)A->sae.
2、测试数据
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
t | d | s | A | E | z | g | x | n | i |
天 | 地 | 上 | 一个 | 鹅 | 追 | 赶 | 下 | 蛋 | 恨 |
3、设计详情
首先遍历一边魔王的语言,根据转换形似(1)的规则,对里面的字符先进行改变。比如按照测试数据,存在B则将B换为tAdA,存在A 则将A 换为sae。换完后,再将进行转换形式(2)的操作,遍历字符串的每个字符的时候,如果是‘(’的话,先取出括号中的第一个字符,然后依次将后面的字符存放进栈中,如果括号内还有“(”那么进行递归修改字符串。将内部的括号先改完。如此便可以实现括号中有很多括号的情况。
最终再将字母字符串转化为中文输出就解决了问题。
4、用户手册
输入魔王说的语言,即输入字符串。
5、测试结果
测试结果完全正确
(同时用递归解决了括号中有很多括号的情况,非常高效,能应对很多情况!)
6、源代码
//
// Created by stu_kk on 2022/4/25.
//
#include<bits/stdc++.h>
using namespace std;
//string s = "B(ehnxgz)B";
string ans;
string s;
bool ok = true;
char mp[10001];
typedef struct Stack{
char data;
Stack *next;
}*sta;
void init(sta now){
now = NULL;
}
bool isEmpty(sta now){//判断空
if(now == NULL){
return true;
}
return false;
}
void pushstack(sta *now,char e){//插入数据
sta p = (Stack*)malloc(sizeof(Stack));
p->data = e;
p->next = *now;
*now = p;
}
char top(sta now){//返回栈顶元素
if(isEmpty(now)){
cout<<"栈已经是空了,无法出栈"<<endl;
exit(0);
}
return now->data;
}
void pop(sta *now){//删除栈顶元素
if(isEmpty(*now)){
cout<<"栈已经是空了,无法出栈"<<endl;
exit(0);
}
Stack *p = *now;
*now = p->next;
}
void change(){
string news = "";
for(int i = 0;i<s.length();i++){
if(s[i] == 'B'){
news+="tAdA";
}
else{
news+=s[i];
}
}
s = "";
for(int i = 0;i<news.length();i++){
if(news[i] == 'A'){
s+="sae";
}
else{
s+=news[i];
}
}
}
void dfs(int pi){
stack<char> st;
char s1 = s[pi+1];
int ded;
for(int i = pi+2;i<s.length();i++){
if(s[i] == '('){
dfs(i);//递归、解决有括号中括号的问题
}
else if(s[i] == ')'){
ded = i;
break;
}
else{
st.push(s[i]);
}
}
string p1 = s.substr(0,pi+1);
string p2 = s.substr(ded+1,s.length());
string p3 = "";
while(!st.empty()){
p3+=s1;
p3+= st.top();
st.pop();
}
p3+=s1;
s = p1+p3+p2;
}
string find(){
string answer = "";
for(int i = 0;i<s.length();i++){
if(s[i] == '(')
dfs(i);
else
answer+=s[i];
}
return answer;
}
void translate(){
for(int i = 0;i<ans.length();i++){
if(ans[i] == 't'){
cout<<"天";
}
else if(ans[i] == 'd'){
cout<<"地";
}
else if(ans[i] == 's'){
cout<<"上";
}
else if(ans[i] == 'a'){
cout<<"一只";
}
else if(ans[i] == 'e'){
cout<<"鹅";
}
else if(ans[i] == 'z'){
cout<<"追";
}
else if(ans[i] == 'g'){
cout<<"赶";
}
else if(ans[i] == 'x'){
cout<<"下";
}
else if(ans[i] == 'n'){
cout<<"蛋";
}
else if(ans[i] == 'h'){
cout<<"恨";
}
}
}
int main(){
cout<<"请输入魔王的语言:";
cin>>s;
change();//将大写字母都换成小写
string ak = find();//解决问题的函数,去除括号
ans = ak;
cout<<"整理之后的魔王语言为:"<<endl;
cout<<ans<<endl;
cout<<"魔王语言的翻译为:"<<endl;
translate();
}