Donnerstag, 26. Februar 2009

 

Array sortieren

Man kann ein Array von einem bestimmten Typ leicht mit der Methode sort() aus der Klasse java.util.Arrays sortieren, wenn die Objekte das Interface Comparable implementiert. Dieses Interface verlangt, dass eine Methode

public abstract int compareTo(Object other);
implementiert wird. Diese Methode wird verwendet, um Objekte miteinander zu vergleichen. Der Typ Object wird dann für die konkrete Implementierung durch den benötigten Datentyp ersetzt (wobei man natürlich auch bei Object bleiben könnte, da alle Klassen von Object erben). compareTo() liefert 0, wenn die Objekte "gleich" sind, einen Wert kleiner 0, wenn das aktuelle Objekt "kleiner" als das andere (other) ist und einen Wert größer 0, wenn das aktuelle Objekt "größer" als das andere ist.
String implementiert dieses Interface bereits:

String[] arr = { "hallo", "du", "da", "wo", "bist", "du" };
java.util.Arrays.sort(arr);
System.out.println(java.util.Arrays.toString(arr));

liefert folgende Ausgabe:

[bist, da, du, du, hallo, wo]


Will man Objekte eines eigenen Typs sortieren, dann sieht das für Objekte mit einer Nummer und einem String etwa so aus:

class Data implements Comparable<Data> {
int nr;
String name;
Data(int nr, String name) {
this.nr = nr;
this.name = name;
}
public String toString() {
return String.format("%d -> %s", nr, name);
}
public int compareTo(Data other) {
int ret = nr - other.nr; // Nummer vergleichen
if (ret == 0) { // nun auch nach String vergleichen
ret = name.compareTo(other.name);
}
return ret;
}
}

Data[] data = {
new Data(23, "Thomas"), new Data(1, "Alfred"), new Data(2, "Brigitte"),
new Data(23, "Harald"), new Data(12, "Manfred"),
};
java.util.Arrays.sort(data); // SORTIEREN
System.out.println(java.util.Arrays.toString(data));

Arrays.toString(array) gibt den Inhalt eines Arrays aus. Daher wird bei obigem Codestück folgendes ausgegeben:

[1 -> Alfred, 2 -> Brigitte, 12 -> Manfred, 23 -> Harald, 23 -> Thomas]

Das Array wurde sortiert.

Labels: , , ,


 

Gruppenwechsel Ski

Aufgabe:

Schreiben Sie ein Programm Grw.java, welches aus dem Datenbestand ski.csv die beigelegte Statistik erzeugt.
Ausschnitt csv-Datei ski.csv als Bild
Lesen Sie die csv -Datei zeilenweise und erstellen Sie aus jeder Zeile ein Objekt einer Klasse SkiDaten, die alle notwendigen Attribute (Klasse, Name, Geb.Datum,....) enthält.

Nennen Sie das Projekt klasse-grw-familienname, wobei klasse Ihre Klasse ist (2ad, 2bd bzw. 2cd) familienname Ihr Name ist (z.B. 2ad-grw-haberstroh). Bitte keine Umlaute, Leerzeichen und kein scharfes s (ß) verwenden.


Sollte eine neue Sortierung des Sätze notwendig sein, bitte mit Excel-Funktion oder für 1-er Kandidaten mit eigenem Sortprogramm durchführen.

INFO: es handelt sich um einen zweistufigen Gruppenwechsel mit den Gruppen

 KLASSE und GESCHL

und einer Gesamtdarstellung des Durchschnitts!
Eine Einführung in den Gruppenwechsel finden Sie in der Datei gruppenwechsel.pdf

Aufruf des Programms:



java Grw [-h | -o ausgabedat] [-d] eingabedatei

Die Option -d bewirkt die Ausgabe der Detailzeilen, ohne -d nur Summenzeilen ausgeben!

Beispiel Statistik:



--------------------------------- --------------------------------
STATISTIK zum Schuelerrennen der HTL am SKIKURS 2006 in OBERTAUERN
------------------------------------------------------------------

