Montag, 20. Januar 2014
Aufgabe zu Arrays in Java (POS1: 2BHIF)
Erzeugen Sie eine Klasse
DreieckArray
, welche ein privates zweidimensionales Array feld
für Integers enthält. Dieses Feld soll "dreieckig" sein und mit folgenden Werten initialisiert werden:1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1
void create(int zeilen, int spalten)
soll ein neues Feld mit den gegebenen Zeilen und Spalten erzeugen (rechteckig).int[][] getArray()
soll das Feld zurückliefern.int[] summen()
soll ein eindimensionales Feld mit den Zeilensummen liefern.boolean set(int zeile, int spalte, int wert)
soll den Wert an der gegebenen Stelle im Feld feld setzen und bei erfolg true zurückliefern. Bei ungültigen Indizes soll false zurückgeliefert werden.TestDreieckArray
, in der zwei Objekte von DreieckArray in der Methode main()
angelegt werden. Machen Sie zum Testen passende Aufrufe der Methoden (z.B. gültige und ungültige set()
usw.).Versehen Sie die Abgabe mit dem Tag
ABGABE_2_0
.
Montag, 13. Januar 2014
Aufgabe Arrays (POS1: 2BHIF)
Es folgen einige Aufgaben mit Arrays. Zur Erinnerung: bei Arrays haben alle Elemente denselben Datentyp und es muss vorab definiert werden, wie viele Elemente in einem Array enthalten sind.
Nennen Sie das Projekt java-arrays.
Bei allen folgenden Aufgaben soll das Ergebnis auf der Konsole ausgegeben werden.
Alle Methoden sollen in einer Klasse Arrays
implementiert werden. Die Testaufrufe aller Methoden muss im main()
erfolgen.
- Summe bilden
Erstellen Sie ein Array von ganzen Zahlen mit den folgenden Zahlen:82, 7, 58, 87, 47, 51, 81, 79, 65, 40, 45, 47, 85, 67, 85
Schreiben Sie nun zwei Methoden, welche die Summe und das Produkt der Arrayelemente bestimmt. Die Methoden sollen einint
-Array als Parameter bekommen und einint
zurückliefern.
Nennen Sie die Methodensum()
bzw. product().
Achtung: mit den oben genannten Zahlen ergibt sich beim Produkt ein Überlauf (die Zahlen werden negativ). Lassen Sie zum Testen des Produkts die letzten 4 Zahlen weg.
- Alle Elemente ändern
Erstellen Sie ein Array von ganzen Zahlen mit den folgenden Zahlen:82, 7, 58, 87, 47, 51, 81, 79, 65, 40, 45, 47, 85, 67, 85
Schreiben Sie eine Methodeaddtoall(array, number)
, welche zu allen Elementen des Arrays die Zahlnumber
addiert. Verwenden Sie für das Testprogramm die Zahl 23.
- Filtern von Elementen
Erstellen Sie ein Array von ganzen Zahlen mit den folgenden Zahlen:82, 7, 58, 87, 47, 51, 81, 79, 65, 40, 45, 47, 85, 67, 85
Schreiben Sie eine Methodefilter(array, number)
, welche ein neues Array als Returnwert liefert, das alle Elemente enthält, die kleiner alsnumber
sind. Verwenden Sie für das Testprogramm fürnumber
den Wert 60 (die Länge des neuen Arrays muss nun kleiner oder gleich sein!).
- Entfernen von Minimum und Maximum
Erstellen Sie ein Array von ganzen Zahlen mit den folgenden Zahlen:82, 7, 58, 87, 47, 51, 81, 79, 65, 40, 45, 47, 85, 67, 85, 7
Schreiben Sie eine Methodeelim(array)
, welche die kleinste und größte Zahl aus dem Array entfernt und ein neues Array ohne die beiden Werte zurückliefert (die Länge des neuen Arrays muss nun kleiner sein!).
Sollte das Minimum oder Maximum mehrfach vorkommen, so sind alle Minima bzw. Maxima zu entfernen (in unserem Beispiel muss also 7 zweimal entfernt werden).
- Entfernen von Duplikaten
Erstellen Sie ein Array von ganzen Zahlen mit den folgenden Zahlen:82, 7, 58, 87, 47, 51, 81, 79, 65, 40, 45, 47, 85, 67, 85
Schreiben Sie eine Methodeelimduplicates(array)
, welche alle Dpuplikate aus dem Array entfernt und ein neues Array zurückliefert (die Länge des neuen Arrays muss nun kleiner oder gleich sein!).
- Reihenfolge umdrehen
Erstellen Sie ein Array von ganzen Zahlen mit den folgenden Zahlen:82, 7, 58, 87, 47, 51, 81, 79, 65, 40, 45, 47, 85, 67, 85
Schreiben Sie eine Methodereverse(array)
, welche ein neues Array mit den Werten des Arrays in umgekehrter Reihenfolge zurückliefert.
- Transponieren einer Matrix
Erstellen Sie ein zweidimensionales Array von ganzen Zahlen mit den folgenden Zahlen:29, 67, 22, 95, 44 42, 56, 81, 6, 96 92, 77, 31, 9, 17 21, 99, 33, 79, 28 11, 59, 72, 28, 54
Schreiben Sie eine Methodetranspose(array)
, welche die Einträge eines zweidimensionalen Arrays an der Hauptdiagonalen (von links oben nach rechts unten) spiegelt. In der Mathematik nennt man diesen Vorgang transponieren.
Das Ergebnis sollte bei diesem Beispiel wie folgt sein:29, 42, 92, 21, 11 67, 56, 77, 99, 59 22, 81, 31, 33, 72 95, 6, 9, 79, 28 44, 96, 17, 28, 54
Freitag, 10. Januar 2014
Aufgabe einfach Java Klassen (POS1: 2BHIF)
Erstellen Sie ein Projekt java-klassen
mit zwei Klassen:
- Person
- PersonManager
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()
vonPerson
verwenden).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
Importieren Sie das Projekt ins CVS. Die Abgabe erfolgt durch Taggen der abzugebenden Version (siehe CVS: Wissenswertes (POS1: 2BHIF)).
Labels: Aufgabe, CVS, Java, POS1-2
Mittwoch, 8. Januar 2014
CVS: Wissenswertes (POS1: 2BHIF)
Tags
Ein Tag (nicht das Gegenstück zur Nacht, sondern das englische Wort zu Marke) ist ein symbolischer Name für den Zustand des Projekts im Repository zu einem bestimmten Zeitpunkt. Ein Tag muss mit einem Buchstaben beginnen und kann dann Buchstaben, Ziffern, Unterstriche und Bindestriche enthalten. Punkte sind nicht erlaubt, damit ein Tag nicht mit einer Versionsnummer verwechselt werden kann.
Beispiele REL_1_0
, rev-99
, TRY_HP_20060919
Reguläre Tags
Jede Datei im Repository hat ihre eigene Versionsnummer (beginnend mit 1.1, wird bei jedem commit erhöht: 1.2, 1.3 usw.).
Besteht ein Modul (Projekt) aus den Dateien
Main.java 1.4
Gui.java 1.9
Net.java 1.6
will man auf diesen Zustand (diese Versionen) später wieder zugreifen können, weil dies z.B. eine auszuliefernde Version ist, so wählt man ein Tag, z.B. REL_1_0
.
Ein Tag erzeugt intern eine Liste von Versionsnummern, die den Stand jeder Datei wiedergeben.
Es können beliebig viele Tags vergeben werden, jedoch müssen sie eindeutig sein.
~/work/project > cvs commit -m ""
cvs commit: Examing .
~/work/project > cvs rtag REL_1_0 project
cvs rtag: Tagging project
Mit dem CVS-Befehl rtag
wird das Tag REL_1_0
erzeugt. Später kann man das Projekt mit der Option -r REL_1_0
(-r
für release)
~/work > cvs checkout -r REL_1_0 project
~/work > cd project
~/work/project >
auschecken. Die Dateien im Verzeichnis project
haben dann wieder obige Versionsnummern. Möchte man das Projekt in ein anderes Verzeichnis auschecken, dann muss man die Option -d name
verwenden. Z.B.: es soll REL_1_0
in das Verzeichnis rel1.0
ausgecheckt werden:
~/work > cvs checkout -r REL_1_0 -d rel1.0 project
~/work > cd rel1.0
~/work/rel1.0 >
Verwenden eines Tags für die Abgabe
Für die Abgabe verwenden Sie das Tag ABGABE_1_0
. Wollen Sie Korrekturen abgeben, dann verwenden Sie bitte ABGABE_1_1
, ABGABE_1_2
usw.
Gibt es für ein Beispiel mehrere (Teil-)Abgaben, so verwenden Sie für die erste Abgabe obiges Schema, für die zweite Abgabe ABGABE_2_0
bis ABGABE_2_n
(n
n. Abgabeversion) usw.
alte Versionen auschecken
Will man auf eine alte Version zugreifen, so kann man beim Auschecken angeben, welchen Zustand man haben will, in dem man die Option -D datum
angibt. datum
kann entweder in der englischen Schreibweise angegeben werden (MM/TT/JJJJ
), im ISO-Format (JJJJ-MM-TT
) oder auch relativ als Text unter Hochkomma (z.B.
, 3 weeks ago
oder 1 day ago 27 minutes ago
o.ä.).3 days ago
Das Projekt python
im Zustand vor einer Woche auschecken:
~/work > cvs co -D "1 week ago" python
cvs checkout: Updating python
U python/dreieck.py
U python/prim.py
~/work >
Das Projekt python
im Zustand vom 22.9.2006 auschecken:
~/work > cvs co -D 09/22/2006 python
cvs checkout: Updating python
U python/calc.py
U python/craten.py
U python/dreieck.py
U python/ggt.py
U python/mittelwert.py
U python/muster.py
U python/prim.py
U python/pyintro.pdf
U python/raten.py
U python/summe.py
~/work >
Ältere Versionen sollten in eigene Verzeichnisse ausgecheckt werden. Sobald eine bestimmte Version ausgecheckt wurde, ist sie sticky
(klebrig). Das bedeutet, dass sich alle Arbeiten in diesem ausgecheckten Verzeichnisbaum auf diese Version beziehen.
Daher ist das Weiterarbeiten an einer solchen Version nur sinnvoll bei Zweigen.
binäre Dateien
Unter binären Dateien verstehen wir hier Dateien, die nicht aus Textzeilen bestehen. Das sind z.B. Word- und Excel-Dateien, Bilder usw. CVS speichert normalerweise Textdateien und deren Zeilenänderungen. Dies ist bei Binärdateien nicht möglich. Wird z.B. eine Word-Datei nicht als Binärdatei markiert, so wird sie vom CVS zerstört
(Subversion, der Nachfolger von CVS, kann gut mit Binärdateien umgehen, CVS ist aber immer noch weit verbreitet...).
Damit nicht bei jedem cvs add
, cvs import" usw. die Option %-W
(für jede Dateiendung von Binärdateien einmal!) angegeben werden muss, schreibt man diese Dateien in die Konfigurationsdatei *.gif -k 'b'
CVSROOT/cvswrappers
.
Die Konfiguration eines Repositories befindet sich im Projekt
CVSROOT
, welches man auscheckt, bearbeitet und dann wieder eincheckt (commit).
~/work > cvs checkout CVSROOT
...
~/work > cd CVSROOT
~/work/CVSROOT > vim cvswrappers
Die Datei sollte z.B. so aussehen (Zeilen mit #
sind Kommentare, die schon enthalten sind):
# This file affects handling of files based on their names.
#
# The -m option specifies whether CVS attempts to merge files.
#
# The -k option specifies keyword expansion (e.g. -kb for binary).
#
# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
#
# wildcard [option value][option value]...
#
# where option is one of
# -f from cvs filter value: path to filter
# -t to cvs filter value: path to filter
# -m update methodology value: MERGE or COPY
# -k expansion mode value: b, o, kkv, &c
#
# and value is a single-quote delimited value.
# For example:
*.img -k 'b'
*.cramfs -k 'b'
*.jar -k 'b'
*.m2v -k 'b'
*.mvi -k 'b'
*.ppc -k 'b'
*.jffs* -k 'b'
*.nfi -k 'b'
# Microsoft
*.doc -k 'b'
*.xls -k 'b'
*.ppt -k 'b'
# Openoffice 1.*
*.stc -k 'b'
*.std -k 'b'
*.sti -k 'b'
*.stw -k 'b'
*.sxc -k 'b'
*.sxd -k 'b'
*.sxq -k 'b'
*.sxi -k 'b'
*.sxm -k 'b'
*.sxp -k 'b'
*.sxw -k 'b'
# dia
*.dia -k 'b'
# Bilder
*.xcf -k 'b'
*.jpg -k 'b'
*.bmp -k 'b'
*.gif -k 'b'
*.png -k 'b'
Für jeden Dateityp mit Binärformat gibt es eine Zeile der Form *.endung -k 'b'
.
Diese Einträge speichern, den Editor beenden und das Projekt wieder commiten
:
~/work/CVSROOT > cvs commit -m "Binärdateien bekanntgegeben"
...
Das Verzeichnis ~/work/CVSROOT
können Sie löschen, da Sie es ja jederzeit wieder auschekcen können, wenn Sie eine Dateiendung vergessen haben.
Ignorieren von Dateien/Verzeichnissen
Bestimmte Dateien im Projektverzeichnis will man nicht in die Versionsverwaltung aufnehmen, z.B. Testdateien à la xxx
oder die Sicherungsdateien vom vim (*~
- diese werden standardmäßig ignoriert), Klassendateien (*.class
) usw.
Dafür gibt es auch Kommandozeilenargumente für cvs (z.B. -I '*.class'
), aber besser ist es, diese Dateien ein für alle mal zu ignorieren
. Die Konfigurationsdatei heißt CVSROOT/cvsignore
. Leider existiert diese Datei in der Standardkonfiguration nicht und muss daher mit cvs add
aufgenommen werden.
Hat man CVSROOT
bereits ausgecheckt, so muss man die Datei mit einem Editor erzeugen:
~/work/CVSROOT > vim cvsignore
Bei mir hat die Datei folgenden Inhalt:
*.nfi
*.img
*.pyc
*.class
*.log
*.tmp
xxx
*.ppc
*.jffs*
*.cramfs
Dann muss man die Datei dem Repository hinzufügen und einchecken (commit):
~/work/CVSROOT > cvs add cvsignore
~/work/CVSROOT > cvs commit -m "zu ignorierende Dateien"
...
cvs.htlwrn.ac.at (POS1: 2BHIF)
Anmeldung am Server
erfolgt über ssh. Man muss zunächst den Server und das CVS-Verzeichnis wählen. Die Anmeldung erfolgt bei jedem CVS-Befehl über ssh.
~ > export CVSROOT=:ext:USER@cvs.htlwrn.ac.at:/srv/cvsroot/USER
~ > export CVS_RSH=ssh
USER ist der Username (Projektuser, Evidenznummer).
Repository einrichten
~ > cvs init
Password:
damit wird ein Repository eingerichtet (dieser Schritt wird für Schüler vom Administrator beim Anlegen der User durchgeführt). Die Zeile mit Password:
deutet das Anmelden am Server an. Hier ist das Passwort einzugeben. Die Meldungen vom CVS werden in diesem Text nicht angegeben.
Importieren eines Projektes
Soll ein Projekt ins CVS aufgenommen werden, so muss man zunächst ein Verzeichnis mit allen Unterverzeichnissen und Dateien anlegen (natürlich können später weitere Dateien hinzugefügt werden).
Dann importiert man das Projekt mit
~ > cd neues_projekt
~/neues_projekt > cvs import -m "eine Beschreibung des Projekts" projektname name start
projektname ist der Name des Projekts im CVS.
name ist das sog. Vendor Tag, eine Bezeichnung des Verkäufers (Entwicklers).
start ist das Release Tag, welches den Start des Projekts anzeigt (beide Tags sind eigentlich unnötig, aber vom CVS zwingen einzugeben...).
Nach dem Import kann (soll) das Verzeichnis neues_projekt gelöscht werden, denn wenn man an diesem Projekt nun weiterarbeiten will, muss es ausgecheckt werden.
Checkout
In einem Arbeitsverzeichnis (workspace) wird das Projekt ausgecheckt (dieser Vorgang ist normalerweise pro Arbeitsplatz und User nur einmal zu machen):
~ > cd workspace
~/workspace > cvs checkout projektname
Password:
Im Verzeichnis workspace wird nun ein Verzeichnis projektname angelegt. In diesem Verzeichnis kann man nun editieren, compilieren, debuggen usw. projektname kann auch ein Modulname sein (vgl. Einführung in CVS).
Update
Ein Update ist nötig, um Änderungen, die von anderen Personen oder von einem anderen Arbeistplatz aus eingecheckt wurden, in den eigenen workspace zu übernehmen. Hier kann es natürlich zu Konflikten kommen, d.h. dieselben Dateien haben sich im Repository und im eigenen Workspace geändert.
~/workspace > cvs update
Password:
Falls es Konflikte gibt, müssen diese gelöst werden.
commit - Änderungen ins Repository übernehmen (check in)
Änderungen im eigenen workspace sollten regelmäßig ins CVS übernommen werden. Dadurch werden von den geänderten Dateien neue Versionen angelegt. Arbeitet man im Team, so dürfen nur Sourcen eingecheckt (commit) werden, die sich zumindest übersetzen lassen. Noch besser ist es, wenn die nötigen Tests bestanden werden.
~/workspace > cvs commit -m "der Text, der beschreibt, was sich geändert hat"
Password:
add - neue Dateien aufnehmen
Werden neue Dateien angelegt, so müssen sie der Versionsverwaltung zunächst bekannt gegeben werden. Die Dateien werden aber erst wirklich aufgenommen, wenn ein commit gemacht wird.
~/workspace > cvs add neue_dateien...
Password:
Nun müssen die Dateien auch eingecheckt werden (commit):
~/workspace > cvs commit -m "der Text, der beschreibt, was sich geändert hat (welche Dateien neu sind)"
Password:
Genauere Informationen sind mit man cvs
bzw. cvs –help
zu finden.
CVS-Einführung (POS1: 2BHIF)
- Source Code
- Makefiles
- Scripts
- Dokumentation
- Schriftverkehr
- u.U. Libraries von Fremdherstellern
- ...
Mit Hilfe von CVS kann man u.a. folgende Dinge tun:
- eine bestimmte Version einer datei auschecken
- den Stand des gesamten Projekts (Moduls) von vor 5 Wochen bestimmen
- die Unterschiede einer bestimmten Datei zwischen Version 1.3 und 1.5 anzeigen
Main.java 1.4ausgecheckt, dann in
Gui.java 1.9
Net.java 1.6
Gui.java
und Net.java
etwas geändert und danach das Modul wieder eingecheckt, so werden nur die Versionen der geänderten Dateien erhöht: Main.java 1.4Das bedeutet, dass die individuellen Versionsnummern nicht für Releases verwendet werden können. Dazu sind Tags (Marken) zu verwenden.
Gui.java 1.10
Net.java 1.7
PreRel_1_0
gewählt werden. Mit PreRel_1_0
kann man dann ganau auf die oben gezeigten Versionen von Main.java
, Gui.java
und Net.java
zugreifen.Mit Tags werden üblicherweise bestimmte signifikante Ereignisse im Projekt markiert.
Zweige in der Versionsverwaltung sind parallele Zeitlinien. Zu einem Zeitpunkt verzweigt sich der Hauptstrang. Ab diesem Zeitpunkt existieren zwei parallele Zeitlinien und damit Kopien des Sourcecodes. Jeder Zweig verhält sich wie ein eigenes Repository. Zweige werden durch Tags gekennzeichnet. Sie werden oft für Releases verwendet (ab einem bestimten Zeitpunkt wird ein Releasezweig erzeugt, in dem nur mehr Fehler behoben werden und keine neue Funktionalität eingebaut wird, im Hauptstrang kann aber gleichzeitig an neuen Features weitergearbeitet werden, Fehlerkorrekturen werden natürlich im Hauptzweig "nachgezogen").
Zweige können natürlich wieder zusammengeführt werden. Die Änderungen für die Korrekturen im Releasezweig können automatisch ermittelt werden und in den Hauptstrang übernommen werden.
Links
Ximbiot
Einführung in das Concurrent Versions System (CVS)
Wikipedia:CVS
ganz kurze Einführung in CVS (pdf)
Bücher
Versionsverwaltung mit CVS
Kurzreferenz
2-seitige Kurzreferenz
Aufgabe Java Wurzelberechnung (POS1: 2BHIF)
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?
Abonnieren Posts [Atom]