數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1/1數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)福建農(nóng)林高校計(jì)算機(jī)與信息學(xué)院

計(jì)算機(jī)類

課程設(shè)計(jì)報(bào)告

課程名稱:算法與數(shù)據(jù)結(jié)構(gòu)

課程設(shè)計(jì)題目:表達(dá)式計(jì)算

姓名:

系:數(shù)學(xué)系

專業(yè):數(shù)學(xué)與應(yīng)用數(shù)學(xué)

班級(jí):

學(xué)號(hào):

指導(dǎo)老師:寧正元

職稱:教授

20**年12月25日

名目

1、課程設(shè)計(jì)的目的(1)

2、課程設(shè)計(jì)的要求(1)

3、課程設(shè)計(jì)的內(nèi)容(1)

3.1主函數(shù)中一些重要變量的作用(1)

3.2重要步驟算法思路分析(1)

3.3源程序代碼(3)

3.4程序調(diào)試與測(cè)試結(jié)果(12)

3.5結(jié)果分析(16)

4、總結(jié)(16)

5、

表達(dá)式計(jì)算

1、課程設(shè)計(jì)的目的

1.把握C語(yǔ)言的相關(guān)學(xué)問;

2.熟識(shí)把握結(jié)構(gòu)體和共用體的定義和使用;

3.熟識(shí)把握棧和相關(guān)操作函數(shù)的定義和使用;

4.熟識(shí)把握數(shù)組和相關(guān)操作的定義和使用

2、課程設(shè)計(jì)的要求

1.對(duì)從鍵盤輸入一個(gè)表達(dá)式,先檢查合法性:如不合法,則給出錯(cuò)誤信息,再返回;如合法,則對(duì)其進(jìn)行整理,利用棧和數(shù)組進(jìn)行相關(guān)數(shù)據(jù)保存,再進(jìn)行運(yùn)算,最終輸出計(jì)算結(jié)果。

2.計(jì)算范圍:包括一般的算術(shù)運(yùn)算(加、減、乘、除、括號(hào))和常用的函數(shù)運(yùn)算(三角函數(shù)、自然指數(shù)函數(shù)、自然對(duì)數(shù)函數(shù)、肯定值函數(shù)、平方根函數(shù))。

3.其他功能可自行添加。

3、課程設(shè)計(jì)的內(nèi)容

3.1主函數(shù)中一些重要變量的作用

doublesz[MAXSIZE];用于存放數(shù)值的數(shù)組

charfh[MAXSIZE];用于存放運(yùn)算符的數(shù)組

chartemp[MAXSIZE];用于存放輸入的表達(dá)式的數(shù)組

floatsum;用于記錄當(dāng)前讀到的數(shù)中以讀到的數(shù)值

inti_b,i_t,ld,lsz;i_b后面?zhèn)溆?i_t記錄讀到哪一個(gè)字符;

ld記錄小數(shù)的位數(shù);lsz記錄sz的有效長(zhǎng)度;shedKH,HS;KH用于放括號(hào)的棧;HS用于放函數(shù)的棧

3.2重要步驟算法思路分析(均以合法表達(dá)式為例)

先用數(shù)組temp對(duì)輸入的表達(dá)式進(jìn)行儲(chǔ)存,再對(duì)其進(jìn)行一位一位地讀取和處理:1.對(duì)數(shù)值和運(yùn)算符的處理:

1)對(duì)運(yùn)算符的處理比較簡(jiǎn)潔,當(dāng)遇到運(yùn)算符時(shí),直接存入數(shù)組fh即可;

2)對(duì)數(shù)值的處理,由于不知道數(shù)是幾位,所以要用兩個(gè)變量sum、ld,(sum記錄已讀取

得數(shù)字,ld記錄小數(shù)位數(shù)),詳細(xì)操作請(qǐng)見下面流程圖:

2.對(duì)括號(hào)運(yùn)算和函數(shù)運(yùn)算的處理:

對(duì)括號(hào)運(yùn)算和函數(shù)運(yùn)算的處理比較麻煩,特殊市它們的嵌套使用,如式子:

1+(2-(3+4)*5)*6

當(dāng)讀到2前的‘(’時(shí),由于括號(hào)運(yùn)算的優(yōu)先級(jí)高于加、減、乘、除,所以應(yīng)對(duì)其先進(jìn)行保存,當(dāng)讀到3前的‘(’時(shí),同樣也要先進(jìn)行保存。當(dāng)讀到4后的‘)’時(shí),應(yīng)把3前的‘(’取出來,與之配對(duì),再運(yùn)算之間的式子,同樣當(dāng)讀到5后的‘)’時(shí),應(yīng)把2前的‘(’取出來,配對(duì),再運(yùn)算。所以對(duì)于‘(’的保存與讀取具有先進(jìn)后出的特點(diǎn),棧剛好也有這個(gè)特點(diǎn),因此用??梢詫?duì)其進(jìn)行儲(chǔ)存;

同理,對(duì)函數(shù)的處理也是這樣的,如式子:

sin(abs(-1))

應(yīng)先保存sin函數(shù)名,再保存abs函數(shù)名;而進(jìn)行計(jì)算時(shí),應(yīng)先計(jì)算abs函數(shù)再計(jì)算sin函數(shù),也有先進(jìn)后出的特點(diǎn)。

再考慮這些棧的元素的特點(diǎn):

對(duì)于保存函數(shù)名的棧,它的元素必要有兩個(gè)重量:一個(gè)保存函數(shù)名,可以用char類型,另一個(gè)重量要記錄該函數(shù)在式中的位置,可以用int類型。

對(duì)于保存扣號(hào)的棧,由于考慮到有2種括號(hào):一種是一般算式中的括號(hào),如式子2*(3+4)中的括號(hào);另一種是函數(shù)中把參數(shù)與一般數(shù)值區(qū)分開的括號(hào),如式子sin(-1)中的括號(hào)。又考慮到要保存的都是’(’,所以該棧也只要2個(gè)重量,一個(gè)是該括號(hào)的種類,可以用int類型的0和1表示(0表示一般算式中的括號(hào),1表示函數(shù)參數(shù)前的括號(hào)),另一個(gè)重量是保存該括號(hào)在式中的位置。

又考慮到兩種棧統(tǒng)一性,我們先定義一個(gè)共用體:

unionsig//sign1記錄括號(hào)是屬于函數(shù)的還是運(yùn)算的,sign2記錄是什么函數(shù)

{intsign1;

charsign2;

};

在定義棧元素的結(jié)構(gòu)體:

typedefstructnode

{unionsigsign;

intjilu;

}node;//記錄括號(hào)或函數(shù)的結(jié)構(gòu)體

3.3源程序代碼

#include

#include

#include

#include

#defineMAXSIZE100

unionsig//sign1記錄括號(hào)是屬于函數(shù)的還是運(yùn)算的,sign2記錄是什么函數(shù)

{intsign1;

charsign2;};

typedefstructnode

{unionsigsign;

intjilu;}node;//記錄括號(hào)或函數(shù)的結(jié)構(gòu)體

structshed

{nodedata[MAXSIZE];

inttop;};

typedefstructshedshed;//定義棧

voidsetnull(shed*S)//初始化棧函數(shù)

{S->top=-1;}

voidpush(shed*S,nodex)//入棧函數(shù)

{S->top++;

S->data[S->top]=x;}

nodepop(shed*S)//出棧函數(shù)

{S->top--;

return(S->data[S->top+1]);}

intpanduan(char*x)//該函數(shù)檢驗(yàn)輸入的表達(dá)式是否正確,正確返回1,錯(cuò)誤返回0。{chara[4]={'s','i','n','\0'};

inti=0,j=0,k;

chartem[4];

while(x[i]!='\0')

{if((x[i]=='*'||x[i]=='/')

return0;break;}

if(x[i]=='p')

{if(x[i+1]!='i')

{printf("!!輸入錯(cuò)誤:%c%c不存在!!\n",x[i],x[i+1]);

return0;break;}

if(x[i+2]>='a'

return0;break;}

i++;

}

elseif((x[i]>='a'

return0;break;}

tem[0]=x[i];

tem[1]=x[i+1];

tem[2]=x[i+2];

tem[3]='\0';

if(strcmp(tem,"sin")

return0;break;

}

}

i=i+2;

}

if(x[i-1]=='+'||x[i-1]=='-'||x[i-1]=='*'||x[i-1]=='/')

{if(x[i]=='+'||x[i]=='-'||x[i]=='*'||x[i]=='/')

{printf("!!輸入錯(cuò)誤:連續(xù)輸入運(yùn)算符!!\n");

return0;break;

}

}

if((x[i]==')'||x[i]=='=')

return0;break;}

if((x[i-1]>='0'

return0;break;}

if((x[i-1]>='0'

return0;break;}

if((x[i-1]=='(')

return0;break;}

if((x[i-1]==')')

return0;break;}

if(x[i]=='(')j++;

if(x[i]==')')j--;

if(x[i]=='.')

{k=0;

while(x[i+(++k)]>='0'

if(x[i+k]=='.')

{printf("!!輸入錯(cuò)誤:多輸入了小數(shù)點(diǎn)!!\n");

return0;

}

}

i++;

}

if(j!=0)

{if(j>0)

printf("!!輸入格式錯(cuò)誤:少輸入了%d個(gè)‘)’\n",j);

else

printf("!!輸入格式錯(cuò)誤:少輸入了%d個(gè)‘(’\n",-j);

return0;

}

else

return1;

}

intyunsuan(inta,intlsz,double*sz,char*fh)

//把sz數(shù)組中的數(shù)從sz[a]到sz[lsz]依據(jù)數(shù)組fh中的運(yùn)算符進(jìn)行計(jì)算

//返回值為計(jì)算后lsz的值

{inti,j;

for(i=a;i='0'

else

{sum+=float((temp[i_t]-'0')*pow(10,-ld));

ld++;

}

}

if(temp[i_t]=='+'||temp[i_t]=='-'||temp[i_t]=='*'

||temp[i_t]=='/'||temp[i_t]==')')

{if(temp[i_t-1]!=')')

{sz[lsz++]=sum;

sum=0;

ld=0;

}

if(temp[i_t]==')')

{lsz--;

ele=pop(

i_b=ele.jilu;

lsz=yunsuan(i_b,lsz,sz,fh);

i_b=ele.sign.sign1;

if(i_b==1)

{ele=pop(

switch(ele.sign.sign2)

{

case's':sz[lsz]=sin(sz[lsz]);break;

case'c':sz[lsz]=cos(sz[lsz]);break;

case't':sz[lsz]=tan(sz[lsz]);break;

case'l':sz[lsz]=log(sz[lsz]);break;

case'e':sz[lsz]=exp(sz[lsz]);break;

case'a':sz[lsz]=fabs(sz[lsz]);break;

case'q':sz[lsz]=sqrt(sz[lsz]);break;

}

}

lsz++;

}

else

fh[lsz-1]=temp[i_t];

}

if(temp[i_t]=='(')

{ele.sign.sign1=0;

ele.jilu=lsz;

push(

}

if(temp[i_t]>='a'

i_t++;

}

else

{ele.sign.sign2=temp[i_t];

ele.jilu=lsz;

push(

ele.sign.sign1=1;

ele.jilu=lsz;

push(

i_t+=3;

}

}

i_t++;

}

if(temp[i_t-1]!=')'||lsz-1>0)

{sz[lsz]=sum;

sum=0;

yunsuan(0,lsz,sz,fh);

}

printf("計(jì)算結(jié)果:\n");

printf("%lf\n",sz[0]);

printf("**************************************************\n");

gotoloop2;

}

3.4程序調(diào)試與測(cè)試結(jié)果1.程序運(yùn)行后:

2.檢測(cè)輸入的合法性:

3.檢測(cè)清屏功能(以下屏幕內(nèi)容是上一屏幕的一部分):

按下Enter后:

4.檢測(cè)一般算術(shù)運(yùn)算(加、減、乘、除及括號(hào)):

5.檢測(cè)函數(shù)運(yùn)算:

3.5結(jié)果分析

由詳細(xì)結(jié)果及分析知:

該計(jì)算器的各項(xiàng)功能基本能夠?qū)崿F(xiàn),各項(xiàng)功能的實(shí)現(xiàn)細(xì)節(jié)考慮還算周到,而且能夠達(dá)到預(yù)期的效果,但是還有一些不足之處,比照實(shí)現(xiàn)的功能過于簡(jiǎn)潔,不能進(jìn)行符號(hào)運(yùn)算等等。由于本人的力量有限,所以也只能達(dá)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論