1
0
Fork 0

Compare commits

..

1 Commits
main ... main

Author SHA1 Message Date
Oliver Hummel ada8f538a2 Bugfix - OutofBoundsException. 2023-12-19 15:25:55 +01:00
4 changed files with 51 additions and 252 deletions

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="src" path="Axel/src"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>PR1-Spreadsheet</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -1,7 +1,6 @@
package de.hs_mannheim.informatik.spreadsheet; package de.hs_mannheim.informatik.spreadsheet;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.Scanner;
/** /**
* Part of a simplified spreadsheet system for the PR1 programming lab at Hochschule Mannheim. * Part of a simplified spreadsheet system for the PR1 programming lab at Hochschule Mannheim.
@ -11,45 +10,20 @@ import java.util.Scanner;
public class Axel { public class Axel {
public static void main(String[] args) throws FileNotFoundException { public static void main(String[] args) throws FileNotFoundException {
String cell, in; Spreadsheet spr = new Spreadsheet(10,10);
int rows, cols;
Spreadsheet spr=new Spreadsheet(99,26);
Scanner kb = new Scanner(System.in);
System.out.printf("1. New\n"
+ "2. Load\n"
+ "Eingabe:");
in=kb.nextLine();
switch(in) {
case("1"):
System.out.print("Rows:");
rows=Integer.parseInt(kb.nextLine());
System.out.print("Cols:");
cols=Integer.parseInt(kb.nextLine());
spr=new Spreadsheet(rows,cols);
case("2"):
System.out.print("File Name:");
in=kb.nextLine();
spr.readCsv("tmp/"+in);
}
while(true) { spr.put("A3", "123");
System.out.println(spr); spr.put("A2", "1");
System.out.print("Cell:");
cell=kb.nextLine(); spr.put("B9", "=41+A2");
if(cell.equals("/exit")) { spr.put("J5", "=7*6");
System.out.println("Auf Wiedersehen"); spr.put("J6", "=3/2");
break;
} System.out.println(spr);
System.out.print("Value:");
in=kb.nextLine(); spr.saveCsv("/tmp/test.csv");
if(in.equals("/exit")) {
System.out.println("Auf Wiedersehen"); // TODO: You might want to put "UI loop" for entering value and formulas here resp. in some UI methods.
break;
}
spr.put(cell,in);
}
spr.saveCsv("tmp/test.csv");
kb.close();
} }
} }

View File

@ -1,10 +1,8 @@
package de.hs_mannheim.informatik.spreadsheet; package de.hs_mannheim.informatik.spreadsheet;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Scanner;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -23,12 +21,8 @@ public class Spreadsheet {
* @param cols number of columns * @param cols number of columns
*/ */
public Spreadsheet(int rows, int cols) { public Spreadsheet(int rows, int cols) {
if (rows>99){
rows=99; // TODO limit the maximum size on 99 (1..99) rows and 26 (A..Z) columns
}
if (cols>26) {
cols=26;
}
cells = new Cell[rows][cols]; cells = new Cell[rows][cols];
@ -68,7 +62,7 @@ public class Spreadsheet {
} }
private int getRow(String cellName) { private int getRow(String cellName) {
return Integer.parseInt(cellName.substring(1))-1; return cellName.charAt(1) - '1';
} }
// ----- // -----
@ -82,18 +76,8 @@ public class Spreadsheet {
* @return Nothing. * @return Nothing.
* @exception IOException If path does not exist. * @exception IOException If path does not exist.
*/ */
public void readCsv(String path) throws FileNotFoundException { public void readCsv(String path, char separator, String startCellName) throws FileNotFoundException {
Scanner file=new Scanner(new File(path)); // TODO: implement this
String[] rowRead;
int row=0;
while(file.hasNextLine()) {
rowRead=file.nextLine().split(",");
for(int col=0;col<=rowRead.length-1;col++) {
put(row,col,rowRead[col]);
}
row++;
}
} }
/** /**
@ -107,8 +91,12 @@ public class Spreadsheet {
for (Cell[] row : cells) { for (Cell[] row : cells) {
for (Cell cell : row) { for (Cell cell : row) {
out.print(cell.getValue()); if (!cell.getFormula().isEmpty())
if (cell != row[cells.length-1]) out.print("=" + cell.getFormula());
else
out.print(cell.getValue());
if (cell != row[cells[0].length-1])
out.print(","); out.print(",");
} }
out.println(); out.println();
@ -126,48 +114,18 @@ public class Spreadsheet {
String formula = cells[row][col].getFormula(); String formula = cells[row][col].getFormula();
String result = ""; String result = "";
if (formula.startsWith("SUMME(")) if (formula.startsWith("SUMME(")) // e.g. SUMME(A3:A8)
if(formula.length()==14) result = "" + sum(formula.substring(6, 8), formula.substring(9, 11)); // TODO adapt to cells with two digits
result = "" + sum(formula.substring(6, 9), formula.substring(10, 13)); else if (formula.startsWith("PRODUKT(")) // e.g. PRODUKT(A3:B9)
else if(formula.length()==13) result = "TODO"; // TODO
result = "" + sum(formula.substring(6, 8), formula.substring(9, 12)); else if (formula.startsWith("MITTELWERT(")) // e.g. MITTELWERT(A3:A5)
else result = "TODO"; // TODO
result = "" + sum(formula.substring(6, 8), formula.substring(9, 11)); else if (formula.startsWith("STABW(")) // e.g. STABW(C6:D8) -> Standardabweichung
else if (formula.startsWith("PRODUKT(")) result = "TODO"; // TODO
if(formula.length()==16) else if (formula.startsWith("MIN(")) // e.g. MIN(C13:H13) -> größter Wert
result = "" + product(formula.substring(8, 11), formula.substring(12, 15)); result = "TODO"; // TODO
else if(formula.length()==15) else if (formula.startsWith("MAX(")) // e.g. MAX(A1:A10) -> Standardabweichung
result = "" + product(formula.substring(8, 10), formula.substring(11, 14)); result = "TODO"; // TODO
else
result = "" + product(formula.substring(8, 10), formula.substring(11, 13));
else if (formula.startsWith("MITTELWERT("))
if(formula.length()==19)
result = "" + average(formula.substring(11, 14), formula.substring(15, 18));
else if(formula.length()==18)
result = "" + average(formula.substring(11, 13), formula.substring(14, 17));
else
result = "" + average(formula.substring(11, 13), formula.substring(14, 16));
else if (formula.startsWith("STABW("))
if(formula.length()==14)
result = "" + standardDeviation(formula.substring(6, 9), formula.substring(10, 13));
else if(formula.length()==13)
result = "" + standardDeviation(formula.substring(6, 8), formula.substring(9, 12));
else
result = "" + standardDeviation(formula.substring(6, 8), formula.substring(9, 11));
else if (formula.startsWith("MAX("))
if(formula.length()==12)
result = "" + max(formula.substring(4, 7), formula.substring(8, 11));
else if(formula.length()==11)
result = "" + max(formula.substring(4, 6), formula.substring(7, 10));
else
result = "" + max(formula.substring(4, 6), formula.substring(7, 9));
else if (formula.startsWith("MIN("))
if(formula.length()==12)
result = "" + min(formula.substring(4, 7), formula.substring(8, 11));
else if(formula.length()==11)
result = "" + min(formula.substring(4, 6), formula.substring(7, 10));
else
result = "" + min(formula.substring(4, 6), formula.substring(7, 9));
else if (!formula.isEmpty()) { else if (!formula.isEmpty()) {
try { try {
result = "" + calculate(formula); result = "" + calculate(formula);
@ -178,79 +136,17 @@ public class Spreadsheet {
cells[row][col].setValue("" + result); cells[row][col].setValue("" + result);
} }
//calculations for cell blocks
/**
* 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) { private long sum(String startCellName, String endCellName) {
long sum=0; // TODO implement
for(int i=startCellName.charAt(0)-'A'; i<=endCellName.charAt(0)-'A'; i++) {
for(int j=Integer.parseInt(startCellName.substring(1))-1; j<=Integer.parseInt(endCellName.substring(1))-1; j++) { return 0;
if(cells[j][i].isEmpty())
continue;
sum+=Integer.parseInt(cells[j][i].getValue());
}
}
return sum;
}
private long product(String startCellName, String endCellName) {
long product=1;
for(int i=startCellName.charAt(0)-'A'; i<=endCellName.charAt(0)-'A'; i++) {
for(int j=Integer.parseInt(startCellName.substring(1))-1; j<=Integer.parseInt(endCellName.substring(1))-1; j++) {
if(cells[j][i].isEmpty())
return 0;
product=product*Integer.parseInt(cells[j][i].getValue());
}
}
return product;
}
private long average(String startCellName, String endCellName) {
long average=0;
long counter=0;
for(int i=startCellName.charAt(0)-'A'; i<=endCellName.charAt(0)-'A'; i++) {
for(int j=Integer.parseInt(startCellName.substring(1))-1; j<=Integer.parseInt(endCellName.substring(1))-1; j++) {
if(cells[j][i].isEmpty())
continue;
average+=Integer.parseInt(cells[j][i].getValue());
counter++;
}
}
return (long) average/counter;
}
private long standardDeviation(String startCellName, String endCellName) {
long average=average(startCellName,endCellName);
long counter=0;
long value=0;
for(int i=startCellName.charAt(0)-'A'; i<=endCellName.charAt(0)-'A'; i++) {
for(int j=Integer.parseInt(startCellName.substring(1))-1; j<=Integer.parseInt(endCellName.substring(1))-1; j++) {
if(cells[j][i].isEmpty())
continue;
value+=Math.pow(Integer.parseInt(cells[j][i].getValue())-average,2);
counter++;
}
}
return (long) Math.sqrt(value/(counter-1));
}
private int max(String startCellName,String endCellName) {
int max=Integer.MIN_VALUE;
for(int i=startCellName.charAt(0)-'A'; i<=endCellName.charAt(0)-'A'; i++) {
for(int j=Integer.parseInt(startCellName.substring(1))-1; j<=Integer.parseInt(endCellName.substring(1))-1; j++) {
if(cells[j][i].isEmpty())
continue;
else if(max<Integer.parseInt(cells[j][i].getValue()))
max=Integer.parseInt(cells[j][i].getValue());
}
}
return max;
}
private int min(String startCellName,String endCellName) {
int min=Integer.MAX_VALUE;
for(int i=startCellName.charAt(0)-'A'; i<=endCellName.charAt(0)-'A'; i++) {
for(int j=Integer.parseInt(startCellName.substring(1))-1; j<=Integer.parseInt(endCellName.substring(1))-1; j++) {
if(cells[j][i].isEmpty())
continue;
else if(min>Integer.parseInt(cells[j][i].getValue()))
min=Integer.parseInt(cells[j][i].getValue());
}
}
return min;
} }
/** /**
@ -266,61 +162,14 @@ public class Spreadsheet {
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 res = 0;
boolean first=true;
String operation="";
// 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() while (m.find()) { // m.find() must always be used before m.group()
String s = m.group(); String s = m.group();
if(!s.isEmpty()) { if (!s.isEmpty()) {
if((int)s.charAt(0)>=(int)'A'&&(int)s.charAt(0)<=(int)'Z' && get(s).isEmpty()) System.out.println(s);
continue;
if(first && (int)s.charAt(0)>=(int)'A'&&(int)s.charAt(0)<=(int)'Z') {
res=Integer.parseInt(get(s));
first=false;
}else if(first) {
res=Integer.parseInt(s);
first=false;
}else if(s.equals("+")){
operation="+";
}else if(s.equals("-")){
operation="-";
}else if(s.equals("*")){
operation="*";
}else if(s.equals("/")){
operation="/";
}else if((int)s.charAt(0)>=(int)'A'&&(int)s.charAt(0)<=(int)'Z'){
switch(operation) {
case("+"):
res+=Integer.parseInt(get(s));
break;
case("-"):
res-=Integer.parseInt(get(s));
break;
case("*"):
res*=Integer.parseInt(get(s));
break;
case("/"):
res/=Integer.parseInt(get(s));
break;
}
}else {
switch(operation) {
case("+"):
res+=Integer.parseInt(s);
break;
case("-"):
res-=Integer.parseInt(s);
break;
case("*"):
res*=Integer.parseInt(s);
break;
case("/"):
res/=Integer.parseInt(s);
break;
}
}
} }
} }