版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
REliable,INtelligent&Scalable程序設(shè)計(jì)Programming第13REliable,INtelligent&Scalable程序設(shè)計(jì)Programming第13編寫(xiě)程ChapterWriting翻譯自Stroustrup概REliable,INtelligent&Scalable???概REliable,INtelligent&Scalable?????2構(gòu)建程REliable,INtelligent&Scalable?構(gòu)建程REliable,INtelligent&Scalable???–––調(diào)測(cè)?3編寫(xiě)程序:策REliable,INtelligent&Scalable?編寫(xiě)程序:策REliable,INtelligent&Scalable?問(wèn)題的描述是否清楚肯定有!例如iostreams,vector等????–4編寫(xiě)程序:策REliable,INtelligent&Scalable?–即使編寫(xiě)程序:策REliable,INtelligent&Scalable?–即使有經(jīng)驗(yàn)的程序員也會(huì)犯錯(cuò)–設(shè)計(jì)優(yōu)秀的程序相當(dāng)困–讓編譯器探測(cè)錯(cuò)誤比在一開(kāi)始就仔細(xì)確保每個(gè)細(xì)節(jié)都正確要快捷–構(gòu)建簡(jiǎn)單的、不完備的版本可以使我們能夠進(jìn)行試驗(yàn)和反5一個(gè)簡(jiǎn)單的計(jì)算REliable,INtelligent&Scalable?–一個(gè)簡(jiǎn)單的計(jì)算REliable,INtelligent&Scalable?–??????Expression:Result:4Result:8Expression:2+3-Result:?下面,我們細(xì)化這個(gè)問(wèn)題6偽代REliable,INtelligent&Scalable?第一個(gè)想法int{while(get偽代REliable,INtelligent&Scalable?第一個(gè)想法int{while(getaline)analyze//pseudo//what’sa//whatdoesthatevaluatetheexpressionprinttheresult}}?????45+5/7表示成數(shù)據(jù)如何從輸入字符串中發(fā)現(xiàn) /如何確45+5/7表示45+(5/7)而不我們是否允許進(jìn)行浮點(diǎn)數(shù)運(yùn)算(必需的我們是否可以定義變量v=7m=9;v*m以后就可以運(yùn)算它們7一個(gè)簡(jiǎn)單的計(jì)算REliable,INtelligent&Scalable?等一下我們只不過(guò)在做毫無(wú)意義的重復(fù)性工作一個(gè)簡(jiǎn)單的計(jì)算REliable,INtelligent&Scalable?等一下我們只不過(guò)在做毫無(wú)意義的重復(fù)性工作?專(zhuān)家們會(huì)做什么–––計(jì)算機(jī)能夠計(jì)算表達(dá)式已經(jīng)超過(guò)50年肯定已經(jīng)有解決方案了專(zhuān)家們都做了些什么??8一個(gè)簡(jiǎn)單的計(jì)算器-第一個(gè)版REliable,INtelligent&Scalable一個(gè)簡(jiǎn)單的計(jì)算器-第一個(gè)版REliable,INtelligent&Scalableint{cout<<"Pleaseenterexpression(wecanhandle+and-):";intlval=0;intintres;if讀入表達(dá)式,例如1res=lval+rval;elseif(op=='-')res=lval-cout<<"Result:"<<res<<'\n';return}9一個(gè)簡(jiǎn)單的計(jì)算器-第二個(gè)版REliable,INtelligent&一個(gè)簡(jiǎn)單的計(jì)算器-第二個(gè)版REliable,INtelligent&Scalable{cout<<"Pleaseenterexpression(wecanhandle+,-,*,and/):";intlval=0;intchar//讀入最左邊的操作if(!cin)error("nofirstwhile(cin>>op){if(!cin)error("nosecond//重復(fù)讀入操作符和右操作一個(gè)簡(jiǎn)單的計(jì)算器-第二個(gè)版REliable,INtelligent&Scalable一個(gè)簡(jiǎn)單的計(jì)算器-第二個(gè)版REliable,INtelligent&Scalable{caselval+=rval;case'-lval-=rval;caselval*=rval;caselval/=rval;//add:lval=lval+//subtract:lval=lval-//multiply:lval=lval*//divide:lval=lval/一個(gè)簡(jiǎn)單的計(jì)算器-第二個(gè)版REliable,INtelligent&一個(gè)簡(jiǎn)單的計(jì)算器-第二個(gè)版REliable,INtelligent&Scalable//notanotheroperator:printcout<<"Result:"<<lval<<'\n';return}}error("bad}catch(exception&e)cerr<<"error:"<<e.what()<<'\n';return1;}catch(...)cerr<<"Oops:unknownexception!\n";return2;}表達(dá)式文REliable,INtelligent&Scalable?編寫(xiě)一種文法-專(zhuān)家的做法表達(dá)式文REliable,INtelligent&Scalable?編寫(xiě)一種文法-專(zhuān)家的做法Expression‘-’TermTermTerm‘*’PrimaryTerm‘/’PrimaryTerm‘%’PrimaryNumber:floating-pointe.g.,(1-e.g.,(1-e.g.,e.g.,e.g.,3.14,構(gòu)建出來(lái)的(e.g.,numbersand?程序就是由符號(hào)文REliable,INtelligent&Scalable?什么是文法––關(guān)于表達(dá)式的文REliable,INtelligent&Scalable?什么是文法––關(guān)于表達(dá)式的一系列(語(yǔ)法)規(guī)這些規(guī)則描述了如何分析(“解析parse”)––有些就像是我們腦子中固有的例如,我們知道下面表達(dá)式的birdsflybutfish我們知道下面的表達(dá)式是錯(cuò)誤2*+3flybirdsfishbut––––我們?nèi)绾螌⑺赖慕探o計(jì)算文法-英REliable,INtelligent&Scalable文法-英REliable,INtelligent&Scalable文法-表達(dá)REliable,INtelligent&Scalable文法-表達(dá)REliable,INtelligent&Scalable文法-表達(dá)REliable,INtelligent&Scalable文法-表達(dá)REliable,INtelligent&Scalable文法-表達(dá)REliable,INtelligent&Scalable文法-表達(dá)REliable,INtelligent&Scalable編寫(xiě)文REliable,INtelligent&Scalable?編寫(xiě)文REliable,INtelligent&Scalable?區(qū)分規(guī)則和符表達(dá)重復(fù)模識(shí)別文法規(guī){A{B{A,B{A,A,A,A,B"{"Sequence"}"Element","Sequence{{A,A,C,A,B{AB{A,A,A,A,B,用于解析的函REliable,INtelligent&Scalable?我們需要下面的用于解析的函REliable,INtelligent&Scalable?我們需要下面的函數(shù)來(lái)匹配文//讀入字符,并組cin輸term()*,/,和%term//處理數(shù)字和//expression()??類(lèi)比:將一組人群聚在一起解決復(fù)雜問(wèn)題時(shí),每個(gè)人指出了他的專(zhuān)業(yè)部分,函數(shù)返回類(lèi)REliable,INtelligent&Scalable?–Tokendouble函數(shù)返回類(lèi)REliable,INtelligent&Scalable?–Tokendouble//讀入字符,并組(或差*,和返回乘積(或商和余數(shù)doubletermdouble//處理數(shù)字和返回?什么是符REliable,INtelligent&Scalable?我們可以將輸入看做是一個(gè)符–––(包含13個(gè)字符,其中什么是符REliable,INtelligent&Scalable?我們可以將輸入看做是一個(gè)符–––(包含13個(gè)字符,其中2個(gè)是空格+4*(-6)6種符號(hào):*(-)?我們認(rèn)為每一個(gè)符號(hào)都包含兩––“種類(lèi)e.g.,數(shù)字值e.g?我們需要一種類(lèi)型來(lái)表示“符號(hào)–––t.kindt.value+什么是符REliable,INtelligent&Scalable?classToken{charkind;doublevalue;什么是符REliable,INtelligent&Scalable?classToken{charkind;doublevalue;用于數(shù)字?jǐn)?shù)//從一個(gè)字符創(chuàng)建符:kind(ch),value(0){}Token(charch,double:kind(ch),value(val){//從一個(gè)字符和一個(gè)doubleTokent;t.kind='8';t.value=Tokenut;//Token的行為與內(nèi)置類(lèi)型很像,例如cout<<什么是符REliable,INtelligent&Scalable?classToken{什么是符REliable,INtelligent&Scalable?classToken{charkind;doublevalue;用于數(shù)字?jǐn)?shù)//從一個(gè)字符創(chuàng)建符:kind(ch),value(0){}Token(charch,double:kind(ch),value(val){//從一個(gè)字符和一個(gè)double?––//“kind”‘+’來(lái)創(chuàng)建對(duì)//使用“kind”‘8’和值4.5來(lái)創(chuàng)建對(duì)和——第一個(gè)版REliable,INtelligent&Scalable和——第一個(gè)版REliable,INtelligent&ScalableExpression‘-’Termdouble{doubleleft=expression();Tokent=get_token();switch(t.kind)//讀入和計(jì)算//獲取下一個(gè)//查看符號(hào)的case'+':returnleft+case'-':returnleft-term();//讀入并計(jì)算Term,然后執(zhí)行加//讀入并計(jì)算Term,然后執(zhí)行減return//返回Expression的}}和——第二個(gè)版REliable,INtelligent&Scalable和——第二個(gè)版REliable,INtelligent&ScalableExpression‘-’Termdouble{doubleleft=term();Tokent=get_token();switch(t.kind)//獲取下一個(gè)//查看符號(hào)的casereturnleftexpression();讀入并計(jì)算Expression,然后執(zhí)returnleft;返回Expression的}}和——第三個(gè)版REliable,INtelligent&Scalable和——第三個(gè)版REliable,INtelligent&ScalableExpression‘-’Termdouble{doubleleft=term();while(true){Tokent=get_token();switch(t.kind){case'+':left+=term();break;case'-':left-=term();break;default:returnleft;}}}//讀入和計(jì)算Expression://獲取開(kāi)頭的//獲取下一個(gè)符號(hào)//…并對(duì)其執(zhí)行正確的操//返回Expression的*、第一個(gè)版REliable,INtelligent&Scalable*、第一個(gè)版REliable,INtelligent&ScalableTerm'/'Term'%'double//就像expression()一樣,但是用于處理*,/,和{doubleleft=primary();while(true){Tokent=獲取//獲取下一個(gè)符號(hào)switch{casecase}left*=primary();break;left/=primary();break;left%=primary();return返回}}*、第二個(gè)版REliable,INtelligent&Scalable*、第二個(gè)版REliable,INtelligent&ScalableTerm'/'Primarydouble{doubleleft=primary();while(true){Tokent=get_token();switch(t.kind){//就像expression()一樣,但是用于處理*,/,和獲取//獲取下一個(gè)符號(hào)casecase'/':left*=primary();break;left/=primary();break;returnleft;返回}}}*、第三個(gè)版REliable,INtelligent&Scalable*、第三個(gè)版REliable,INtelligent&ScalableTerm'/'Primarydouble//就像expression()一樣,但是用于處理*,/,和{doubleleft=primary();while(true){Tokent=獲取//獲取下一個(gè)符號(hào)switch{casecaseleft*=primary();{doubled=if(d==0)error("dividebyzero");left/=d;break;}return返回}}}處理數(shù)字和符REliable,INtelligent&Scalable'('Expressiondouble處理數(shù)字和符REliable,INtelligent&Scalable'('Expressiondoubleprimary()Expression{Tokent=get_token();switch(t.kind){case‘(’expression{doubled=t=if(t.kind!=')')error("')'expected");returnd;}casereturn//我們使用‘8’表示種類(lèi)為error("primary}}程序組REliable,INtelligent&Scalable程序組REliable,INtelligent&Scalable程REliable,INtelligent&Scalable#include//Token部程REliable,INtelligent&Scalable#include//Token部分(下節(jié)課介紹doubleexpression();//這里聲明是為了讓primary()可以調(diào)用doubleprimary(){/*…*/}doubleterm(){/*…*/}doubleexpression(){/*…*/}//處理數(shù)字和*不包括intmain(){/*…*/下一程REliable,INtelligent&Scalabletry{while程REliable,INtelligent&Scalabletry{whilecout<<expression()<<'\n';}catch(exception&e)cerr<<e.what()<<endl;keep_window_open();return1;}catch(...)cerr<<"exception\n";keep_window_open();return2;}運(yùn)23425XBad1234+56+78+910111468和REliable,INtelligent&ScalableExpression‘-’和REliable,INtelligent&ScalableExpression‘-’double{doubleleft=term();while(true){Tokent=get_token();switch(t.kind){case'+':left+=term();break;case'-':left-=term();break;default:returnleft;}}}//讀入和計(jì)算Expression://獲取開(kāi)頭的//獲取下一個(gè)符號(hào)//…并對(duì)其執(zhí)行正確的操//返回Expression的和REliable,INtelligent&Scalable放回到哪里當(dāng)然是和REliable,INtelligent&Scalable放回到哪里當(dāng)然是“輸入”;也?double{doubleleft=term();while(true){Tokent=處理和//“符號(hào)流”獲取下一個(gè)switch(t.kind)casecase'-':left+=term();break;left-=term();break;return}}}*、REliable,INtelligent&Scalable?double*、REliable,INtelligent&Scalable?double{doubleleft=primary();while(true){switch(t.kind){case'*':處理case處理returnleft;//將未使用的符號(hào)放回到輸入流}}}程REliable,INtelligent&Scalable?int{doubleval程REliable,INtelligent&Scalable?int{doubleval=0;while(cin){Tokentts.get();不是使用if(t.kind==‘q’)break;if(t.kind==';')cout<<val<<//‘q’for//‘;’for“print//printval=expression();//將符號(hào)放回到輸計(jì)}}異常處理符號(hào)REliable,INtelligent&Scalable???Token_stream讀入字符,按照需要產(chǎn)生符號(hào)REliable,INtelligent&Scalable???Token_stream讀入字符,按照需要產(chǎn)生Token_stream“緩存”來(lái)保存放回的符號(hào)Token_streamInput是“其他函數(shù)”的工作,然后將+放回到Token_stream中稍后expression()+??Token_streamInput符號(hào)REliable,INtelligent&Scalable?自定義類(lèi)型–get()和classToken_stream符號(hào)REliable,INtelligent&Scalable?自定義類(lèi)型–get()和classToken_streamToken//創(chuàng)建一個(gè)從cin讀//獲取一個(gè)符號(hào)(get()是在其他地方定義的voidputback(Token//將一個(gè)符號(hào)boolToken//這個(gè)符號(hào)在緩存//我們將使用putback()放回的符號(hào)放在符號(hào)REliable,INtelligent&Scalable?–:full(false),{}//符號(hào)REliable,INtelligent&Scalable?–:full(false),{}//Token?voidToken_stream::putback(Token{if(full
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級(jí)班主任的工作感悟與總結(jié)
- 做好風(fēng)險(xiǎn)控制保持財(cái)務(wù)穩(wěn)定
- 營(yíng)造和諧教育氛圍的工作總結(jié)
- 紡織行業(yè)的會(huì)計(jì)工作總結(jié)
- 《希臘旅游資源介紹》課件
- 廣西賀州地區(qū)2022-2023學(xué)年六年級(jí)上學(xué)期英語(yǔ)期末試卷
- 2025年四川省八省聯(lián)考高考地理模擬試卷
- 《腹股溝疝手術(shù)配合》課件
- 2022年湖南省婁底市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2024年云南省曲靖市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2025高考語(yǔ)文步步高大一輪復(fù)習(xí)講義教材文言文點(diǎn)線(xiàn)面答案精析
- 《工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)》(2002年修訂本)-工程設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)2002修訂版
- 新省中考統(tǒng)考語(yǔ)文模擬卷(一)(山東卷)2024年新中考地區(qū)語(yǔ)文適應(yīng)性考試模擬卷(新中考地區(qū)適用)(原卷版)
- DL∕T 5344-2018 電力光纖通信工程驗(yàn)收規(guī)范
- DL∕T 2528-2022 電力儲(chǔ)能基本術(shù)語(yǔ)
- 2024年安徽省高考政治試卷(真題+答案)
- 中外合作辦學(xué)規(guī)劃方案
- GB 14102.1-2024防火卷簾第1部分:通用技術(shù)條件
- 2024年決戰(zhàn)行測(cè)5000題言語(yǔ)理解與表達(dá)一套
- DZ∕T 0272-2015 礦產(chǎn)資源綜合利用技術(shù)指標(biāo)及其計(jì)算方法(正式版)
- 生物入侵與生物安全智慧樹(shù)知到期末考試答案章節(jié)答案2024年浙江農(nóng)林大學(xué)
評(píng)論
0/150
提交評(píng)論