1
0
Fork 0

Spreadsheet evaluateCell further implementation.

pull/1/head
selim 2023-12-26 05:20:21 +01:00
parent 096215a33a
commit e9a9ac5527
1 changed files with 69 additions and 19 deletions

View File

@ -146,23 +146,50 @@ public class Spreadsheet {
String formula = cells[row][col].getFormula(); String formula = cells[row][col].getFormula();
String result = ""; String result = "";
String substringStartCell1 = formula.substring(formula.length() - 6, formula.length() - 4);
String substringStart2 = formula.substring(formula.length() - 6, formula.length() - 3);
String substringEndCell = formula.substring(formula.length() - 3, formula.length() - 1);
if (formula.startsWith("SUMME(")) // e.g. SUMME(A3:A8) if (formula.startsWith("SUMME(")) // e.g. SUMME(A3:A8)
if(formula.length()<13) if(formula.length()<13)
result = "" + sum(formula.substring(6, 8), formula.substring(9, 11)); result = "" + sum(substringStartCell1, substringEndCell);
else if(formula.length()<14&&formula.substring(6, 9).contains(":")) else if(formula.length()<14&&substringStart2.contains(":"))
result = "" + sum(formula.substring(6, 8), formula.substring(9, 12)); result = "" + sum(substringStartCell1, substringEndCell);
else if(formula.length()<14&&!formula.substring(6, 9).contains(":")) else if(formula.length()<14&&!substringStart2.contains(":"))
result = "" + sum(formula.substring(6, 9), formula.substring(10, 12)); result = "" + sum(substringStart2, substringEndCell);
else if(formula.length()<15) else if(formula.length()<15)
result = "" + sum(formula.substring(6, 9), formula.substring(10, 13)); result = "" + sum(substringStart2, substringEndCell);
else else
result = "0"; result = "0";
else if (formula.startsWith("PRODUKT(")) // e.g. PRODUKT(A3:B9) else if (formula.startsWith("PRODUKT(")) // e.g. PRODUKT(A3:B9)
result = "TODO"; // TODO if(formula.length()<15)
result = "" + product(substringStartCell1, substringEndCell);
else if(formula.length()<16&&substringStart2.contains(":"))
result = "" + product(substringStartCell1, substringEndCell);
else if(formula.length()<16&&!substringStart2.contains(":"))
result = "" + product(substringStart2, substringEndCell);
else if(formula.length()<17)
result = "" + product(substringStart2, substringEndCell);
else
result = "0";
else if (formula.startsWith("MITTELWERT(")) // e.g. MITTELWERT(A3:A5) else if (formula.startsWith("MITTELWERT(")) // e.g. MITTELWERT(A3:A5)
result = "TODO"; // TODO if(formula.length()<17)
result = "" + average(substringStartCell1, substringEndCell);
else if(formula.length()<18&&substringStart2.contains(":"))
result = "" + average(substringStartCell1, substringEndCell);
else if(formula.length()<18&&!substringStart2.contains(":"))
result = "" + average(substringStart2, substringEndCell);
else if(formula.length()<19)
result = "" + average(substringStart2, substringEndCell);
else
result = "0";
else if (formula.startsWith("STABW(")) // e.g. STABW(C6:D8) -> Standardabweichung else if (formula.startsWith("STABW(")) // e.g. STABW(C6:D8) -> Standardabweichung
result = "TODO"; // TODO result = "TODO"; // TODO
else if (formula.startsWith("MIN(")) // e.g. MIN(C13:H13) -> größter Wert else if (formula.startsWith("MIN(")) // e.g. MIN(C13:H13) -> größter Wert
@ -198,6 +225,29 @@ public class Spreadsheet {
return result; return result;
} }
private long product(String startCellName, String endCellName) {
long result = Long.parseLong(cells[0][0].getValue());;
for(int r = getRow(startCellName); r<getRow(endCellName)+1; r++)
for(int c = getCol(startCellName); c<getCol(endCellName)+1; c++)
try {
result *= Long.parseLong(cells[r+1][c+1].getValue());
} catch (NumberFormatException n){}
return result;
}
private long average(String startCellName, String endCellName){
long result = 0;
int counter = 0;
for(int r = getRow(startCellName); r<getRow(endCellName)+1; r++)
for(int c = getCol(startCellName); c<getCol(endCellName)+1; c++)
try {
result += Long.parseLong(cells[r][c].getValue());
counter ++;
} catch (NumberFormatException n){}
result /= counter;
return result;
}
/** /**
* This method calculates the result of a "normal" algebraic expression. It only needs to support * This method calculates the result of a "normal" algebraic expression. It only needs to support
@ -212,7 +262,7 @@ public class Spreadsheet {
private long calculate(String formula) throws ArithmeticException { private long calculate(String formula) throws ArithmeticException {
Matcher m = Pattern.compile("([A-Z][0-9]*)|[-+*/]|[0-9]+").matcher(formula); Matcher m = Pattern.compile("([A-Z][0-9]*)|[-+*/]|[0-9]+").matcher(formula);
long res = 0; long result = 0;
long currentOperand = 0; long currentOperand = 0;
String currentOperator = "+"; String currentOperator = "+";
boolean firstOperator = true; boolean firstOperator = true;
@ -228,9 +278,9 @@ public class Spreadsheet {
currentOperand = Long.parseLong(get(s)); currentOperand = Long.parseLong(get(s));
} else { } else {
if (!firstOperator) { if (!firstOperator) {
res = evaluateOperator(res, currentOperand, currentOperator); result = evaluateOperator(result, currentOperand, currentOperator);
} else { } else {
res = currentOperand; result = currentOperand;
firstOperator = false; firstOperator = false;
} }
currentOperator = s; currentOperator = s;
@ -238,22 +288,22 @@ public class Spreadsheet {
} }
if (!firstOperator) { if (!firstOperator) {
res = evaluateOperator(res, currentOperand, currentOperator); result = evaluateOperator(result, currentOperand, currentOperator);
} else } else
res = currentOperand; result = currentOperand;
return res; return result;
} }
private long evaluateOperator(long res, long currentOperand, String currentOperator) { private long evaluateOperator(long result, long currentOperand, String currentOperator) {
switch (currentOperator) { switch (currentOperator) {
case "+": case "+":
return res + currentOperand; return result + currentOperand;
case "-": case "-":
return res - currentOperand; return result - currentOperand;
case "*": case "*":
return res * currentOperand; return result * currentOperand;
case "/": case "/":
return res / currentOperand; return result / currentOperand;
default: default:
throw new IllegalArgumentException("Invalid operator: " + currentOperator); throw new IllegalArgumentException("Invalid operator: " + currentOperator);
} }