魔王语言c语言
❶ 魔王语言解释 c语言源程序
不知所云
❷ 高手给个数据结构(魔王语言解释)的算法全代码吧 急用~~谢谢了 ~~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"malloc.h"
#define LEN 20
#define L_size 100
typedef struct Nodeone
{ char a[2];
struct Nodeone *next;
}Nodeone,*TNodeone;
struct
{
char rA[20];
char ra[20];
}rule[20];
struct
{
char mA[20];
char ma[20];
}mean[20];
/////////////////////////////////////////////
//栈的操作//////
typedef struct node
{
char data;
struct node * next;
}LinkStackNode,* LinkStack;
void InitStack(LinkStack * top)
{
(* top)=(LinkStack)malloc(sizeof(LinkStackNode));
(* top)->next=NULL;
}
//用头插法建栈
void Push(LinkStack top,char a)
{
LinkStackNode * temp;
temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));
temp->data=a;
temp->next=top->next;
top->next=temp;
}
//删除栈顶元素
void Pop(LinkStack top,char *x)
{
LinkStackNode * temp;
temp=top->next;
top->next=temp->next;
*x=temp->data;
free(temp);
}
//////////////////////////////////////////////////////////////
////队列的操作////
typedef struct Node
{
char data;
struct Node * next;
}LinkQueueNode;
typedef struct
{
LinkQueueNode * front;
LinkQueueNode * rear;
}LinkQueue;
//链队列初始化
void InitQueue(LinkQueue *Q)
{
Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
}
}
//链队列入队操作
void EnterQueue(LinkQueue *Q,char x)
{
LinkQueueNode * NewNode;
NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(NewNode!=NULL)
{
NewNode->data=x;
NewNode->next=NULL;
Q->rear->next=NewNode;
Q->rear=NewNode;
}
}
//链队列出队操作
void DeleteQueue(LinkQueue *Q,char *x)
{
LinkQueueNode * p;
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
*x=p->data;
free(p);
}
//读取文件
void read_rulefile()
{
FILE * fp;
char filename[LEN];
int i=0;
printf("请输入要打开规则文件的完整路径及其文件名:\n"); //1. 读取文本文件(rule.txt), 将具体规则的对应 关系读入数组或链表中
gets(filename);
fp=fopen(filename,"rt");
if(fp==NULL)
{
printf("\n打开文件失败,%s文件可能不存在\n",filename);
return ;
}
while(fscanf(fp,"%s %s",rule[i].rA,rule[i].ra)!=EOF)
{
printf("%s %s\n",rule[i].rA,rule[i].ra);
i++;
}
return ;
}
void read_meanfile()
{
FILE * fp;
char filename[LEN];
int i=0;
printf("请输入要打开mean文件的完整路径及其文件名:\n"); //2. 读取文本文件(mean.txt), 将小写字母及其 对应的含义读入数组或链表中
gets(filename);
fp=fopen(filename,"rt");
if(fp==NULL)
{
printf("\n打开文件失败,%s文件可能不存在\n",filename);
return ;
}
while(fscanf(fp,"%s %s",mean[i].mA,mean[i].ma)!=EOF)
{
printf("%s %s\n",mean[i].mA,mean[i].ma);
i++;
}
return ;
}
///////////////////////////////////////////////////////////////////////
//思想:当没遇到闭括号时,一直压栈(top栈)。一旦遇到闭括号,首先找到与这个闭括号最近的匹配的开括号
//找到这两个括号“(” “)”之间的第一个 字符
//利用队列(Q 入队)以及(top栈 出栈)完成转换,再把转换后的队列,添加到(top栈中)把剩余的字符 原样添加到top栈中
//在把top栈 逆置到 top1栈中
//再利用top1栈出栈,给L重新赋值。
//递归,看L中是否还有括号
void tackle_2(LinkStackNode * top,LinkStackNode * top1,LinkQueue * Q,char L[])
{
int i=0,j;
char * a;
char first;
a=(char *)malloc(sizeof(char));
InitStack(&top);
InitQueue(Q);//辅助用来输出括号内的内容
InitStack(&top1);
while(L[i]!=')'&&L[i]!='\0')
{
Push(top,L[i]);//当不等于‘)’时,往top栈中压。
i++;
}
if(L[i]==')') //当等于')'时
{
j=i;
while(L[j]!='(')
{ j--;
if(L[j]=='(')
{
j++;break;
}
}
first=L[j];//找到当前‘( ’内的第一个字符
for(;j<i-1;j++)
{
EnterQueue(Q,first);
Pop(top,a);
EnterQueue(Q,*a);
}
Pop(top,a); //这个是括号内的第一个字符
EnterQueue(Q,*a);
Pop(top,a);//把‘(’删掉
while(Q->front->next!=NULL)
{
DeleteQueue(Q,a);
Push(top,*a);
}
}// if
i++;//跳过‘)’
while(L[i]!=NULL)
{ Push(top,L[i]);
i++;
}
while(top->next!=NULL)
{
Pop(top,a);
Push(top1,*a);
}
i=0;
while(top1->next!=NULL)
{
Pop(top1,a);
L[i]=*a;
i++;
}
L[i]=NULL;
i=0;j=0;
while(L[i]!=NULL)
{
i++;
if(L[i]=='(' || L[i]==')')
j++;
}
if(j==0) return;
else tackle_2(top,top1,Q,L);
}
//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//实现提示: 处理规则形式(1) 问题并没有规定具体规则的数量,
//比如增加 一条具体规则 C→eB 那么对魔王语言就要多处理一次,
//因此处理 规则形式(1)时需要递归处理,当语言中没有 大写字母后递归结束。
void tackle_1(char L[],LinkQueue * Q)
{
int i=0,j,z;
int k=0;
char * a;
a=(char *)malloc(sizeof(char));
while(L[i]!=NULL)
{ z=0;
for(j=0;j<20;j++)
{
if(L[i]==rule[j].rA[0])
{ k=0;
z=1;
while(rule[j].ra[k]!=NULL)
{
EnterQueue(Q,rule[j].ra[k]);
k++;
}
}
}
if(z==1)
i++;
else
{
EnterQueue(Q,L[i]);
i++;
}
}
i=0;
while(Q->front->next!=NULL)
{
DeleteQueue(Q,a);
L[i]=(*a);
i++;
}
L[i]=NULL;
i=0; j=0;
while(L[i]!=NULL)
{
if(L[i]>='A' &&L[i]<='Z')
j++;
i++;
}
if(j==0)return;
else tackle_1(L,Q);
}
TNodeone tackle_12(char L[])
{ TNodeone head,r,s;
int i=0;
int j;
head=(Nodeone*)malloc(sizeof(Nodeone));
head->next=NULL;
r=head;
while(L[i]!=NULL)
{
for(j=0;j<20;j++)
{
if(L[i]==mean[j].mA[0])
printf("%s",mean[j].ma);
s=(Nodeone*)malloc(sizeof(Nodeone));
strcpy(s->a,mean[j].ma);
r->next=s;
r=s;
}
i++;
}
r->next=NULL;
return head;
}
void savefile(TNodeone head)
{ FILE *fp;
TNodeone h;
h=head->next;
fp=fopen("c:/result.txt","wb");
if(fp==NULL)
{ printf("读文件失败,按任意键退出!");
getchar();
exit(1);
}
for(;h;h=h->next)
fprintf(fp,"%s",h->a);
fclose(fp);
printf("\n");
printf("保存文件成功!");
}
void main()
{ TNodeone head;
read_rulefile();
read_meanfile();
char L[L_size]; //魔王说的话
printf("请输入魔王语言:\n");
scanf("%s",L);
LinkStackNode * top, * top1;
top=(LinkStackNode * )malloc(sizeof(LinkStackNode));
top1=(LinkStackNode * )malloc(sizeof(LinkStackNode));
LinkQueue *Q;
Q=(LinkQueue *)malloc(sizeof(LinkQueue));
tackle_2(top,top1,Q,L);
printf("魔王要说的话是:%s\n",L);
tackle_1(L,Q);
printf("魔王要说的话是(转换成小写后):%s\n",L);
head=tackle_12(L);
savefile(head);
}
❸ c语言:魔王语言解释 问题描述 有一个魔王总是使用自已的一种非常精练而抽象的语言讲话,没有人能听得懂。
大意:
#define m 99
char * ALPHA( char a )
{
char b[m];
int i;
for(i=0;i<m;i++)
b[i] = i+1;
return b;
}
char * THITA( char * b )
{
char bt[m+2];
int i;
bt[0] = 'T';
for(i=0;i<m;i++)
bt[i] = b[m-i-1];
bt[m+1] = 'T';
return bt;
}
❹ 数据结构 c语言 魔王语言
简单地理解就是
多重括号的解决办法就是:
先设置一个栈,遇到左括号时,压栈,不断地压,直到遇到右括号。一旦遇到了右括号就不断地出栈,直到出一个左括号,然后把这些字符解释,解释后压到栈里去。然后再不断地压栈,直到遇到下一个右括号,如此往复。
多条规则的解决办法就是:
最简单的方法就是 来回多扫描几遍。:)
❺ C语言用栈实现表达式求值
type sign(char ch1,char ch2)
{
int i,j;
char a[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
i=firstvalue(ch1);
j=firstvalue(ch2);//调用函数两次,返回两个函数值
return a[i][j];
}
这个函数的返回问题吧, a[i][j]应该是这里的问题。
栈和队列的应用,我有写过魔王语言的,应该也是差不多的哈,在我空间:http://hi..com/zhangna%5F307/blog/item/aa92841a5d0245ddac6e75e8.html
自己看下哈~~基本操作差不多的~~
❻ c语言编程,,具体要求是输入1002300,可以输出“壹佰零拾零万贰仟叁佰零拾零元”看看我编的错误吧。
微软Vc++不用管它中英文,照样输入输出。
你这个题目有点难度。我调试花了十几分钟时间找到一处语法错误,b变量定义初始化值的语句缺少了个,符号,其他就比如书写缩进工整不够。
输入1002300,可以输出“壹佰零拾零贰叁零零元”
来看下这格式便明白了一个原理。我来说下我的思路吧,也许简单很多。
把一个输入的数字按照数字分位来输出,那就是万仟佰拾元。用%求余数的方法输出。
另外也可以把数字转换为字符串,strlen()知道这个数字的位数,当然不能有小数点的;strcpy(num_string,char(num)),然后呢,用循环语句输出每个罗马数字的汉语大写并按照数位的方法输出万仟佰拾元。