Programmieren mit Harald R. Haberstroh (original) (raw)
Freitag, 29. September 2017
vim Einführung (2AHIF, 2BHIF)
Vim ist ein hervorragender Editor mit Syntaxhervorhebung und Vergleichsfunktionen, mehreren Darstellungsfenstern und vielen anderen nützlichen Funktionen. Leider ist der Einstieg damit nicht immer ganz leicht, da vim eine Weiterentwicklung des Editors vi ist, den es bereits in den 80er Jahren gab, wo Benutzerfreundlichkeit noch eine andere Bedeutung hatte als heute. Weiterhin erscheint vim im unkonfigurierten Zustand zunächst erstmal sehr langweilig und es ist mühselig eine passende Konfiguration zu erstellen.
Der vi ist praktisch auf jedem Linux-System verfügbar und kann von der Shell (Terminal) aus verwendet werden. Daher ist es praktisch, wenn man den vi(m) beherrscht, wenn man einen Server (z.B. Web-Server) über das Internet warten muss. Die wichtigsten Funkionen kann man probieren und üben mit vimtutor
Weitere Dokumentation finden Sie hier:
vim Kurzreferenz
vim Homepage www.vim.org
vim Quick Reference Card (2 Seiten)
Wir verwenden eine spezielle Konfigurationsdatei für den vim. Im Laufe dieses Schuljahres werden wir Ihnen diese Datei (eigentlich eine überarbeitete Version, denn die bisherige Version ist hauptsächlich für C-Programmierung eingerichtet) zur Verfügung stellen. Also, bleiben Sie dran oder suchen Sie auf www.vim.org/scripts nach passenden Scripts für den vim. vim ist eine Erweiterung des Standard-Unix-Editors vi. vimsteht für vi improved.vim gibt es nicht nur für Unix-Plattformen, sondern auch für andere Betriebssysteme (Windows, OSX). Siehe dazu auch http://www.vim.org/. vimist frei verfügbar.
Es ist besser, einen Editor wirklich gut zu beherrschen als viele verschiedene Editoren oder Entwicklungsumgebungen nur mittelmäßig bedienen zu können. Der vim eignet sich besonders als universeller (Programmier-)Editor, da er für jede Plattform verfügbar ist und hochgradig konfigurierbar bzw. programmierbar ist.vi gibt es auf jedem Unix-ähnlichem System. Wenn nichts mehr geht, dann muss man u.U. dem vinehmen und in den Konfigurationsdateien Änderungen vornehmen.
vim hat (wie vi) mehrere Betriebsmodi:
Dies hat den Vorteil, dass man einen mächtigen Editor (vimist programmierbar, arbeitet mit regulären Ausdrücken usw.) auch über einfache Terminals bedienen kann. Alle Funktionen sind über eine Standardtastatur mit Escape-Taste verfügbar. Man braucht keine Funktionstasten und keine Cursortasten. Funktions- und Cursortasten sowie Maus können bei geeigneten Terminals (X-Window System, Console) verwendet werden.
Nachteilig ist der relativ hohe Lernaufwand.
Befehlsmodus
Grundsätzlich kann jeder Befehl mehrfach ausgeführt werden, indem zuerst eine Anzahl angegeben wird. Z.B. 10ddlöscht 10 Zeilen (siehe unten), 2dwlöscht 2 Worte.[ _Anzahl_ ] _Befehl_ [ _Taste_ ][ _Anzahl_ ] _Befehl_ [ _Bereich_ ]
Cursorbewegung
`` khinauf
h llinks rechts
`` jhinunter
^F orward page
^Backward page
^D own half page
^U p half page
w ord right
b ack word
[_line_ ]Goto line (default letzte Zeile)
( Sätze zurück
) Sätze vorwärts
{ Absätze zurück
} Absätze vorwärts
f _c_gehe zum Zeichen c in der aktuellen Zeile
'm gehe zu Marke m
ma mark a (setze Marke a), Marken werden auch für Lösch-, Änder- und Kopieroperationen verwendet (sieh weiter unten)
Löschen (d elete)
dd Zeile löschen
dw Wort löschen
x Zeichen unter Cursor löschen
X Zeichen links von Cursor löschen
D bis Zeilenende löschen
_Bereich_ dlöschen des Bereichs
d' _marke_löschen bis zur Marke _marke_(ein Buchstabe, vorher gesetzt mit m _marke_)
Ändern
>schiebt Text nach rechts (shiftwidth)
<schiebt Text nach links (shiftwidth)
iEinfügen vor Cursor (insert)
aEinfügen nach Cursor (append)
IEinfügen Zeilenanfang (Insert)
AEinfügen Zeilenende (Append)
o Öffnet neue Zeile darunter (open line)
O Öffnet neue Zeile darüber
J (join) hänge die nächste Zeile an die aktuelle Zeile an (mit Leerzeichen getrennt)
r _x_ersetzen des aktuellen Zeichens durch das Zeichen _x_(kein ESC nötig)
cw ändert Wort (change word)
_Bereich_ cändert Bereich (vgl. Bereich angeben)
c' _marke_ändert Bereich bis zur Marke
Bereich angeben (markieren)
Cursor an ein Ende des Bereichs setzen, v eingeben, den Cursor zum anderen Ende bewegen und den gewünschten Befehl eingeben. Zeilenweise markieren mit V.
Wurde :set mouse=a gesetzt, dann kann auch mit der Maus markiert werden.
Fast alle Befehle arbeiten mit einem so markierten Bereich.
Kopieren/Einfügen
_Bereich_ y"yank", Bereich wird in den Puffer kopiert
y' _marke_kopiert Bereich bis zur Marke in den Puffer
yw Wort in den Puffer
Y Zeile in den Puffer
pEinfügen nach Cursor (paste - "einkleben")
Suchen
^A sucht nächstes Vorkommen des Wortes unter Cursor
%platziert Curser auf zugehörige ( ) { } [ ]
Anzahl%platziert Cursor auf Anzahl Prozent der Datei
/ _text_sucht vorwärts _text_ oder regulären Ausdruck
? _text_sucht rückwärts _text_ oder regulären Ausdruck
* sucht das Wort unter dem Cursor
Wiederholung
. (Punkt) wiederholt letztes Kommando
n letzte Suche wiederholen
N letzte Suche in umgekehrter Richtung
Rückgängig
u undo, der vi kann nur die letzte Änderung rückgängig machen (d.h. uu stellt die letzte Änderung wieder her), der vimkann im Prinzip beliebig viele Änderungen rückgängig machen
^r(crtl+r) redo (nur vim) macht das letzte undo bzw. die letzten undos wieder rückgängig
Sonstige Kommandos
^G zeigt Dateistatus und Zeilennummer
^Lerneuert Bildschirm
_Bereich_ !führt angegebenen Bereich einem Filter zu, der anschließend eingegeben werden muss
Änderungsmodus
Eingegebener Text wird eingefügt (bei i,a,...) bzw. ersetzt markierten Bereich (c,...), löschen mit Backspace in der aktuellen Zeile möglich (nur eben eingegebener Text).
Der Änderungsmodus wird mit der ESC-Taste verlassen.^v (ctrl+v) stellt sicher, dass das nächste Zeichen normal eingegeben wird (z.B. wird bei TAB normalerweise nicht das Tabulator-Zeichen eingefügt sondern so viele Leerzeichen als nötig, will man jedoch das TAB-Zeichen einfügen, muss man ^vTAB drücken).
Ex-Befehle (Colon mode)
:[ _Zeile_ ][, _Zeile_ ] _Befehl_ _Argumente_
Der Bereich _Zeile,Zeile_bezeichnet Anfangszeile und Endzeile. Ein .(Punkt) bedeutet aktuelle Zeile, $die letzte Zeile. Wurde vorher ein Bereich mit vausgewählt, dann wird automatisch ein Bereich eingefügt: '<,'>(die Marke '<bezeichnet den Anfang und '>das Ende eines markierten Bereichs). %ist die Kurzform von 1,$.
:xSpeichern und Ende
:w write, speichern
:w dateiSpeichern in Datei (write), wurde vorher ein Bereich markiert, so wird dieser Bereich in diedateigeschrieben.
:r dateiEinfügen von Datei (read)
:q Quit (schließen eines Fensters)
:split [datei]weiteres Fenster (mit datei öffnen)
Suchen und ersetzen
:s/ _suchtext_ / _ersatztext_ /[g]
Ersetzen von _suchtext_durch _ersatztext_. Wird g(die eckigen Klammern bezeichnen "optional") angegeben, dann wird auch mehrfaches Vorkommen pro Zeile ersetzt. _suchtext_kann ein regulärer Ausdruck sein.
Wenn kein Bereich angegeben wird, dann wird die Ersetzung nur in der aktuellen zeile durchgeführt. Wird ein Bereich markiert, so wird nur in diesem Bereich ersetzt. Es können auch Zeilennummern angegeben werden:
:.,$s/i++/j++/g ersetze alle i++ durch j++von der aktuellen Zeile bis zum
Ende der Datei.
Setzen von Modi
:se tabstop=3Tabulatorweite
:se shiftwidth=3Weite für > und <
:se aioder :set autoindent automatisches Einrücken
:se etoder :set expandtab Tabulator wird durch Leerzeichen ersetzt (dies sollte eingestellt werden!)
:syntax onHighlighting von Sourcen
Abkürzungen
:ab lhs rhsDefinieren einer Abkürzung lhs (left hand side) für rhs (right hand side), Abkürzungen werden expandiert, sobald ESC,Enter oder die Leertaste gedrückt wird.
:ablistet alle Abkürzungen auf.
:unab lhslöscht die Abkürzung lhs.
:help abbreviateHilfe zu den Abkürzungen.
Konfigurationsdatei .vimrc
In dieser Datei können beliebige Ex-Befehle stehen. Diese Datei wird beim Starten von vimausgeführt. Weitere Konfigurationsmöglichkeiten sind in der Dokumentation (:help) beschrieben. So können Abkürzungen definiert werden, Funktionstasten belegt werden und in Abhängigkeit eines Dateityps Konfigurationsdateien ausgeführt werden.
reguläre Ausdrücke
Reguläre Ausdrücke werden immer wieder benötigt. Der vim erlaubt es reguläre Ausdrücke zu beim Suchen. Das Programm grep erlaubt reguläre Ausdrücke. Reguläre Ausdrücke ermöglichen es Suchmuster anzugeben. Dabei gibt es viel mehr Möglichkeiten als bei den Shell-Suchmustern. Es folgen beispielhaft die wichtigsten Ausdrücke:
\. (Punkt) steht für ein beliebiges Zeichen
[aeiou] ein Selbstlaut klein geschrieben
[A-Z] alle Großbuchstaben
[^0-9] alles außer Ziffern
cdrom\|floppy alle Vorkommnisse der Worte cdromoder floppy
a\+ mindestens ein a(a,aa,aaa,aaaa, ...)
.* keines, ein oder mehrere beliebige Zeichen (der *braucht
keinen \)
\( _ausdruck\_ )+ das Muster _ausdruck_muss mindestens einmal
vorkommen
_ausdruck_ { _von_ , _bis_ } _ausdruck_muss mindestens _von_mal und höchstens
_bis_mal vorkommen.
_ausdruck_ { _n_ } _ausdruck_muss genau _n_mal vorkommen.
^ _ausdruck_ _ausdruck_muss am Zeilenanfang stehen.
_Ausdruck_ $ _ausdruck_muss am Zeilenende stehen.
Die Operatoren \+und *sind "gefräßig", d.h. sie nehmen soviel als möglich, u.U. bis zum Ende eine Zeile. Der Ausdruck a.*hpasst auf ah,ahh,abh,abhcdh.
**Beispiele:
[0-9A-Fa-f]+ erkennt Hexadezimalzahlen, z.B. 123,abc,F000usw.
\(un\)*stable erkenntstable,unstable,ununstable,
unununstableetc.
\(un\)\{-,1}stableerkenntstableund unstable
int [a-z]\+(.*); passt auf alle Prototypen von int-Funktionen, die nur
Kleinbuchstaben im Namen haben.
Donnerstag, 10. März 2016
Aufgabe Regex (POS1: 2CHIF)
Schreiben Sie eine Klasse AbbreviationMatcher, welche folgendes Interface implementiert:
public interface AbbreviationMatcherInterface { public void setStrings(String[] strings); public void setSearchString(String searchstring); public String[] match(); }
Zusätzlich muss die Klasse einen Konstruktor mit zwei Parametern besitzen:
public AbbreviationMatcher(String searchstring, String[] strings) { // set the values like setSearchString() and setStrings() }
Die Methode match() liefert ein Array mit jenen Strings (aus setStrings()), auf die das Muster (ein String), welches mit setSearchString() angegeben wurde, passt.
Aus dem Suchstring (setSearchString(searchstring)) ist ein passender regulärer Ausdruck zu erzeugen. Ein String passt zum Suchstring, wenn er einfach den String "searchstring" (Groß-/Kleinschreibung ignorierend) komplett enthält oder einfach nur die Buchstaben in der gegebenen Reihenfolge beinhaltet. In diesem Fall muss der zu matchende String mit dem ersten Buchstaben beginnen.
Beispiele:Beispiele für Muster und das Ergebnis:
String "MyList"
passt auf folgende Beispielstrings:
MyList myList ThatMyList MylistMaker
String "CF"
passt auf folgende Beispielstrings:
CF ClassFinder CharacterFixer CharFinderFactory
Testen
Schreiben Sie eine (JUnit-) Testklasse AbbreviationFinderTest, welche die Methoden ausreichend testet.
Abgabe
Nennen Sie das Projekt **name_vorname_regex** und Checken Sie das Projekt am cvs.htlwrn.ac.at ein.
# Eingestellt von Harald R. Haberstroh @ 14:15 0 Kommentare
Dienstag, 19. Januar 2016
Gleitender Mittelwert (POS1: 2CHIF)
Erstellen Sie eine Klasse Averager, welche den Durchschnitt beliebig vieler Zahlen berechnen kann:
add() soll eine Zahl aufnehmengetAverage() liefert den MittelwertgetSum() liefert die Summe der ZahlengetNum() liefert die Anzahl der Zahlenreset() setzt alles zurück, d.h. ab reset() kann ein neuer Mittelwert einer Folge von Zahlen bestimmt werden.
Schreiben Sie eine passende Testklasse.
Hinweis: Dieses Beispiel kann ganz ohne Arrays gelöst werden.
Abgabe:
Nennen Sie das Projekt name_vorname_averager und Checken Sie das Projekt am `cvs.htlwrn.ac.at ein.
# Eingestellt von Harald R. Haberstroh @ 13:00 0 Kommentare
`
`` ### Montag, 23. November 2015
OOP in Java, Beispiel Geld/Währungstabelle (POS1: 2CHIF)
Laut Wikipedia kann Objektorientierte Programmierung definiert werden als:
Die objektorientierte Programmierung (kurz OOP) ist ein auf dem Konzept der Objektorientierung basierendes Programmierparadigma. Die Grundidee besteht darin, die Architektur einer Software an den Grundstrukturen desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft. Ein Modell dieser Strukturen wird in der Entwurfsphase aufgestellt. Es enthält Informationen über die auftretenden Objekte und deren Abstraktionen, ihre Typen. Die Umsetzung dieser Denkweise erfordert die Einführung verschiedener Konzepte, insbesondere Klassen, Vererbung, Polymorphie und spätes Binden.
Alan Kay, der Erfinder der Programmiersprache Smalltalk und des Begriffs „object oriented“, definierte ihn im Kontext von Smalltalk folgendermaßen:
1. Everything is an object, 2. Objects communicate by sending and receiving messages (in terms of objects), 3. Objects have their own memory (in terms of objects), 4. Every object is an instance of a class (which must be an object), 5. The class holds the shared behavior for its instances (in the form of objects in a program list), 6. To eval a program list, control is passed to the first object and the remainder is treated as its message
„1. Alles ist ein Objekt, 2. Objekte kommunizieren durch das Senden und Empfangen von Nachrichten (welche aus Objekten bestehen), 3. Objekte haben ihren eigenen Speicher (strukturiert als Objekte), 4. Jedes Objekt ist Instanz einer Klasse (welche ein Objekt sein muss), 5. Die Klasse beinhaltet das Verhalten aller ihrer Instanzen (in der Form von Objekten in einer Programmliste), 6. Um eine Programmliste auszuführen, wird die Ausführungskontrolle dem ersten Objekt gegeben und das Verbleibende als dessen Nachricht behandelt“
– Alan Kay: The Early History of Smalltalk (1993)
Beispielanwendung
Anhand des folgenden Beispiels soll ein kurzer Einblick in die Objektorientierte Programmierung gegeben werden.
Es soll Geld implementiert werden. Da es in verschiedenen Ländern unterschiedliche Währungen gibt, muss unsere Klasse neben dem Betrag auch die Währung beinhalten. Um rechnen zu können wird noch eine Währungstabelle mitgespeichert.
Die Währungstabelle wechselkurs könnte natürlich auch wieder in eigenen Klassen/Objekten realisiert werden (im Java-Code ist das auch tatsächlich der Fall).
Die Attribute (Eigenschaften) sind alle öffentlich (public), da damit das Beispiel kürzer wird. Tatsächlich werden normalerweise die Attribute nach außen unsichtbar gemacht (private) und nur Methoden (Methoden-Aufrufe entsprechen Alan Kays "Nachrichten") öffentlich gemacht, um den Zugriff auf das Innere der Objekte zu verhinden (Information Hiding oder Datenkapselung).
Die Methode getEuro() liefert den auf Euro umgerechneten Geldbetrag.
Die Methode add(geld) addiert den Wert des Parameters geld zum Wert des aktuellen Objekts und erzeugt ein neues Objekt mit der Summe und liefert es als Returnwert zurück.
Der Konstruktor wird in diesem Klassendiagramm nicht angegeben. Durch ihn wird aber die Währung der Betrag festgelegt. Der Konstruktor wird ausgeführt, wenn ein Objekt erzeugt wird.
Die Umsetzung in Java:
In Java heißt die Referenz auf das aktuelle Objekt this. this wird nicht als Parameter deklariert (anders als in Python). Den Methoden fehlt ein this-Parameter (bzw. self in Python). Dieser Parameter existiert nur intern.
Dennoch kann man this beim Zugriff auf Attribute (und Methoden) angeben. Im folgenden Beispiel wird das auch gemacht.
Man muss this nur dann angeben, wenn es sonst zu Mehrdeutigkeiten käme (in unserem Beispiel beim Konstruktor, bi dem die Parameter genauso benannt sind wie die Attribute).
Der Kunstruktor heißt in Java immer so wie die Klasse, in unserem Fall Geld().
Die Währungstabelle wechselkurs wird als Array einer eigenen Klasse Wechselkurs realisiert. Zusätzlich benötigt man mangels Dictionary eine Methode, die zu einer gegebenen Währung den Kurs liefert: getKurs()
class Geld { final class Wechselkurs { // final nur für's scrapbook String waehrung; double kurs;
public Wechselkurs(String waehrung, double kurs) {
this.waehrung = waehrung;
this.kurs = kurs;
}
}
private Wechselkurs[] wechselkurs = {
new Wechselkurs("USD", 1.505), // US-$ (1EUR sind
// 1.505 USD)
new Wechselkurs("GBP", 0.908), // Britische Pfund
new Wechselkurs("EUR", 1.0),
new Wechselkurs("CHF", 1.509), // Schweizer Franken
new Wechselkurs("JPY", 130.582),// Japanische Yen
};
String waehrung;
double betrag;
public Geld(String waehrung, double betrag) {
this.waehrung = waehrung;
this.betrag = betrag;
}
public double getEuro() {
return this.betrag / this.getKurs();
}
private double getKurs() {
for (Wechselkurs kurs : this.wechselkurs) {
if (kurs.waehrung.equals(this.waehrung)) {
return kurs.kurs;
}
}
return 0.0;
}
public Geld add(Geld geld) {
double summeInEuro = this.getEuro() + geld.getEuro();
Geld summe = new Geld(this.waehrung,
summeInEuro * this.getKurs());
return summe;
}}
/*** Testaufrufe ***/ Geld hotelrechnung = new Geld("EUR", 560); Geld mietwagen = new Geld("USD", 760); Geld summe = mietwagen.add(hotelrechnung); System.out.printf("Summe: %s%.2f, %s%.2f\n", summe.waehrung, summe.betrag, "EUR", summe.getEuro());
Testausgabe:
Summe: USD1602,80, EUR1064,98
Scrapbook oop.jpage zum Download.
Labels: Java, Objektorienterung, POS1-2
# Eingestellt von Harald R. Haberstroh @ 11:16 0 Kommentare
Java Arrays
Folgendes Beispiel zeigt ein zweidimensionales Array, bei dem die zweite Dimension für jede Zeile unterschiedlich lang ist. In der Animation ist sichtbar, wie dieses Array von Arrays im Speicher organisiert ist.
hier finden Sie die Animation direkt am Python-Tutor.
# Eingestellt von Harald R. Haberstroh @ 10:53 0 Kommentare
Dienstag, 10. November 2015
Aufgabe Java Wurzelberechnung (POS1: 2CHIF)
Man kann die Wurzel einer Zahl berechnen mit folgender Formel
xn = (xn-1 + a / xn-1) / 2
Man beginnt damit, dass a und x0 gleich der Zahl, aus der man die Wurzel ziehen will, setzt und x1 berechnet. Dann berechnet man x2 usw. bis sich die beiden letzten Werte nur mehr gering unterscheiden (z.B. die Differenz kleiner 0,0000001 ist).
Schreiben Sie eine Methode (Funktion) wurzel(zahl, genauigkeit), welche nach obigem Verfahren die Wurzel berechnet.
Erstellen Sie eine Klasse SquareRoot.java, welche eine Tabelle der Wurzeln der Zahlen 1 bis 20 bei den Genauigkeiten 0.01, 0.0001 sowie 0.0000001 ausgibt:
1: 1.0000000 1.0000000 1.0000000 2: 1.4142157 1.4142136 1.4142136 3: 1.7320508 1.7320508 1.7320508 4: 2.0000001 2.0000000 2.0000000 5: 2.2360689 2.2360680 2.2360680 6: 2.4494944 2.4494897 2.4494897 7: 2.6457670 2.6457513 2.6457513 8: 2.8284271 2.8284271 2.8284271 9: 3.0000000 3.0000000 3.0000000 10: 3.1622777 3.1622777 3.1622777 11: 3.3166248 3.3166248 3.3166248 12: 3.4641017 3.4641016 3.4641016 13: 3.6055514 3.6055513 3.6055513 14: 3.7416576 3.7416574 3.7416574 15: 3.8729837 3.8729833 3.8729833 16: 4.0000006 4.0000000 4.0000000 17: 4.1231067 4.1231056 4.1231056 18: 4.2426425 4.2426407 4.2426407 19: 4.3589018 4.3588989 4.3588989 20: 4.4721402 4.4721360 4.4721360
Stellen Sie fest, wie viele Iterationen benötigt werden. Wie kann man die Anzahl der Iterationen bestimmen, ohne die Parameter bzw. den Returntyp bzw. -wert von wurzel(zahl, genauigkeit) zu ändern?
# Eingestellt von Harald R. Haberstroh @ 10:03 0 Kommentare
Aufgaben zu Java (POS1: 2CHIF)
- Schreiben Sie ein einfaches Java Programm, welches
"Hello World"ausgibt. Nennen Sie das ProgrammHello.java. Verwenden Sie dazu einen Texteditor und übersetzen Sie das Programm auf der Kommandozeile. - Schreiben Sie ein einfaches Java-Programm, welches das kleine Einmaleins ausgibt. Welchen Namen könnte das Programm haben?
X 1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10
2 2 4 6 8 10 12 14 16 18 20
3 3 6 9 12 15 18 21 24 27 30
4 4 8 12 16 20 24 28 32 36 40
5 5 10 15 20 25 30 35 40 45 50
6 6 12 18 24 30 36 42 48 54 60
7 7 14 21 28 35 42 49 56 63 70
8 8 16 24 32 40 48 56 64 72 80
9 9 18 27 36 45 54 63 72 81 90
10 10 20 30 40 50 60 70 80 90 100
Verwenden Sie wieder einen Texteditor und den Java-Compiler auf der Kommandozeile.
3. Erstellen Sie mit eclipse ein Java-Projekt java-intro. Erzeugen Sie ein package intro1 ("intro eins").
Erstellen Sie in diesem Paket die beiden Klassen von oben (in das Projekt-Verzeichnis kopieren und an das package anpassen). Starten Sie die beiden Klassen von eclipse aus.
4. Starten Sie die beiden Klassen von der Kommandozeile aus. Wo sind die Class files zu finden, wie sieht der Aufruf aus?
5. Erstellen Sie im package intro1 eine Klasse Schleife, die (im main) eine Zahl einliest und dann alle Zahlen von 1 bis zu der gegebenen Zahl ausgibt. Beispielaufruf:
Grenze ? 10
1
2
3
4
5
6
7
8
9
10
6. Erweitern Sie die Klasse Schleife so, dass zwei Zahlen eingegeben werden. Es sollen dann die Zahlen von der ersten bis zur zweiten ausgegeben werden. Wenn die zweite Zahl kleiner ist, dann soll eine absteigende Folge ausgegeben werden. Beispielaufruf:
von? 15
bis? 10
15
14
13
12
11
10
# Eingestellt von Harald R. Haberstroh @ 10:00 0 Kommentare
eclipse einrichten (POS1: 2CHIF)
Machen Sie sich mit der Entwicklungsumgebung eclipse vertraut!
- Richten Sie den "Formatter" ein, sodass nur Leerzeichen für die Einrückung verwendet werden:

- Richten Sie sich ein File-Template mit einem Header nach unseren Programmierrichtlinien ein:

- Richten Sie sich ein Code-Template mit einem Header für Klassen nach unseren Programmierrichtlinien ein:

# Eingestellt von Harald R. Haberstroh @ 09:58 0 Kommentare
Montag, 15. Juni 2015
Java Swing Währungsumrechner (POS1: 2BHIF)
Erstellen Sie eine Swing-GUI mit Texteingabefeldern und Labels für 5 verschiedene Währungen. Es soll ein Neu/Löschen und ein Umrechnen-Button vorhanden sein.
Wenn der Umrechnen-Button gedrückt wird, wird erkannt in welcher Währung die Eingabe erfolgte und diese Währung in alle anderen umgerechnet.
Der Neu/Löschen-Button löscht alle Eingaben.
Fehler wie z.B. keine Eingabe, Eingaben in mehreren Feldern, falsche Eingabe (Text statt Zahl) u.s.w. sollen zu keinem Programmabsturz führen sondern den Benutzer mit einem Fehlerdialog darauf hinweisen.
Das User-Interface könnte etwa so aussehen:
# Eingestellt von Harald R. Haberstroh @ 09:47 0 Kommentare
Montag, 11. Mai 2015
Worthäufigkeiten mit binärem Baum ermitteln (POS1: 2BHIF)
Erstellen Sie ein Java-Programm welches für jedes gelesene Wort bestimmt, wie oft es vorkommt. Nach dem Ende der Eingabe (EOF) ist eine Liste von Worten und deren Häufigkeiten auszugeben.
Ein Beispiel, gegeben sei folgende Eingabe:
Das ist die erste Zeile und das ist die zweite Zeile und hier folgt die dritte Zeile. Satzzeichen gelten als Trenner. Folgendes ist kein W0rt und das 4uch nicht.
Das Programm soll dann diese Ausgabe liefern.
als 1 Das 3 die 3 dritte 1 erste 1 Folgendes 1 folgt 1 gelten 1 hier 1 ist 3 kein 1 nicht 1 Satzzeichen 1 Trenner 1 und 3 Zeile 3 zweite 1
Es erzeugt also eine Liste von Worten (in der zuerst vorkommenden Schreibweise), mit der Anzahl der Vorkommnisse.
Das Programm soll von der Standardeingabe oder von beliebig vielen Dateien lesen.
Zur Erkennung von Wörtern lesen Sie hier: Wörter in der Eingabe erkennen
Verwenden Sie dazu einen binären Baum für die Wörter.
Nennen Sie das Projekt hauf.
Labels: algorithmen, Aufgabe, Java, POS1-2
# Eingestellt von Harald R. Haberstroh @ 09:56 0 Kommentare
Aufgabe: Gruppenwechsel (POS1: 2BHIF)
Schreiben Sie eine Java-Klasse Grw.java, welches aus dem Datenbestand ski.csv die beigelegte Statistik erzeugt.
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 grwski.
Sollte eine neue Sortierung des Sätze notwendig sein, bitte mit OpenOffice Calc oder Excel sortieren. 1-er Kandidaten sortieren bitte mit eigenem Sortprogramm.
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.
Binäres Dateiformat für Eingabe
Erstellen Sie ein neues Programm so, dass sie statt der CSV-Eingabedatei auch eine Datei im binären Datenformat verwenden können. Die Daten sind wie folgt gespeichert (C-Datentypen):
typedef struct umsatz { char artikel[25]; char verkaeufer[25]; int vkpreis; int monat; } umsatz_t;
Dabei ist char artikel[25] ein maximal 24-Zeichen langer String, bei dem jedes Zeichen (ASCII) als ein Byte gespeichert wird. Das Ende des Strings wird durch das Zeichen '\0' abgeschlossen (das hat tatsächlich den Wert 0). D.h. es müssen bis zu 25 Bytes gelesen werden, wobei nur die Zeichen bis exklusive '\0' (direkt) in Java-chars umgewandelt werden können (verwenden Sie z.B. RandomAccessFile.read(byte[] buf)).int entspricht einem 32-Bit-Integer und passt zum Java-Typ int.
Die passende Datei mit Testdaten finden Sie hier: daten.dat.
Den Inhalt dieser Datei kann man nur mit einem Programm öffnen, das die Daten binär lesen kann und sinnvoll, z.B. im Hexadezimalsystem, anzeigen kann. khexedit oder das Konsolenprogramm hexdump eignen sich dafür.
Die Ausgabe von hexdump könnte so aussehen (gekürzt):
hp@L211 $ hexdump -C daten.dat 00000000 50 72 6f 64 30 31 00 01 4c 00 ba 01 e5 e2 e6 b7 |Prod01..L.......| 00000010 00 00 00 00 e4 98 04 08 28 4d 61 69 65 72 00 08 |........(Maier..| 00000020 a0 fc f5 b7 dc e9 b9 bf 48 e9 b9 bf f1 86 04 08 |........H.......| 00000030 90 8b f8 b7 dc 00 00 00 01 00 00 00 50 72 6f 64 |............Prod| 00000040 30 32 00 01 4c 00 ba 01 e5 e2 e6 b7 00 00 00 00 |02..L...........| 00000050 e4 98 04 08 28 4d 61 69 65 72 00 08 a0 fc f5 b7 |....(Maier......| 00000060 dc e9 b9 bf 48 e9 b9 bf f1 86 04 08 90 8b f8 b7 |....H...........| 00000070 90 01 00 00 02 00 00 00 50 72 6f 64 30 33 00 01 |........Prod03..| 00000080 4c 00 ba 01 e5 e2 e6 b7 00 00 00 00 e4 98 04 08 |L...............| 00000090 28 48 75 62 65 72 00 08 a0 fc f5 b7 dc e9 b9 bf |(Huber..........|
Es soll wieder ein 2-stufiger Gruppenwechsel programmiert werden (Artikel und Verkäufer).
Zum Vergleich können Sie die Daten auch im CSV-Format verwenden: daten.csv.
Versuchen Sie, die beiden Varianten, jene mit den Ski-Daten und jene mit den (binären) Umsatzdaten, so zu gestalten, dass nur geringe Teile unterschiedlich sind (am Besten austauschbare Klassen mit gleichem Namen für die Daten und für die Formatierung). Der Hauptalgorithmus bleibt ja gleich.
Labels: algorithmen, Aufgabe, Java, POS1-2
# Eingestellt von Harald R. Haberstroh @ 09:48 0 Kommentare
Montag, 19. Januar 2015
Worthäufigkeiten mit Collections ermitteln (POS1: 2BHIF)
Erstellen Sie ein Java-Programm welches für jedes gelesene Wort bestimmt, wie oft es vorkommt. Nach dem Ende der Eingabe (EOF) ist eine Liste von Worten und deren Häufigkeiten auszugeben.
Ein Beispiel, gegeben sei folgende Eingabe:
Das ist die erste Zeile und das ist die zweite Zeile und hier folgt die dritte Zeile. Satzzeichen gelten als Trenner. Folgendes ist kein W0rt und das 4uch nicht.
Das Programm soll dann diese Ausgabe liefern.
als 1 Das 3 die 3 dritte 1 erste 1 Folgendes 1 folgt 1 gelten 1 hier 1 ist 3 kein 1 nicht 1 Satzzeichen 1 Trenner 1 und 3 Zeile 3 zweite 1
Es erzeugt also eine Liste von Worten (in der zuerst vorkommenden Schreibweise), mit der Anzahl der Vorkommnisse. Bei der Überprüfung, ob ein Wort schon vorhanden ist, soll jedoch Groß- und Kleinschreibung nicht unterschieden werden (zum Beispiel "Und" == "und").
Das Programm soll von der Standardeingabe oder von beliebig vielen Dateien lesen.
Zur Erkennung von Wörtern lesen Sie hier: Wörter in der Eingabe erkennen
Verwenden Sie dazu eine Map für die Wörter.
Nennen Sie das Projekt hauf.
# Eingestellt von Harald R. Haberstroh @ 09:50 0 Kommentare
Sonntag, 11. Januar 2015
Aufgabe einfache Java Klassen (POS1: 2BHIF)
Erstellen Sie ein Projekt java-klassen mit zwei Klassen:
- Person
- PersonManager
nach dem folgenden Klassendiagramm:
Die Methoden der Klasse Person sollen folgende Funktionalität bereitstellen:
- Der Konstruktor
Person(String vn, String fn, int gj, char g)soll einfach die passenden Attribute setzen. print()soll Vorname, Nachname, Alter und Geschlecht auf der Konsole ausgeben.getName()liefert den Vornamen und Nachnamen mit einem Leerzeichen getrennt.getAlter(int jahr)soll das Alter in Jahren bezogen auf das im Parameter angegebene Jahr zurückliefern.toString()liefert einen String, der alle Informationen lesbar enthält.main()ist optional und enthält einfach Tests der Klasse.
Die Methoden der Klasse PersonManager sollen folgende Funktionalität bereitstellen:
print()soll einfach alle Personen ausgeben (print()vonPersonverwenden).add(Person person)nimmt eine neue Person in die interne Liste/Array auf.main()soll mindestens zwei verschiedene Personen anlegen, die dann in einen Manager aufgenommen werden. Alle Personen sollen ausgegeben werden.
Beispielaufruf auf Konsole:
hp@if205-2l $ java PersonManager Max Meier, geboren 1998 (16 Jahre alt), männlich Katrin Huber, geboren 1996 (18 Jahre alt), weiblich
# Eingestellt von Harald R. Haberstroh @ 21:12 0 Kommentare
Mittwoch, 3. Dezember 2014
OOP in Java, Beispiel Geld/Währungstabelle (POS1: 2BHIF)
Laut Wikipedia kann Objektorientierte Programmierung definiert werden als:
Die objektorientierte Programmierung (kurz OOP) ist ein auf dem Konzept der Objektorientierung basierendes Programmierparadigma. Die Grundidee besteht darin, die Architektur einer Software an den Grundstrukturen desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft. Ein Modell dieser Strukturen wird in der Entwurfsphase aufgestellt. Es enthält Informationen über die auftretenden Objekte und deren Abstraktionen, ihre Typen. Die Umsetzung dieser Denkweise erfordert die Einführung verschiedener Konzepte, insbesondere Klassen, Vererbung, Polymorphie und spätes Binden.
Alan Kay, der Erfinder der Programmiersprache Smalltalk und des Begriffs „object oriented“, definierte ihn im Kontext von Smalltalk folgendermaßen:
1. Everything is an object, 2. Objects communicate by sending and receiving messages (in terms of objects), 3. Objects have their own memory (in terms of objects), 4. Every object is an instance of a class (which must be an object), 5. The class holds the shared behavior for its instances (in the form of objects in a program list), 6. To eval a program list, control is passed to the first object and the remainder is treated as its message
„1. Alles ist ein Objekt, 2. Objekte kommunizieren durch das Senden und Empfangen von Nachrichten (welche aus Objekten bestehen), 3. Objekte haben ihren eigenen Speicher (strukturiert als Objekte), 4. Jedes Objekt ist Instanz einer Klasse (welche ein Objekt sein muss), 5. Die Klasse beinhaltet das Verhalten aller ihrer Instanzen (in der Form von Objekten in einer Programmliste), 6. Um eine Programmliste auszuführen, wird die Ausführungskontrolle dem ersten Objekt gegeben und das Verbleibende als dessen Nachricht behandelt“
– Alan Kay: The Early History of Smalltalk (1993)
Beispielanwendung
Anhand des folgenden Beispiels soll ein kurzer Einblick in die Objektorientierte Programmierung gegeben werden.
Es soll Geld implementiert werden. Da es in verschiedenen Ländern unterschiedliche Währungen gibt, muss unsere Klasse neben dem Betrag auch die Währung beinhalten. Um rechnen zu können wird noch eine Währungstabelle mitgespeichert.
Die Währungstabelle wechselkurs könnte natürlich auch wieder in eigenen Klassen/Objekten realisiert werden (im Java-Code ist das auch tatsächlich der Fall).
Die Attribute (Eigenschaften) sind alle öffentlich (public), da damit das Beispiel kürzer wird. Tatsächlich werden normalerweise die Attribute nach außen unsichtbar gemacht (private) und nur Methoden (Methoden-Aufrufe entsprechen Alan Kays "Nachrichten") öffentlich gemacht, um den Zugriff auf das Innere der Objekte zu verhinden (Information Hiding oder Datenkapselung).
Die Methode getEuro() liefert den auf Euro umgerechneten Geldbetrag.
Die Methode add(geld) addiert den Wert des Parameters geld zum Wert des aktuellen Objekts und erzeugt ein neues Objekt mit der Summe und liefert es als Returnwert zurück.
Der Konstruktor wird in diesem Klassendiagramm nicht angegeben. Durch ihn wird aber die Währung der Betrag festgelegt. Der Konstruktor wird ausgeführt, wenn ein Objekt erzeugt wird.
Die Umsetzung in Java:
In Java heißt die Referenz auf das aktuelle Objekt this. this wird nicht als Parameter deklariert (anders als in Python). Den Methoden fehlt ein this-Parameter (bzw. self in Python). Dieser Parameter existiert nur intern.
Dennoch kann man this beim Zugriff auf Attribute (und Methoden) angeben. Im folgenden Beispiel wird das auch gemacht.
Man muss this nur dann angeben, wenn es sonst zu Mehrdeutigkeiten käme (in unserem Beispiel beim Konstruktor, bi dem die Parameter genauso benannt sind wie die Attribute).
Der Kunstruktor heißt in Java immer so wie die Klasse, in unserem Fall Geld().
Die Währungstabelle wechselkurs wird als Array einer eigenen Klasse Wechselkurs realisiert. Zusätzlich benötigt man mangels Dictionary eine Methode, die zu einer gegebenen Währung den Kurs liefert: getKurs()
class Geld { final class Wechselkurs { // final nur für's scrapbook String waehrung; double kurs;
public Wechselkurs(String waehrung, double kurs) {
this.waehrung = waehrung;
this.kurs = kurs;
}}
private Wechselkurs[] wechselkurs = {
new Wechselkurs("USD", 1.505), // US-$ (1EUR sind 1.505 USD)
new Wechselkurs("GBP", 0.908), // Britische Pfund
new Wechselkurs("EUR", 1.0),
new Wechselkurs("CHF", 1.509), // Schweizer Franken
new Wechselkurs("JPY", 130.582),// Japanische Yen
};
String waehrung; double betrag;
public Geld(String waehrung, double betrag) { this.waehrung = waehrung; this.betrag = betrag; }
public double getEuro() { return this.betrag / this.getKurs(); }
private double getKurs() { for (Wechselkurs kurs : this.wechselkurs) { if (kurs.waehrung.equals(this.waehrung)) { return kurs.kurs; } } return 0.0; }
public Geld add(Geld geld) { double summeInEuro = this.getEuro() + geld.getEuro(); Geld summe = new Geld(this.waehrung, summeInEuro * this.getKurs()); return summe; } }
/*** Testaufrufe ***/ Geld hotelrechnung = new Geld("EUR", 560); Geld mietwagen = new Geld("USD", 760); Geld summe = mietwagen.add(hotelrechnung); System.out.printf("Summe: %s%.2f, %s%.2f\n", summe.waehrung, summe.betrag, "EUR", summe.getEuro());
Testausgabe:
Summe: USD1602,80, EUR1064,98
Scrapbook oop.jpage zum Download.
Labels: Java, Objektorienterung, OOP, POS1-2
# Eingestellt von Harald R. Haberstroh @ 10:14 0 Kommentare
Montag, 1. Dezember 2014
Aufgabe Java Wurzelberechnung (POS1: 2BHIF)
Man kann die Wurzel einer Zahl berechnen mit folgender Formel
xn = (xn-1 + a / xn-1) / 2
Man beginnt damit, dass a und x0 gleich der Zahl, aus der man die Wurzel ziehen will, setzt und x1 berechnet. Dann berechnet man x2 usw. bis sich die beiden letzten Werte nur mehr gering unterscheiden (z.B. die Differenz kleiner 0,0000001 ist).
Schreiben Sie eine Methode (Funktion) wurzel(zahl, genauigkeit), welche nach obigem Verfahren die Wurzel berechnet.
Erstellen Sie eine Klasse SquareRoot.java, welche eine Tabelle der Wurzeln der Zahlen 1 bis 20 bei den Genauigkeiten 0.01, 0.0001 sowie 0.0000001 ausgibt:
1: 1.0000000 1.0000000 1.0000000 2: 1.4142157 1.4142136 1.4142136 3: 1.7320508 1.7320508 1.7320508 4: 2.0000001 2.0000000 2.0000000 5: 2.2360689 2.2360680 2.2360680 6: 2.4494944 2.4494897 2.4494897 7: 2.6457670 2.6457513 2.6457513 8: 2.8284271 2.8284271 2.8284271 9: 3.0000000 3.0000000 3.0000000 10: 3.1622777 3.1622777 3.1622777 11: 3.3166248 3.3166248 3.3166248 12: 3.4641017 3.4641016 3.4641016 13: 3.6055514 3.6055513 3.6055513 14: 3.7416576 3.7416574 3.7416574 15: 3.8729837 3.8729833 3.8729833 16: 4.0000006 4.0000000 4.0000000 17: 4.1231067 4.1231056 4.1231056 18: 4.2426425 4.2426407 4.2426407 19: 4.3589018 4.3588989 4.3588989 20: 4.4721402 4.4721360 4.4721360
Stellen Sie fest, wie viele Iterationen benötigt werden. Wie kann man die Anzahl der Iterationen bestimmen, ohne die Parameter bzw. den Returntyp bzw. -wert von wurzel(zahl, genauigkeit) zu ändern?
# Eingestellt von Harald R. Haberstroh @ 10:08 0 Kommentare
Montag, 10. November 2014
eclipse einrichten (POS1: 2BHIF)
Machen Sie sich mit der Entwicklungsumgebung eclipse vertraut!
- Richten Sie den "Formatter" ein, sodass nur Leerzeichen für die Einrückung verwendet werden:

- Richten Sie sich ein File-Template mit einem Header nach unseren Programmierrichtlinien ein:

- Richten Sie sich ein Code-Template mit einem Header für Klassen nach unseren Programmierrichtlinien ein:

Labels: Aufgabe, eclipse, POS1-2
# Eingestellt von Harald R. Haberstroh @ 10:17 0 Kommentare
Aufgaben zu Java (POS1: 2BHIF)
- Schreiben Sie ein einfaches Java Programm, welches
"Hello World"ausgibt. Nennen Sie das ProgrammHello.java. Verwenden Sie dazu einen Texteditor und übersetzen Sie das Programm auf der Kommandozeile. - Schreiben Sie ein einfaches Java-Programm, welches das kleine Einmaleins ausgibt. Welchen Namen könnte das Programm haben?
X 1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10
2 2 4 6 8 10 12 14 16 18 20
3 3 6 9 12 15 18 21 24 27 30
4 4 8 12 16 20 24 28 32 36 40
5 5 10 15 20 25 30 35 40 45 50
6 6 12 18 24 30 36 42 48 54 60
7 7 14 21 28 35 42 49 56 63 70
8 8 16 24 32 40 48 56 64 72 80
9 9 18 27 36 45 54 63 72 81 90
10 10 20 30 40 50 60 70 80 90 100
Verwenden Sie wieder einen Texteditor und den Java-Compiler auf der Kommandozeile.
3. Erstellen Sie mit eclipse ein Java-Projekt java-intro. Erzeugen Sie ein package intro1 ("intro eins").
Erstellen Sie in diesem Paket die beiden Klassen von oben (in das Projekt-Verzeichnis kopieren und an das package anpassen). Starten Sie die beiden Klassen von eclipse aus.
4. Starten Sie die beiden Klassen von der Kommandozeile aus. Wo sind die Class files zu finden, wie sieht der Aufruf aus?
5. Erstellen Sie im package intro1 eine Klasse Schleife, die (im main) eine Zahl einliest und dann alle Zahlen von 1 bis zu der gegebenen Zahl ausgibt. Beispielaufruf:
Grenze ? 10
1
2
3
4
5
6
7
8
9
10
6. Erweitern Sie die Klasse Schleife so, dass zwei Zahlen eingegeben werden. Es sollen dann die Zahlen von der ersten bis zur zweiten ausgegeben werden. Wenn die zweite Zahl kleiner ist, dann soll eine absteigende Folge ausgegeben werden. Beispielaufruf:
von? 15
bis? 10
15
14
13
12
11
10
# Eingestellt von Harald R. Haberstroh @ 09:54 0 Kommentare
Abonnieren Kommentare [Atom]
``

.png)



