Compare commits
16 Commits
Author | SHA1 | Date |
---|---|---|
ERANZER | 7cf156f229 | |
ERANZER | 0a6ad90343 | |
ERANZER | 1c024fdbfc | |
ERANZER | f3af3f39e0 | |
ERANZER | 365b569a67 | |
ERANZER | 9096432995 | |
ERANZER | 3f9b7a7091 | |
ERANZER | 99017baabe | |
ERANZER | 85905a5d6d | |
ERANZER | 7f44b09aa4 | |
ERANZER | e8114209f2 | |
ERANZER | 859be3633e | |
ERANZER | 9c5b38d9db | |
ERANZER | f19c749e0b | |
ERANZER | 0a7c0022e8 | |
ERANZER | ba7e093c46 |
|
@ -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>
|
|
@ -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>
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue