values.cpp

来自「数据结构与程序设计教材源码 数据结构与程序设计教材源码」· C++ 代码 · 共 238 行

CPP
238
字号
double trunc(const double &v)
{
   double ans;
   if (v >= 0.0)
      ans = (double) ((int) v);
   else
      ans = - ((double) ((int) (-v)));
   return ans;
}
 
double round(const double &v)
{
   if (v >= 0.0) return (double) ((int) (v + 0.5));
   else return -round(-v);
}
 
double factorial(const double &v)
{
   double temp = v;
   double ans = temp;
   while (temp >= 2.0) {
      temp = temp - 1.0;
      ans *= temp;
   }
   while (temp <= 0.0) {
      temp = temp + 1.0;
      ans *= temp;
   }
   return ans;
}
 
double percent(const double &v)
{
   double ans;
   ans = v / 100.0;
   return ans;
}
 
double cos(const double &v)
{
   double ans = 1.0;
   double temp = v*v;
   double ct = 3.0;
   double mult = -temp/2.0;
   while (mult > 0.00001 || mult < -0.00001) {
     ans += mult;
     mult *= temp;
     mult /= ct;
     ct = ct + 1;
     mult /= ct;
     ct = ct + 1;
     mult = -mult;
   }
   return ans;
}
 
double sin(const double &v)
{
   double ans = 0.0;
   double temp = v;
   double ct = 1.0;
   double mult = temp;
   while (mult > 0.00001 || mult < -0.00001) {
     ans += mult;
     ct = ct + 1;
     mult *= temp;
     mult /= ct;
     ct = ct + 1;
     mult *= temp;
     mult /= ct;
     mult = -mult;
   }
   return ans;
}
 
double arctan(const double &v)
{
   double ans = 0.0;
   bool negative= false;
   double temp = v;
   if (v < 0) {
      negative= true;
      temp = -v;
   }
   bool recip = false;
   if (temp > 1.0) {
     recip = true;
     temp = 1.0/temp;
   }

   double ct = 1.0;
   double mult = temp;
   temp = temp * temp;
   double sign = 1.0;
   while (mult > 0.00001) {
     ans += sign*mult/ct;
     ct = ct + 2;
     sign = -sign;
     mult *= temp;
   }

   if (recip) {
      ans = 3.141592/ 2.0 - ans;
   }
   if (negative) {
      ans = - ans;
   }
   return ans;
}
 
double ln(const double &v)
{
   double ans = 0.0;
   double temp = v;
   if (temp <= 0.0) return 0.0;
   while (temp < 0.99999) {
      ans -= 1.0;
      temp *= 2.71828;
   }
   while (temp > 2.71829) {
      ans += 1.0;
      temp /=2.71828;
   }
   bool recip = false;
   if (2.71828/temp < temp) {
      temp = 2.71828/temp;
      recip = true;
   }
   temp = temp - 1.0;
   double ct = 1.0;
   double addon = 0.0;
   double mult = temp;
   double sign = 1.0;
   while (mult > 0.00001) {
     addon += sign*mult/ct;
     ct = ct + 1;
     sign = -sign;
     mult *= temp;
   }
   if (recip) addon = 1.0 - addon;
   ans = ans + addon;
   return ans;
}
 
double expo(const double &v)
{
   double ans = 1.0;
   double temp = v;
   double ct = 1.0;
   double mult = temp;
   while (mult > 0.00001 || mult < -0.00001) {
     ans += mult;
     ct = ct + 1;
     mult *= temp;
     mult /= ct;
   }
   return ans;
}
 
double exp(const double &v, const double &w)
{
   return expo(ln(v) * w);
}
 
Value get_value(const Token &current)
/* 
 
Pre:  Token current is an operand.
Post: The Value of current is returned.
Uses: Methods of class Token.
 
*/
{
   return current.value();
}
 
Value do_unary(Token &t, Value &v)
{
   switch (t.code_number()) {
   case 3:
      return -v;
   case 4:
      if (v < 0) return -v;
      else return v;
   case 5:
      return v*v;
   case 6:
      return exp(v, 0.5);
   case 7:
      return exp(2.71828, v);
   case 8:
      return ln(v);
   case 9:
      return ln(v)/ln(10);
   case 10:
      return sin(v);
   case 11:
      return cos(v);
   case 12:
      return arctan(v);
   case 13:
      return round(v);
   case 14:
      return trunc(v);
   case 15:
      return factorial(v);
   case 16:
      return percent(v);
   }
   return v;
}
 
Value do_binary(const Token &operation,
                const Value &first_argument, const Value &second_argument)
/* 
 
Pre:  Token operation is a binary operator.
Post: The Value of operation applied to the pair
      of Value parameters is returned.
Uses: Methods of class Token.
 
*/
{
   switch (operation.code_number()) {
   case 17:
      return first_argument + second_argument;
   case 18:
      return first_argument - second_argument;
   case 19:
      return first_argument * second_argument;
   case 20:
      return first_argument / second_argument;
   case 21:
      return exp(first_argument, second_argument);
   }
   return first_argument;
}

⌨️ 快捷键说明

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