![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第1頁(yè)](http://file4.renrendoc.com/view/66764aebbd46cfba927a0dd97a3a7cd5/66764aebbd46cfba927a0dd97a3a7cd51.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第2頁(yè)](http://file4.renrendoc.com/view/66764aebbd46cfba927a0dd97a3a7cd5/66764aebbd46cfba927a0dd97a3a7cd52.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第3頁(yè)](http://file4.renrendoc.com/view/66764aebbd46cfba927a0dd97a3a7cd5/66764aebbd46cfba927a0dd97a3a7cd53.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第4頁(yè)](http://file4.renrendoc.com/view/66764aebbd46cfba927a0dd97a3a7cd5/66764aebbd46cfba927a0dd97a3a7cd54.gif)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)_第5頁(yè)](http://file4.renrendoc.com/view/66764aebbd46cfba927a0dd97a3a7cd5/66764aebbd46cfba927a0dd97a3a7cd55.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技發(fā)展與學(xué)科教育的互促關(guān)系研究
- 科技教育編程教育的普及與推廣
- DB4453T 30-2025廣藿香組培苗生產(chǎn)技術(shù)規(guī)程
- DB35T 2232-2024海峽兩岸共通 火龍果生產(chǎn)技術(shù)規(guī)程
- 東莞企業(yè)勞動(dòng)合同范本
- 個(gè)人貸款房屋抵押合同模板大全
- 業(yè)務(wù)經(jīng)營(yíng)權(quán)轉(zhuǎn)讓合同
- 個(gè)人車位共有權(quán)買賣合同
- 臨時(shí)倉(cāng)儲(chǔ)合同范本
- 兩人股權(quán)轉(zhuǎn)讓合同范本
- 2024-2030年全球及中國(guó)水楊酸行業(yè)市場(chǎng)現(xiàn)狀供需分析及市場(chǎng)深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告
- 體育館改造裝修工程施工組織設(shè)計(jì)
- 137案例黑色三分鐘生死一瞬間事故案例文字版
- 【魔鏡洞察】2024藥食同源保健品滋補(bǔ)品行業(yè)分析報(bào)告
- 2024-2030年中國(guó)潤(rùn)滑油行業(yè)發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 鋼結(jié)構(gòu)工程施工(第五版) 課件 2項(xiàng)目四 高強(qiáng)度螺栓
- 機(jī)票預(yù)訂行業(yè)營(yíng)銷策略方案
- 大學(xué)生就業(yè)指導(dǎo)(高等院校學(xué)生學(xué)習(xí)就業(yè)指導(dǎo)課程)全套教學(xué)課件
- 《實(shí)驗(yàn)診斷學(xué)》課件
- 眼的解剖結(jié)構(gòu)與生理功能課件
- 小學(xué)網(wǎng)管的工作總結(jié)
評(píng)論
0/150
提交評(píng)論