www.r-krell.de |
Webangebot für Schule und Unterricht, Software, Fotovoltaik und mehr |
Willkommen/Übersicht > Informatik > Informatik mit Java, Teil e) > param. Liste
Nach dem Webstart erscheint das Testprogramm in einem Extra-Fenster:
Die Anleitung zum Programm steht etwas weiter unten hier auf dieser Webseite;
Kommazahlen bitte mit Punkt statt mit Komma eingeben, etwa als 3.14
Wenn die Java-JRE (ab Version 1.8) installiert ist, können Sie das Programm jetzt sofort ausführen:
Hier klicken zum Webstart der parametrisierten Liste |
Danach Öffnen von Liste_param.jnlp [mit Java(TM) Webstart Launcher (Standard)]
wählen/bestätigen
und bei evtl. Sicherheitswarnung vor der Ausführung von Ls_Start das Risiko akzeptieren und OK drücken.
Wenn Sie außerdem gefragt werden, ob Sie eine Desktop- und eine Startmenüverknüpfung
anlegen wollen,
sollten Sie zustimmen, wenn Sie das Test-Programm auch nach Verlassen dieser Webseite nochmal ausprobieren wollen.
Wird nach dem Klick Liste_param.jnlp herunter geladen oder werden Sie gefragt, womit Sie Liste_param.jnlp
öffnen wollen
oder ob/wohin Sie die Datei speichern wollen, haben Sie entweder kein Java installiert oder ihr Browser (z.B. Opera) unterstützt keinen
Webstart.
Im letzten Fall empfiehlt sich nachfolgend der Download der .jar-Datei:
Sie können das Testprogramm für die parametrisierte Liste auch als ausführbare Java-Datei Liste_param(r-krell.de).jar (16 kB) herunter laden und später lokal auf Ihrem Rechner starten (Java-Umgebung JRE ab Version 1.8 vorausgesetzt). Die Ausführung als Applet im Browser wird von mir hingegen nicht mehr angeboten: Gründe, Abhilfe und alle Downloads (in neuem Tab)
Bedienungsanleitung und komplette Quelltexte folgen jetzt auf dieser Seite:
Zunächst muss der Elementtyp festgelegt und dafür eine neue Liste erzeugt werden. Liegt der Elementtyp fest, können Eingaben passend zum gewählten Elementtyp getätigt und das eingetippte Element mit rein in die Liste aufgenommen werden - vor der jeweils aktuellen Position. Mit istLeer lässt sich überprüfen, ob überhaupt Elemente in der Liste sind. Und mit istHintermLetzten wird geprüft, ob sich die aktuelle Position hinterm letzten Element befindet oder ob doch ein echtes Element aktuell ist. Nur im letzten Fall lässt sich das aktuelle Element mit zeige1 anzeigen oder mit raus löschen (wobei dann der Nachfolger des gelöschten Elements aktuell wird). Die gesamte Liste einschließlich der Position des Aktuell-Zeigers lässt sich zur Kontrolle anzeigen.
Hinweis: Wird eine neue Liste angelegt, so ersetzt die neue Liste eine eventuell vorhandene frühere Liste, d.h. die alte Liste und ihr Inhalt gehen unwiederbringlich verloren.
Die hier vorgestellte Liste ist auch Grundlage der parametrisierten sortierten Liste (mit eigenem Applet).
Eine andere, nicht-parametrisierte Liste ("List") findet man auch im Applet (mit
Quelltexten) für die Datentypen der Abiturvorgaben 2014-2016.
Ebenfalls noch nicht parametrisiert ist das alte Programm zu den linearen abstrakten Datenspeichern Keller &
Schlange.
Im Gegensatz zum Quelltext auf der Webseite "Informatik mit Java, Teil e)" wurde im Folgenden der im
Unterricht verwendete Präfix Ls_ (Liste) statt P_ (parametrisiert) beibehalten. Ansonsten sollten aber gleiche Konzepte und
Algorithmen verwendet werden, bei der Liste ergänzt um die Methode zur Gesamtausgabe der Liste. Außerdem kommt die Oberfläche
hinzu, in der dann die Liste mit dem richtigen konkreten Typ erzeugt wird. Da anfangs der Elementtyp unbekannt ist - er wird ja erst zur Laufzeit
gewählt --, muss im Quelltext der Oberfläche am Ende der Atrribute Ls_Liste liste;
noch ohne Parameter/Typangabe deklariert werden. Beim Compilieren erhält man daher eine Compiler-Warnung auf eventuelle Typunsicherheit - zum
Glück keinen Fehler, der das Compilieren verhindert. Die Oberfläche wurde übrigens mit dem im Javaeditor eingebauten GUI-Builder
erzeugt und 'nur' die dort bereitgestellten Methodenrahmen für die Schaltflächen wurden von Hand mit eigenem Programmtext
gefüllt.
Es gibt vier Java-Dateien für die vier Klassen:
/**
*
* Beschreibung: Knoten für den abstrakten Datenspeicher "Liste"
*
* @version 1.2 vom 12/13.03.2015
* @author R. Krell für IF Q1-M, www.r-krell.de
*/
public class Ls_Knoten<Elementtyp> // R. Krell, im März 2015 -- www.r-krell.de
{
Elementtyp inhalt; // hierhin kommt das gespeicherte Element
Ls_Knoten<Elementtyp> zeiger; // hier merkt man sich den Knoten mit dem nächsten Element
public Ls_Knoten (Elementtyp i, Ls_Knoten<Elementtyp> z)
{
inhalt = i;
zeiger = z;
}
}
/**
*
* Beschreibung: Abstrakter Datenspeicher "Liste"
*
* @version 1.2 vom 12/13.03.2015
* @author R. Krell für IF Q1-M, www.r-krell.de
*/
// parametrisierte Liste -- für IF Q1 M - R. Krell, März 2015 (www.r-krell.de)
public class Ls_Liste <ElTyp>
{
Ls_Knoten<ElTyp> vorAnfang = new Ls_Knoten<ElTyp> (null, null); // (bei E_Liste: dummy)
Ls_Knoten<ElTyp> vorAktuell = vorAnfang;
public void rein (ElTyp neuesEl) // fült neues Element vor aktuellem ein
{
Ls_Knoten<ElTyp> neuerKn = new Ls_Knoten<ElTyp> (neuesEl, vorAktuell.zeiger);
vorAktuell.zeiger = neuerKn;
vorAktuell = neuerKn; // damit bisheriger aktueller Knoten,
//vor dem gerade neuerKn eingefügt wurde, weiter aktuell ist
}
public boolean istLeer() // wird genau dann true, wenn die Liste leer ist
{
return (vorAnfang.zeiger == null);
}
public ElTyp zeige1() // zeigt das aktuelle Element (bei E_Liste: zeige())
{
return vorAktuell.zeiger.inhalt;
}
public ElTyp raus() // löscht (und zeigt) aktuelles Element; Nachfolger wird aktuell
{
ElTyp element = vorAktuell.zeiger.inhalt;
vorAktuell.zeiger = vorAktuell.zeiger.zeiger;
return (element);
}
public void anDenAnfang() // macht erstes Element aktuell
{
vorAktuell = vorAnfang;
}
public boolean istHintermLetzten() // true, wenn aktuelle Position hinterm Listenende
{ // (bei E_Liste: istAmEnde())
return (vorAktuell.zeiger == null);
}
public void weiter() // macht nächstes Element aktuell (Nachfolger vom aktuellen)
{
vorAktuell = vorAktuell.zeiger;
}
// -----------------------------------------------------------------------------
// -- nur zu Kontrollzwecken; gehört nicht zu den Standard-Listenoperationen: --
public String gesamtAusgabeZurKontrolle()
{
int anz = 0;
String ausgabe = "Liste { ";
Ls_Knoten<ElTyp> vorHilf = vorAnfang;
while (vorHilf != null)
{
if (vorHilf == vorAktuell)
{
ausgabe = ausgabe + "^"; // ^ markiert nachfolgendes aktuelles Element
} // end of if
if (vorHilf.zeiger != null)
{
ausgabe = ausgabe + "["+vorHilf.zeiger.inhalt+"] "; // erwartet druckbaren Inhalt
anz ++;
} // end of if
vorHilf = vorHilf.zeiger;
}
ausgabe = ausgabe+"}\n - die Liste enthält "+anz+" Element(e); markiert: ^aktuelles Element bzw. akt. Position\n";
return (ausgabe);
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
/**
*
* Beschreibung: Testoberfläche für den abstrakten Datenspeicher "Liste"
*
* @version 1.2 vom 12/13.03.2015
* @author R. Krell für IF Q1-M, www.r-krell.de
*/
public class Ls_Oberflaeche extends JFrame {
// Anfang Attribute
private Label label1 = new Label();
private CheckboxGroup checkboxGroup1 = new CheckboxGroup();
private Checkbox rbInt = new Checkbox("",true,checkboxGroup1);
private Checkbox rbDouble = new Checkbox("",false,checkboxGroup1);
private Checkbox rbString = new Checkbox("",false,checkboxGroup1);
private Button btNeu = new Button();
private TextField tfEingabe = new TextField();
private Button btRein = new Button();
private Button btLeer = new Button();
private Button btZeige1 = new Button();
private Button btRaus = new Button();
private Button btHint = new Button();
private Button btWeiter = new Button();
private Button btAnfang = new Button();
private Label label2 = new Label();
private TextArea taAusgabe = new TextArea("", 1, 1, TextArea.SCROLLBARS_BOTH);
private Button btKontrolle = new Button();
private Label label3 = new Label();
String typ = "";
Ls_Liste liste;
// Ende Attribute
public Ls_Oberflaeche(String title) {
// Frame-Initialisierung
super(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 666;
int frameHeight = 472;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten
label1.setBounds(16, 32, 59, 33);
label1.setText("Liste für");
cp.add(label1);
rbInt.setBounds(80, 40, 100, 20);
rbInt.setLabel("ganze Zahlen");
cp.add(rbInt);
rbDouble.setBounds(200, 40, 100, 20);
rbDouble.setLabel("Kommazahlen");
cp.add(rbDouble);
rbString.setBounds(320, 40, 100, 20);
rbString.setLabel("Texte (Strings)");
cp.add(rbString);
btNeu.setBounds(464, 40, 171, 25);
btNeu.setLabel("neu anlegen");
btNeu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btNeu_ActionPerformed(evt);
}
});
cp.add(btNeu);
tfEingabe.setBounds(16, 72, 121, 25);
cp.add(tfEingabe);
btRein.setBounds(160, 72, 105, 25);
btRein.setLabel("rein");
btRein.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btRein_ActionPerformed(evt);
}
});
cp.add(btRein);
btLeer.setBounds(296, 72, 153, 25);
btLeer.setLabel("ist Leer?");
btLeer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btLeer_ActionPerformed(evt);
}
});
cp.add(btLeer);
btZeige1.setBounds(464, 72, 81, 25);
btZeige1.setLabel("zeige1");
btZeige1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btZeige1_ActionPerformed(evt);
}
});
cp.add(btZeige1);
btRaus.setBounds(560, 72, 73, 25);
btRaus.setLabel("raus");
btRaus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btRaus_ActionPerformed(evt);
}
});
cp.add(btRaus);
btHint.setBounds(296, 104, 153, 25);
btHint.setLabel("ist hinterm Letzten?");
btHint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btHint_ActionPerformed(evt);
}
});
cp.add(btHint);
btWeiter.setBounds(464, 104, 169, 25);
btWeiter.setLabel("weiter (vor)");
btWeiter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btWeiter_ActionPerformed(evt);
}
});
cp.add(btWeiter);
btAnfang.setBounds(160, 104, 105, 25);
btAnfang.setLabel("an den Anfang");
btAnfang.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btAnfang_ActionPerformed(evt);
}
});
cp.add(btAnfang);
label2.setBounds(16, 104, 133, 25);
label2.setText("Wähle aktuelle Stelle");
cp.add(label2);
taAusgabe.setBounds(16, 176, 617, 241);
cp.add(taAusgabe);
// setTitle("Demo/Test: Liste -- www.r-krell.de");
btKontrolle.setBounds(160, 144, 329, 25);
btKontrolle.setLabel("Kontrollausgabe der gesamten Liste");
btKontrolle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btKontrolle_ActionPerformed(evt);
}
});
cp.add(btKontrolle);
label3.setBounds(80, 8, 515, 25);
label3.setText("Ausprobieren der Methoden zur Arbeit mit dem abstrakten Datenspeicher Liste");
label3.setFont(new Font("Dialog", Font.PLAIN, 14));
cp.add(label3);
// Ende Komponenten
setVisible(true);
btNeu.requestFocus();
} // end of public Ls_Oberflaeche
// Anfang Methoden
// public static void main(String[] args) {
// new Ls_Oberflaeche("Demo/Test: Liste -- www.r-krell.de");
//
// } end of main
public void btNeu_ActionPerformed(ActionEvent evt) {
switch (checkboxGroup1_getSelectedRadioButtonLabel())
{
case "ganze Zahlen" : liste = new Ls_Liste<Integer>();
taAusgabe.setText("Neue, leere Liste für ganze Zahlen erzeugt\n");
typ = "ganz";
break;
case "Kommazahlen" : liste = new Ls_Liste<Double>();
taAusgabe.setText("Neue, leere Liste für Kommazahlen erzeugt\n");
typ = "komma";
break;
case "Texte (Strings)": liste = new Ls_Liste<String>();
taAusgabe.setText("Neue, leere Liste für Texte erzeugt\n");
typ = "text";
break;
} // end of switch
tfEingabe.requestFocus();
} // end of btNeu_ActionPerformed
public void btRein_ActionPerformed(ActionEvent evt) {
String ein = tfEingabe.getText();
if (ein==null || ein.equals(""))
{
taAusgabe.append("Hinweis: Eingabe war leer. Trotzdem wird Einfügen probiert.\n");
} // end of if
try
{
switch (typ) {
case "ganz" : int i = Integer.parseInt(ein);
liste.rein(i);
taAusgabe.append("Ganzzahl "+i+" vor aktuellem Element aufgenommen\n");
break;
case "komma": double d = Double.parseDouble(ein);
liste.rein(d);
taAusgabe.append("Kommazahl "+d+" vor aktuellem Element aufgenommen\n");
break;
case "text" : liste.rein(ein);
taAusgabe.append("Text \""+ein+"\" vor aktuellem Elment aufgenommen\n");
break;
default: taAusgabe.append("** Fehler ** Erst neue Liste für einen bestimmten Typ erzeugen!\n");
} // end of switch
}
catch (Exception ex)
{
taAusgabe.append("** Fehler ** Eingabe '"+ein+"' passt nicht zum Typ '"+typ+"'\n");
}
tfEingabe.selectAll();
tfEingabe.requestFocus();
} // end of btRein_ActionPerformed
public void btLeer_ActionPerformed(ActionEvent evt) {
if (liste.istLeer())
{
taAusgabe.append("Die Liste ist z.Z. leer!\n");
}
else
{
taAusgabe.append("Die Liste ist z.Z. nicht leer, sondern enthält mindestens ein Element\n");
}
} // end of btLeer_ActionPerformed
public void btZeige1_ActionPerformed(ActionEvent evt) {
String ausgabe = "";
ausgabe = ausgabe + liste.zeige1();
taAusgabe.append("Das aktuelle Element ist ["+ausgabe+"]\n");
} // end of btZeige1_ActionPerformed
public void btRaus_ActionPerformed(ActionEvent evt) {
String ausgabe = "";
ausgabe = ausgabe + liste.raus();
taAusgabe.append("Das bisher aktuelle Element ["+ausgabe+"] wurde gelöscht und sein Nachfolger aktuell\n");
} // end of btRaus_ActionPerformed
public void btHint_ActionPerformed(ActionEvent evt) {
if (liste.istHintermLetzten())
{
taAusgabe.append("Die aktuelle Position befindet sich z.Z. hinterm letzten Element\n");
}
else
{
taAusgabe.append("z.Z. ist ein echtes Element aktuell\n");
}
} // end of btHint_ActionPerformed
public void btWeiter_ActionPerformed(ActionEvent evt) {
liste.weiter();
taAusgabe.append("Der Nachfolger des letzten aktuellen Elements ist jetzt aktuell\n");
} // end of btWeiter_ActionPerformed
public void btAnfang_ActionPerformed(ActionEvent evt) {
liste.anDenAnfang();
taAusgabe.append("Das allererste Element der Liste ist aktuell\n");
} // end of btAnfang_ActionPerformed
public String checkboxGroup1_getSelectedRadioButtonLabel() {
if (checkboxGroup1.getSelectedCheckbox() != null)
return checkboxGroup1.getSelectedCheckbox().getLabel();
else
return "";
}
public void btKontrolle_ActionPerformed(ActionEvent evt) {
taAusgabe.append(liste.gesamtAusgabeZurKontrolle());
} // end of btKontrolle_ActionPerformed
// Ende Methoden
} // end of class Ls_Oberflaeche
import javax.swing.JApplet;
/**
*
* Beschreibung Startdatei für die Oberfläche zum abstrakten Datenspeicher "Liste"
*
* @version 1.2 vom 12/13.03.2015
* @author R. Krell für IF Q1-M, www.r-krell.de
*/
public class Ls_Start extends JApplet
{
public void init() // Start als Applet bzw. ..
{
new Ls_Oberflaeche("parametrisierte Liste (www.r-krell.de) als Applet");
}
public static void main (String[] s) //.. als Application
{
new Ls_Oberflaeche("parametrisierte Liste (www.r-krell.de) als Application");
}
}
zurück zur Seite „Informatik mit Java, Teil e)"