魔王語言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)),然後呢,用循環語句輸出每個羅馬數字的漢語大寫並按照數位的方法輸出萬仟佰拾元。