1、课程设计报告课程设计报告 作者:刘英华1执行过程分析算术表达式中会含有0123456789等数字字符;+,-,*,/,%,(,)等运算符。不能含有上述以外的其他字符。遍历算术表达式所有字符: 若当前字符为非上述字符,则返回错误。 若当前字符是左括号(,则入栈,等待匹配后面的右括号)。 若当前字符是右括号),则出栈,做当前栈顶不是左括号(,则返回错误,否则匹配正确。 若当前字符是+或-,检查后面相邻字符,若仍然是运算符,则返回错误,否则正确。 若当前字符是*或/或%,检查前后相邻字符,若仍然是运算符,则返回错误,否则正确。 若当前字符是小数点.,检查前后相邻字符是否为阿拉伯数字,若不是,则返回错
2、误,否则正确。2.流程图3.设计中遇到的问题及解决思路、办法3.1解决思路分析正常数学表达式的逻辑运算。数字的匹配原则。运算符的匹配原则。3.2问题不知把要匹配的字符存储,然后匹配时再准确取出。3.3解决办法运用栈的思想解决了。4.其他/ 头文件MathString.hclass CMathStringpublic: CMathString(void); CMathString(const tstring& str); CMathString(void);public: / 存放波兰表达式的结构 struct Bolan int m_nFlag; / 0: 数值; 1: 运算符 double
3、m_dValue; / 数值 TCHAR m_chOper; / 运算符+,-,*,/,%,(,) ; typedef std:vectorstd:pair CVecChar2Pos; typedef std:vector CVecBolan;public: / 检查算术表达式是否正确匹配. / return: 错误(不匹配)返回,正确返回非. bool CheckMathExp(); / 获取错误描述 const tstring& GetErrDesc() const; / 获取错误位置 int GetErrPos() const;private: / 类似printf的方式创建一个格式化的
4、字符串。请注意不要超过个字节,否则将会造成越界崩溃. / 返回一个格式化后的字符串. tstring CreateFormatStr(const TCHAR* lpszFormat, .) const; / 获取字符串的最后一个字符. TCHAR GetEndChar(const tstring& str) const; TCHAR GetEndChar(const CVecChar2Pos& vecPair) const; / 获取字符串某位置前面相邻字符,nPos基于开始. TCHAR GetPreChar(const tstring& str, int nPos) const; / 获取
5、字符串某位置后面相邻字符,nPos基于开始. TCHAR GetNextChar(const tstring& str, int nPos) const; / 出栈 void PopStack(tstring& str, int nCount = 1) const; / 判断字符是否为操作符 bool IsOperator(TCHAR ch) const; / 判断字符是否为数字 bool IsDigit(TCHAR ch) const; / 将算术表达式转化成波兰表达式 bool StringToBolan(); / 将数字字符串转化成数值 bool StringToDigit(tstrin
6、g str, double& dValue);private: / 算术表达式 tstring m_strMathExp; / 表达式错误(不匹配)位置 int m_nErrPos; / 错误(不匹配)描述 tstring m_strErrDesc; / 存放转化后的波兰表达式 CVecBolan m_vecBolan;/ 执行文件MathString.cppbool CMathString:CheckMathExp() if ( m_strMathExp.empty() ) / 若算术表达式为空,返回false m_strErrDesc = _T(算术表达式为空!); return fals
7、e; / 存放括号(的栈 CVecChar2Pos stack; for ( std:string:size_type ix = 0; ix != m_strMathExp.size(); +ix ) m_nErrPos = (int)ix; TCHAR ch = m_strMathExpix; if ( ch = _T() ) / 若是左括号(,则入栈 stack.push_back(std:make_pair(ch, ix); else if ( ch = _T() ) if ( GetEndChar(stack) = _T() ) / 若栈的顶端字符为(,则匹配,出栈 stack.pop
8、_back(); else / 若栈的顶端字符为非(,不匹配,返回false m_strErrDesc = CreateFormatStr(_T(n错误:没找到与位置%d处的操作符)相匹配的操作符(!), m_nErrPos); return false; else if ( ch = _T(+) | ch = _T(-) ) / 若是+或-,检查后面相邻字符 TCHAR chTmp = GetNextChar(m_strMathExp, ix); if ( chTmp = _T(0) | IsOperator(chTmp) ) m_strErrDesc = CreateFormatStr(_
9、T(n错误:位置%d处的操作符%c没有右值!), m_nErrPos, ch); return false; else if ( ch = _T(*) | ch = _T(/) | ch = _T(%) ) / 若是*或/或%,检查前后相邻字符 TCHAR chTmp = GetPreChar(m_strMathExp, ix); if ( chTmp = _T(0) | IsOperator(chTmp) ) m_strErrDesc = CreateFormatStr(_T(n错误:位置%d处的操作符%c没有左值!), m_nErrPos, ch); return false; chTmp
10、 = GetNextChar(m_strMathExp, ix); if ( chTmp = _T(0) | IsOperator(chTmp) ) m_strErrDesc = CreateFormatStr(_T(n错误:位置%d处的操作符%c没有右值!), m_nErrPos, ch); return false; else if ( ch = _T(.) ) / 若是小数点(.),检查前后相邻字符是否为阿拉伯数字 TCHAR chTmp = GetPreChar(m_strMathExp, ix); if ( !IsDigit(chTmp) ) m_strErrDesc = Creat
11、eFormatStr(_T(n错误:位置%d处的小数点前面没有左值!), m_nErrPos); return false; chTmp = GetNextChar(m_strMathExp, ix); if ( !IsDigit(chTmp) ) m_strErrDesc = CreateFormatStr(_T(n错误:位置%d处的小数点前面没有右值!), m_nErrPos); return false; else if ( !IsDigit(ch) ) / 若为暂不能识别的字符 m_strErrDesc = CreateFormatStr(_T(n错误:当前暂不能识别%d处的符号%c!), m_nErrPos, ch); return false; / 判断栈里是否还存有( CVecChar2Pos:const_reverse_iterator it = stack.rbegin(); if ( it != stack.rend() ) m_strErrDesc = CreateFormatStr(_T(n错误:没找到与位置%d处的操作符(相匹配的操作符)!), it-second); return false; return true;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1