课程设计报告.docx

上传人:b****6 文档编号:7275823 上传时间:2023-01-22 格式:DOCX 页数:9 大小:42.11KB
下载 相关 举报
课程设计报告.docx_第1页
第1页 / 共9页
课程设计报告.docx_第2页
第2页 / 共9页
课程设计报告.docx_第3页
第3页 / 共9页
课程设计报告.docx_第4页
第4页 / 共9页
课程设计报告.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

课程设计报告.docx

《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(9页珍藏版)》请在冰豆网上搜索。

课程设计报告.docx

课程设计报告

课程设计报告

作者:

刘英华

1.执行过程分析

算术表达式中会含有0123456789等数字字符;+,-,*,/,%,(,)等运算符。

不能含有上述以外的其他字符。

遍历算术表达式所有字符:

✓若当前字符为非上述字符,则返回错误。

✓若当前字符是左括号'(',则入栈,等待匹配后面的右括号’)’。

✓若当前字符是右括号’)’,则出栈,做当前栈顶不是左括号'(',则返回错误,否则匹配正确。

✓若当前字符是’+’或’-’,检查后面相邻字符,若仍然是运算符,则返回错误,否则正确。

✓若当前字符是’*’或’/’或’%’,检查前后相邻字符,若仍然是运算符,则返回错误,否则正确。

✓若当前字符是小数点’.’,检查前后相邻字符是否为阿拉伯数字,若不是,则返回错误,否则正确。

2.流程图

3.设计中遇到的问题及解决思路、办法

3.1解决思路

分析正常数学表达式的逻辑运算。

数字的匹配原则。

运算符的匹配原则。

3.2问题

不知把要匹配的字符存储,然后匹配时再准确取出。

3.3解决办法

运用栈的思想解决了。

4.其他

//头文件MathString.h

classCMathString

{

public:

CMathString(void);

CMathString(consttstring&str);

~CMathString(void);

public:

//存放波兰表达式的结构

structBolan

{

intm_nFlag;//0:

数值;1:

运算符

doublem_dValue;//数值

TCHARm_chOper;//运算符"+,-,*,/,%,(,)"

};

typedefstd:

:

vector

:

pair>CVecChar2Pos;

typedefstd:

:

vectorCVecBolan;

public:

//检查算术表达式是否正确匹配.

//return:

错误(不匹配)返回,正确返回非.

boolCheckMathExp();

//获取错误描述

consttstring&GetErrDesc()const;

//获取错误位置

intGetErrPos()const;

private:

//类似printf的方式创建一个格式化的字符串。

请注意不要超过个字节,否则将会造成越界崩溃.

//返回一个格式化后的字符串.

tstringCreateFormatStr(constTCHAR*lpszFormat,...)const;

//获取字符串的最后一个字符.

TCHARGetEndChar(consttstring&str)const;

TCHARGetEndChar(constCVecChar2Pos&vecPair)const;

//获取字符串某位置前面相邻字符,nPos基于开始.

TCHARGetPreChar(consttstring&str,intnPos)const;

//获取字符串某位置后面相邻字符,nPos基于开始.

TCHARGetNextChar(consttstring&str,intnPos)const;

//出栈

voidPopStack(tstring&str,intnCount=1)const;

//判断字符是否为操作符

boolIsOperator(TCHARch)const;

//判断字符是否为数字

boolIsDigit(TCHARch)const;

//将算术表达式转化成波兰表达式

boolStringToBolan();

//将数字字符串转化成数值

boolStringToDigit(tstringstr,double&dValue);

private:

//算术表达式

tstringm_strMathExp;

//表达式错误(不匹配)位置

intm_nErrPos;

//错误(不匹配)描述

tstringm_strErrDesc;

//存放转化后的波兰表达式

CVecBolanm_vecBolan;

};

//执行文件MathString.cpp

boolCMathString:

:

CheckMathExp()

{

if(m_strMathExp.empty())//若算术表达式为空,返回false

{

m_strErrDesc=_T("算术表达式为空!

");

returnfalse;

}

//存放括号'('的栈

CVecChar2Posstack;

for(std:

:

string:

:

size_typeix=0;ix!

=m_strMathExp.size();++ix)

{

m_nErrPos=(int)ix;

TCHARch=m_strMathExp[ix];

if(ch==_T('('))//若是左括号'(',则入栈

{

stack.push_back(std:

:

make_pair(ch,ix));

}

elseif(ch==_T(')'))

{

if(GetEndChar(stack)==_T('('))//若栈的顶端字符为'(',则匹配,出栈

{

stack.pop_back();

}

else//若栈的顶端字符为非'(',不匹配,返回false

{

m_strErrDesc=CreateFormatStr(_T("\n错误:

没找到与位置%d处的操作符')'相匹配的操作符'('!

"),m_nErrPos);

returnfalse;

}

}

elseif(ch==_T('+')||ch==_T('-'))//若是'+'或'-',检查后面相邻字符

{

TCHARchTmp=GetNextChar(m_strMathExp,ix);

if(chTmp==_T('\0')||IsOperator(chTmp))

{

m_strErrDesc=CreateFormatStr(_T("\n错误:

位置%d处的操作符'%c'没有右值!

"),m_nErrPos,ch);

returnfalse;

}

}

elseif(ch==_T('*')||ch==_T('/')||ch==_T('%'))//若是'*'或'/'或'%',检查前后相邻字符

{

TCHARchTmp=GetPreChar(m_strMathExp,ix);

if(chTmp==_T('\0')||IsOperator(chTmp))

{

m_strErrDesc=CreateFormatStr(_T("\n错误:

位置%d处的操作符'%c'没有左值!

"),m_nErrPos,ch);

returnfalse;

}

chTmp=GetNextChar(m_strMathExp,ix);

if(chTmp==_T('\0')||IsOperator(chTmp))

{

m_strErrDesc=CreateFormatStr(_T("\n错误:

位置%d处的操作符'%c'没有右值!

"),m_nErrPos,ch);

returnfalse;

}

}

elseif(ch==_T('.'))//若是小数点('.'),检查前后相邻字符是否为阿拉伯数字

{

TCHARchTmp=GetPreChar(m_strMathExp,ix);

if(!

IsDigit(chTmp))

{

m_strErrDesc=CreateFormatStr(_T("\n错误:

位置%d处的小数点前面没有左值!

"),m_nErrPos);

returnfalse;

}

chTmp=GetNextChar(m_strMathExp,ix);

if(!

IsDigit(chTmp))

{

m_strErrDesc=CreateFormatStr(_T("\n错误:

位置%d处的小数点前面没有右值!

"),m_nErrPos);

returnfalse;

}

}

elseif(!

IsDigit(ch))//若为暂不能识别的字符

{

m_strErrDesc=CreateFormatStr(_T("\n错误:

当前暂不能识别%d处的符号'%c'!

"),m_nErrPos,ch);

returnfalse;

}

}

//判断栈里是否还存有'('

CVecChar2Pos:

:

const_reverse_iteratorit=stack.rbegin();

if(it!

=stack.rend())

{

m_strErrDesc=CreateFormatStr(_T("\n错误:

没找到与位置%d处的操作符'('相匹配的操作符')'!

"),it->second);

returnfalse;

}

returntrue;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1