⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculat.cpp

📁 这是c++编程方面的名著的例子代码
💻 CPP
字号:
#include <calculat.h>#include <strstream.h>calculator::calculator(String Input) : query_processor(Input){    char Character;    Result = 0;    Character = '0';    strcpy(FunctionResult,"");    while(Character <= '9')    {
	  ValidNumbers.insert(Character);	  ValidOperands.insert(Character);	  ValidCharacters.insert(Character);  	  Character++;    }    ValidOperators.insert('*');    ValidOperators.insert('-');    ValidOperators.insert('+');    ValidOperators.insert('/');    Character = 'a';    while(Character <= 'z')    {
	  ValidLetters.insert(Character);
	  ValidCharacters.insert(Character);
	  Character++;
    }
    Character = 'A';
    while(Character < 'Z')
    {
	  ValidLetters.insert(Character);
	  ValidCharacters.insert(Character);
	  Character++;
    }
    ValidCharacters.insert(' ');
    ValidCharacters.insert('.');
    ValidCharacters.insert(')');
    ValidCharacters.insert('(');
    ValidCharacters.insert('*');
    ValidCharacters.insert('/');
    ValidCharacters.insert('+');
    ValidCharacters.insert('-');

    ValidFunctions.insert("tan");
    ValidFunctions.insert("sqr");
    ValidFunctions.insert("log");
    ValidFunctions.insert("sin");
    ValidFunctions.insert("cos");
    ValidFunctions.insert("acos");
    ValidFunctions.insert("atan");
    ValidFunctions.insert("asin");

}

calculator::calculator(String Input,VSet VOperands,
				VSet VOperators,
				VSet VFunctions,
				VSet VCharacters,
				VSet VLetters,
				VSet VNumbers) : query_processor(Input,VOperands,
								       VOperators,
								       VFunctions,
								       VCharacters,
								       VLetters,
								       VNumbers)
{

   Result = 0;}

calculator::calculator(void)
{
    char Character;
    Result = 0;
    Character = '0';
    strcpy(FunctionResult,"");
    while(Character <= '9')
    {

	  ValidNumbers.insert(Character);
	  ValidOperands.insert(Character);
	  ValidCharacters.insert(Character);
	  Character++;
    }
    ValidOperators.insert('*');
    ValidOperators.insert('-');
    ValidOperators.insert('+');
    ValidOperators.insert('/');
    Character = 'a';
    while(Character <= 'z')
    {
	  ValidCharacters.insert(Character);
	  ValidLetters.insert(Character);
	  Character++;
    }
    Character = 'A';
    while(Character < 'A')
    {
	  ValidLetters.insert(Character);
	  ValidCharacters.insert(Character);
	  Character++;
    }
    ValidCharacters.insert(' ');
    ValidCharacters.insert('.');
    ValidCharacters.insert(')');
    ValidCharacters.insert('(');
    ValidCharacters.insert('*');
    ValidCharacters.insert('/');
    ValidCharacters.insert('+');
    ValidCharacters.insert('-');

    ValidFunctions.insert("tan");
    ValidFunctions.insert("sqr");
    ValidFunctions.insert("log");
    ValidFunctions.insert("sin");
    ValidFunctions.insert("cos");
    ValidFunctions.insert("acos");
    ValidFunctions.insert("atan");
    ValidFunctions.insert("asin");


}

void calculator::evaluate(void)
{
   list<expression_component>::iterator X;
   X = ExpressionTokens.begin();
   expression_component Temp;
   expression_component Stacktop;
   expression_component Answer;
   double Value;
   while(X != ExpressionTokens.end())
   {
       Temp = *X;
       if(Temp.isOperand()){
	  OperandStack.push(Temp);
       }
       else{
	     if(Temp.op() == '('){
		OperatorStack.push(Temp);
	     }
	      else{
		    if(Temp.op() == ')'){
		       processCloseParenthesis();
		    }
		    else{

			  if(OperatorStack.empty()){
			     OperatorStack.push(Temp);
			  }
			  else{
				    Stacktop = OperatorStack.top();
				    if(Temp.opType() > Stacktop.opType()){
				       OperatorStack.push(Temp);
				    }
				    else{
					  OperatorStack.pop();
					   Value = processOperator(Stacktop);
					   Answer.isOperand(1);
					   Answer.value(Value);
					   OperandStack.push(Answer);
					   OperatorStack.push(Temp);
				    }
			  }
		    }
	      }
       }
       X++;
   }
   while(!OperatorStack.empty())
   {
       Temp = OperatorStack.top();
       OperatorStack.pop();
       Value = processOperator(Temp);
       Temp.isOperand(1);
       Temp.value(Value);
       OperandStack.push(Temp);
   }
   Answer = OperandStack.top();
   OperandStack.pop();
   Result = Answer.value();

}

void calculator::processCloseParenthesis(void)
{
    expression_component Temp;
    double Value;
    while(Temp.op() != '(')
    {
	Temp = OperatorStack.top();
	OperatorStack.pop();
	if(Temp.op() != '('){
	   Value = processOperator(Temp);
	   Temp.isOperand(1);
	   Temp.value(Value);
	   OperandStack.push(Temp);
	}
    }
}

double calculator::processOperator(expression_component Operator)
{

     expression_component Temp1;
     expression_component Temp2;

     switch(Operator.op())
     {

	 case '+' : Temp2 = OperandStack.top();
		    OperandStack.pop();
		    Temp1 = OperandStack.top();
		    OperandStack.pop();
		    return(Temp1.value() + Temp2.value());

	 case '-' : Temp2 = OperandStack.top();
		    OperandStack.pop();
		    Temp1 = OperandStack.top();
		    OperandStack.pop();
		    return(Temp1.value() - Temp2.value());

	case '*' :  Temp2 = OperandStack.top();
		    OperandStack.pop();
		    Temp1 = OperandStack.top();
		    OperandStack.pop();
		    return(Temp1.value() * Temp2.value());
	case '/' :  Temp2 = OperandStack.top();
		    OperandStack.pop();
		    Temp1 = OperandStack.top();
		    OperandStack.pop();
		    if(Temp2.value() != 0){
		       return(Temp1.value() / Temp2.value());
		    }
		    else{
			  ValidExpression = 0;
			  return(0);
		    }
       case '@'   : Temp1 = OperandStack.top();
		    OperandStack.pop();
		    return(Operator.function(Temp1.value()));
	 default:  break;
       }
       return(0);
}


double calculator::result(void)
{
    return(Result);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -