Website Summary Files Commits Branches @commit @diff @stats
path: root / src / Models / CellFormula.cpp
diff options
context:
space:
mode:
Commit09bf71b13d873767a400b4e3e17172ae1c2830f8 (patch)
Author
 Syndamia <kamen@syndamia.com>
2022-05-30 18:02:36 +0300
Committer
 Syndamia <kamen@syndamia.com>
2022-05-30 18:02:36 +0300
Files04ce5b3a68a1c8d85e2a530086b246b0b4aba9ba /src/Models/CellFormula.cpp
FMI-OOP-P2_Tables-09bf71b13d873767a400b4e3e17172ae1c2830f8.tar
FMI-OOP-P2_Tables-09bf71b13d873767a400b4e3e17172ae1c2830f8.tar.gz
FMI-OOP-P2_Tables-09bf71b13d873767a400b4e3e17172ae1c2830f8.zip
Parent272f317bb0817ec46ecfae9696457ec84b8ec55c (diff)
Autocommit at 30.05.2022 @ 18:02
1 files changed, 15 insertions, 16 deletions
-rw-r--r--src/Models/CellFormula.cpp31
diff --git a/src/Models/CellFormula.cpp b/src/Models/CellFormula.cpp
index 915c38d..5cc3ae5 100644
--- a/src/Models/CellFormula.cpp
+++ b/src/Models/CellFormula.cpp
@@ -4,8 +4,8 @@
#include <iostream>
#include <stdexcept>
-const Cell* CellFormula::ptrByInd(int firstInd, int secondInd) const {
- return (firstInd < 0) ? &localCells[secondInd] : (*tableCells)[firstInd][secondInd];
+const Cell* CellFormula::ptrByInd(Pair<int, int> loc) const {
+ return (loc.left < 0) ? &localCells[loc.right] : (*tableCells)[loc.left][loc.right];
}
double pow(double x, unsigned y) {
@@ -17,31 +17,30 @@ double pow(double x, unsigned y) {
return res;
}
-double CellFormula::calculate(unsigned index) {
- Cell* currCell = ptrByInd(formula[index].left);
- double lval = (c.firstInd == -1) ? localCells[c.secondInd].getNumeralValue() : (*tableCells)[c.firstInd][c.secondInd]->getNumeralValue();
+double CellFormula::calculate(unsigned index) const {
+ const Cell* currCell = ptrByInd(formula[index].left);
+ double numVal = currCell->getNumeralValue();
while (formula[index].right < 0) {
- double secondLval = (c.firstInd == -1) ? localCells[c.secondInd].getNumeralValue() : (*tableCells)[c.firstInd][c.secondInd]->getNumeralValue();
switch (-formula[index].right) {
- case '+' : lval += secondLval; break;
- case '*' : lval *= secondLval; break;
- case '/' : if (secondLval == 0) throw std::logic_error("");
- lval /= secondLval; break;
- case '^' : lval = pow(lval, secondLval); break;
+ case '+' : numVal += ptrByInd(formula[index].left)->getNumeralValue(); break;
+ case '*' : numVal *= ptrByInd(formula[index].left)->getNumeralValue(); break;
+ case '/' : if (ptrByInd(formula[index].left)->getNumeralValue() == 0) throw std::logic_error("");
+ numVal /= ptrByInd(formula[index].left)->getNumeralValue(); break;
+ case '^' : numVal = pow(numVal, ptrByInd(formula[index].left)->getNumeralValue()); break;
}
}
double temp;
switch(formula[index].right) {
- case '+' : return lval + calculate(++index);
- case '*' : return lval * calculate(++index);
+ case '+' : return numVal + calculate(++index);
+ case '*' : return numVal * calculate(++index);
case '/' : temp = calculate(++index);
if (temp == 0) throw std::logic_error("");
- return lval / temp;
- case '^' : return pow(lval, calculate(++index));
+ return numVal / temp;
+ case '^' : return pow(numVal, calculate(++index));
case '\0' :
- default : return lval;
+ default : return numVal;
}
}