# Buchführungsprogramm



## Hünker (4. Dez 2011)

hallo,
bräuchte hilfe bei der aufgabe:
Es sollen Buchführungseinträge verwaltet werden. Erstellen Sie dafür eine Klasse
BookingEntry. Diese Klasse enthält die Attribute consecutiveNumber (ein int),
purpose (ein String) und ein value (ein float).
Schreiben Sie eine Klasse Booking mit einer main-Methode. Hier sollen vier
BookingEntry Objekte erzeugt werden. Füllen sie die Objekte mit folgenden Werten:
            consecutiveNumber  purpose          value
Objekt1           1                 bus-ticket       -20.00
Objekt2           2                 sold book        +50.25
Objekt3           3                 sold car          +4012.12
Objekt4           4                 bought used car  + 2134.13

Erstellen Sie eine float-Variable total mit dem Wert 500:00.
Geben Sie erst den Wert von total aus, dann nacheinander die vier
Werte (consecutiveNumber, purpose und value). Nach jedem Booking 
total-Wert um den BookingEntry value geändert werden (Aufaddier
Wert wird dann erneut ausgegeben.
Die Reihenfolge der Ausgeben in jeweils einer neuen Zeile sind:
1. total
2. BookingEntry 1 (consecutiveNumber, purpose and value)
3. new total
4. BookingEntry 2
5. new total
6. BookingEntry 3
7. new total
8. BookingEntry 4
9. new total
Die Ausgaben sollen mit dem System.out.println Befehl erfolgen.

hab das bisher:


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package grundlagenuebungen;

/**
 *
 * @author 
 */
public class BookingEntry {

    public int consecutiveNumber;
    public String purpose;
    public float value;

}
```


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package grundlagenuebungen;

/**
 *
 * @author 
 */
public class Booking {
    
public static void main(String[] args) {

       
    BookingEntry bookingentry = new BookingEntry();
    
    bookingentry.consecutiveNumber = 1;
   
    bookingentry.consecutiveNumber = 2;
    
    bookingentry.consecutiveNumber = 3;
    
    bookingentry.consecutiveNumber = 4;
    
    bookingentry.purpose = "bus ticket";
    
    bookingentry.purpose = "sold book";
    
    bookingentry.purpose = "sold car";
    
    bookingentry.purpose = "bought used car";
    
    bookingentry.value = -20.00f;
    
    bookingentry.value = +50.25f;
    
    bookingentry.value = +4012.12f;
    
    bookingentry.value = -2134.13f;
    
    float total;
    
    total = 500;
    
    float objekt1 = 
            
            System.out.println (total);
       }
}
```

Das problem ist ich weiß nicht ob ich die Objekte richtig erstellt hab und wie man dann die werte ausgebe kann? :S


----------



## Michael... (4. Dez 2011)

Ich nehme mal an, dass hier mit get und set Methoden gearbeitet werden soll.
Üblicherweise werde Instanzvariablen als private deklariert, mit set Methoden gesetzt und mit get-Methoden ausgelesen.
Um eine Objekt bzw. dessen Inhalte gesamthaft auszugeben, kann man auch die 
	
	
	
	





```
public void String toString()
```
 der Klasse überschreiben.


----------



## Hünker (4. Dez 2011)

hmmm verstehe grade nur bahnhof...hatten aber noch keine get oder set methoden in der vorlesung gehabt :S was gibt es den für andere methoden noch? weil wir hatten nur bisher nur diese die ich gemacht hab..
könntest du mir die get set methode an einem kleinen beispiel zeigen?
und ist die klasse BookingEntry richtig?


----------



## Traxer (4. Dez 2011)

Hm, ich habe die Aufgabenstellung nicht wirklich verstanden...

In der Klasse Booking erstellst Du aber definitiv nur ein Objekt BookingEntry und überschreibst die Attribute jeweils viermal. Sprich nach Durchlaufen der main hast Du ein Objekt bookingentry mit den Werten consecutiveNumber = 4, purpose = "bought used car" und value = -2134.13f. Das macht so keinen Sinn. 

Vermutlich soll irgendwo das total mitgeführt und aufsaldiert werden, allerdings wird das aus der Aufgabenstellung so nicht ersichtlich.


----------



## Hünker (4. Dez 2011)

steht doch in der aufgaben stellung: Nach jedem Booking
total-Wert um den BookingEntry value geändert werden (Aufaddiert)
Wert wird dann erneut ausgegeben...


----------



## Hünker (5. Dez 2011)

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package grundlagenuebungen;

/**
 *
 * @author 
 */
public class Booking {
    
public static void main(String[] args) {

       
    BookingEntry bookingentry1 = new BookingEntry();
    
      bookingentry1.consecutiveNumber = 1;
      bookingentry1.purpose = "bus ticket";
      bookingentry1.value = -20.00f;
    
    BookingEntry bookingentry2 = new BookingEntry();
     
      bookingentry2.consecutiveNumber = 2;
      bookingentry2.purpose = "sold book";
      bookingentry2.value = +50.25f;
    
    BookingEntry bookingentry3 = new BookingEntry();
    
      bookingentry3.consecutiveNumber = 3;
      bookingentry3.purpose = "sold car";
      bookingentry3.value = +4012.12f;
    
    BookingEntry bookingentry4 = new BookingEntry();
    
      bookingentry4.consecutiveNumber = 4;
      bookingentry4.purpose = "bought used car";
      bookingentry4.value = -2134.13f;
      
    float total;
   
    
    total = 500.00f;
   
            
   
            
            System.out.println (total);
            System.out.println (bookingentry1.consecutiveNumber +" "+bookingentry1.purpose +" "+ bookingentry1.value );
            System.out.println (total + bookingentry1.value );
            System.out.println (bookingentry2.consecutiveNumber +" "+bookingentry2.purpose +" "+ bookingentry2.value );
            System.out.println (total + bookingentry1.value + bookingentry2.value );
            System.out.println (bookingentry3.consecutiveNumber +" "+bookingentry3.purpose +" "+ bookingentry3.value );
            System.out.println (total + bookingentry1.value + bookingentry2.value + bookingentry3.value);
            System.out.println (bookingentry4.consecutiveNumber +" "+bookingentry4.purpose +" "+ bookingentry4.value );
            System.out.println (total + bookingentry1.value + bookingentry2.value + bookingentry3.value + bookingentry4.value );
```

ich hab das so gelöst! kommt auch fast richtig raus!
run:
500.0
1 bus ticket -20.0
480.0
2 sold book 50.25
530.25
3 sold car 4012.12
4542.37
4 bought used car -2134.13
2408.2402

versteh nur nicht wieso beim letzten 2408.2402 rauskommt und nicht 2408.24?! könnte mir da einer helfen?


----------



## Dow Jones (5. Dez 2011)

Die 2408.2402 werden vermutlich durch Rundungsfehler entstehen. Das ist aber JAVAs Schuld, nicht deine. Es liegt daran wie Floats und Doubles intern verarbeitet werden und ist ein gängiges Problem, dessen man sich bewusst sein sollte. Du kannst dann höchstens noch versuchen _irgendwie zurückzurunden_.


```
double x = 1.1 + 0.1;
        System.out.println("x = " + x);
```
Was meinst du, was dabei herauskommt? 

Die Verwendung von BigDecimals hilft einem auch nicht. Da hat man leider den gleichen Salat, nur mit mehr Nachkommastellen. Das sinnvollste wäre es wohl du würdest alles in Cent rechnen (also mit Integerwerten) und erst zum Schluß den Betrag in Euro und Cent aufspalten.


----------



## Hünker (5. Dez 2011)

da würde : 1.2000000000000002 rauskommen 

das problem ist es ist vorgegeben das value in float sein muss :S

aber wie ich dann richtig verstanden hab ich meine lösung entsprechend der aufgabe richtig ?


----------



## Dow Jones (5. Dez 2011)

Hünker hat gesagt.:


> da würde : 1.2000000000000002 rauskommen


Du lernst schnell, junger Padawan. 



> aber wie ich dann richtig verstanden hab ich meine lösung entsprechend der aufgabe richtig ?


Beinahe. Also eigentlich schon. Bis auf einen kleinen Schönheitsfehler: In der Aufgabe steht explizit geschrieben, das der total-wert nach jedem booking geändert werden soll. Bei dir wird er jedoch nicht verändert. Wenn du ganz am Ende des Programms mal ein 
	
	
	
	





```
System.out.println(total);
```
 anfügst wirst du feststellen, das total immer noch auf 500.00 steht. Der Lehrer wollte wahrscheinlich eher soetwas sehen:

```
System.out.println (total);

            System.out.println (bookingentry1.consecutiveNumber +" "+bookingentry1.purpose +" "+ bookingentry1.value );
            total = total + bookingentry1.value;
            System.out.println (total);

            System.out.println (bookingentry2.consecutiveNumber +" "+bookingentry2.purpose +" "+ bookingentry2.value );
            total = total + bookingentry2.value;
            System.out.println (total);

            System.out.println (bookingentry3.consecutiveNumber +" "+bookingentry3.purpose +" "+ bookingentry3.value );
            total = total + bookingentry3.value;
            System.out.println (total);

            System.out.println (bookingentry4.consecutiveNumber +" "+bookingentry4.purpose +" "+ bookingentry4.value );
            total = total + bookingentry4.value;
            System.out.println (total);
```


----------



## Hünker (5. Dez 2011)

danke wäre darauf nicht gekommen  habe mir gerade das mit BigDecimal angeguckt und mit eingegebaut...


```
*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package grundlagenuebungen;



import java.text.DecimalFormat;
/**
 *
 * @author 
 */
public class Booking {
    
public static void main(String[] args) {

       
    BookingEntry bookingentry1 = new BookingEntry();
    
      bookingentry1.consecutiveNumber = 1;
      bookingentry1.purpose = "bus ticket";
      bookingentry1.value = -20.00f;
    
    BookingEntry bookingentry2 = new BookingEntry();
     
      bookingentry2.consecutiveNumber = 2;
      bookingentry2.purpose = "sold book";
      bookingentry2.value = +50.25f;
    
    BookingEntry bookingentry3 = new BookingEntry();
    
      bookingentry3.consecutiveNumber = 3;
      bookingentry3.purpose = "sold car";
      bookingentry3.value = +4012.12f;
    
    BookingEntry bookingentry4 = new BookingEntry();
    
      bookingentry4.consecutiveNumber = 4;
      bookingentry4.purpose = "bought used car";
      bookingentry4.value = -2134.13f;
      
    float total;
   
    
    total = 500.00f;
   
    DecimalFormat df = new DecimalFormat("0.00");

     
   
            
              System.out.println (total);
 
            System.out.println (bookingentry1.consecutiveNumber +" "+bookingentry1.purpose +" "+ bookingentry1.value );
            total = total + bookingentry1.value;
            System.out.println (total);
 
            System.out.println (bookingentry2.consecutiveNumber +" "+bookingentry2.purpose +" "+ bookingentry2.value );
            total = total + bookingentry2.value;
            System.out.println (total);
 
            System.out.println (bookingentry3.consecutiveNumber +" "+bookingentry3.purpose +" "+ bookingentry3.value );
            total = total + bookingentry3.value;
            System.out.println (total);
 
            System.out.println (bookingentry4.consecutiveNumber +" "+bookingentry4.purpose +" "+ bookingentry4.value );
            total = total + bookingentry4.value;
            System.out.println (df.format(total));
    
            }

}
```

500.0
1 bus ticket -20.0
480.0
2 sold book 50.25
530.25
3 sold car 4012.12
4542.37
4 bought used car -2134.13
2408,24

was muss ich ändern damit am ende 2408.24 steht und nicht 2408,24 ?


----------



## emailundlos (5. Dez 2011)

string format, string formatter


----------



## Hünker (5. Dez 2011)

hatten wir leider noch nicht !
kann man es auch so machen? komme damit zumindest auf die 2408.24!


```
total = total + bookingentry4.value;
            System.out.println (Math.round(total*100.0)/100.0);
```


----------



## Hünker (5. Dez 2011)

kann mir jemand erklären was mit den beiden fehler meldungen gemeint ist?

.Teste Booking.main auf die Daten des bus-ticket-Objektes

Ausgaben:
500.0
1 bus ticket -20.0
480.0
2 sold book 50.25
530.25
3 sold car 4012.12
4542.37
4 bought used car -2134.13
2408.24

F
Time: 0,015
There was 1 failure:
1) testStudenten1(AllTests)junit.framework.AssertionFailedError: Daten des Objektes bus-ticket nicht enthalten.
-----
	at AllTests.testStudenten1(AllTests.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

FAILURES!!!
Tests run: 1,  Failures: 1,  Errors: 0

und 

.Teste Booking.main auf den ersten Zwischenbetrag

Ausgaben:
500.0
1 bus ticket -20.0
480.0
2 sold book 50.25
530.25
3 sold car 4012.12
4542.37
4 bought used car -2134.13
2408.24

F
Time: 0,016
There was 1 failure:
1) testStudenten1(AllTests)junit.framework.AssertionFailedError: Erster Zwischenbetrag ist nicht enthalten.
-----
	at AllTests.testStudenten1(AllTests.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

FAILURES!!!
Tests run: 1,  Failures: 1,  Errors: 0

danke im vorraus!


----------



## Hünker (6. Dez 2011)

also den ersten fehler hab ich korrigiert lag wohl daran das ich bus ticket anstatt bus-ticket geschrieben hab und so es nicht zu greifen konnte 

wieso kann ich aber nicht auf den 1 zwischen betrag sprich die 480 zugreifen?


----------



## SlaterB (6. Dez 2011)

was bedeutet es, 'auf einen Betrag zuzugreifen'?
worum geht es dir, welcher Code ist aktuelle, welche Probleme bestehen?

ich sehe im Thread nicht viel mehr als 'bus ticket -20.0'-rechnen, Ausgaben usw., wie soll irgendjemand deine Fragen verstehen?


----------



## Hünker (6. Dez 2011)

also der aktuelle code ist:

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package grundlagenuebungen;



/**
 *
 * @author 
 */
public class Booking {
    
public static void main(String[] args) {

       
    BookingEntry bookingentry1 = new BookingEntry(); //erstellen des 1.Objektes
    
      bookingentry1.consecutiveNumber = 1;
      bookingentry1.purpose = "bus-ticket";
      bookingentry1.value = -20.00f;                //da-20.00 double ist in float umwandeln
    //Daten des 1.Objektes
    BookingEntry bookingentry2 = new BookingEntry(); //erstellen des 2.Objektes
     
      bookingentry2.consecutiveNumber = 2;           
      bookingentry2.purpose = "sold book";
      bookingentry2.value = +50.25f;                 //da 50.25 double ist in float umwandeln
    // Daten des 2.Objektes
    BookingEntry bookingentry3 = new BookingEntry(); //erstellen des 3.Objektes
    
      bookingentry3.consecutiveNumber = 3;
      bookingentry3.purpose = "sold car";
      bookingentry3.value = +4012.12f;               //da +4012.12 double ist in float umwandeln
    // Daten des 3.Objektes
    BookingEntry bookingentry4 = new BookingEntry(); //erstellen des 4.Objektes
    
      bookingentry4.consecutiveNumber = 4;
      bookingentry4.purpose = "bought used car";
      bookingentry4.value = -2134.13f;               //da -2134.13 double ist in float umwandeln
     // Daten des 4.Objektes 
    float total;                                    //initialisierung der variable total
   
    
    total = 500.00f;                                //deklarieren der variable total
                                                    // da 500.00 double ist in float umwandeln
         
   
            
            System.out.println (total);
            //Ausgabe total
            System.out.println (bookingentry1.consecutiveNumber +" "+bookingentry1.purpose +" "+ bookingentry1.value );
            //Ausgabe 1.BookingEntry (1.Objekt)
            total = total + bookingentry1.value;
            //Berechnung new total
            System.out.println (total);
            //Ausgabe new total
            System.out.println (bookingentry2.consecutiveNumber +" "+bookingentry2.purpose +" "+ bookingentry2.value );
            //Ausgabe 2.BookingEntry (2.Objekt)
            total = total + bookingentry2.value;
            //berechnung new total
            System.out.println (total);
            //Ausgabe new total
            System.out.println (bookingentry3.consecutiveNumber +" "+bookingentry3.purpose +" "+ bookingentry3.value );
            //Ausgabe 3.BookingEntry (3.Objekt)
            total = total + bookingentry3.value;
            //berechnung new total
            System.out.println (total);
            //Ausgabe new total
            System.out.println (bookingentry4.consecutiveNumber +" "+bookingentry4.purpose +" "+ bookingentry4.value );
            //Ausgabe 4.BookingEntry (4.Objekt)
            total = total + bookingentry4.value;
            //berechnung new total
            System.out.println (Math.round(total*100.0)/100.0);
            /** Ausgabe new total, wird auf 2 nachkommastellen gerundet weil bei der 
             berechnung von float und double zahlen ein rundungsfehler entsteht */ 
            
            }

}
```

wir können dann bei der Abgabe solche tests machen hatte dann diese 2 fehler meldungen...beim ersten denke ich hab ich einfach "-" zwischen bus ticket vergessen und beim 2 kp wieso da diese fehler meldung kam :S


----------



## SlaterB (6. Dez 2011)

ok, so langsam verstehe ich die Vorgänge,

meine schwache Vermutung ist dann, dass die Ausgabe nicht stimmt, z.B. zwei Nachkommastellen bei Zahlen,
dass deine erzeugten BookingEntry Auswirkung haben kann ich mir kaum vorstellen, wahrscheinlich nur die System.out.println()-Ausgaben

versuche es testweise nur mit Dummy-Ausgaben


```
main {
  System.out.println("500.00");
  System.out.println("1 bus-ticket -20.00");
  usw.

}
```
oder arbeite eben an geänderter Ausgabe, mit DecimalFormat kannst du zwei Nachkommastellen erzwingen,
vielleicht ist auch 1., 2., 3. am Anfang der Zeilen nötig?
später ist wahrscheinlich auch an ein Plus-Zeichen zu denken

was anderes sehe ich derzeit nicht, mit Java hat das alles auch ziemlich wenig zu tun, 
es ist nur zu raten welche Ausgaben oder sonstigen Umstände dein Test-Programm erwartet..


----------

