Compare commits

..

16 Commits
main ... main

Author SHA1 Message Date
ERANZER 7cf156f229 vorheriges 2024-01-09 14:32:26 +01:00
ERANZER 0a6ad90343 ReadCsv + little rework for UI 2024-01-09 14:32:07 +01:00
ERANZER 1c024fdbfc das vorherige 2024-01-09 13:40:01 +01:00
ERANZER f3af3f39e0 update regex für leere zellen 2024-01-09 13:39:15 +01:00
ERANZER 365b569a67 Ausrechnen von Formeln 2024-01-09 13:25:44 +01:00
ERANZER 9096432995 min value of a cell block 2024-01-05 20:18:26 +01:00
ERANZER 3f9b7a7091 max value of a cell block 2024-01-05 20:14:01 +01:00
ERANZER 99017baabe Standardabweichung 2024-01-05 19:28:29 +01:00
ERANZER 85905a5d6d Mittelwert 2024-01-05 19:09:52 +01:00
ERANZER 7f44b09aa4 improving previous written code 2024-01-05 18:42:21 +01:00
ERANZER e8114209f2 product of a cell block 2024-01-05 12:55:34 +01:00
ERANZER 859be3633e sum of a cell block with two digit rows 2024-01-05 12:31:59 +01:00
ERANZER 9c5b38d9db sum of a cell block 2024-01-05 11:58:29 +01:00
ERANZER f19c749e0b simple loop + limitation for cols and rows 2024-01-05 11:18:20 +01:00
ERANZER 0a7c0022e8 simple loop + limitation for rows and cols 2024-01-05 11:15:23 +01:00
ERANZER ba7e093c46 testen 2023-12-19 14:39:36 +01:00
4 changed files with 252 additions and 51 deletions

7
.classpath 100644
View File

@ -0,0 +1,7 @@
<?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>

17
.project 100644
View File

@ -0,0 +1,17 @@
<?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,6 +1,7 @@
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.
@ -10,20 +11,45 @@ import java.io.FileNotFoundException;
public class Axel { public class Axel {
public static void main(String[] args) throws FileNotFoundException { public static void main(String[] args) throws FileNotFoundException {
Spreadsheet spr = new Spreadsheet(10,10); String cell, in;
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);
}
spr.put("A3", "123"); while(true) {
spr.put("A2", "1"); System.out.println(spr);
System.out.print("Cell:");
spr.put("B9", "=41+A2"); cell=kb.nextLine();
spr.put("J5", "=7*6"); if(cell.equals("/exit")) {
spr.put("J6", "=3/2"); System.out.println("Auf Wiedersehen");
break;
System.out.println(spr); }
System.out.print("Value:");
spr.saveCsv("/tmp/test.csv"); in=kb.nextLine();
if(in.equals("/exit")) {
// TODO: You might want to put "UI loop" for entering value and formulas here resp. in some UI methods. System.out.println("Auf Wiedersehen");
break;
}
spr.put(cell,in);
}
spr.saveCsv("tmp/test.csv");
kb.close();
} }
} }

View File

@ -1,8 +1,10 @@
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;
@ -21,8 +23,12 @@ 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){
// TODO limit the maximum size on 99 (1..99) rows and 26 (A..Z) columns rows=99;
}
if (cols>26) {
cols=26;
}
cells = new Cell[rows][cols]; cells = new Cell[rows][cols];
@ -62,7 +68,7 @@ public class Spreadsheet {
} }
private int getRow(String cellName) { private int getRow(String cellName) {
return cellName.charAt(1) - '1'; return Integer.parseInt(cellName.substring(1))-1;
} }
// ----- // -----
@ -76,8 +82,18 @@ 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, char separator, String startCellName) throws FileNotFoundException { public void readCsv(String path) throws FileNotFoundException {
// TODO: implement this Scanner file=new Scanner(new File(path));
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++;
}
} }
/** /**
@ -91,12 +107,8 @@ public class Spreadsheet {
for (Cell[] row : cells) { for (Cell[] row : cells) {
for (Cell cell : row) { for (Cell cell : row) {
if (!cell.getFormula().isEmpty()) out.print(cell.getValue());
out.print("=" + cell.getFormula()); if (cell != row[cells.length-1])
else
out.print(cell.getValue());
if (cell != row[cells[0].length-1])
out.print(","); out.print(",");
} }
out.println(); out.println();
@ -114,18 +126,48 @@ public class Spreadsheet {
String formula = cells[row][col].getFormula(); String formula = cells[row][col].getFormula();
String result = ""; String result = "";
if (formula.startsWith("SUMME(")) // e.g. SUMME(A3:A8) if (formula.startsWith("SUMME("))
result = "" + sum(formula.substring(6, 8), formula.substring(9, 11)); // TODO adapt to cells with two digits if(formula.length()==14)
else if (formula.startsWith("PRODUKT(")) // e.g. PRODUKT(A3:B9) result = "" + sum(formula.substring(6, 9), formula.substring(10, 13));
result = "TODO"; // TODO else if(formula.length()==13)
else if (formula.startsWith("MITTELWERT(")) // e.g. MITTELWERT(A3:A5) result = "" + sum(formula.substring(6, 8), formula.substring(9, 12));
result = "TODO"; // TODO else
else if (formula.startsWith("STABW(")) // e.g. STABW(C6:D8) -> Standardabweichung result = "" + sum(formula.substring(6, 8), formula.substring(9, 11));
result = "TODO"; // TODO else if (formula.startsWith("PRODUKT("))
else if (formula.startsWith("MIN(")) // e.g. MIN(C13:H13) -> größter Wert if(formula.length()==16)
result = "TODO"; // TODO result = "" + product(formula.substring(8, 11), formula.substring(12, 15));
else if (formula.startsWith("MAX(")) // e.g. MAX(A1:A10) -> Standardabweichung else if(formula.length()==15)
result = "TODO"; // TODO result = "" + product(formula.substring(8, 10), formula.substring(11, 14));
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);
@ -136,17 +178,79 @@ 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) {
// TODO implement long sum=0;
for(int i=startCellName.charAt(0)-'A'; i<=endCellName.charAt(0)-'A'; i++) {
return 0; for(int j=Integer.parseInt(startCellName.substring(1))-1; j<=Integer.parseInt(endCellName.substring(1))-1; j++) {
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;
} }
/** /**
@ -162,14 +266,61 @@ 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()) {
System.out.println(s); if((int)s.charAt(0)>=(int)'A'&&(int)s.charAt(0)<=(int)'Z' && get(s).isEmpty())
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;
}
}
} }
} }