Program commands

Added program commands like saving, loading, exiting a file or clearing the table, added example file including formulas
Victor Hans-Georg Waitz 2023-12-30 01:27:14 +01:00
parent 33ed4534f0
commit d2aa28c5b3
3 changed files with 178 additions and 102 deletions

View File

@ -1,4 +1,11 @@
1,2 1,5,=SUMME(A1:B4),,,,,,,,200
3,4 2,6,,,,,,,,,
5,6 3,7,,,,,,,,,
7,8 4,8,,=1+4*A2,,,2,,,4,
,,,,,3,3,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,69,,
,,,,,,,=STABW(K1:K11),,,100

1 1 2 5 =SUMME(A1:B4) 200
2 3 2 4 6
3 5 3 6 7
4 7 4 8 8 =1+4*A2 2 4
5 3 3
6
7
8
9
10 69
11 =STABW(K1:K11) 100

View File

@ -1,5 +1,6 @@
package de.hs_mannheim.informatik.spreadsheet; package de.hs_mannheim.informatik.spreadsheet;
import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Scanner; import java.util.Scanner;
@ -13,36 +14,21 @@ import java.util.regex.Pattern;
*/ */
public class Axel { public class Axel {
static Scanner keyboard = new Scanner(System.in); static Scanner keyboard = new Scanner(System.in);
static Spreadsheet spr = new Spreadsheet(11,11); static Spreadsheet spr = new Spreadsheet(11, 11);
static String saveFilePath = "Axel\\resources\\zahlen.csv";
public static void main(String[] args) throws FileNotFoundException { public static void main(String[] args) throws FileNotFoundException {
System.out.println("Welcome to Axel (Totally not Excel)"); System.out.println("Welcome to Axel (Totally not Excel)");
System.out.println(); System.out.println();
/*
spr.put("A1", "1");
spr.put("A2", "1");
spr.put("A3", "123");
spr.put("B1", "2");
spr.put("B2", "4");
spr.put("B3", "1");
spr.put("B4", "=41+A2"); spr.loadSpecialTable();
spr.put("C5", "=7*6");
spr.put("D1", "=3/2");
*/
progLoad();
System.out.println(spr); System.out.println(spr);
// spr.saveCsv("/tmp/test.csv"); // spr.saveCsv("/tmp/test.csv");
// DONE: You might want to put "UI loop" for entering value and formulas here resp. in some UI methods. while (true) {
// TODO ME: Implement program commands
while(true) {
String userCommandPositionInput = userCommandPositionInput(); String userCommandPositionInput = userCommandPositionInput();
if (userCommandPositionInput.charAt(0) == '*'){ if (userCommandPositionInput.charAt(0) == '*') {
executeCommand(userCommandPositionInput); executeCommand(userCommandPositionInput);
System.out.println(spr); System.out.println(spr);
continue; continue;
@ -60,25 +46,25 @@ public class Axel {
//? User input for a program command or a position //? User input for a program command or a position
public static String userCommandPositionInput(){ public static String userCommandPositionInput() {
System.out.println(); System.out.println();
System.out.println("Input a command for the program or a position"); System.out.println("Input a command for the program or a position");
System.out.printf("List of program commands: *exit, *save, *load or *help %nFormat for position: A1 or B14%n"); System.out.printf("List of program commands: *clear, *load, *save, *exit or *help %nFormat for position: A1 or B14%n");
System.out.print("Input: "); System.out.print("Input: ");
String userCommandPositionInput = keyboard.nextLine(); String userCommandPositionInput = keyboard.nextLine();
return userCommandPositionComputation(userCommandPositionInput); return userCommandPositionComputation(userCommandPositionInput);
} }
public static String userCommandPositionComputation(String userCommandPositionInput){ public static String userCommandPositionComputation(String userCommandPositionInput) {
if (userCommandPositionInput.isEmpty()){ if (userCommandPositionInput.isEmpty()) {
System.out.println("Input is empty!"); System.out.println("Input is empty!");
return userCommandPositionInput(); return userCommandPositionInput();
} }
//? Program command //? Program command
if (userCommandPositionInput.charAt(0) == '*'){ if (userCommandPositionInput.charAt(0) == '*') {
if (!(userCommandErrorCheck(userCommandPositionInput))) { if (!(userCommandErrorCheck(userCommandPositionInput))) {
System.out.println("Invalid command!"); System.out.println("Invalid command!");
return userCommandPositionInput(); return userCommandPositionInput();
@ -87,12 +73,12 @@ public class Axel {
} }
//? Position //? Position
if (!(userPositionErrorCheck(userCommandPositionInput, spr))){ if (!(userPositionErrorCheck(userCommandPositionInput, spr))) {
System.out.println("Invalid position!"); System.out.println("Invalid position!");
return userCommandPositionInput(); return userCommandPositionInput();
} }
if (!(userPositionBoundsErrorCheck(userCommandPositionInput, spr))){ if (!(userPositionBoundsErrorCheck(userCommandPositionInput, spr))) {
System.out.println("Position out of bounds!"); System.out.println("Position out of bounds!");
return userCommandPositionInput(); return userCommandPositionInput();
} }
@ -100,35 +86,35 @@ public class Axel {
return userCommandPositionInput; return userCommandPositionInput;
} }
public static boolean userCommandErrorCheck(String CommandToCheck){ public static boolean userCommandErrorCheck(String CommandToCheck) {
//? true if valid //? true if valid
//? valid inputs are: *exit, *save, *load, *help (and all upper case variants) //? valid inputs are: *clear, *exit, *save, *load, *help (and all upper case variants)
CommandToCheck = CommandToCheck.toLowerCase(); CommandToCheck = CommandToCheck.toLowerCase();
if (CommandToCheck.equals("*exit") || CommandToCheck.equals("*save") || CommandToCheck.equals("*load") || CommandToCheck.equals("*help")){ if (CommandToCheck.equals("*clear") || CommandToCheck.equals("*exit") || CommandToCheck.equals("*save") || CommandToCheck.equals("*load") || CommandToCheck.equals("*help")) {
return true; return true;
} }
return false; return false;
} }
public static boolean userPositionErrorCheck(String positionToCheck, Spreadsheet spr){ public static boolean userPositionErrorCheck(String positionToCheck, Spreadsheet spr) {
//? true if valid //? true if valid
//? valid inputs are: A1, B14, C79, E99, F1, G99, J1, M98, ... (and all lower case variants) //? valid inputs are: A1, B14, C79, E99, F1, G99, J1, M98, ... (and all lower case variants)
positionToCheck = positionToCheck.toUpperCase(); positionToCheck = positionToCheck.toUpperCase();
//? Check if input is the right length //? Check if input is the right length
if (positionToCheck.length() < 2 || positionToCheck.length() > 3){ if (positionToCheck.length() < 2 || positionToCheck.length() > 3) {
return false; return false;
} }
//? Check if input is in the right format //? Check if input is in the right format
if (!(Character.isLetter(positionToCheck.charAt(0)) && Character.isDigit(positionToCheck.charAt(1)))){ if (!(Character.isLetter(positionToCheck.charAt(0)) && Character.isDigit(positionToCheck.charAt(1)))) {
return false; return false;
} }
if (positionToCheck.length() == 3){ if (positionToCheck.length() == 3) {
if (!(Character.isDigit(positionToCheck.charAt(2)))){ if (!(Character.isDigit(positionToCheck.charAt(2)))) {
return false; return false;
} }
} }
@ -136,7 +122,7 @@ public class Axel {
return true; return true;
} }
public static boolean userPositionBoundsErrorCheck(String positionToCheck, Spreadsheet spr){ public static boolean userPositionBoundsErrorCheck(String positionToCheck, Spreadsheet spr) {
//? true if valid //? true if valid
positionToCheck = positionToCheck.toUpperCase(); positionToCheck = positionToCheck.toUpperCase();
@ -150,7 +136,7 @@ public class Axel {
//? User input for a value or a formula //? User input for a value or a formula
public static String userValueFormulaInput(String currentPos){ public static String userValueFormulaInput(String currentPos) {
System.out.println(); System.out.println();
System.out.printf("Input a value of a formula for the selected position: %s.%n", currentPos); System.out.printf("Input a value of a formula for the selected position: %s.%n", currentPos);
System.out.printf("Format for a value: 7 or 1337 %nFormat for a formula: =7*6 or =SUMME(A1:A3)%n"); System.out.printf("Format for a value: 7 or 1337 %nFormat for a formula: =7*6 or =SUMME(A1:A3)%n");
@ -160,14 +146,14 @@ public class Axel {
return userValueFormulaComputation(userCommandInput, currentPos); return userValueFormulaComputation(userCommandInput, currentPos);
} }
public static String userValueFormulaComputation(String userValueFormulaInput, String currentPos){ public static String userValueFormulaComputation(String userValueFormulaInput, String currentPos) {
if (userValueFormulaInput.isEmpty()){ if (userValueFormulaInput.isEmpty()) {
System.out.println("Input is empty!"); System.out.println("Input is empty!");
return userValueFormulaInput(currentPos); return userValueFormulaInput(currentPos);
} }
//? Formula //? Formula
if (userValueFormulaInput.charAt(0) == '='){ if (userValueFormulaInput.charAt(0) == '=') {
if (!(userFormulaErrorCheck(userValueFormulaInput))) { if (!(userFormulaErrorCheck(userValueFormulaInput))) {
System.out.println("Invalid formula!"); System.out.println("Invalid formula!");
return userValueFormulaInput(currentPos); return userValueFormulaInput(currentPos);
@ -176,7 +162,7 @@ public class Axel {
} }
//? Value //? Value
if (!(userValueErrorCheck(userValueFormulaInput))){ if (!(userValueErrorCheck(userValueFormulaInput))) {
System.out.println("Invalid value!"); System.out.println("Invalid value!");
return userValueFormulaInput(currentPos); return userValueFormulaInput(currentPos);
} }
@ -184,59 +170,56 @@ public class Axel {
return userValueFormulaInput; return userValueFormulaInput;
} }
public static boolean userFormulaErrorCheck(String formulaToCheck){ public static boolean userFormulaErrorCheck(String formulaToCheck) {
//? true if valid //? true if valid
//? valid inputs are: =7*6, =SUM(A1:A3), =A1, =A1+A2, =A1-A2, ... (and all lower case variants) //? valid inputs are: =7*6, =SUM(A1:A3), =A1, =A1+A2, =A1-A2, ... (and all lower case variants)
//TODO ME: Formula format check, maybe too much work
//TODO ME: Check if formula vars are in bounds
//? remove '=' at the beginning and make everything upper case //? remove '=' at the beginning and make everything upper case
formulaToCheck = formulaToCheck.toUpperCase().substring(1); formulaToCheck = formulaToCheck.toUpperCase().substring(1);
if (formulaToCheck.startsWith("SUMME(") || formulaToCheck.startsWith("PRODUKT(") || formulaToCheck.startsWith("MITTELWERT(") || formulaToCheck.startsWith("STABW(") || formulaToCheck.startsWith("MIN(") || formulaToCheck.startsWith("MAX(")){ if (formulaToCheck.startsWith("SUMME(") || formulaToCheck.startsWith("PRODUKT(") || formulaToCheck.startsWith("MITTELWERT(") || formulaToCheck.startsWith("STABW(") || formulaToCheck.startsWith("MIN(") || formulaToCheck.startsWith("MAX(")) {
return userFormulaFunctionErrorCheck(formulaToCheck); return userFormulaFunctionErrorCheck(formulaToCheck);
} }
return userFormulaExpressionErrorCheck(formulaToCheck); return userFormulaExpressionErrorCheck(formulaToCheck);
} }
public static boolean userFormulaFunctionErrorCheck(String functionToCheck){ public static boolean userFormulaFunctionErrorCheck(String functionToCheck) {
String[] functionCorners = spr.isolateFunctionCorners(functionToCheck); String[] functionCorners = spr.isolateFunctionCorners(functionToCheck);
if (functionCorners.length != 2){ if (functionCorners.length != 2) {
return false; return false;
} }
for (String functionCorner: functionCorners){ for (String functionCorner : functionCorners) {
if (!(spr.isValueCellName(functionCorner).equals("cellName"))){ if (!(spr.isValueCellName(functionCorner).equals("cellName"))) {
return false; return false;
} }
if (!userPositionBoundsErrorCheck(functionCorner, spr)){ if (!userPositionBoundsErrorCheck(functionCorner, spr)) {
System.out.print("Out of bounds - "); System.out.print("Out of bounds - ");
return false; return false;
} }
} }
if (functionToCheck.startsWith("MITTELWERT(") || functionToCheck.startsWith("STABW(")) { if (functionToCheck.startsWith("MITTELWERT(") || functionToCheck.startsWith("STABW(")) {
String[] functionBlock= spr.wholeFunctionBlock(functionToCheck); String[] functionBlock = spr.wholeFunctionBlock(functionToCheck);
boolean allEmpty = true; boolean allEmpty = true;
for (String cell : functionBlock) { for (String cell : functionBlock) {
if (!cell.isEmpty()){ if (!cell.isEmpty()) {
allEmpty = false; allEmpty = false;
} }
} }
if (allEmpty){ if (allEmpty) {
System.out.print("Division by zero - "); System.out.print("Division by zero - ");
return false; return false;
} }
} }
if (functionToCheck.startsWith("STABW(")) { if (functionToCheck.startsWith("STABW(")) {
String[] functionBlock= spr.wholeFunctionBlock(functionToCheck); String[] functionBlock = spr.wholeFunctionBlock(functionToCheck);
String[] notEmptyValues = spr.extractNotEmptyCells(functionBlock); String[] notEmptyValues = spr.extractNotEmptyCells(functionBlock);
if (notEmptyValues.length < 2){ if (notEmptyValues.length < 2) {
System.out.print("Division by zero - "); System.out.print("Division by zero - ");
return false; return false;
} }
@ -244,12 +227,12 @@ public class Axel {
return true; return true;
} }
public static boolean userFormulaExpressionErrorCheck(String expressionToCheck){ public static boolean userFormulaExpressionErrorCheck(String expressionToCheck) {
//TODO ME: Maybe not worth the time
return true; return true;
} }
public static boolean userValueErrorCheck(String valueToCheck){ public static boolean userValueErrorCheck(String valueToCheck) {
//? true if valid //? true if valid
//? valid inputs are: 7, 1337, 0, , -213,... //? valid inputs are: 7, 1337, 0, , -213,...
@ -257,48 +240,64 @@ public class Axel {
// String digitCheckRegex = "-?\\d+(\\.\\d+)?"; // String digitCheckRegex = "-?\\d+(\\.\\d+)?";
//? For integers //? For integers
String digitCheckRegex = "-?\\d+"; String digitCheckRegex = "-?\\d+";
if (!(valueToCheck.matches(digitCheckRegex))){ if (!(valueToCheck.matches(digitCheckRegex))) {
return false; return false;
} }
return true; return true;
} }
public static void executeCommand(String command) { public static void executeCommand(String command) throws FileNotFoundException {
System.out.printf("Executing command: %s%n", command); switch (command) {
//TODO ME: case "*clear":
switch (command){ progClear();
break;
case "*load": case "*load":
progLoad(); progLoad();
break; break;
case "*save":
progSave();
break;
case "*exit":
progExit();
break;
} }
} }
private static void progLoad(){ private static void progClear(){
int rows = spr.getRowsLCount(); System.out.println("Are you sure you want to clear the table? (yes/no)");
int cols = spr.getColsCount(); System.out.print("Input: ");
String userClearInput = keyboard.nextLine().toLowerCase();
for (int r = 0; r < rows; r++){ if (userClearInput.equals("yes") || userClearInput.equals("y")){
for (int c = 0; c < cols; c++){ spr.clearTable();
spr.cells[r][c].setValue(""); System.out.println("Table cleared!");
} }
} }
spr.put("A1", "1");
spr.put("A2", "2");
spr.put("A3", "3");
spr.put("A4", "4");
spr.put("B1", "5");
spr.put("B2", "6");
spr.put("B3", "7");
spr.put("B4", "8");
spr.put("K1", "200");
spr.put("K11", "100");
spr.put("J4", "4");
spr.put("I10", "69");
spr.put("F5", "3");
spr.put("G4", "2");
spr.put("G5", "3");
private static void progLoad() throws FileNotFoundException {
spr.readCsv(saveFilePath, ",", "Amogus");
System.out.println("File loaded!");
} }
private static void progSave() throws FileNotFoundException {
String savePath = saveFilePath;
spr.saveCsv(savePath);
System.out.println("File saved");
}
private static void progExit() throws FileNotFoundException {
System.out.println("Do you want to save befor you exit? (yes/no)");
System.out.print("Input: ");
String userExitInput = keyboard.nextLine().toLowerCase();
if (userExitInput.equals("yes") || userExitInput.equals("y")) {
progSave();
}
System.out.println("Goodbye!");
}
} }

View File

@ -1,10 +1,12 @@
package de.hs_mannheim.informatik.spreadsheet; package de.hs_mannheim.informatik.spreadsheet;
import javax.naming.ldap.spi.LdapDnsProviderResult; import javax.naming.ldap.spi.LdapDnsProviderResult;
import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -24,8 +26,6 @@ public class Spreadsheet {
*/ */
public Spreadsheet(int rows, int cols) { public Spreadsheet(int rows, int cols) {
// TODO limit the maximum size on 99 (1..99) rows and 26 (A..Z) columns
if (rows > 99){ if (rows > 99){
System.out.printf("Row size %d is bigger then 99, value will be set to 99! %n", rows); System.out.printf("Row size %d is bigger then 99, value will be set to 99! %n", rows);
rows = 99; rows = 99;
@ -58,6 +58,7 @@ public class Spreadsheet {
if (!value.startsWith("=")) if (!value.startsWith("="))
cells[row][col].setValue(value); cells[row][col].setValue(value);
else { else {
System.out.printf("Formula: %s %n", value);
cells[row][col].setFormula(value); cells[row][col].setFormula(value);
evaluateCell(row, col); evaluateCell(row, col);
} }
@ -85,24 +86,62 @@ public class Spreadsheet {
/** /**
* A method for reading in data from a CSV file. * A method for reading in data from a CSV file.
* @param path The file to read. * @param filePath The file to read.
* @param separator The char used to split up the input, e.g. a comma or a semicolon. * @param separator The char used to split up the input, e.g. a comma or a semicolon.
* @param startCellName The upper left cell where data from the CSV file should be inserted. * @param startCellName The upper left cell where data from the CSV file should be inserted.
* @return Nothing. * @return Nothing.
* @exception IOException If path does not exist. * @exception IOException If path does not exist.
*/ */
public void readCsv(String path, char separator, String startCellName) throws FileNotFoundException { public void readCsv(String filePath, String separator, String startCellName) throws FileNotFoundException {
// TODO: implement this ArrayList<String> fileRows = new ArrayList<>();
Scanner sc = new Scanner(new File(filePath));
while (sc.hasNextLine()) {
fileRows.add(sc.nextLine());
}
clearTable();
ArrayList <int[]> formulas = new ArrayList<>();
for (int rowI = 0; rowI < fileRows.size(); rowI++) {
String row = fileRows.get(rowI);
String[] cells = row.split(separator);
for (int colI = 0; colI < cells.length; colI++) {
String cellContent = cells[colI].toUpperCase();
if (cellContent.startsWith("=")){
formulas.add(new int[]{rowI, colI});
}
else {
put(rowI, colI, cellContent);
}
}
}
for (int[] formulaPos : formulas){
int rowI = formulaPos[0];
int colI = formulaPos[1];
System.out.printf("Formula at %d-%d %n", rowI, colI);
String row = fileRows.get(rowI);
String formulaToFill = row.split(separator)[colI];
put(rowI, colI, formulaToFill);
}
sc.close();
} }
/** /**
* A method for saving data to a CSV file. * A method for saving data to a CSV file.
* @param path The file to write. * @param filePath The file to write.
* @return Nothing. * @return Nothing.
* @exception IOException If path does not exist. * @exception FileNotFoundException If path does not exist.
*/ */
public void saveCsv(String path) throws FileNotFoundException { public void saveCsv(String filePath) throws FileNotFoundException {
PrintWriter out = new PrintWriter(path); PrintWriter out = new PrintWriter(filePath);
for (Cell[] row : cells) { for (Cell[] row : cells) {
for (Cell cell : row) { for (Cell cell : row) {
@ -129,6 +168,7 @@ public class Spreadsheet {
private void evaluateCell(int row, int col) { private void evaluateCell(int row, int col) {
String formula = cells[row][col].getFormula(); String formula = cells[row][col].getFormula();
System.out.printf("Formel in eval: %s %n", formula);
String result = ""; String result = "";
if (formula.startsWith("SUMME(")) // e.g. SUMME(A3:A8) if (formula.startsWith("SUMME(")) // e.g. SUMME(A3:A8)
@ -451,6 +491,36 @@ public class Spreadsheet {
return cells[0].length; return cells[0].length;
} }
public void clearTable() {
int rows = getRowsLCount();
int cols = getColsCount();
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
cells[r][c].setValue("");
}
}
}
public void loadSpecialTable(){
clearTable();
put("A1", "1");
put("A2", "2");
put("A3", "3");
put("A4", "4");
put("B1", "5");
put("B2", "6");
put("B3", "7");
put("B4", "8");
put("K1", "200");
put("K11", "100");
put("J4", "4");
put("I10", "69");
put("F5", "3");
put("G4", "2");
put("G5", "3");
}
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();