Java/List und Java/Runden: Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
< Java(Unterschied zwischen Seiten)
main>Karl Kirst
K (Kasten blass -> blau)
 
main>Ugh
K (Runden in Java wurde nach Java/Runden verschoben)
 
Zeile 1: Zeile 1:
==Erster Implementierungsansatz==
{{Babel-4|Java|Idee|Links|Software}}
* ??? Wahrscheinlich ist der Positionszähler nicht so gemeint. Er soll anscheinend selbst ein Listenelement sein. Besitzt jemand einen stimmigen Quelltext?


===Mögliche Interpretation===
{{Unterrichtsidee}}
Realisiert mit ArrayList:
Einordnung: Nach der Einführung von Objekt, Klasse, Methode, elementare Datentypen
<source lang="java">
import java.util.ArrayList;


public class List {
Variablen vom Typen double haben z.T. sehr viele Nachkommastellen. Mit folgendem Trick schaffen wir es, die Variablen auf zwei Stellen zu runden.
private ArrayList liste;
private int positionszeiger;


public List(){
Vorgehen: Eine Zahl, z.B. 3.14159265 multipliziere ich mit 100:  314.159265.
  liste = new ArrayList(); // die Liste ist leer
Dann runde ich  und erhalte 314. Danach teile ich durch 100 und bekomme 3.14.
  positionszeiger=-1; // der Positionszeiger steht vor der Liste
}


public void insertBefore (Object pObject){ 
<java>
  liste.add(positionszeiger, pObject);
// Je nach Version wird ganz am Anfang folgende Zeile benötigt:
  positionszeiger--;
import java.lang.Math;
}


public void insertBehind (Object pObject){ 
// (...)
  liste.add(positionszeiger+1, pObject);
}


public void update (Object pObject){   
public double rundeAufZweiStellen(double zahl)  
  liste.set(positionszeiger, pObject);
{   
      return Math.round( zahl * 100 ) / 100;
}
}
</java>


public void delete ()
{{Übung|
  liste.remove(positionszeiger);
# Wie ruft man diese Methode auf, wenn man eine Zahl runden möchte?
}
# Schreiben Sie die Methode rundeAufDreiStellen(). Für fortgeschrittene: RundeAufXStellen()
}}


public void next(){
==Weblinks==
  if (positionszeiger!=liste.size()) positionszeiger++;
* Dieses Beispiel stammt aus Kapitel 2 des [http://informatik.zum.de/pieper/ Java Readers]
}
* vgl. [http://www.torsten-horn.de/techdocs/java-basics.htm Java-Basics]
 
public void previous(){
  if (positionszeiger>-1) positionszeiger--;
}
 
public void toFirst(){
  positionszeiger=0;
}
 
public void toLast(){
  positionszeiger=liste.size()-1;
}
 
public Object getItem(){
  if (liste.size()==0 || positionszeiger==-1 || positionszeiger>=liste.size())
    return null;
  else return liste.get(positionszeiger);
}
 
public boolean isEmpty (){ 
  return (liste.size()==0);
}
 
public boolean isBefore (){ 
  return (positionszeiger<0);
}
 
public boolean isBehind (){ 
  return (positionszeiger>=liste.size());
}
 
}
</source>
 
;Korrekturen:
11.09. - insertBehind: Positionszeiger wird vor und zurück gestellt
http://informatik.zum.de/pieper/blog/index.php?entry=entry060828-105313
 
==Zweiter Implementierungsansatz OOP pur==
* ??? Wahrscheinlich ist der Positionszeiger aus Delphi entlehnt und nicht sauber auf Java übertragbar. Hier mein Versuch es mit möglichst reinem OOP zu versuchen (bitte auf die Basisklasse ListElement achten).
 
<source lang="java">
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
/**
* '''Bestandteil des Zentralabiturs 2009'''<br>
* <br>
* Objekte der Klasse List verwalten beliebige Objekte nach einem Listenprinzip. Ein
* interner Positionszeiger wird durch die Listenstruktur bewegt, seine Position markiert
* ein aktuelles Objekt. Die Lage des Positionszeigers kann abgefragt, verändert und die
* Objektinhalte an den Positionen können gelesen oder verändert werden. Die Klasse Stack
* stellt Methoden in folgender Syntax zur Verfügung:
* <ul>
* <li>public List()</li>
* <li>public boolean isEmpty()</li>
* <li>public boolean isBefore()</li>
* <li>public boolean isBehind()</li>
* <li>public void next()</li>
* <li>public void previous()</li>
* <li>public void toFirst()</li>
* <li>public void toLast()</li>
* <li>public Object getItem()</li>
* <li>public void update (Object pObject)</li>
* <li>public void insertBefore (Object pObject)</li>
* <li>public void insertBehind (Object pObject)</li>
* <li>public void delete()</li>
* </ul>
* ''' Nicht Bestandteil des Zentralabiturs 2009''' - dient der praktischen Anwendung<br>
* <ul>
* <li>public clone()</li>
* <li>public load(String fileName)</li>
* <li>public save(String fileName)</li>
* </ul>
*
* @author <a href="mailto:schule@dinro.de">DiNaro</a>
* @version 1.0z+ 2006-09-12
*/
public class List implements Cloneable, Serializable
{
/**
* Attribut dient zur Serialisierung.
*/
private static final long serialVersionUID = 1087406856309777647L;
/**
* Attribut der Positionszeiger befindet sich vor der Liste (Flag).
*/
private boolean before;
 
/**
* Attribut der Positionszeiger befindet sich hinter der Liste (Flag).
*/
private boolean behind;
 
/**
* Attribut aktuelles Element.
*/
private ListElement current;
 
/**
* Attribut erstes Element der Liste
*/
private ListElement first;
 
/**
* Attribut letztes Element der Liste.
*/
private ListElement last;
 
/**
* Der Konstruktor erzeugt eine leere lineare Liste.<br>
* <br>
*
* <pre>
* Konstruktor  List()
* <br>
* Nachher      Eine leere Liste ist angelegt.
*              Der interne Positionszeiger steht vor der leeren Liste.
* </pre>
*/
public List()
{
this.first = null;
this.last = null;
this.current = null;
this.before = true;
this.behind = false;
}
 
/**
* Kopiert die Liste - '''Nicht Bestandteil des Zentralbiturs 2009!!!'''<br>
* ("shallow copy" nach dem Handbuch der Java Programmierung Kapitel 9.4.2).
*
* @return kopierte lineare Liste
* @throws CloneNotSupportedException kann nicht auftreten, aber der Compiler will es
*          so...
*/
@Override
public List clone() throws CloneNotSupportedException
{
try
{
return (List) super.clone();// "shallow copy"
}
catch (CloneNotSupportedException e)
{ // Kann nicht auftreten, aber der Compiler will es so...
throw new CloneNotSupportedException(e.toString());
}
}
 
/**
* Löscht des aktuellen Listenelement.<br>
* <br>
*
* <pre>
* Auftrag      delete()
* Vorher      Der Positionszeiger steht nicht vor oder hinter der Liste.
* Nachher      Das aktuelle Listenelement ist gelöscht. Der Positionszeiger steht auf
*              dem Element hinter dem gelöschten Element, bzw. hinter der Liste,
*              wenn das gelöschte Element das letzte Listenelement war.
* </pre>
*/
public void delete()
{
if (!this.before && !this.behind)
{ // Zeiger des Vorgängerelementes setzen
if (this.current == this.first)
{ // Vorgänger existiert nicht - Kopfzeiger korregieren
this.first = this.current.getNext();
}
else
{ // Vorgänger existiert
this.current.getPrevious().setNext(this.current.getNext());
}
// Zeiger des Nachfolgerelementes setzen
if (this.current == this.last)
{ // Nachfolger existiert nicht - Scxhwanzzeiger korreegieren
this.last = this.current.getPrevious();
}
else
{ // Nachfolger existiert
this.current.getNext().setPrevious(this.current.getPrevious());
}
// aktuelles Element setzen
this.current = this.current.getNext();
// Flag für Positionszeiger befindet sich hinter der Liste setzen
this.behind = this.current == null;
}
}
 
/**
* Gibt den Inhalt des aktuellen Listenelementes zurück, ohne die Liste zu verändern.<br>
* <br>
*
* <pre>
* Anfrage      getItem(): Object
* Nachher      Die Anfrage liefert den Wert des aktuellen Listenelements bzw. null,
*              wenn die Liste keine Elemente enthält, bzw. der Positionszeiger
*              vor oder hinter der Liste steht.
* </pre>
*
* @return item Inhalt des aktuellen Listenelementes.
*/
public Object getItem()
{
if (this.current != null)
{
return this.current.getItem();
}
else
{
return null;
}
}
 
/**
* Einfügen eines Listenelementes vor das aktuelle.<br>
* <br>
*
* <pre>
* Auftrag      insertBefore (Object pObject)
* Vorher        Der Positionszeiger steht nicht vor der Liste.
* Nachher      Ein neues Listenelement mit dem entsprechenden Objekt ist angelegt und
*              vor der aktuellen Position in die Liste eingefügt worden.
*              Der Positionszeiger steht hinter dem eingefügten Element.
* </pre>
*
* @param pObject Inhalt des Listenelementes.
*/
public void insertBefore(Object pObject)
{
if (!this.before)
{ // Der Positionszeiger steht nicht vor der Liste.
ListElement newElement;
if (this.isEmpty())
{ // Erstes und einziges Element in die Liste einfügen
newElement = new ListElement(pObject, null, null);
this.first = newElement;
this.last = newElement;
this.behind = true;
this.current = null;
}
else
{ // Die Liste ist nicht leer
if (this.behind)
{ // Der Positionszeiger steht hinter der Liste
newElement = new ListElement(pObject, this.last, null);
this.last.setNext(newElement);
this.last = newElement;
this.behind = true;
this.current = null;
}
else
{ // Der Positionszeiger steht mitten in der Liste
newElement = new ListElement(pObject, this.current.getPrevious(), this.current);
if (this.current == this.first)
{ // Vorgänger existiert nicht - Kopfzeiger korregieren
this.first = newElement;
}
else
{ // Vorgänger koregieren
this.current.getPrevious().setNext(newElement);
}
// Nachfolger korregieren
this.current.setPrevious(newElement);
// Aktuelles Element bleibt aktuelles Element
}
}
}
}
 
/**
* Einfügen eines Listenlementes hinter das aktuelle.<br>
* <br>
*
* <pre>
* Auftrag      insertBehind (Object pObject)
* Vorher        Der Positionszeiger steht nicht hinter der Liste.
* Nachher      Ein neues Listenelement mit dem entsprechenden Objekt ist angelegt
*              und hinter der aktuellen Position in die Liste eingefügt worden. Der
*              Positionszeiger steht vor dem eingefügten Element.
* </pre>
*
* @param pObject Inhalt des Listenelementes.
*/
public void insertBehind(Object pObject)
{
if (!this.behind)
{ // Der Positionszeiger steht nicht hinter der Liste.
ListElement newElement;
if (this.isEmpty())
{// Erstes und einziges Element in die Liste einfügen
newElement = new ListElement(pObject, null, null);
this.first = newElement;
this.last = newElement;
this.before = true;
this.current = null;
}
else
{ // Die Liste ist nicht leer
if (this.before)
{ // Der Positionszeiger steht vor der Liste.
newElement = new ListElement(pObject, null, this.first);
this.first.setPrevious(newElement);
this.first = newElement;
this.before = true;
this.current = null;
}
else
{ // Der Positionszeiger steht mitten in der Liste.
newElement = new ListElement(pObject, this.current, this.current.getNext());
if (this.current == this.last)
{ // Nachfolger existiert nicht - Schwanzzeiger korregieren
this.last = newElement;
}
else
{ // Nachfolger korregieren
this.current.getNext().setPrevious(newElement);
}
// Vorgänger koregieren
this.current.setNext(newElement);
// Aktuelles Element bleibt aktuelles Element
}
}
}
}
 
/**
* Steht der Positionszeiger vor der Liste?<br>
* <br>
*
* <pre>
* Anfrage      isBefore(): boolean
* Nachher      Die Anfrage liefert den Wert true, wenn der Positionszeiger vor dem
*              ersten Listenelement oder vor der leeren Liste steht, sonst liefert
*              sie den Wert false.
* </pre>
*
* @return liefert den Wert true, wenn der Positionszeiger vor dem ersten Listenelement
*        oder vor der leeren Liste steht, sonst liefert sie den Wert false.
*/
public boolean isBefore()
{
return this.before;
}
 
/**
* Steht der Positionszeiger hinter der Liste?<br>
* <br>
*
* <pre>
* Anfrage      isBehind(): boolean
* Nachher      Die Anfrage liefert den Wert true, wenn der Positionszeiger hinter dem
*              letzten Listenelement oder hinter der leeren Liste steht, sonst liefert
*              sie den Wert false.
* </pre>
*
* @return liefert den Wert true, wenn der Positionszeiger hinter dem letzten
*        Listenelement oder hinter der leeren Liste steht, sonst liefert sie den Wert
*        false.
*/
public boolean isBehind()
{
return this.behind;
}
 
/**
* Enthält die Liste keine Elemente?<br>
* <br>
*
* <pre>
* Anfrage      isEmpty(): boolean
* Nachher      Die Anfrage liefert den Wert true, wenn die Liste keine Elemente
*              enthält, sonst liefert sie den Wert false.
* </pre>
*
* @return liefert den Wert true, wenn die Liste keine Elemente enthält, sonst liefert
*        sie den Wert false.
*/
public boolean isEmpty()
{
return this.first == null;
}
 
/**
* Lädt die gesamte Liste als Objekt aus einer Datei - <b>Nicht Bestandteil des
* Zentralbiturs 2009!!!</b><br>
* Neues aktuelles Element wird das erste Listenelement(Setzung!).
*
* @param fileName [Laufwerk][Pfad]Dateiname,
* @throws ClassNotFoundException Erwartete Klasse nicht vorhanden
* @throws IOException Fehler beim Laden der Datei
*/
public void load(final String fileName) throws ClassNotFoundException, IOException
{
try
{
final ObjectInputStream stream = new ObjectInputStream(
new FileInputStream(fileName));
final List dummy = (List) stream.readObject();
this.first = dummy.first;
this.last = dummy.last;
this.before = dummy.before;
this.behind = dummy.behind;
this.toFirst(); // Als neues aktuelles Element wird das erste Listenelement gesetzt!
stream.close();
}
catch (final ClassNotFoundException e)
{ // Erwartete Klasse nicht vorhanden.
throw new ClassNotFoundException(e.toString());
}
catch (final IOException e)
{ // Fehler beim Laden der Datei.
throw new IOException(e.toString());
}
}
 
/**
* Setze das aktuelle Listenelement auf das nächste. <br>
* <br>
*
* <pre>
* Auftrag      next()
* Nachher      Der Positionszeiger ist um eine Position in Richtung Listenende weiter-
*              gerückt, d.h. wenn er vor der Liste stand, wird das Element am
*              Listenanfang zum aktuellen Element, ansonsten das jeweils nachfolgende
*              Listenelement. Stand der Positionszeiger auf dem letzten Listenelement,
*              befindet er sich jetzt hinter der Liste. Befand er sich hinter der
*              Liste, hat er sich nicht verändert.
* </pre>
*/
public void next()
{
if (!this.isEmpty())
{
if (this.before)
{ // Der Positionszeiger steht vor der Liste; das erste Element wird aktuelles
this.current = this.first;
this.before = false;
}
else
{ // der Positionszeiger steht nicht vor der Liste
if (this.current != null)
{ // das jeweils nachfolgende Listenelement wird aktuelles
this.current = this.current.getNext();
if (this.current == null)
{ // Der Positionszeiger zeigt hinter das letzte Element
this.behind = true;
}
}
} // Der Positionszeiger befindet sich hinter der Liste und bleibt unverändert
}
}
 
/**
* Setze das aktuelle Listenelement auf das vorherige.<br>
* <br>
*
* <pre>
* Auftrag      previous()
* Nachher      Der Positionszeiger ist um eine Position in Richtung Listenanfang
*              weitergerückt, d.h. wenn er hinter der Liste stand, wird das Element am
*              Listenende zum aktuellen Element, ansonsten das jeweils vorhergehende
*              Listenelement. Stand der Positionszeiger auf dem ersten Listenelement,
*              befindet er sich jetzt vor der Liste. Befand er sich vor der Liste, hat
*              er sich nicht verändert.
* </pre>
*/
public void previous()
{
if (!this.isEmpty())
{ /// Der Positionszeiger bleibt unverändert, wenn die Liste leer ist
if (this.behind)
{ // Der Positionszeiger steht hinter der Liste; das letzte Element wird aktuelles
this.current = this.last;
this.behind = false;
}
else
{// Der Positionszeiger steht nicht hinter der Liste
if (this.current != null)
{ // das jeweils vorhergehende Listenelement wird aktuelles
this.current = this.current.getPrevious();
if (this.current == null)
{ // Der Positionszeiger zeigt vor das erste Element
this.before = true;
}
}
} // Der Positionszeiger befindet sich vor der Liste und bleibt unverändert
}
}
 
/**
* Speichert die gesamte Liste als Objekt in einer Datei - <b>Nicht Bestandteil des
* Zentralbiturs 2009!!!</b><br>
* Das aktuelles Element bleibt erhalten!
*
* @param fileName [Laufwerk][Pfad]Dateiname.
* @throws IOException Fehler beim Speichern der Datei
*/
public void save(String fileName) throws IOException
{
try
{
ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(fileName));
stream.writeObject(this);
stream.close();
}
catch (IOException e)
{ // Fehler beim Speichern der Datei.
throw new IOException(e.toString());
}
}
 
/**
* Setzt das aktuelle Listenelement auf das erste zurück.<br>
* <br>
*
* <pre>
* Auftrag      toFirst()
* Nachher      Der Positionszeiger steht auf dem ersten Listenelement.
*              Falls die Liste leer ist befindet er sich jetzt hinter der Liste.
* </pre>
*/
public void toFirst()
{
this.current = this.first;
this.before = false;
this.behind = this.isEmpty();
}
 
/**
* Setzt das aktuelle Listenelement auf das letzte zurück.<br>
* <br>
*
* <pre>
* Auftrag      toLast()
* Nachher      Der Positionszeiger steht auf dem letzten Listenelement.
*              Falls die Liste leer ist befindet er sich jetzt vor der Liste.
* </pre>
*/
public void toLast()
{
this.current = this.last;
this.behind = false;
this.before = this.isEmpty();
}
 
/**
* <pre>
* Auftrag      update (Object pObject)
* Vorher        Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder
*              hinter der Liste.
* Nachher      Der Wert des Listenelements an der aktuellen Position ist durch pObject
*              ersetzt.
* </pre>
*
* @param pObject neuer Wert des Listenelements
*/
public void update(Object pObject)
{ // Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder hinter der
// Liste.
if (!this.isEmpty() && !this.before && !this.behind)
{ // Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder hinter der Liste.
this.current.setItem(pObject);
}
}
 
}
////////////////////////////////// Basisklasse ListElement /////////////////////////////////
import java.io.Serializable;
 
/**
* Datei ListElement.java (Klasse Listelement mit generalisiertem Datentyp Object).<br>
* <br>
* Die Klasse ListElement ist die '''Basisklasse für doppelt verkette Listen'''.<br>
* <br>
* Ein ListElement enthält eine Date, einen Verweis auf den Vorgänger und einen Verweis
* auf den Nachfolger. <br>
*
* Die Klasse ist wegen der Speicherbarkeit der Oberklasse serialisiert.<br>
* '''Die Klasse ist nicht Bestandteil des Zentralabiturs 2009, aber notwendig!!!'''
*
* @author <a href="mailto:schule@dinro.de">DiNaro</a>
* @version 1.0z+ 2006-09-11
*/
public class ListElement implements Serializable
{
/**
* Attribut dient zur Serialisierung.
*/
private static final long serialVersionUID = 8626283657638014888L;
 
/**
* Attribut Date des Listenelements.
*/
private Object item;
 
/**
* Attribut Nachfolger des Listenelements.
*/
private ListElement next;
 
/**
* Attribut Vorgänger des Listenelements.
*/
private ListElement previous;
 
/**
* Der Konstruktor erzeugt ein Listenelement mit Date, Vorgänger und Nachfolger.
*
* @param item Date des Listenelements.
* @param previous Vorgänger des Listenelements
* @param next Nachfolger des Listenelemente.
*/
public ListElement(Object item, ListElement previous, ListElement next)
{ this.item = item;
this.previous = previous;
this.next = next;
}
 
/**
* Gibt die Date des Elements zurück.
* @return  Date des Listenelements.
*/
public Object getItem()
{ return this.item;
}
 
/**
* Gibt den Nachfolger des Listenelements zurück.
* @return    Nachfolger des Listenelements.
*/
public ListElement getNext()
{ return this.next;
}
 
/**
* Gibt den Vorgänger des Listenelements zurück.
* @return  Vorgänger des Listenelements.
*/
public ListElement getPrevious()
{ return this.previous;
}
 
/**
* Setzt die Date des Listenelements.
* @param item    neue Date des Listenelements.
*/
public void setItem(Object item)
{ this.item = item;
}
 
/**
* Setzt den Nachfolger des Listenelements.
* @param next    neuer Nachfolger des Listenelements.
*/
public void setNext(ListElement next)
{ this.next = next;
}
 
/**
* Setzt den Vorgänger des Listenelements.
* @param previous  neuer Vorgänger des Listenelements.
*/
public void setPrevious(ListElement previous)
{ this.previous = previous;
}
 
}
</source>
 
