From 47d2db4f400321681ae9c83f24fc3d5f02c41cbf Mon Sep 17 00:00:00 2001 From: Oliver Hummel Date: Tue, 12 Dec 2023 15:00:07 +0100 Subject: [PATCH] Initial Commit. --- Axel/resources/zahlen.csv | 4 + .../informatik/spreadsheet/Axel.java | 26 +++ .../informatik/spreadsheet/Cell.java | 38 ++++ .../informatik/spreadsheet/Spreadsheet.java | 173 ++++++++++++++++++ 4 files changed, 241 insertions(+) create mode 100644 Axel/resources/zahlen.csv create mode 100644 Axel/src/de/hs_mannheim/informatik/spreadsheet/Axel.java create mode 100644 Axel/src/de/hs_mannheim/informatik/spreadsheet/Cell.java create mode 100644 Axel/src/de/hs_mannheim/informatik/spreadsheet/Spreadsheet.java diff --git a/Axel/resources/zahlen.csv b/Axel/resources/zahlen.csv new file mode 100644 index 0000000..1ec60e0 --- /dev/null +++ b/Axel/resources/zahlen.csv @@ -0,0 +1,4 @@ +1,2 +3,4 +5,6 +7,8 diff --git a/Axel/src/de/hs_mannheim/informatik/spreadsheet/Axel.java b/Axel/src/de/hs_mannheim/informatik/spreadsheet/Axel.java new file mode 100644 index 0000000..86e0c44 --- /dev/null +++ b/Axel/src/de/hs_mannheim/informatik/spreadsheet/Axel.java @@ -0,0 +1,26 @@ +package de.hs_mannheim.informatik.spreadsheet; + + +/** + * Part of a simplified spreadsheet system for the PR1 programming lab at Hochschule Mannheim. + * + * @author Oliver Hummel + */ +public class Axel { + + public static void main(String[] args) { + Spreadsheet spr = new Spreadsheet(10,10); + + spr.put("A3", "123"); + spr.put("A2", "1"); + + spr.put("B9", "=41+A2"); + spr.put("J5", "=7*6"); + spr.put("J6", "=3/2"); + + System.out.println(spr); + + // TODO: You might want to put "UI loop" for entering value and formulas here. + } + +} \ No newline at end of file diff --git a/Axel/src/de/hs_mannheim/informatik/spreadsheet/Cell.java b/Axel/src/de/hs_mannheim/informatik/spreadsheet/Cell.java new file mode 100644 index 0000000..f80e156 --- /dev/null +++ b/Axel/src/de/hs_mannheim/informatik/spreadsheet/Cell.java @@ -0,0 +1,38 @@ +package de.hs_mannheim.informatik.spreadsheet; + +/** + * Part of a simplified spreadsheet system for the PR1 programming lab at Hochschule Mannheim. + * A cell needs to be able to hold a formula and a value + * + * @author Oliver Hummel + */ +public class Cell { + private String formula = ""; + private String value = ""; + + public String getFormula() { + return formula; + } + + public void setFormula(String formula) { + if (!formula.isEmpty()) + this.formula = formula.toUpperCase().substring(1); // removes '=' at the beginning + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String toString() { + return String.format("%4s", value); + } + + public boolean isEmpty() { + return value.isEmpty(); + } + +} diff --git a/Axel/src/de/hs_mannheim/informatik/spreadsheet/Spreadsheet.java b/Axel/src/de/hs_mannheim/informatik/spreadsheet/Spreadsheet.java new file mode 100644 index 0000000..e2fc34d --- /dev/null +++ b/Axel/src/de/hs_mannheim/informatik/spreadsheet/Spreadsheet.java @@ -0,0 +1,173 @@ +package de.hs_mannheim.informatik.spreadsheet; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A simplified spreadsheet class for the PR1 programming lab at Hochschule Mannheim. + * One aspect worth mentioning is that it only supports long numbers, not doubles. + * + * @author Oliver Hummel + */ +public class Spreadsheet { + Cell[][] cells; + + /** + * Constructor that creates a Spreadsheet of size rows * cols. + * @param rows number of rows + * @param cols number of columns + */ + public Spreadsheet(int rows, int cols) { + + // TODO limit the maximum size on 99 (1..99) rows and 26 (A..Z) columns + + cells = new Cell[rows][cols]; + + for (int r = 0; r < rows; r++) + for (int c = 0; c < cols; c++) + cells[r][c] = new Cell(); + } + + // ----- + // retrieve or change values of cells + + private String get(int row, int col) { + return cells[row][col].getValue(); + } + + public String get(String cellName) { + cellName = cellName.toUpperCase(); + return get(getRow(cellName), getCol(cellName)); + } + + private void put(int row, int col, String value) { + if (!value.startsWith("=")) + cells[row][col].setValue(value); + else { + cells[row][col].setFormula(value); + evaluateCell(row, col); + } + } + + public void put(String cellName, String value) { + cellName = cellName.toUpperCase(); + put(getRow(cellName), getCol(cellName), value); + } + + private int getCol(String cellName) { + return cellName.charAt(0) - 'A'; + } + + private int getRow(String cellName) { + return cellName.charAt(1) - '1'; + } + + // ----- + // business logic + + /** + * A method for reading in data from a CSV file. + * @param path The file to read. + * @param separator The char used to split up the input, e.g. a comma or a semicolon. + * @param starCellName The upper left cell where data from the CSV file should be inserted. + * @return Nothing. + * @exception IOException If path does not exist. + */ + public void readCsv(String path, char separator, String startCellName) throws FileNotFoundException { + // TODO: implement this + } + + /** + * This method does the actual evaluation/calcluation of a specific cell + * @param cellName the name of the cell to be evaluated + * @return Nothing. + */ + private void evaluateCell(int row, int col) { + String formula = cells[row][col].getFormula(); + String result = ""; + + if (formula.startsWith("SUMME(")) // e.g. SUMME(A3:A8) + result = "" + sum(formula.substring(6, 8), formula.substring(9, 11)); // TODO adapt to cells with two digits + else if (formula.startsWith("PRODUKT(")) // e.g. PRODUKT(A3:B9) + result = "TODO"; // TODO + else if (formula.startsWith("MITTELWERT(")) // e.g. MITTELWERT(A3:A5) + result = "TODO"; // TODO + else if (formula.startsWith("STABW(")) // e.g. STABW(C6:D8) -> Standardabweichung + result = "TODO"; // TODO + else if (formula.startsWith("MIN(")) // e.g. MIN(C13:H13) -> größter Wert + result = "TODO"; // TODO + else if (formula.startsWith("MAX(")) // e.g. MAX(A1:A10) -> Standardabweichung + result = "TODO"; // TODO + else if (!formula.isEmpty()) + result = "" + calculate(formula); + + cells[row][col].setValue("" + result); + } + + /** + * Method for calculating the sum of a rectangular block of cells, such as from A1 to B3. + * @param startCellName The name of the cell in the upper left corner of the rectangle. + * @param endCellName The name of the cell in the lower right corner of the rectangle. + * @return The sum calculated. + */ + private long sum(String startCellName, String endCellName) { + // TODO implement + + return 0; + } + + /** + * This method calculates the result of a "normal" algebraic expression. It only needs to support + * expressions like =B4 or =2+A3-B2, i.e. only with int numbers and other cells and with plus, + * minus, times, split only. An expression always starts with either a number or a cell name. If it + * continues, it is guaranteed that this is followed by an operator and either a number or a + * cell name again. It is NOT required to implement dot before dash or parentheses in formulas. + * @param formula The expression to be evaluated. + * @return The result calculated. + */ + private long calculate(String formula) { + Matcher m = Pattern.compile("([A-Z][0-9]*)|[-\\+\\*/]|[0-9]*").matcher(formula); + + long res = 0; + + // TODO implement + + // uncomment the following to see an example how the elements of a formula can be accessed + while (m.find()) { // m.find() must always be used before m.group() + String s = m.group(); + if (!s.isEmpty()) { + System.out.println(s); + } + } + + return res; + } + + // ----- + + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append(" "); + for (int i = 0; i < cells.length; i++) { + sb.append(" " + (char)('A'+ i) + " | "); + } + + int rc = 1; + for (Cell[] r : cells) { + sb.append(System.lineSeparator()); + sb.append(String.format("%2s", rc++) + ": "); + + for (Cell c : r) { + if (c == null || c.isEmpty()) + c.setValue(" "); + sb.append(c + " | "); + } + + } + return sb.toString(); + } + +} \ No newline at end of file