1
0
Fork 0
PR1-Spreadsheet/Axel/src/de/hs_mannheim/informatik/spreadsheet/Axel.java

278 lines
7.7 KiB
Java
Raw Normal View History

2023-12-12 15:00:07 +01:00
package de.hs_mannheim.informatik.spreadsheet;
2023-12-14 08:31:20 +01:00
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
2023-12-12 15:00:07 +01:00
/**
* Part of a simplified spreadsheet system for the PR1 programming lab at Hochschule Mannheim.
*
* @author Oliver Hummel & Victor Waitz
2023-12-12 15:00:07 +01:00
*/
public class Axel {
static Scanner keyboard = new Scanner(System.in);
static Spreadsheet spr = new Spreadsheet(11,11);
2023-12-12 15:00:07 +01:00
2023-12-14 08:31:20 +01:00
public static void main(String[] args) throws FileNotFoundException {
// Spreadsheet spr = new Spreadsheet(6,9);
spr.put("A1", "1");
spr.put("A2", "1");
2023-12-12 15:00:07 +01:00
spr.put("A3", "123");
spr.put("B1", "2");
spr.put("B2", "4");
spr.put("B3", "1");
spr.put("B4", "=41+A2");
spr.put("C5", "=7*6");
spr.put("D1", "=3/2");
2023-12-12 15:00:07 +01:00
System.out.println(spr);
// spr.saveCsv("/tmp/test.csv");
2023-12-14 08:31:20 +01:00
// DONE: You might want to put "UI loop" for entering value and formulas here resp. in some UI methods.
// TODO ME: Implement program commands
System.out.println("Welcome to Axel (Totally not Excel)");
System.out.println();
while(true) {
String userCommandPositionInput = userCommandPositionInput();
if (userCommandPositionInput.charAt(0) == '*'){
executeCommand(userCommandPositionInput);
System.out.println(spr);
continue;
}
String userPositionInput = userCommandPositionInput;
String userValueFormulaInput = userValueFormulaInput();
spr.put(userPositionInput, userValueFormulaInput);
System.out.println(spr);
}
}
//? User input for a program command or a position
public static String userCommandPositionInput(){
System.out.println();
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.print("Input: ");
String userCommandPositionInput = keyboard.nextLine();
return userCommandPositionComputation(userCommandPositionInput);
}
public static String userCommandPositionComputation(String userCommandPositionInput){
if (userCommandPositionInput.isEmpty()){
System.out.println("Input is empty!");
return userCommandPositionInput();
}
//? Program command
if (userCommandPositionInput.charAt(0) == '*'){
if (!(userCommandErrorCheck(userCommandPositionInput))) {
System.out.println("Invalid command!");
return userCommandPositionInput();
}
return userCommandPositionInput;
}
//? Position
if (!(userPositionErrorCheck(userCommandPositionInput))){
System.out.println("Invalid position!");
return userCommandPositionInput();
}
if (!(userPositionBoundsErrorCheck(userCommandPositionInput, spr))){
System.out.println("Position out of bounds!");
return userCommandPositionInput();
}
return userCommandPositionInput;
}
public static boolean userCommandErrorCheck(String CommandToCheck){
//? true if valid
//? valid inputs are: *exit, *save, *load, *help (and all upper case variants)
CommandToCheck = CommandToCheck.toLowerCase();
if (CommandToCheck.equals("*exit") || CommandToCheck.equals("*save") || CommandToCheck.equals("*load") || CommandToCheck.equals("*help")){
return true;
}
return false;
}
public static boolean userPositionErrorCheck(String positionToCheck){
//? true if valid
//? valid inputs are: A1, B14, C79, E99, F1, G99, J1, M98, ... (and all lower case variants)
positionToCheck = positionToCheck.toUpperCase();
//? Check if input is the right length
if (positionToCheck.length() < 2 || positionToCheck.length() > 3){
return false;
}
//? Check if input is in the right format
if (!(Character.isLetter(positionToCheck.charAt(0)) && Character.isDigit(positionToCheck.charAt(1)))){
return false;
}
if (positionToCheck.length() == 3){
if (!(Character.isDigit(positionToCheck.charAt(2)))){
return false;
}
}
return true;
}
public static boolean userPositionBoundsErrorCheck(String positionToCheck, Spreadsheet spr){
//? true if valid
positionToCheck = positionToCheck.toUpperCase();
if ((spr.getRow(positionToCheck) >= spr.getRowsLCount()) || (spr.getCol(positionToCheck) >= spr.getColsCount())) {
return false;
}
return true;
2023-12-12 15:00:07 +01:00
}
//? User input for a value or a formula
public static String userValueFormulaInput(){
System.out.println();
System.out.printf("Input a value of a formula for the selected position.%n");
System.out.printf("Format for a value: 7 or 1337 %nFormat for a formula: =7*6 or =SUMME(A1:A3)%n");
System.out.print("Input: ");
String userCommandInput = keyboard.nextLine();
return userValueFormulaComputation(userCommandInput);
}
public static String userValueFormulaComputation(String userValueFormulaInput){
if (userValueFormulaInput.isEmpty()){
System.out.println("Input is empty!");
return userValueFormulaInput();
}
//? Formula
if (userValueFormulaInput.charAt(0) == '='){
if (!(userFormulaErrorCheck(userValueFormulaInput))) {
System.out.println("Invalid formula!");
return userValueFormulaInput();
}
return userValueFormulaInput;
}
//? Value
if (!(userValueErrorCheck(userValueFormulaInput))){
System.out.println("Invalid value!");
return userValueFormulaInput();
}
return userValueFormulaInput;
}
public static boolean userFormulaErrorCheck(String formulaToCheck){
//? true if valid
//? 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
formulaToCheck = formulaToCheck.toUpperCase().substring(1);
if (formulaToCheck.startsWith("SUMME(") || formulaToCheck.startsWith("PRODUKT(") || formulaToCheck.startsWith("MITTELWERT(") || formulaToCheck.startsWith("STABW(") || formulaToCheck.startsWith("MIN(") || formulaToCheck.startsWith("MAX(")){
return userFormulaFunctionErrorCheck(formulaToCheck);
}
return userFormulaExpressionErrorCheck(formulaToCheck);
}
public static boolean userFormulaFunctionErrorCheck(String functionToCheck){
String[] functionCorners = spr.isolateFunctionCorners(functionToCheck);
String[] functionBlock= spr.wholeFunctionBlock(functionToCheck);
if (functionCorners.length != 2){
return false;
}
for (String functionCorner: functionCorners){
System.out.printf("Corner: %s - Cell test: %s %n", functionCorner, spr.isValueCellName(functionCorner));
if (!(spr.isValueCellName(functionCorner).equals("cellName"))){
return false;
}
if (!userPositionBoundsErrorCheck(functionCorner, spr)){
return false;
}
}
return true;
}
public static boolean userFormulaExpressionErrorCheck(String expressionToCheck){
return true;
}
public static boolean userValueErrorCheck(String valueToCheck){
//? true if valid
//? valid inputs are: 7, 1337, 0, , -213,...
//? For floating point numbers
// String digitCheckRegex = "-?\\d+(\\.\\d+)?";
//? For integers
String digitCheckRegex = "-?\\d+";
if (!(valueToCheck.matches(digitCheckRegex))){
return false;
}
return true;
}
public static void executeCommand(String command) {
System.out.printf("Executing command: %s%n", command);
//TODO ME:
switch (command){
case "*load":
progLoad();
break;
}
}
private static void progLoad(){
int rows = spr.getRowsLCount();
int cols = spr.getColsCount();
for (int r = 0; r < rows; r++){
for (int c = 0; c < cols; c++){
spr.cells[r][c].setValue("");
}
}
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");
}
2023-12-12 15:00:07 +01:00
}