==Probleme mit der Implementierung==
* [http://www.u-helmich.de/inf/BlueJ/kurs121/seite15/abi-list.html Hier] sind offene Fragen und Kommentare zusammengefasst.
* [http://informatik.zum.de/pieper/blog/index.php?entry=entry060828-105313 Aufruf zur Diskussion]
 
==Anwendungsbeispiele==
* [http://informatik.zum.de/pieper/blog/index.php?entry=entry060828-183201 Quiz mit Hilfe einer Liste] + Arbeitsblatt
* [[Liste mit Zahlen (Informatik)]]
 
==Unterseiten zu List==
{{blau|
<subpages
  parent=Java/List
  order=DESC
  order=lastedit
  showpath=no
/>
}}


== Siehe auch ==
==Siehe auch==
* [[Informatik]]
* [[Java]]
* [[Programmiersprachen]]
* [[Abitur (NRW)]]


[[Kategorie:Informatik]]
[[Kategorie:Java]]
[[Kategorie:Java]]
[[Kategorie:Linksammlung]]

Version vom 30. Oktober 2006, 15:36 Uhr

Vorlage:Babel-4

Vorlage:Unterrichtsidee Einordnung: Nach der Einführung von Objekt, Klasse, Methode, elementare Datentypen

Variablen vom Typen double haben z.T. sehr viele Nachkommastellen. Mit folgendem Trick schaffen wir es, die Variablen auf zwei Stellen zu runden.

Vorgehen: Eine Zahl, z.B. 3.14159265 multipliziere ich mit 100: 314.159265. Dann runde ich und erhalte 314. Danach teile ich durch 100 und bekomme 3.14.

<java> // Je nach Version wird ganz am Anfang folgende Zeile benötigt: import java.lang.Math;

// (...)

public double rundeAufZweiStellen(double zahl) {

     return Math.round( zahl * 100 ) / 100;

} </java>


Übung
  1. Wie ruft man diese Methode auf, wenn man eine Zahl runden möchte?
  2. Schreiben Sie die Methode rundeAufDreiStellen(). Für fortgeschrittene: RundeAufXStellen()


Weblinks

Siehe auch