-
大小: 273KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2024-02-01
- 語言: 其他
- 標(biāo)簽: 測試數(shù)據(jù)??C語言版??
資源簡介
【問題的描述】
一個表達(dá)式和一棵二叉樹之間,存在著自然的對應(yīng)關(guān)系。寫一個程序,實現(xiàn)基于二叉樹表示的算術(shù)表達(dá)式Expression的操作。
【基本要求】
【一】【必做部分】
假設(shè)算術(shù)表達(dá)式Expression內(nèi)可以含有變量(a-z),常量(0-9)和二元運(yùn)算符(+,-,*,/,^(乘冪))。實現(xiàn)以下操作:
(1)ReadExpr(E)――以字符序列的形式輸入語法正確的前綴表達(dá)式并構(gòu)造表達(dá)式E。
(2)WriteExpr(E)――用帶括號的中綴表達(dá)式輸出表達(dá)式E。
(3)Assign(V,c)――實現(xiàn)對變量V的賦值(V=c),變量的初值為0。
(4)Value(E)――對算術(shù)表達(dá)式E求值。
(5)CompoundExpr(p,E1,E2)――構(gòu)造一個新的復(fù)合表達(dá)式(E1)p(E2)。
【二】【選做部分】
(1)以表達(dá)式的原書寫形式輸入,支持大于0的正整數(shù)常量;
(2)增加常數(shù)合并操作MergeConst(E)——合并表達(dá)式E中所有常數(shù)運(yùn)算。例如,對表達(dá)式E=(2+3-a)*(b+3*4)進(jìn)行合并常數(shù)的操作后,求得E=(5-a)*(b+12)
【測試數(shù)據(jù)】
1) 分別輸入0;a;-91;+a*bc;+*5x2*8x;+++*3^*2^x2x6并輸出。
2) 每當(dāng)輸入一個表達(dá)式后,對其中的變量賦值,然后對表達(dá)式求值。
3) 還有很多測試的數(shù)據(jù),詳細(xì)請見附上的文件Test.txt。
代碼片段和文件信息
#include“expression.h“
/*全局變量*/
int?save_number[31];/*在按原表達(dá)式輸入形式中,輸入的常量保存到數(shù)組save_number中,常量最多為30個,0單元不用*/
char?Expr_String[30];/*存放表達(dá)式的字符串*/
/*以字符序列的形式輸入語法正確的前綴表達(dá)式,保存到字符串string*/
/*參數(shù)flag=0表示輸出的提示信息是“請輸入正確的前綴表示式:“*/
/*flag=1表示輸出的提示信息為“請以表達(dá)式的原書寫形式輸入正確表示式:“*/
Status?Input_Expr(char?*stringint?flag)
{
if(flag==0)printf(“\n請輸入正確的前綴表示式:“);
else?printf(“\n請以表達(dá)式的原書寫形式輸入正確表示式:“);
flushall();/*清理緩沖區(qū)*/
gets(string);/*從鍵盤輸入一串字符串作為表達(dá)式*/
if(strlen(string)==1)/*輸入的表達(dá)式字符串長度為1*/
if(string[0]==‘+‘||string[0]==‘-‘||string[0]==‘*‘||string[0]==‘/‘||string[0]==‘^‘)/*輸入的表達(dá)式只有一個運(yùn)算符*/
{?printf(“\n表達(dá)式只有一個字符,為運(yùn)算符,錯誤!“);return?ERROR;}
else?if((string[0]>=‘0‘&&string[0]<‘9‘)||(string[0]>=‘a(chǎn)‘&&string[0]<=‘z‘)||(string[0]>=‘A‘&&string[0]<=‘Z‘))
/*輸入的表達(dá)式只有一個數(shù)字或字符*/
{?printf(“\n表達(dá)式只有一個字符!“);return?OK;}
else?{printf(“\n輸入的字符不是運(yùn)算符也不是變量常量,錯誤!“);return?ERROR;}
return?OK;
}
/*判斷字符string[i],如果是‘0‘-‘9‘常量之間,二叉樹結(jié)點(diǎn)存為整型;否則,存為字符型*/
void?judge_value(BiTree?*Echar?*stringint?i)
{
if(string[i]>=‘0‘&&string[i]<=‘9‘)/*為常量*/
{(*E)->data.tag=INT;(*E)->data.num=string[i]-48;}
else?if(string[i]>=1&&string[i]<=20)/*為常量,常量存于數(shù)組save_number中*/
{(*E)->data.tag=INT;(*E)->data.num=save_number[string[i]];}
else/*為變量*/
{(*E)->data.tag=CHAR;(*E)->data.c=string[i];}
}
/*以正確的前綴表示式并構(gòu)造表達(dá)式E*/
Status?ReadExpr(BiTree?*Echar?*exprstring)
{
SqStack?S;
int?ilen;/*len為表達(dá)式的長度*/
BiTree?pq;
(*E)=(BiTree)malloc(sizeof(BiTNode));/*申請二叉樹的根結(jié)點(diǎn)的空間*/
(*E)->lchild=NULL;
(*E)->rchild=NULL;
len=strlen(exprstring);/*len賦值為表達(dá)式的長度*/
if(len==1)/*表達(dá)式長度為1時,二叉樹只有根結(jié)點(diǎn)*/
judge_value(Eexprstring0);/*將exprstring[0]存入二叉樹的結(jié)點(diǎn)中*/
else?
{
judge_value(Eexprstring0);/*將exprstring[0]存入二叉樹的結(jié)點(diǎn)中*/
InitStack(&S);/*初始化棧*/
q=(*E);
Push(&Sq);/*入棧*/
Push(&Sq);/*入棧,根結(jié)點(diǎn)入棧兩次是為判斷先序輸入的表達(dá)式是不是正確的表達(dá)式*/
for(i=1;i {
p=(BiTree)malloc(sizeof(BiTNode));
judge_value(&pexprstringi);/*將exprstring[i]存入二叉樹的結(jié)點(diǎn)中*/
p->lchild=NULL;
p->rchild=NULL;
if(exprstring[i]==‘+‘||exprstring[i]==‘-‘||exprstring[i]==‘*‘||exprstring[i]==‘/‘||exprstring[i]==‘^‘)
{/*為運(yùn)算符,運(yùn)算符入棧,左孩子不空,向左孩子走,否則,如果右孩子不空,向右孩子走*/
if(!q->lchild) {q->lchild=p;Push(&Sp);q=p;}
else {q->rchild=p;Push(&Sp);q=p;}
}
else/*不是運(yùn)算符,運(yùn)算符出棧*/
{
if(!q->lchild) {q->lchild=p;Pop(&S&q);}
else {q->rchild=p;Pop(&S&q);}
}
}
if(StackEmpty(S)&&i>=len) return?OK;/*棧空且i>=len,說明輸入的表達(dá)式是正確的*/
else /*輸入的表達(dá)式是錯誤的*/
{
printf(“\n輸入的表達(dá)式有誤!“);
return?ERROR;
}
}
}
/*如果兩個字符是運(yùn)算符,比較兩個運(yùn)算符的優(yōu)先級,c1比c2優(yōu)先,返回OK,否則返回ERROR*/
Status?Pri_Compare(char?c1char?c2)
{
if((c1==‘^‘||c1==‘*‘||c1==‘-‘||c1==‘+‘||c1==‘/‘)&&(c2==‘^‘||c2==‘*‘||c2==‘-‘||c2==‘+‘||c2==‘/‘))
{/*c1和c2為運(yùn)算符*/
if(c1==‘^‘)/*c1為指數(shù)運(yùn)算符,則當(dāng)c2不為‘^‘時,c1比c2優(yōu)先*/
{
if(c2!=‘^‘)?return?OK;
else?return?ERROR;
}
else?if(c1==‘*‘||c1==‘/‘)/*c1為乘法或除法運(yùn)算符,則當(dāng)c2為‘+‘或
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
????..A.SH.??????4608??2008-07-12?14:13??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\Thumbs.db
?????文件???????1654??2008-07-04?16:39??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\測試數(shù)據(jù).txt
????..A.SH.?????38400??2008-07-04?15:52??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\Thumbs.db
?????文件?????654890??2008-07-04?13:51??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\主菜單界面.bmp
?????文件??????99582??2008-07-04?15:44??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\合并常數(shù)操作?多次合并1.bmp
?????文件?????100206??2008-07-04?15:45??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\合并常數(shù)操作?多次合并2.bmp
?????文件??????97030??2008-07-04?15:45??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\合并常數(shù)操作?多次合并3.bmp
?????文件?????432694??2008-07-04?15:42??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\合并常數(shù)操作1.bmp
?????文件?????189198??2008-07-04?14:09??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試前綴表達(dá)式輸入?-91.bmp
?????文件?????230094??2008-07-04?14:10??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試前綴表達(dá)式輸入?變量.bmp
?????文件?????561570??2008-07-04?14:06??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試前綴表達(dá)式輸入?常量.bmp
?????文件?????191754??2008-07-04?14:12??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試前綴表達(dá)式輸入?較為復(fù)雜表達(dá)式.bmp
?????文件?????179534??2008-07-04?15:15??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試前綴表達(dá)式輸入?輸出帶括弧.bmp
?????文件?????143190??2008-07-04?14:17??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試前綴表達(dá)式輸入?錯誤前綴表達(dá)式1.bmp
?????文件?????143414??2008-07-04?14:19??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試前綴表達(dá)式輸入?錯誤前綴表達(dá)式2.bmp
?????文件?????194614??2008-07-04?14:55??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試原表達(dá)式輸入?BUG1.bmp
?????文件?????155970??2008-07-04?15:09??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試原表達(dá)式輸入?出錯處理1.bmp
?????文件?????156214??2008-07-04?15:11??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試原表達(dá)式輸入?出錯處理2.bmp
?????文件?????158774??2008-07-04?15:14??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試原表達(dá)式輸入?出錯處理3.bmp
?????文件?????159270??2008-07-04?15:20??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試原表達(dá)式輸入?出錯處理4.bmp
?????文件?????176694??2008-07-04?15:03??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試原表達(dá)式輸入?簡化括弧.bmp
?????文件?????309814??2008-07-04?14:42??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試構(gòu)造復(fù)合表達(dá)式1.bmp
?????文件?????286774??2008-07-04?14:44??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試構(gòu)造復(fù)合表達(dá)式2.bmp
?????文件?????563254??2008-07-04?14:45??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試構(gòu)造復(fù)合表達(dá)式3.bmp
?????文件?????107238??2008-07-04?14:40??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試求算數(shù)表達(dá)式的值?帶有變量.bmp
?????文件?????311886??2008-07-04?14:36??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試求算數(shù)表達(dá)式的值1.bmp
?????文件?????105014??2008-07-04?14:38??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試求算數(shù)表達(dá)式的值2.bmp
?????文件?????258210??2008-07-04?14:27??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試賦值操作1.bmp
?????文件?????261174??2008-07-04?14:29??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試賦值操作2.bmp
?????文件?????227538??2008-07-04?14:32??數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式類型的實現(xiàn)\測試\部分測試的截圖\測試賦值操作3.bmp
............此處省略12個文件信息
- 上一篇:交通燈控制實驗(計算機(jī)組成原理)完整版
- 下一篇:實用馬爾可夫決策過程
評論
共有 條評論