关于计算器的简单实现和简单变量赋值

#include <stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
#include <vector>
#include <ctype.h>
using namespace std;
vector<float>Double;
vector<string>Char;
float ivalue(const char str[], int len, int &j)
{
 int i = 0;
 char moto[10];
 while (isdigit(str[j]) || str[j] == '.')
 {
  moto[i] = str[j];
  i++; j++;
 }
 moto[i] = 0;
 return atof(moto);
}
int isStack(string str)
{
 for (int i = 0; i < Char.size(); i++)
 {
  if (str == Char[i])return i;
 }
 return -1;
}
float STR(const char str[], int len, int &j)
{
 string add;
 while (1)
 {
  add.clear();
  while (isalpha(str[j]))
  {
   add += str[j];
   j++;
  }
  if (str[j] == ' ')j++;
  if (add == "int" || add == "double")
  {
   if (isalpha(str[j]))
   {
    add.clear();
    while (isalpha(str[j]))
    {
     add += str[j];
     j++;
    }
    Char.push_back(add);
    j++;
   }
   Double.push_back(ivalue(str, len, j));
   if (j == len - 1 && str[j] == ';')return-1;
   else if (str[j] == ';') j++;
  }
  else if (isStack(add) != -1)
  {
   return isStack(add);
  }
  else
  {
   return -1;
  }
 }
}
char Precede(char a, char b)
{
 if ((a == '+' || a == '-') && (b == '*' || b == '%' || b == '/'))return '<';
 else if ((a == '+' || a == '-') && (b == '+' || b == '-'))return '>';
 if (a == '('&&b == ')') { return '='; }
 else if (a == '(') { return '<'; }
 else if (b == ')') { return '>'; }
 if (b == '(') { return '<'; }
 if ((a == '*' || a == '%' || a == '/') && (b != '('))return '>';
}
float opreator(float number1, char a, float number2)
{
 switch (a)
 {
 case '+': return number1 + number2;
 case '-': return number1 - number2;
 case '*': return number1 * number2;
 case '/': return int(number1) / int(number2);
 case '%': return int(number1) % int(number2);
 }

}
float change(const char str[], int len)
{
 vector<float> OPND;    //默认初始化,vec1为空
 vector<char>OPTR;
 int i = 0;
 char a;
 int temp;
 float number1, number2;
 
 while (1)
 {
  if (isdigit(str[i])) { OPND.push_back(ivalue(str, len, i)); continue; }
  else if (isalpha(str[i]))
  {
   temp = STR(str, len, i);
   if (temp != -1)OPND.push_back(Double.at(temp));
   else {
    cout << "this is no find";
    return 0;
   }
   continue;
  }
  if (OPTR.size() == 0 && (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '%'))
  { OPTR.push_back('('); OPTR.push_back(str[i]); i++; continue; }
  else if (OPTR.size() == 0) { OPTR.push_back('('); continue; }
  if (str[i] == 0)
  {
   switch (Precede(OPTR.back(), ')'))
   {
   case '>':
    number2 = OPND.back();
    OPND.pop_back();
    number1 = OPND.back();
    OPND.pop_back();
    a = OPTR.back();
    OPTR.pop_back();
    OPND.push_back(opreator(number1, a, number2));
    break;
   case '=':
    OPTR.pop_back();
    break;
   }
  }
  else {
   switch (Precede(OPTR.back(), str[i]))
   {
   case '<':
   {
    if (i <= len) {
     OPTR.push_back(str[i]);
     i++;
    }
    break;
   }
   case '>':
    number1 = OPND.back();
    OPND.pop_back();
    number2 = OPND.back();
    OPND.pop_back();
    a = OPTR.back();
    OPTR.pop_back();
    OPND.push_back(opreator(number2, a, number1));
    break;
   case '=':
    OPTR.pop_back();
    i++;
    break;

   }
  }
  if (str[i] == 0 && OPND.size() == 1 && OPTR.size() == 0)break;
 }
  number1 = OPND.front();
 OPND.~vector();
 OPTR.~vector();
 return number1;
}
此函数封装好,返回出结果值

猜你喜欢

转载自blog.csdn.net/qq_41111491/article/details/80822521