• Skip to content
  • Skip to link menu
KDE 4.0 API Reference
  • KDE API Reference
  • kdeutils
  • Sitemap
  • Contact Us
 

kcalc

kcalc_core.h

Go to the documentation of this file.
00001 /*
00002 
00003     KCalc, a scientific calculator for the X window system using the
00004     Qt widget libraries, available at no cost at http://www.troll.no
00005 
00006     Copyright (C) 1996 Bernd Johannes Wuebben
00007                        wuebben@math.cornell.edu
00008 
00009     This program is free software; you can redistribute it and/or modify
00010     it under the terms of the GNU General Public License as published by
00011     the Free Software Foundation; either version 2 of the License, or
00012     (at your option) any later version.
00013 
00014     This program is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017     GNU General Public License for more details.
00018 
00019     You should have received a copy of the GNU General Public License
00020     along with this program; if not, write to the Free Software
00021     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00022 
00023 */
00024 
00025 #ifndef _KCALC_CORE_H
00026 #define _KCALC_CORE_H
00027 
00028 #include <QStack>
00029 #include "stats.h"
00030 #include "knumber.h"
00031 
00032 #define     POS_ZERO     1e-19L  /* What we consider zero is */
00033 #define     NEG_ZERO    -1e-19L  /* anything between these two */
00034 
00035 
00036 typedef KNumber (*Arith)(const KNumber &, const KNumber &);
00037 typedef KNumber (*Prcnt)(const KNumber &, const KNumber &);
00038 
00039 #define UNUSED(x) ((void)(x))
00040 
00041 
00042 
00043 struct operator_data {
00044   int precedence;  // priority of operators in " enum Operation"
00045   Arith arith_ptr;
00046   Prcnt prcnt_ptr;
00047 };
00048 
00049 class CalcEngine
00050 {
00051  public:
00052   // operations that can be stored in calculation stack 
00053   enum Operation {
00054     FUNC_EQUAL,
00055     FUNC_PERCENT,
00056     FUNC_BRACKET,
00057     FUNC_OR,
00058     FUNC_XOR,
00059     FUNC_AND,
00060     FUNC_LSH,
00061     FUNC_RSH,
00062     FUNC_ADD,
00063     FUNC_SUBTRACT,
00064     FUNC_MULTIPLY,
00065     FUNC_DIVIDE,
00066     FUNC_MOD,
00067     FUNC_INTDIV,
00068     FUNC_BINOM,
00069     FUNC_POWER,
00070     FUNC_PWR_ROOT
00071   };
00072 
00073   CalcEngine();
00074   
00075   KNumber lastOutput(bool &error) const;
00076 
00077   void enterOperation(KNumber num, Operation func);
00078 
00079 
00080   void ArcCosDeg(KNumber input);
00081   void ArcCosRad(KNumber input);
00082   void ArcCosGrad(KNumber input);
00083   void ArcSinDeg(KNumber input);
00084   void ArcSinRad(KNumber input);
00085   void ArcSinGrad(KNumber input);
00086   void ArcTangensDeg(KNumber input);
00087   void ArcTangensRad(KNumber input);
00088   void ArcTangensGrad(KNumber input);
00089   void AreaCosHyp(KNumber input);
00090   void AreaSinHyp(KNumber input);
00091   void AreaTangensHyp(KNumber input);
00092   void Complement(KNumber input);
00093   void CosDeg(KNumber input);
00094   void CosRad(KNumber input);
00095   void CosGrad(KNumber input);
00096   void CosHyp(KNumber input);
00097   void Cube(KNumber input);
00098   void CubeRoot(KNumber input);
00099   void Exp(KNumber input);
00100   void Exp10(KNumber input);
00101   void Factorial(KNumber input);
00102   void InvertSign(KNumber input);
00103   void Ln(KNumber input);
00104   void Log10(KNumber input);
00105   void ParenClose(KNumber input);
00106   void ParenOpen(KNumber input);
00107   void Reciprocal(KNumber input);
00108   void SinDeg(KNumber input);
00109   void SinGrad(KNumber input);
00110   void SinRad(KNumber input);
00111   void SinHyp(KNumber input);
00112   void Square(KNumber input);
00113   void SquareRoot(KNumber input);
00114   void StatClearAll(KNumber input);
00115   void StatCount(KNumber input);
00116   void StatDataNew(KNumber input);
00117   void StatDataDel(KNumber input);
00118   void StatMean(KNumber input);
00119   void StatMedian(KNumber input);
00120   void StatStdDeviation(KNumber input);
00121   void StatStdSample(KNumber input);
00122   void StatSum(KNumber input);
00123   void StatSumSquares(KNumber input);
00124   void TangensDeg(KNumber input);
00125   void TangensRad(KNumber input);
00126   void TangensGrad(KNumber input);
00127   void TangensHyp(KNumber input);
00128 
00129   void Reset();
00130  private:
00131   KStats    stats;
00132 
00133   typedef struct {
00134     KNumber number;
00135     Operation operation;
00136   } _node;
00137 
00138   // Stack holds all operations and numbers that have not yet been
00139   // processed, e.g. user types "2+3*", the calculation can not be
00140   // executed, because "*" has a higher precedence than "+", so we
00141   // need to wait for the next number.
00142   //
00143   // In the stack this would be stored as ((2,+),(3,*),...)
00144   //
00145   // "enterOperation": If the introduced Operation has lower priority
00146   // than the preceding operations in the stack, then we can start to
00147   // evaluate the stack (with "evalStack"). Otherwise we append the new
00148   // Operation and number to the stack.
00149   //
00150   // E.g. "2*3+" evaluates to "6+", but "2+3*" can not be evaluated
00151   // yet.
00152   //
00153   // We also take care of brackets, by writing a marker "FUNC_BRACKET"
00154   // into the stack, each time the user opens one.  When a bracket is
00155   // closed, everything in the stack is evaluated until the first
00156   // marker "FUNC_BRACKET" found.
00157   QStack<_node> _stack;
00158 
00159   KNumber _last_number;
00160 
00161   bool _percent_mode;
00162 
00163 
00164   static const struct operator_data Operator[];
00165 
00166   bool evalStack(void);
00167 
00168   KNumber evalOperation(KNumber arg1, Operation operation, KNumber arg2);
00169 
00170   const KNumber Deg2Rad(const KNumber &x) const
00171   { return KNumber(2) * KNumber::Pi / KNumber(360) * x; }
00172   const KNumber Gra2Rad(const KNumber &x) const
00173   { return KNumber(2)*KNumber::Pi / KNumber(400) * x; }
00174   const KNumber Rad2Deg(const KNumber &x) const
00175   { return KNumber(360) / (KNumber(2) * KNumber::Pi) * x; }
00176   const KNumber Rad2Gra(const KNumber &x) const
00177   { return KNumber(400) / (KNumber(2)*KNumber::Pi) * x; }
00178 
00179 };
00180 
00181 
00182 #endif  //_KCALC_CORE_H

kcalc

Skip menu "kcalc"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members

kdeutils

Skip menu "kdeutils"
  • ark
  • kcalc
  • kcharselect
  • kdelirc
  • kdessh
  • kdf
  • kfloppy
  • kgpg
  • kjots
  • klaptopdaemon
  • kmilo
  • ksim
  • ktimer
  • kwallet
  • superkaramba
Generated for kdeutils by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal