综合程序设计_第1页
综合程序设计_第2页
综合程序设计_第3页
综合程序设计_第4页
综合程序设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

REliable,INtelligent&Scalable程序设计Programming第13REliable,INtelligent&Scalable程序设计Programming第13编写程ChapterWriting翻译自Stroustrup概REliable,INtelligent&Scalable•••概REliable,INtelligent&Scalable•••••2构建程REliable,INtelligent&Scalable•构建程REliable,INtelligent&Scalable•••–––调测•3编写程序:策REliable,INtelligent&Scalable•编写程序:策REliable,INtelligent&Scalable•问题的描述是否清楚肯定有!例如iostreams,vector等••••–4编写程序:策REliable,INtelligent&Scalable•–即使编写程序:策REliable,INtelligent&Scalable•–即使有经验的程序员也会犯错–设计优秀的程序相当困–让编译器探测错误比在一开始就仔细确保每个细节都正确要快捷–构建简单的、不完备的版本可以使我们能够进行试验和反5一个简单的计算REliable,INtelligent&Scalable•–一个简单的计算REliable,INtelligent&Scalable•–••••••Expression:Result:4Result:8Expression:2+3-Result:•下面,我们细化这个问题6伪代REliable,INtelligent&Scalable•第一个想法int{while(get伪代REliable,INtelligent&Scalable•第一个想法int{while(getaline)analyze//pseudo//what’sa//whatdoesthatevaluatetheexpressionprinttheresult}}•••••45+5/7表示成数据如何从输入字符串中发现 /如何确45+5/7表示45+(5/7)而不我们是否允许进行浮点数运算(必需的我们是否可以定义变量v=7m=9;v*m以后就可以运算它们7一个简单的计算REliable,INtelligent&Scalable•等一下我们只不过在做毫无意义的重复性工作一个简单的计算REliable,INtelligent&Scalable•等一下我们只不过在做毫无意义的重复性工作•专家们会做什么–––计算机能够计算表达式已经超过50年肯定已经有解决方案了专家们都做了些什么••8一个简单的计算器-第一个版REliable,INtelligent&Scalable一个简单的计算器-第一个版REliable,INtelligent&Scalableint{cout<<"Pleaseenterexpression(wecanhandle+and-):";intlval=0;intintres;if读入表达式,例如1res=lval+rval;elseif(op=='-')res=lval-cout<<"Result:"<<res<<'\n';return}9一个简单的计算器-第二个版REliable,INtelligent&一个简单的计算器-第二个版REliable,INtelligent&Scalable{cout<<"Pleaseenterexpression(wecanhandle+,-,*,and/):";intlval=0;intchar//读入最左边的操作if(!cin)error("nofirstwhile(cin>>op){if(!cin)error("nosecond//重复读入操作符和右操作一个简单的计算器-第二个版REliable,INtelligent&Scalable一个简单的计算器-第二个版REliable,INtelligent&Scalable{caselval+=rval;case'-lval-=rval;caselval*=rval;caselval/=rval;//add:lval=lval+//subtract:lval=lval-//multiply:lval=lval*//divide:lval=lval/一个简单的计算器-第二个版REliable,INtelligent&一个简单的计算器-第二个版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;}表达式文REliable,INtelligent&Scalable•编写一种文法-专家的做法表达式文REliable,INtelligent&Scalable•编写一种文法-专家的做法Expression‘-’TermTermTerm‘*’PrimaryTerm‘/’PrimaryTerm‘%’PrimaryNumber:floating-pointe.g.,(1-e.g.,(1-e.g.,e.g.,e.g.,3.14,构建出来的(e.g.,numbersand•程序就是由符号文REliable,INtelligent&Scalable•什么是文法––关于表达式的文REliable,INtelligent&Scalable•什么是文法––关于表达式的一系列(语法)规这些规则描述了如何分析(“解析parse”)––有些就像是我们脑子中固有的例如,我们知道下面表达式的birdsflybutfish我们知道下面的表达式是错误2*+3flybirdsfishbut––––我们如何将所知道的教给计算文法-英REliable,INtelligent&Scalable文法-英REliable,INtelligent&Scalable文法-表达REliable,INtelligent&Scalable文法-表达REliable,INtelligent&Scalable文法-表达REliable,INtelligent&Scalable文法-表达REliable,INtelligent&Scalable文法-表达REliable,INtelligent&Scalable文法-表达REliable,INtelligent&Scalable编写文REliable,INtelligent&Scalable•编写文REliable,INtelligent&Scalable•区分规则和符表达重复模识别文法规{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•我们需要下面的函数来匹配文//读入字符,并组cin输term()*,/,和%term//处理数字和//expression()••类比:将一组人群聚在一起解决复杂问题时,每个人指出了他的专业部分,函数返回类REliable,INtelligent&Scalable•–Tokendouble函数返回类REliable,INtelligent&Scalable•–Tokendouble//读入字符,并组(或差*,和返回乘积(或商和余数doubletermdouble//处理数字和返回•什么是符REliable,INtelligent&Scalable•我们可以将输入看做是一个符–––(包含13个字符,其中什么是符REliable,INtelligent&Scalable•我们可以将输入看做是一个符–––(包含13个字符,其中2个是空格+4*(-6)6种符号:*(-)•我们认为每一个符号都包含两––“种类e.g.,数字值e.g•我们需要一种类型来表示“符号–––t.kindt.value+什么是符REliable,INtelligent&Scalable•classToken{charkind;doublevalue;什么是符REliable,INtelligent&Scalable•classToken{charkind;doublevalue;用于数字数//从一个字符创建符:kind(ch),value(0){}Token(charch,double:kind(ch),value(val){//从一个字符和一个doubleTokent;t.kind='8';t.value=Tokenut;//Token的行为与内置类型很像,例如cout<<什么是符REliable,INtelligent&Scalable•classToken{什么是符REliable,INtelligent&Scalable•classToken{charkind;doublevalue;用于数字数//从一个字符创建符:kind(ch),value(0){}Token(charch,double:kind(ch),value(val){//从一个字符和一个double•––//“kind”‘+’来创建对//使用“kind”‘8’和值4.5来创建对和——第一个版REliable,INtelligent&Scalable和——第一个版REliable,INtelligent&ScalableExpression‘-’Termdouble{doubleleft=expression();Tokent=get_token();switch(t.kind)//读入和计算//获取下一个//查看符号的case'+':returnleft+case'-':returnleft-term();//读入并计算Term,然后执行加//读入并计算Term,然后执行减return//返回Expression的}}和——第二个版REliable,INtelligent&Scalable和——第二个版REliable,INtelligent&ScalableExpression‘-’Termdouble{doubleleft=term();Tokent=get_token();switch(t.kind)//获取下一个//查看符号的casereturnleftexpression();读入并计算Expression,然后执returnleft;返回Expression的}}和——第三个版REliable,INtelligent&Scalable和——第三个版REliable,INtelligent&ScalableExpression‘-’Termdouble{doubleleft=term();while(true){Tokent=get_token();switch(t.kind){case'+':left+=term();break;case'-':left-=term();break;default:returnleft;}}}//读入和计算Expression://获取开头的//获取下一个符号//…并对其执行正确的操//返回Expression的*、第一个版REliable,INtelligent&Scalable*、第一个版REliable,INtelligent&ScalableTerm'/'Term'%'double//就像expression()一样,但是用于处理*,/,和{doubleleft=primary();while(true){Tokent=获取//获取下一个符号switch{casecase}left*=primary();break;left/=primary();break;left%=primary();return返回}}*、第二个版REliable,INtelligent&Scalable*、第二个版REliable,INtelligent&ScalableTerm'/'Primarydouble{doubleleft=primary();while(true){Tokent=get_token();switch(t.kind){//就像expression()一样,但是用于处理*,/,和获取//获取下一个符号casecase'/':left*=primary();break;left/=primary();break;returnleft;返回}}}*、第三个版REliable,INtelligent&Scalable*、第三个版REliable,INtelligent&ScalableTerm'/'Primarydouble//就像expression()一样,但是用于处理*,/,和{doubleleft=primary();while(true){Tokent=获取//获取下一个符号switch{casecaseleft*=primary();{doubled=if(d==0)error("dividebyzero");left/=d;break;}return返回}}}处理数字和符REliable,INtelligent&Scalable'('Expressiondouble处理数字和符REliable,INtelligent&Scalable'('Expressiondoubleprimary()Expression{Tokent=get_token();switch(t.kind){case‘(’expression{doubled=t=if(t.kind!=')')error("')'expected");returnd;}casereturn//我们使用‘8’表示种类为error("primary}}程序组REliable,INtelligent&Scalable程序组REliable,INtelligent&Scalable程REliable,INtelligent&Scalable#include//Token部程REliable,INtelligent&Scalable#include//Token部分(下节课介绍doubleexpression();//这里声明是为了让primary()可以调用doubleprimary(){/*…*/}doubleterm(){/*…*/}doubleexpression(){/*…*/}//处理数字和*不包括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;}运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;}}}//读入和计算Expression://获取开头的//获取下一个符号//…并对其执行正确的操//返回Expression的和REliable,INtelligent&Scalable放回到哪里当然是和REliable,INtelligent&Scalable放回到哪里当然是“输入”;也•double{doubleleft=term();while(true){Tokent=处理和//“符号流”获取下一个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;//将未使用的符号放回到输入流}}}程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();//将符号放回到输计}}异常处理符号REliable,INtelligent&Scalable•••Token_stream读入字符,按照需要产生符号REliable,INtelligent&Scalable•••Token_stream读入字符,按照需要产生Token_stream“缓存”来保存放回的符号Token_streamInput是“其他函数”的工作,然后将+放回到Token_stream中稍后expression()+••Token_streamInput符号REliable,INtelligent&Scalable•自定义类型–get()和classToken_stream符号REliable,INtelligent&Scalable•自定义类型–get()和classToken_streamToken//创建一个从cin读//获取一个符号(get()是在其他地方定义的voidputback(Token//将一个符号boolToken//这个符号在缓存//我们将使用putback()放回的符号放在符号REliable,INtelligent&Scalable•–:full(false),{}//符号REliable,INtelligent&Scalable•–:full(false),{}//Token•voidToken_stream::putback(Token{if(full

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论