计算器+QT+VS2013

  • z8_740772
    了解作者
  • 7.9MB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-15 05:47
    上传日期
1、能科学计算器所有功能 2、基于QT开发的 3、使用正则表达式对公式进行开发
calculator .zip
内容介绍
#include"Calc.h" #include<cmath> #include<qmath.h> #include<QRegExp> #include<QSettings> CCalculator::CCalculator():m_curIndex(0){} int CCalculator::TransExp(QString &express) { m_curIndex = 0; //当前字符所指位置 if(!IsValid(express)) //检查字符串中是否存在异常字符 {return RET_WRONG;} unsigned int size,len=0,i; short countBack=0; //记录小括号是否匹配 size=express.length(); QChar charray[2000]; QString str; //对不同进制的数进行预处理 if(isChangeSystem) { for(i=0;i<size&&countBack>=0;i++) { if(isHexNumber(express[i])) { int position = i,res=0; str=""; do{ if(express[i]==' ') {i++;continue;} if(oldSystem!=16&&express[i].isUpper()) { ERRORBEGIN=i; return RET_UPPERLETTER; } str+=express[i++]; }while(i<size&&isHexNumber(express[i])); if(oldSystem==10) { res=str.length(); for(int k=0;k<res;k++) charray[len++]=str[k]; } str=changeSystem(str,newSystem,oldSystem); express.replace(position,i-position,str); size=express.length(); i=position+str.length()-1; if(oldSystem!=10) { if(newSystem!=10) str=changeSystem(str,10,newSystem); res=str.length(); for(int k=0;k<res;k++) charray[len++]=str[k]; } } else { if(express[i].isUpper()) { ERRORBEGIN=i; return RET_UPPERLETTER; } charray[len++]=express[i]; if(express[i]=='(') countBack++; else if(express[i]==')') countBack--; } } } else if(newSystem!=10) { for(i=0;i<size&&countBack>=0;i++) { if(isHexNumber(express[i])) { str=""; do{ if(express[i]==' ') {i++;continue;} if(oldSystem!=16&&express[i].isUpper()) { ERRORBEGIN=i; return RET_UPPERLETTER; } str+=express[i++]; }while(i<size&&isHexNumber(express[i])); int res; if(isErrorNumber(str,newSystem)) return RET_NUMBER; str=changeSystem(str,10,newSystem); res=str.length(); for(int k=0;k<res;k++) charray[len++]=str[k]; i--; } else { if(express[i].isUpper()) { ERRORBEGIN=i; return RET_UPPERLETTER; } charray[len++]=express[i]; if(express[i]=='(') countBack++; else if(express[i]==')') countBack--; } } } else { for(i=0;i<size&&countBack>=0;i++) { if(express[i].isUpper()) {ERRORBEGIN=i;return RET_UPPERLETTER;} else { charray[len++]=express[i]; if(express[i]=='(') countBack++; else if(express[i]==')') countBack--; } } } m_strExp=QString(charray); if(countBack!=0) { if(countBack<0) {ERRORBEGIN=i-1;} else { for(i=0;i<size;i++) if(express[i]=='(') {ERRORBEGIN=i;break;} } return RET_BACK; } //括号不匹配 if(Check_Start()==RET_START) //表达式开头有错 return RET_START; if(Check_Last()==RET_LAST) //表达式结尾有错 return RET_LAST; Symbol sym; QQueue<Symbol> que; int ret; while((ret=GetNextSymbol(que,sym))!=RET_END) { if(ret!=RET_CORRECT) {return ret;} } //中缀式转换成后缀式 Symbol symTop; QStack<Symbol> stk; //存放操作符和函数的栈 //将‘#’压入栈底 symTop.type=Symbol::OPERATOR; symTop.content.opType=Symbol::STACKEND; stk.push(symTop); while(!que.empty()) { symTop=que.head(); que.dequeue(); if(symTop.type==Symbol::NUMBER) {//操作数直接入队列 QueSymbol.enqueue(symTop); continue; } else if(symTop.type==Symbol::FUNCTION) {//函数入操作符栈 stk.push(symTop); continue; } //以下均为Symbol::OPERATOR的情况 else if(symTop.content.opType==Symbol::LEFTBRACE) {//'('入操作符栈 stk.push(symTop); continue; } else if(symTop.content.opType==Symbol::FACTORIAL||symTop.content.opType==Symbol::PERCENT) {//单目运算符直接入队列 if(!stk.empty()&&stk.top().type==Symbol::FUNCTION) {QueSymbol.enqueue(stk.top()); stk.pop();} QueSymbol.enqueue(symTop); continue; } else if(symTop.content.opType==Symbol::RIGHTBRACE) {//遇到')',弹出操作符,直到'(' while(stk.top().type==Symbol::FUNCTION|| stk.top().content.opType!=Symbol::LEFTBRACE) { QueSymbol.enqueue(stk.top()); stk.pop(); } stk.pop(); //将'('弹出栈 continue; } else if(symTop.content.opType==Symbol::COMMA) {//遇到‘,’,弹出操作符,直到‘(’ while(stk.top().type==Symbol::FUNCTION|| stk.top().content.opType!=Symbol::LEFTBRACE) { QueSymbol.enqueue(stk.top()); stk.pop(); } stk.push(symTop); continue; } else if(!CompPri(stk.top(),symTop)) { stk.push(symTop); continue; } else { do { QueSymbol.enqueue(stk.top()); stk.pop(); }while(CompPri(stk.top(),symTop)); stk.push(symTop); } } while(!stk.empty()) { QueSymbol.enqueue(stk.top()); stk.pop(); } return RET_CORRECT; } int CCalculator::GetNextSymbol(QQueue<Symbol>&que,Symbol &sym) { int size=m_strExp.length(); if( m_curIndex >=size) return RET_END; QChar ch=m_strExp[m_curIndex]; while(ch==' ') {ch=m_strExp[++m_curIndex];} if(ch=='$')//常量 { QString str; ERRORLENGTH=0; do { if(ch!=' ')str+=ch; m_curIndex++,ERRORLENGTH++; if(m_curIndex>=size) break; else ch=m_strExp[m_curIndex]; }while(ch.isLetterOrNumber()||ch==' '); double temp; int lower =0,upper = 12,mid; while( lower <=upper ) {//二分法查找常量 mid = (lower+upper)/2;
评论
    相关推荐
    • 正则表达式
      利用正则表达式匹配字符串,找到符合规律的字符串,这里包括多种匹配方式,如匹配出现两个相同字母的单词,或有某个后缀的单词等
    • 正则表达式
      正则表达式简介  为什么需要正则表达式?  文本的复杂处理。  正则表达式的优势和用途?  一种强大而灵活的文本处理工具;  提供了一种紧凑的、动态的方式,能够以一种完全通用的方式来解决各种字符串...
    • 正则表达式
      多个正则表达式资料,较全面,要的人块下手哦。多个正则表达式资料,较全面,要的人块下手哦。
    • 正则表达式
      《精通正则表达式(第3版)》主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施。
    • 正则表达式
      正则表达式的学习很有用,是个值得学习的知识点,在很多编程中的都用得到的一项技巧
    • 正则表达式
      正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。
    • 正则表达式
      利用此工具,输入正则表达式之后则可以进行验证其正确性,进而大大提高了使用正则表达式的准确性
    • 正则表达式
      正则表达式调试器是一个小软件,用于调试自己编写的正则表达式正确与否。输入正则表达式和自己需要匹配的内容就可以了。很好用的。
    • 正则表达式
      都是讲的关于正则表达式的一些整理过的资料 对想了解这方面或想学习这方面人来说 就是世纪福音呀 好东东
    • 正则表达式
      正则表达式是一个程序员不得不掌握的利器。本资源收藏了目前最好的几个正则表达式文章,大家有空可以看看!