數(shù)據(jù)結構課程設計(表達式計算)_第1頁
數(shù)據(jù)結構課程設計(表達式計算)_第2頁
數(shù)據(jù)結構課程設計(表達式計算)_第3頁
數(shù)據(jù)結構課程設計(表達式計算)_第4頁
數(shù)據(jù)結構課程設計(表達式計算)_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1/1數(shù)據(jù)結構課程設計(表達式計算)福建農(nóng)林高校計算機與信息學院

計算機類

課程設計報告

課程名稱:算法與數(shù)據(jù)結構

課程設計題目:表達式計算

姓名:

系:數(shù)學系

專業(yè):數(shù)學與應用數(shù)學

班級:

學號:

指導老師:寧正元

職稱:教授

20**年12月25日

名目

1、課程設計的目的(1)

2、課程設計的要求(1)

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

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

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

3.3源程序代碼(3)

3.4程序調(diào)試與測試結果(12)

3.5結果分析(16)

4、總結(16)

5、

表達式計算

1、課程設計的目的

1.把握C語言的相關學問;

2.熟識把握結構體和共用體的定義和使用;

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

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

2、課程設計的要求

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

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

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

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

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

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

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

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

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

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

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

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

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

1)對運算符的處理比較簡潔,當遇到運算符時,直接存入數(shù)組fh即可;

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

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

2.對括號運算和函數(shù)運算的處理:

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

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

當讀到2前的‘(’時,由于括號運算的優(yōu)先級高于加、減、乘、除,所以應對其先進行保存,當讀到3前的‘(’時,同樣也要先進行保存。當讀到4后的‘)’時,應把3前的‘(’取出來,與之配對,再運算之間的式子,同樣當讀到5后的‘)’時,應把2前的‘(’取出來,配對,再運算。所以對于‘(’的保存與讀取具有先進后出的特點,棧剛好也有這個特點,因此用棧可以對其進行儲存;

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

sin(abs(-1))

應先保存sin函數(shù)名,再保存abs函數(shù)名;而進行計算時,應先計算abs函數(shù)再計算sin函數(shù),也有先進后出的特點。

再考慮這些棧的元素的特點:

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

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

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

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

{intsign1;

charsign2;

};

在定義棧元素的結構體:

typedefstructnode

{unionsigsign;

intjilu;

}node;//記錄括號或函數(shù)的結構體

3.3源程序代碼

#include

#include

#include

#include

#defineMAXSIZE100

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

{intsign1;

charsign2;};

typedefstructnode

{unionsigsign;

intjilu;}node;//記錄括號或函數(shù)的結構體

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ù)檢驗輸入的表達式是否正確,正確返回1,錯誤返回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("!!輸入錯誤:%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("!!輸入錯誤:連續(xù)輸入運算符!!\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("!!輸入錯誤:多輸入了小數(shù)點!!\n");

return0;

}

}

i++;

}

if(j!=0)

{if(j>0)

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

else

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

return0;

}

else

return1;

}

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

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

//返回值為計算后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("計算結果:\n");

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

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

gotoloop2;

}

3.4程序調(diào)試與測試結果1.程序運行后:

2.檢測輸入的合法性:

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

按下Enter后:

4.檢測一般算術運算(加、減、乘、除及括號):

5.檢測函數(shù)運算:

3.5結果分析

由詳細結果及分析知:

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

溫馨提示

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

評論

0/150

提交評論