AMINGER Georg 0.02
ELIAS Thomas 0.97
GALAVICS Marcus 0.15
GALLAUNER Alexander 0.26
HECHER Markus 0.58
HERMANN Gregor 0.65
KAMPER Raphael 0.55
KRIVOKUCA Milan 7.73
MOSER Christoph 2.34
NEPOLA René 0.14
PRIELER Stefan 0.63
RECHBERGER Christian 3.11
RIEGLER Mario 0.87
SCHNEEBERGER Joerg 1.22
SENN Bernhard 0.65
WIESSNER Maximilian 1.61
ZENZ Markus 2.04

die durchschnittliche Zeitdifferenz bei den MAENNERN betraegt: 1.38

die KLASSE 2AHDV erreichte eine Durchschnittsdifferenz von 1.38 Sekunden


CMUND Katharina 2.81
HARATHER Alice 1.87
KONLECHNER Viktoria 0.39
RIEGER Jennifer 0.63
RINNHOFER Elisabeth 1.65
...........................................................

...........................................................
REICHHART Thomas 0.30
RIEDER Dominik 1.07
SCHERMANN Georg 0.85
STANGL Stefan 1.48
STAUFER Andreas 0.47

die durchschnittliche Zeitdifferenz bei den MAENNERN betraegt: 2.38

die KLASSE 3CHDV erreichte eine Durchschnittsdifferenz von 2.36 Sekunden
************************************************GESAMT-Differenz : 1.93



Achtung: Die obige Ausgabe stellt nur einen Ausschnitt dar (Aufruf mit Option -d) und es wurde die vorletzte Zeile (Hüpfner) gelöscht, da dort extrem abweichende Zeiten vorkommen (die Schülerin ist scheinbar gestürzt). Die Gesamt-Different würde mit dieser Zeile 11,37 Sekunden betragen.

Labels: , ,


Mittwoch, 25. Februar 2009

 

Killer Tux

Labels: , , , ,


 

Prüfen Sie Ihr Wissen

Sie finden an dieser Stelle eine Reihe von Fragen und Aufgaben, die Sie etwa Mitte des zweiten Jahrgangs EDVO beantworten bzw. lösen können sollten. Die Fragen bezüglich Objektorientierung (Klasse, Objekt, Methode etc.) können ohne Vererbung beantwortet werden.

Theorie
  1. Was ist eine Variable?
  2. Welche Grunddatentypen kennen Sie? Geben Sie auch den Speicherbedarf und den Wertebereich an.
  3. Was versteht man unter den Eigenschaften eines Objekts? Wie spiegelt sich das in einer Klasse wieder?
  4. Welche Kontrollstrukturen kennen Sie?
  5. Was ist ein Array?
  6. Geben Sie ein Beispiel eines eindimensionalen Arrays in Java an.
  7. Wie kann man ein eindimensionales Array in Java initialisieren?
  8. Geben Sie ein Beispiel eines zweidimensionalen Arrays in Java an.
  9. Wie kann man ein zweidimensionales Array in Java initialisieren?
  10. Kann man in Java ein zweidimensionales Array definieren, welches "nicht rechteckig" (rechteckig bedeutet hier: alle Zeilen gleich lang) ist?
  11. Geben Sie einen Algorithmus (ohne Programmdetails) an, um alle Elemente eines eindimensionalen Arrays zu ermitteln, die ein bestimmtes Kriterium (z.B. ist größer als ein bestimmter Wert) erfüllen.
  12. Geben Sie einen Algorithmus (ohne Programmdetails) an, um alle Elemente eines zweidimensionalen Arrays zu ermitteln, die ein bestimmtes Kriterium erfüllen.
  13. Geben Sie einen Algorithmus (ohne Programmdetails) an, um das Maximum aller Werte eines eindimensionalen Arrays zu ermitteln.
  14. Geben Sie einen Algorithmus (ohne Programmdetails) an, um das Minimum aller Werte eines eindimensionalen Arrays zu ermitteln.
  15. Geben Sie einen Algorithmus (ohne Programmdetails) an, um das Maximum aller Werte eines zweidimensionalen Arrays zu ermitteln.
  16. Geben Sie einen Algorithmus (ohne Programmdetails) an, um das Minimum aller Werte eines zweidimensionalen Arrays zu ermitteln.
  17. Was ist eine Funktion? Geben Sie ein Beispiel in Java inklusive der Verwendung der Funktion.
  18. Was ist eine Methode? Geben Sie ein Beispiel in Java inklusive der Verwendung der Funktion.
  19. Was ist der Unterschied zwischen einer Variable eines Grunddatentyps und einer Variable vom Typ einer Klasse?
  20. Was ist eine Klasse?
  21. Was ist ein Objekt? Erklären Sie den Zusammenhang zwischen Objekt und Klasse.
  22. Was sind Strings?
  23. Wie kann man Strings vergleichen?
  24. Was ist ein Stack? Beschreiben Sie die Eigenschaften und Methoden.
  25. Was ist eine Queue? Beschreiben Sie die Eigenschaften und Methoden.
  26. Wozu benötigt man Kommentare?
  27. Wozu benötigt man Programmierrichtlinien?
  28. Vergleichen Sie Java mit Python.
  29. Was ist ein Dictionary in Python?
  30. Was bedeutet der Begriff "Sequenz" in Python? Geben Sie einige Beispiele.
  31. Woran soll Sie die Geschichte "Shlemiel the Painter" erinnern?
  32. Was muss grundsätzlich (ohne Programmdetails) gemacht werden, um von einer Datei zu lesen?
  33. Was muss grundsätzlich (ohne Programmdetails) gemacht werden, um in eine Datei zu schreiben?
  34. Geben Sie einen Algorithmus (ohne Programmdetails) an, um alle Zeilen einer Textdatei zu ermitteln, die ein bestimmtes Kriterium (z.B. enthält einen bestimmten String) erfüllen.
  35. Was versteht man unter einem "Gruppenwechsel"?
  36. Was sind die Voraussetzungen für einen Gruppenwechsel?
  37. Geben Sie einen Algorithmus für einen einstufigen Gruppenwechsel an (z.B. Struktogramm).
  38. Geben Sie einen Algorithmus für einen zweistufigen Gruppenwechsel an (z.B. Struktogramm).
  39. Welche Arten von Programm(ier)fehlern kennen Sie? Wie findet man diese Fehler?
  40. Wieviele main()-Methoden muss eine Java-Klasse besitzen?
  41. Wieviele main()-Methoden kann eine Java-Klasse maximal haben?
  42. Wieviele Klassen können in einer einzelnen Java-Datei implementiert werden?
  43. Welchen Wert hat die Variable einInteger? Begründen Sie Ihre Antwort!

    int einInteger = Integer.MAX_VALUE + 1;
  44. Was versteht man unter impliziter bzw. expliziter Typumwandlung? Nennen Sie jeweils mindestens ein Beispiel.
  45. Erläuten Sie den Unterschied zwischen String und StringBuffer!
Praxis:
In diesem Blog und auch im alten Blog gibt es bereits eine Reihe von Aufgaben. Vergleichen Sie Ihre Lösungen mit jenen Ihrer MitschülerInnen.
Hier noch ein paar "Grundübungen":
  1. Erstellen Sie ein Pythonprogramm, welches das Maximum einer Sequenz ermittelt. Definieren Sie dazu eine fixe Testsequenz mit folgenden Werten [-1, -23, -2, -32, -89, -100, -1, -99]. Finden Sie weitere Beispieltestdaten.
  2. Erstellen Sie ein Pythonprogramm, welches das Minimum einer Sequenz ermittelt. Definieren Sie dazu eine fixe Testsequenz mit folgenden Werten [1, 23, 2, 32, 89, 100, 1, 99]. Finden Sie weitere Beispieltestdaten.
  3. Erstellen Sie ein Javaprogramm, welches das Maximum einer Sequenz ermittelt. Definieren Sie dazu eine fixe Testsequenz mit folgenden Werten [-1, -23, -2, -32, -89, -100, -1, -99]. Finden Sie weitere Beispieltestdaten.
  4. Erstellen Sie ein Javaprogramm, welches das Minimum einer Sequenz ermittelt. Definieren Sie dazu eine fixe Testsequenz mit folgenden Werten [1, 23, 2, 32, 89, 100, 1, 99]. Finden Sie weitere Beispieltestdaten.
  5. Erstellen Sie ein Pythonprogramm, welches die Häufigkeit von Elementen einer Sequenz (Liste) ermittelt. Definieren Sie dazu eine Testsequenz mit folgenden Werten [1, 2, -3, 4, 2, 1, 10, -3, 4, 2, 2, 10] bzw. ["hallo", "du", "test", "du", "Maus", "test", "Test"]. Das Ergebnis soll eine Liste von unterschiedlichen Werten sein und wie oft sie vorkommen.
  6. Betrachten Sie die Methode dividiere im folgenden Programm. lässt sich das Programm übersetzen? Falls nicht, dann korrigieren Sie die Fehler:

    public class DivisionApp
    {
    public static void main(String[] args)
    {
    int ergebnis = dividiere(40, 5);
    System.out.println("Ergebnis: " + ergebnis);
    }

    public static int dividiere(int divident, int divisor)
    {
    if (divisor > 0)
    {
    return divident / divisor;
    }
    }
    }

  7. Folgende Ausgabe soll erzeugt werden: 1 3 5 7 9. Lösen Sie die Aufgabe
    • mithilfe einer while-Schleife
    • mithilfe einer do-while-Schleife
    • mithilfe einer for-Schleife und des Modulo-Operators
    • mithilfe einer for-Schleife ohne den Modulo-Operator

  8. Folgende Ausgabe soll erzeugt werden: 1 2 4 7 11 16 22 29 37. Lösen Sie die Aufgabe
    • mithilfe einer do-while-Schleife
    • mithilfe einer for-Schleife
  9. Schreiben Sie ein Java-Programm, welches mithilfe eines Stacks folgende Werte in umgekehrter Reihenfolge ausgibt: 23 21 20 18 17 13 11 5 3
  10. Schreiben Sie ein Java-Programm, welches mithilfe einer Queue folgende Werte in derselben Reihenfolge ausgibt: 23 21 20 18 17 13 11 5 3
  11. Schreiben Sie auf Basis der letzten beiden Beispiele Programme, die Strings statt der Integer-Werte verwenden können.

Labels: ,


Freitag, 20. Februar 2009

 

String mit Umlauten in Bytes umwandeln

UTF-8 ist eine Kodierung für UNICODE. Damit sind alle Zeichen darstellbar. UTF-8 benötigt nicht für alle Zeichen die gleiche Anzahl Bytes, so werden die Zeichen des ASCII-Codes mit einem Byte dargestellt. Viele Zeichen (z.B. Umlaute und 'ß') benötigen 2 Bytes, noch viel mehr (z.B. Chinesische Zeichen) benötigen 3 Bytes.
Die Umwandlung in Bytes ergibt daher Probleme. Probieren Sie folgenden Code im Scrapbook (eclipse):



// UTF-8 Problem mit Umlauten

// ohne encoding umwandeln
byte[] bytes = "AÄÖÜäöüßA".getBytes();
System.out.printf("%d bytes (Länge 9)\n", bytes.length);
for (byte b : bytes) {
System.out.printf("%02x ", b);
}
System.out.println(new String(bytes));

Für deutschen Zeichensatz genügt ein Encoding, welches über eine Tabelle jedem Zeichen aus unserem Zeichensatz nur ein Byte zuordnet. Wir können z.B. ISO-8859-1 verwenden:



// mit encoding umwandeln
byte[] bytes = "AÄÖÜäöüßA".getBytes("ISO-8859-1");
System.out.printf("%d bytes (Länge 9)\n", bytes.length);
for (byte b : bytes) {
System.out.printf("%02x ", b);
}
System.out.println(new String(bytes, "ISO-8859-1"));

Scrap Book zum runterladen (Achtung UTF-8)

Weitere Informationen

unterstützte encodings in Java
Unicode for Programmers
Java Tutorials - Converting Non-Unicode Text

Konvertierung von/nach C-Strings

Ist nach obigem Muster möglich. C-Strings sind Byte-Arrays mit einem Zeichen in einem Byte (kein Unicode!). Das Ende des Strings wird mit einem Nullzeichen markiert ('\0'). Dieses Byte muss man als letztes Zeichen zum C-String hinzufügen, wenn man einen C-String erzeugt bzw. entfernen, wenn man einen Java-String in einen C-String umwandeln will. Man muss dabei beachten, dass C-Strings damit eine maximale Länge haben. Die Länge ist durch die Arraygröße - 1 definiert (Null-Zeichen).

Labels: , , , ,


Donnerstag, 19. Februar 2009

 

Swing und AWT mischen

Schüler zeigen mir immer wieder ihre Programme, die folgendes Verhalten an den Tag legen: das Menü verschwindet hinter den Steuerelementen:
Obiges Bild zeigt das Problem. Das geöffnete Menü verschwindet hinter dem TextField, ist aber vor dem unteren Textfeld. Das Verhalten des unteren Textfeldes passt, jenes des oberen passt nicht.
Es handelt sich hier um ein Swing-Formular, das mit Netbeans erstellt wurde. Für das obere Textfeld wurde AWT benutzt.
Für das untere Textfeld wurde Swing verwendet (Swing Controls).

Wichtig: bei Swing-Anwendungen immer Swing-Steuerelemente verwenden (beginnen alle mit J, also JFrame, JList, usw.). Bei AWT-Anwendungen nur AWT-Steuerelemente verwenden (Frame, List, usw.).

Der Grund liegt in der unterschiedlichen "Zeichenfunktion", AWT verwendet paint(), Swing immer paintComponent().

Bei den Variablendeklarationen sieht man das auch:

private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JTextField jTextField1;
private javax.swing.JPanel mainPanel;
private javax.swing.JMenuBar menuBar;
private javax.swing.JProgressBar progressBar;
private javax.swing.JLabel statusAnimationLabel;
private javax.swing.JLabel statusMessageLabel;
private javax.swing.JPanel statusPanel;
private java.awt.TextField textField1;


Die letzte Zeile enthält den "Übeltäter".

Will man "selbst" in einem Panel zeichnen, so macht man dies bei AWT mit:

import java.awt.Frame;
public class Fenster extends Frame {
//...
@Override
public void paint(Graphics g) {
//...
g.drawString("test", x, y);
//...
}

//...
}

Bei Swing (JPanel) muss man hingegen so vorgehen:

import javax.swing.JPanel;
public class GraphView extends JPanel {
//...
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int maxx = 0; // für Panelgröße
int maxy = 0;
//...
g.drawString("test", x, y);
//...
}
//...
}

Beachten Sie, dass hier unbedingt super.paintComponent(g); aufgerufen werden muss.

Labels: ,


Freitag, 13. Februar 2009

 

Mit dem Summerton wird es 1234567890 Uhr

Wir haben ein Jubiläum: die Unixzeit wird 1234567890, also 1234567890 Sekunden nach dem 1.1.1970 0:00 UTC. Auf gut Deutsch ist das am 14. Februar 2009 um 0:31:30 CET. Ein Grund zum Feiern! Siehe http://www.1234567890day.com/.

Zum Beispiel mit python leicht anchzuprüfen:


Python 2.5.2 (r252:60911, Aug 1 2008, 00:43:38)
[GCC 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from time import localtime, asctime
>>> localtime(1234567890)
(2009, 2, 14, 0, 31, 30, 5, 45, 0)
>>> asctime((2009, 2, 14, 0, 31, 30, 5, 45, 0))
'Sat Feb 14 00:31:30 2009'

Labels:


Mittwoch, 11. Februar 2009

 

einfaches JList-Beispiel

Listen mit der Swing-Komponente JList sind etwas umständlich:
  1. muss man die JList in eine ScrollPane verpacken, damit man bei langen Listen Scrollen kann.
  2. muss man sich um das "ListModel" kümmern. Das ListModel dient zur Verwaltung von Daten in der Liste.
Es folgt ein einfaches Beispiel, welches in der Listbox Teststrings anzeigt. Mit einem Button kann man weitere Elemente entweder hinten anhängen (kein Element selektiert) oder vor der Selektion einfügen. Mit dem anderen Button kann man die gewählten Elemente löschen.
Hier der Source Code (eine Hilfsklasse List wird für die Listbox verwendet):

/**
* java-jlist: swing.Fenster.java
*
* 11.02.2009, Harald R. Haberstroh
*/

package swing;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/**
* Einfache Demo einer JList mit Einfügen und entfernen von Elementen.
*
* @author Harald R. Haberstroh (hp)
*
*/
public class Fenster extends JFrame {
private static final long serialVersionUID = -273011863852896510L;
private JPanel panel; // Hauptpanel
private JScrollPane listPane; // damit JList scrollfähig ist
private JPanel buttons; // eine Pabnel für die Buttons
private List list; // unsere Liste
private JButton addButton; // Button zum Einfügen
private JButton removeButton; // Button zum Löschen
private int nrElementsAdded = 0; // für die Testdaten

private void initialize() {
// Panel in die ContentPane des Fensters setzen
panel = new JPanel();
setContentPane(panel);

// Liste erzeugen
list = new List();
listPane = new JScrollPane(list); // verpacken in ScrollPane

// Layout für Hauptpane
panel.setLayout(new BorderLayout());
panel.add(listPane, BorderLayout.CENTER);

// die Buttons...
buttons = new JPanel();
buttons.setLayout(new FlowLayout());
addButton = new JButton("Add Element");
addButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
nrElementsAdded++;
if (list.getSelectedIndex() < 0) { // hinten einfügen
list.getContents().addElement("test " + nrElementsAdded);
} else { // an selektierter Stelle einfügen
list.getContents().add(list.getSelectedIndex(),
"test " + nrElementsAdded);
}
list.clearSelection();
}

});
buttons.add(addButton);

removeButton = new JButton("Remove Element(s)");
removeButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// alle selektierten Elemente
int[] indices = list.getSelectedIndices();
for (int index : indices) {
list.getContents().remove(index);
}
list.clearSelection();
}

});
buttons.add(removeButton);

// Buttonleiste ins Panel...
panel.add(buttons, BorderLayout.SOUTH);

// packe es auf brauchbare Größe
pack();

// Fenster schließen lassen (ohne Handler :-)
setDefaultCloseOperation(EXIT_ON_CLOSE);

// Zentriert am Bildschirm
setLocationRelativeTo(null);

// ein paar Elemente in die Liste einfügen
for (; nrElementsAdded < 10; nrElementsAdded++) {
list.getContents().addElement("test " + nrElementsAdded);
}
}

/**
* @throws HeadlessException
*/
public Fenster() throws HeadlessException {
super();
initialize();
}

/**
* @param gc
*/
public Fenster(GraphicsConfiguration gc) {
super(gc);
initialize();
}

/**
* @param title
* @param gc
*/
public Fenster(String title, GraphicsConfiguration gc) {
super(title, gc);
initialize();
}

/**
* @param title
* @throws HeadlessException
*/
public Fenster(String title) throws HeadlessException {
super(title);
initialize();
}

/**
* @param args
*/
public static void main(String[] args) {
new Fenster("JList Demo").setVisible(true);
}

}

/**
* Änderbare Liste.
*
* @author Harald R. Haberstroh (hp)
*
*/
class List extends JList {
List() {
super(new DefaultListModel());
}

DefaultListModel getContents() {
return (DefaultListModel) getModel();
}

}

Labels: ,


This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]