tag:blogger.com,1999:blog-3957349299393366892024-03-14T00:42:58.238+01:00Programmieren mit Harald R. HaberstrohAlle möglichen Themen zu Programmieren, hauptsächlich jedoch Themen aus dem Programmierunterricht. Programmierbeispiele, Tipps usw.
Sprachen: C, Java, Python, C++, C#, Ruby, PHPHarald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.comBlogger356125tag:blogger.com,1999:blog-395734929939336689.post-29675559404993518332017-10-10T14:46:00.000+02:002017-10-10T14:53:14.026+02:004. Aufgabe 4BHIF - C# Threads<p>
<strong>Abgabename: 2017_4bhif_aufgabe4_<i>name_vorname</i>.zip</strong><br />
<strong>Abgabetermin - <span style="background-color: yellow;">14.11.2017 - Abgabe auf edvossh</span></strong>
<br />
<p>
Im folgenden Code werden Primzahlen berechnet. Ihre Aufgabe ist es aus diesem Code eine <b>Multithreaded</b> Version zu entwickeln. Die Anzahl der Threads und der Höchstwert der Primzahlen soll über Befehlszeilenargumente einstellbar sein. Testen Sie das Programm mit verschiedenen Höchstwerten und Threadanzahlen. (Zumindestens einmal mit einer Anzahl die den Prozessoren des Systems entsprechen) Erzeugen Sie mit den Ergebnissen eine Tabelle die die Zeiten gegen die der Single-Thread-Version vergleicht. (manuell z.B. in Excel oder auch im Programm)
</p>
<pre class="brush:csharp">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Diagnostics;
namespace Primzahlen
{
class Program
{
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
int maxPrim = 0;
int number = 0;
int tests = 0;
watch.Start();
Prim(1600000, out maxPrim, out number, out tests);
watch.Stop();
Console.WriteLine("Es wurden {0} Primzahlen gefunden", number);
Console.WriteLine("Die höchste gefundene Primzahl ist {0}", maxPrim);
Console.WriteLine("Die Laufzeit betrug {0:F0} Millisekungen",
watch.ElapsedMilliseconds);
Console.WriteLine("Es wurden {0} Vergleiche durchgeführt", tests);
}
private static void Prim(int max, out int maxPrim, out int number, out int tests)
{
List<int> prims = new List<int>();
int i = 5;
tests = 0;
prims.Add(2);
prims.Add(3);
while (i < max)
{
int maxTeiler = (int)Math.Sqrt(i) + 1;
int j = 0;
while (true)
{
int n = prims[j];
int rest = (i % n);
++tests;
if (rest == 0)
break; //keine Primzahl
if(n >= maxTeiler)
{
prims.Add(i);
break;
}
++j;
}
i += 2;
}
number = prims.Count;
maxPrim = prims[number - 1];
}
}
}
</pre>
<p>Beispieltabelle für Ausgabe:</p>
<pre>
max Primzahl nr. Primzahlen ein Thread zwei Threads vier Threads
100000 9592 44ms 60ms 80ms
200000 17984 95ms 98ms 104ms
400000 33860 223ms 227ms 230ms
...
51200000 3068712 106000ms 61300ms 32940ms
</pre>
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-72518134962385435152017-10-03T09:48:00.000+02:002017-10-03T09:48:36.329+02:003. Aufgabe 4BHIF<strong>Abgabename: 2017_4bhif_aufgabe3_<i>name_vorname</i>.zip</strong><br />
<strong>Abgabetermin - <span style="background-color: yellow;">24.10.2017 - Abgabe auf edvossh</span></strong><br />
<br />
Erstellen Sie für den RPN-Rechner der letzten Aufgabe ein GUI!
<br />
<br />
Erweitern Sie die Funktionalität so, dass die Anzeige (oberstes Stack-Element <code>C</code>) und alternativ der gesamte Stack (<code>CLS</code>) gelöscht werden kann. Weiters soll ein <code>Drop</code> (oberstes Element entfernen), ein <code>Swap</code> (die beiden obersten Elemente vertauschen), ein <code>+/-</code> (Vorzeichenwechsel), ein <code>1/X</code>, die Quadratwurzel (<code>Sqrt</code>) und das Quadrat (<code>X^2</code>) implementiert werden.
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkRbELkJy23sAwky2g5f6WYqdJ389qEul6qNSljYZ1P0eu1MLE1ABghf7qONKSRa5abpy91Sc00W_0UOyzZHOwVasqryOXmxy0ln-TgXJVoMv892mxG5tpQaT2B4or3KCifrxRTdYkSiJD/s1600/rpn-calc.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkRbELkJy23sAwky2g5f6WYqdJ389qEul6qNSljYZ1P0eu1MLE1ABghf7qONKSRa5abpy91Sc00W_0UOyzZHOwVasqryOXmxy0ln-TgXJVoMv892mxG5tpQaT2B4or3KCifrxRTdYkSiJD/s320/rpn-calc.png" width="220" height="320" data-original-width="503" data-original-height="730" /></a>
<br />
Der Rechner sollte etwa so funktionieren, wie dieser <a href="http://www.alcula.com/calculators/rpn/">Online-Rechner</a>.
<br />
<br />
Zusätzliche Features sind möglich und erwünscht.
Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-61065517034762491102017-09-29T10:03:00.000+02:002017-09-29T10:03:14.723+02:00vim Einführung (2AHIF, 2BHIF)<strong>Vim</strong> 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 <strong>vi</strong> 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. <br />
Der <strong>vi</strong> 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 <strong>probieren</strong> und <strong>üben</strong> mit <code>vimtutor</code><br />
Weitere Dokumentation finden Sie hier:<br />
<a href="https://php-faq.eu/vim-kurz-referenz/">vim Kurzreferenz</a><br />
<a href="http://www.vim.org/">vim Homepage www.vim.org</a><br />
<a href="https://duetsch.info/downloads/vimref.pdf">vim Quick Reference Card (2 Seiten)</a><br />
Wir verwenden eine spezielle Konfigurationsdatei für den <strong>vim</strong>. 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 <a href="http://www.vim.org/scripts/index.php">www.vim.org/scripts</a> nach passenden Scripts für den <strong>vim</strong>.<br />
<code class="western"><br /></code>
<code class="western">vim</code> ist eine Erweiterung des
Standard-Unix-Editors <code class="western">vi</code>. <code class="western">vim</code>
steht für <code class="western">vi</code> i<code class="western">m</code>proved.
<br />
<code class="western">vim</code> gibt es nicht nur für
Unix-Plattformen, sondern auch für andere Betriebssysteme (Windows, OSX). Siehe dazu auch http://www.vim.org/. <code class="western">vim</code>
ist frei verfügbar.<br />
Es ist besser, einen Editor wirklich gut zu beherrschen als viele
verschiedene Editoren oder Entwicklungsumgebungen nur mittelmäßig
bedienen zu können. Der <code class="western">vim</code> eignet sich
besonders als universeller (Programmier-)Editor, da er für jede
Plattform verfügbar ist und hochgradig konfigurierbar bzw.
programmierbar ist.<br />
<code class="western">vi</code> gibt es auf jedem Unix-ähnlichem
System. Wenn nichts mehr geht, dann muss man u.U. dem <code class="western">vi</code>
nehmen und in den Konfigurationsdateien Änderungen vornehmen.<br />
<br />
<code class="western">vim</code> hat (wie <code class="western">vi</code>)
mehrere Betriebsmodi: <br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxp25CJoGRAqF7-U4o3pMKesFAxf6iMaQdnC5ZFqo_UGWxEDFmRhhSbt2bOKwalXzkc0wADaqojlvUH_EJTH92HYIL5GN_PAHMUjMAx6yM1-JO9gcZlRh0Z2iFE1rDp10gvoOPP__4vSnc/s1600/vim.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="293" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxp25CJoGRAqF7-U4o3pMKesFAxf6iMaQdnC5ZFqo_UGWxEDFmRhhSbt2bOKwalXzkc0wADaqojlvUH_EJTH92HYIL5GN_PAHMUjMAx6yM1-JO9gcZlRh0Z2iFE1rDp10gvoOPP__4vSnc/s320/vim.jpg" width="320"></a></div>
Dies hat den Vorteil, dass man einen mächtigen Editor (<code class="western">vim</code>
ist 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.
<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
Nachteilig ist der relativ hohe Lernaufwand.<br />
<h2 class="western">
Befehlsmodus
</h2>
Grundsätzlich kann jeder Befehl mehrfach ausgeführt werden,
indem zuerst eine Anzahl angegeben wird. Z.B. <code class="western">10dd</code>
löscht 10 Zeilen (siehe unten), <code class="western">2dw</code>
löscht 2 Worte.<br />
<code class="western">[</code><code class="western"><i>Anzahl</i></code><code class="western">]
</code><code class="western"><i>Befehl</i></code><code class="western">
[</code><code class="western"><i>Taste</i></code><code class="western">]
</code>
<br />
<code class="western">[</code><code class="western"><i>Anzahl</i></code><code class="western">]
</code><code class="western"><i>Befehl</i></code><code class="western">
[</code><code class="western"><i>Bereich</i></code><code class="western">]</code>
<br />
<b>Cursorbewegung</b>
<br />
<div style="margin-left: 0.87in;">
<code class="western"> </code><code class="western">k
</code>hinauf</div>
<div style="margin-left: 0.87in;">
<code class="western">h l
</code>links<code class="western"> </code>rechts</div>
<div style="margin-left: 0.87in;">
<code class="western"> </code><code class="western">j
</code>hinunter</div>
<div style="margin-left: 0.87in;">
<code class="western">^F</code> orward
page
</div>
<div style="margin-left: 0.87in;">
<code class="western">^B</code>
ackward page
</div>
<div style="margin-left: 0.87in;">
<code class="western">^D</code> own
half page
</div>
<div style="margin-left: 0.87in;">
<code class="western">^U</code> p half
page<code class="western"> </code>
</div>
<div style="margin-left: 0.87in;">
<code class="western">w</code> ord
right
</div>
<div style="margin-left: 0.87in;">
<code class="western">b</code> ack
word
</div>
<div align="LEFT" style="margin-left: 0.87in;">
[<code class="western"><i>line</i></code><code class="western">]G</code>
oto line (default letzte Zeile)
</div>
<div style="margin-left: 0.87in;">
<code class="western">(</code> Sätze
zurück
</div>
<div style="margin-left: 0.87in;">
<code class="western">)</code> Sätze
vorwärts
</div>
<div style="margin-left: 0.87in;">
<code class="western">{</code> Absätze
zurück
</div>
<div style="margin-left: 0.87in;">
<code class="western">}</code> Absätze
vorwärts
</div>
<div style="margin-left: 0.87in;">
<code class="western">f</code><code class="western"><i>c</i></code>
gehe zum Zeichen c in der aktuellen Zeile</div>
<div style="margin-left: 0.87in;">
<code class="western">'m</code> gehe
zu Marke m
</div>
<div style="margin-left: 0.87in;">
<code class="western">ma</code> mark a
(setze Marke a), Marken werden auch für Lösch-, Änder- und
Kopieroperationen verwendet (sieh weiter unten)</div>
<strong>Löschen</strong> (<code class="western">d</code> elete)
<br />
<div style="margin-left: 0.87in;">
<code class="western">dd</code> Zeile
löschen
</div>
<div style="margin-left: 0.87in;">
<code class="western">dw</code> Wort
löschen
</div>
<div style="margin-left: 0.87in;">
<code class="western">x</code> Zeichen
unter Cursor löschen
</div>
<div style="margin-left: 0.87in;">
<code class="western">X</code> Zeichen
links von Cursor löschen
</div>
<div style="margin-left: 0.87in;">
<code class="western">D</code> bis
Zeilenende löschen
</div>
<div style="margin-left: 0.87in;">
<code class="western"><i>Bereich</i></code><code class="western">d</code>
löschen des Bereichs
</div>
<div style="margin-left: 0.87in;">
<code class="western">d'</code><code class="western"><i>marke</i></code><span style="font-style: normal;">
löschen bis zur Marke </span><code class="western"><i>marke</i></code><span style="font-style: normal;">
(ein Buchstabe, vorher gesetzt mit </span><code class="western"><span style="font-style: normal;">m</span></code><code class="western"><i>marke</i></code><span style="font-style: normal;">)</span></div>
<strong>Ändern</strong>
<br />
<div style="margin-left: 0.87in;">
<code class="western">></code>
schiebt Text nach rechts (shiftwidth)
</div>
<div style="margin-left: 0.87in;">
<code class="western"><</code>
schiebt Text nach links (shiftwidth)
</div>
<div style="margin-left: 0.87in;">
<code class="western">i</code>
Einfügen vor Cursor (insert)
</div>
<div style="margin-left: 0.87in;">
<code class="western">a</code>
Einfügen nach Cursor (append)
</div>
<div style="margin-left: 0.87in;">
<code class="western">I</code>
Einfügen Zeilenanfang (<b>I</b>nsert)</div>
<div style="margin-left: 0.87in;">
<code class="western">A</code>
Einfügen Zeilenende (<b>A</b>ppend)</div>
<div style="margin-left: 0.87in;">
<code class="western">o</code> Öffnet
neue Zeile darunter (<b>o</b>pen line)
</div>
<div style="margin-left: 0.87in;">
<code class="western">O</code> Öffnet
neue Zeile darüber
</div>
<div style="margin-left: 0.87in;">
<code class="western">J</code> (<strong>j</strong>oin)
hänge die nächste Zeile an die aktuelle Zeile an (mit Leerzeichen
getrennt)</div>
<div style="margin-left: 0.87in;">
<code class="western">r</code><code class="western"><i>x</i></code>
ersetzen des aktuellen Zeichens durch das Zeichen <code class="western"><i>x</i></code>
(kein <code class="western">ESC</code> nötig)</div>
<div style="margin-left: 0.87in;">
<code class="western">cw</code> ändert
Wort (<b>c</b>hange <b>w</b>ord)
</div>
<div style="margin-left: 0.87in;">
<code class="western"><i>Bereich</i></code><code class="western">c</code>
ändert Bereich (vgl. Bereich angeben)
</div>
<div style="margin-left: 0.87in;">
<code class="western">c'</code><code class="western"><i>marke</i></code><span style="font-style: normal;">
ändert Bereich bis zur Marke</span></div>
<strong>Bereich angeben (markieren)</strong>
<br />
<div style="margin-left: 0.87in;">
Cursor an ein Ende des Bereichs
setzen, <code class="western">v</code> eingeben, den Cursor zum
anderen Ende bewegen und den gewünschten Befehl eingeben.
Zeilenweise markieren mit <code class="western">V</code>.</div>
<div style="margin-left: 0.87in;">
Wurde <code class="western">:set
mouse=a</code> gesetzt, dann kann auch mit der Maus markiert werden.</div>
<div style="margin-left: 0.87in;">
Fast alle Befehle arbeiten mit einem
so markierten Bereich.</div>
<strong>Kopieren/Einfügen</strong>
<br />
<div style="margin-left: 0.87in;">
<code class="western"><i>Bereich</i></code><code class="western">y</code>
"<b>y</b>ank", Bereich wird in den Puffer kopiert
</div>
<div style="margin-left: 0.87in;">
<code class="western">y'</code><code class="western"><i>marke</i></code><span style="font-style: normal;">
kopiert Bereich bis zur Marke in den Puffer</span></div>
<div style="margin-left: 0.87in;">
<code class="western">yw</code> Wort
in den Puffer
</div>
<div style="margin-left: 0.87in;">
<code class="western">Y</code> Zeile
in den Puffer
</div>
<div style="margin-left: 0.87in;">
<code class="western">p</code>
Einfügen nach Cursor (<b>p</b>aste - "einkleben")</div>
<strong>Suchen</strong>
<br />
<div style="margin-left: 0.87in;">
<code class="western">^A</code> sucht
nächstes Vorkommen des Wortes unter Cursor
</div>
<div style="margin-left: 0.87in;">
<code class="western">%</code>
platziert Curser auf zugehörige <code class="western">( ) { } [ ]</code>
</div>
<div style="margin-left: 0.87in;">
<code class="western">Anzahl%</code>
platziert Cursor auf Anzahl Prozent der Datei
</div>
<div style="margin-left: 0.87in;">
<code class="western">/</code><code class="western"><i>text</i></code>
sucht vorwärts <code class="western"><i>text</i></code> oder
regulären Ausdruck
</div>
<div style="margin-left: 0.87in;">
<code class="western">?</code><code class="western"><i>text</i></code>
sucht rückwärts <code class="western"><i>text</i></code> oder
regulären Ausdruck
</div>
<div style="margin-left: 0.87in;">
<code class="western">*</code> sucht
das Wort unter dem Cursor</div>
<strong>Wiederholung</strong>
<br />
<div style="margin-left: 0.87in;">
<code class="western">.</code> (Punkt)
wiederholt letztes Kommando
</div>
<div style="margin-left: 0.87in;">
<code class="western">n</code> letzte
Suche wiederholen
</div>
<div style="margin-left: 0.87in;">
<code class="western">N</code> letzte
Suche in umgekehrter Richtung
</div>
<strong>Rückgängig</strong><br />
<div style="margin-left: 0.87in;">
<code class="western">u</code> undo,
der <code class="western">vi</code> kann nur die letzte Änderung
rückgängig machen (d.h. <code class="western">uu</code> stellt die
letzte Änderung wieder her), der <code class="western">vim</code>
kann im Prinzip beliebig viele Änderungen rückgängig machen</div>
<div style="margin-left: 0.87in;">
<code class="western">^r</code>
(<code class="western">crtl+r</code>) redo (nur <code class="western">vim</code>)
macht das letzte undo bzw. die letzten undos wieder rückgängig</div>
<strong>Sonstige Kommandos</strong>
<br />
<div style="margin-left: 0.87in;">
<code class="western">^G</code> zeigt
Dateistatus und Zeilennummer
</div>
<div style="margin-left: 0.87in;">
<code class="western">^L</code>
erneuert Bildschirm
</div>
<div style="margin-left: 0.87in;">
<code class="western"><i>Bereich</i></code><code class="western">!
</code>führt angegebenen Bereich einem Filter zu, der anschließend
eingegeben werden muss</div>
<h2 class="western">
Änderungsmodus
</h2>
Eingegebener Text wird eingefügt (bei <code class="western">i</code>,
<code class="western">a</code>,...) bzw. ersetzt markierten Bereich
(<code class="western">c</code>,...), löschen mit Backspace in der
aktuellen Zeile möglich (nur eben eingegebener Text).
<br />
Der Änderungsmodus wird mit der <code class="western">ESC</code>-Taste
verlassen.<br />
<code class="western">^v</code> (<code class="western">ctrl+v</code>)
stellt sicher, dass das nächste Zeichen normal eingegeben wird (z.B.
wird bei <code class="western">TAB</code> normalerweise nicht das
Tabulator-Zeichen eingefügt sondern so viele Leerzeichen als nötig,
will man jedoch das <code class="western">TAB</code>-Zeichen
einfügen, muss man <code class="western">^vTAB</code> drücken).<br />
<h2 class="western">
Ex-Befehle (Colon mode)
</h2>
<div align="LEFT" style="margin-left: 0.87in;">
<code class="western">:[</code><code class="western"><i>Zeile</i></code><code class="western">][,</code><code class="western"><i>Zeile</i></code><code class="western">]</code><code class="western"><i>Befehl</i></code><code class="western">
</code><code class="western"><i>Argumente</i></code>
</div>
<div align="LEFT" style="margin-left: 0.87in;">
Der Bereich <code class="western"><i>Zeile,Zeile</i></code><span style="font-style: normal;">
bezeichnet Anfangszeile und Endzeile. Ein </span><code class="western"><span style="font-style: normal;">.</span></code><span style="font-style: normal;">
(Punkt) bedeutet aktuelle Zeile, </span><code class="western"><span style="font-style: normal;">$</span></code><span style="font-style: normal;">
die letzte Zeile. Wurde vorher ein Bereich mit </span><code class="western"><span style="font-style: normal;">v</span></code><span style="font-style: normal;">
ausgewählt, dann wird automatisch ein Bereich eingefügt: </span><code class="western"><span style="font-style: normal;">'<,'></span></code><span style="font-style: normal;">
(die Marke </span><code class="western"><span style="font-style: normal;">'<</span></code><span style="font-style: normal;">
bezeichnet den Anfang und </span><code class="western"><span style="font-style: normal;">'></span></code><span style="font-style: normal;">
das Ende eines markierten Bereichs). </span><code class="western"><span style="font-style: normal;">%</span></code><span style="font-style: normal;">
ist die Kurzform von </span><code class="western"><span style="font-style: normal;">1,$</span></code><span style="font-style: normal;">.</span></div>
<div style="margin-left: 0.87in;">
<code class="western">:x</code>
Speichern und Ende
</div>
<div style="margin-left: 0.87in;">
<code class="western">:w</code> write,
speichern
</div>
<div style="margin-left: 0.87in;">
<code class="western">:w datei</code>
Speichern in Datei (<b>w</b><span style="font-weight: normal;">rite),
wurde vorher ein Bereich markiert, so wird dieser Bereich in die
</span><code class="western"><span style="font-weight: normal;">datei</span></code><span style="font-weight: normal;">
geschrieben.</span></div>
<div style="margin-left: 0.87in;">
<code class="western">:r datei</code>
Einfügen von Datei (<b>r</b>ead)
</div>
<div style="margin-left: 0.87in;">
<code class="western">:q</code> Quit
(schließen eines Fensters)</div>
<div style="margin-left: 0.87in;">
<code class="western">:split [datei]</code>
weiteres Fenster (mit <code class="western">datei</code> öffnen)</div>
<strong>Suchen und ersetzen</strong>
<br />
<div style="margin-left: 0.87in;">
<code class="western">:s/</code><code class="western"><i>suchtext</i></code><code class="western">/</code><code class="western"><i>ersatztext</i></code><code class="western">/[g]</code>
</div>
<div style="margin-left: 0.87in;">
Ersetzen von <code class="western"><i>suchtext</i></code>
durch <code class="western"><i>ersatztext</i></code>. Wird <b>g</b>
(die eckigen Klammern bezeichnen "optional") angegeben,
dann wird auch mehrfaches Vorkommen pro Zeile ersetzt. <code class="western"><i>suchtext</i></code><span style="font-style: normal;">
kann ein regulärer Ausdruck sein.</span></div>
<div style="font-style: normal; margin-left: 0.87in;">
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:</div>
<div style="font-style: normal; margin-left: 0.87in;">
<code class="western">:.,$s/i++/j++/g</code> ersetze
alle <code class="western">i++</code> durch <code class="western">j++</code>
von der aktuellen Zeile bis zum<br /> Ende der Datei.</div>
<strong>Setzen von Modi</strong>
<br />
<div style="margin-left: 0.87in;">
<code class="western">:se tabstop=3</code>
Tabulatorweite
</div>
<div style="margin-left: 0.87in;">
<code class="western">:se shiftwidth=3</code>
Weite für <code class="western">></code> und <code class="western"><</code>
</div>
<div style="margin-left: 0.87in;">
<code class="western">:se ai</code>
oder <code class="western">:set autoindent</code> automatisches
Einrücken
</div>
<div style="margin-left: 0.87in;">
<code class="western">:se et</code>
oder <code class="western">:set expandtab</code> Tabulator wird durch
Leerzeichen ersetzt (dies sollte eingestellt werden!)
</div>
<div style="margin-left: 0.87in;">
<code class="western">:syntax on</code>
Highlighting von Sourcen</div>
<b>Abkürzungen</b><br />
<div style="margin-left: 0.87in;">
<code class="western">:ab lhs rhs</code>
Definieren einer Abkürzung <code class="western">lhs</code> (left
hand side) für <code class="western">rhs</code> (right hand side),
Abkürzungen werden expandiert, sobald <code class="western">ESC</code>,
<code class="western">Enter</code> oder die Leertaste gedrückt wird.</div>
<div style="margin-left: 0.87in;">
<code class="western">:ab</code>
listet alle Abkürzungen auf.</div>
<div style="margin-left: 0.87in;">
<code class="western">:unab lhs</code>
löscht die Abkürzung <code class="western">lhs</code>.</div>
<div style="margin-left: 0.87in;">
<code class="western">:help abbreviate</code>
Hilfe zu den Abkürzungen.</div>
<strong>Konfigurationsdatei</strong> <code class="western">.vimrc</code>
<br />
<div style="margin-left: 0.87in;">
In dieser Datei können beliebige
Ex-Befehle stehen. Diese Datei wird beim Starten von <code class="western">vim</code>
ausgeführt. Weitere Konfigurationsmöglichkeiten sind in der
Dokumentation <strong>(:</strong><code class="western">help</code>)
beschrieben. So können Abkürzungen definiert werden,
Funktionstasten belegt werden und in Abhängigkeit eines Dateityps
Konfigurationsdateien ausgeführt werden.
</div>
<strong>reguläre Ausdrücke</strong><br />
<div style="margin-left: 0.87in;">
<strong><span style="font-weight: normal;">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:</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">\.</span></code><strong><span style="font-weight: normal;"> (Punkt)
steht für ein beliebiges Zeichen</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">[aeiou]</span></code><strong><span style="font-weight: normal;"> ein
Selbstlaut klein geschrieben</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">[A-Z]</span></code><strong><span style="font-weight: normal;"> alle
Großbuchstaben</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">[^0-9]</span></code><strong><span style="font-weight: normal;"> alles
außer Ziffern</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">cdrom\|floppy</span></code><strong><span style="font-weight: normal;"> alle
Vorkommnisse der Worte </span></strong><code class="western"><span style="font-weight: normal;">cdrom</span></code><strong><span style="font-weight: normal;">
oder </span></strong><code class="western"><span style="font-weight: normal;">floppy</span></code></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">a\+</span></code><strong><span style="font-weight: normal;"> mindestens
ein </span></strong><code class="western"><span style="font-weight: normal;">a</span></code><strong><span style="font-weight: normal;">
(</span></strong><code class="western"><span style="font-weight: normal;">a</span></code><strong><span style="font-weight: normal;">,
</span></strong><code class="western"><span style="font-weight: normal;">aa</span></code><strong><span style="font-weight: normal;">,
</span></strong><code class="western"><span style="font-weight: normal;">aaa</span></code><strong><span style="font-weight: normal;">,
</span></strong><code class="western"><span style="font-weight: normal;">aaaa</span></code><strong><span style="font-weight: normal;">,
...)</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">.*</span></code><strong><span style="font-weight: normal;"> keines,
ein oder mehrere beliebige Zeichen (der </span></strong><code class="western"><span style="font-weight: normal;">*</span></code><strong><span style="font-weight: normal;">
braucht <br /> keinen </span></strong><code class="western"><span style="font-weight: normal;">\</span></code><strong><span style="font-weight: normal;">)</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">\(</span></code><code class="western"><i><span style="font-weight: normal;">ausdruck\</span></i></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">)+</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;"> das
Muster </span></span></strong><code class="western"><i><span style="font-weight: normal;">ausdruck</span></i></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
muss mindestens einmal<br /> vorkommen</span></span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><i><span style="font-weight: normal;">ausdruck</span></i></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">{</span></span></code><code class="western"><i><span style="font-weight: normal;">von</span></i></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">,</span></span></code><code class="western"><i><span style="font-weight: normal;">bis</span></i></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">}</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;"> </span></span></strong><code class="western"><i><span style="font-weight: normal;">ausdruck</span></i></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
muss mindestens </span></span></strong><code class="western"><i><span style="font-weight: normal;">von</span></i></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
mal und höchstens <br /> </span></span></strong><code class="western"><i><span style="font-weight: normal;">bis</span></i></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
mal vorkommen.</span></span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><i><span style="font-weight: normal;">ausdruck</span></i></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">{</span></span></code><code class="western"><i><span style="font-weight: normal;">n</span></i></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">} </span></span></code><code class="western"><i><span style="font-weight: normal;">ausdruck</span></i></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
muss genau </span></span></strong><code class="western"><i><span style="font-weight: normal;">n</span></i></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
mal vorkommen.</span></span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">^</span></span></code><code class="western"><i><span style="font-weight: normal;">ausdruck</span></i></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;"> </span></span></code><code class="western"><i><span style="font-weight: normal;">ausdruck</span></i></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
muss am Zeilenanfang stehen.</span></span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><i><span style="font-weight: normal;">Ausdruck</span></i></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">$</span></span></code><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;"> </span></span></code><code class="western"><i><span style="font-weight: normal;">ausdruck</span></i></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
muss am Zeilenende stehen.</span></span></strong></div>
<div style="margin-left: 0.87in;">
<strong><span style="font-style: normal;"><span style="font-weight: normal;">Die
Operatoren </span></span></strong><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">\+</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
und </span></span></strong><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">*</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
sind "gefräßig", d.h. sie nehmen soviel als möglich,
u.U. bis zum Ende eine Zeile. Der Ausdruck </span></span></strong><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">a.*h</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">
passt auf </span></span></strong><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">ah</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">,
</span></span></strong><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">ahh</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">,
</span></span></strong><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">abh</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">,
</span></span></strong><code class="western"><span style="font-style: normal;"><span style="font-weight: normal;">abhcdh</span></span></code><strong><span style="font-style: normal;"><span style="font-weight: normal;">.</span></span></strong></div>
<div style="margin-left: 0.87in;">
<strong><b>Beispiele:</b></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">[0-9A-Fa-f]+</span></code><strong><span style="font-weight: normal;"> erkennt
Hexadezimalzahlen, z.B. </span></strong><code class="western"><span style="font-weight: normal;">123</span></code><strong><span style="font-weight: normal;">,
</span></strong><code class="western"><span style="font-weight: normal;">abc</span></code><strong><span style="font-weight: normal;">,
</span></strong><code class="western"><span style="font-weight: normal;">F000</span></code><strong><span style="font-weight: normal;">
usw.</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">\(un\)*stable</span></code><strong><span style="font-weight: normal;"> erkennt
</span></strong><code class="western"><span style="font-weight: normal;">stable</span></code><strong><span style="font-weight: normal;">,
</span></strong><code class="western"><span style="font-weight: normal;">unstable</span></code><strong><span style="font-weight: normal;">,
</span></strong><code class="western"><span style="font-weight: normal;">ununstable</span></code><strong><span style="font-weight: normal;">,<br /> </span></strong><code class="western"><span style="font-weight: normal;">unununstable</span></code><strong><span style="font-weight: normal;">
etc.</span></strong></div>
<div style="margin-left: 0.87in;">
<code class="western"><span style="font-weight: normal;">\(un\)\{-,1}stable
</span></code><strong><span style="font-weight: normal;">erkennt
</span></strong><code class="western"><span style="font-weight: normal;">stable</span></code><strong><span style="font-weight: normal;">
und </span></strong><code class="western"><span style="font-weight: normal;">unstable</span></code></div>
<div style="margin-left: 0.87in;">
<strong>int [a-z]\+(.*);</strong> passt
auf alle Prototypen von <code class="western">int</code>-Funktionen,
die nur<br /> Kleinbuchstaben im Namen haben.</div>
<br />
<div id="sdfootnote1">
<h2 class="western">
Tipps</h2>
Wenn man nicht weiß, in welchem Modus sich der <code class="western">vi</code>
bzw. <code class="western">vim</code> gerade befindet, drückt man am
besten die <code class="western">ESC</code>-Taste, dann ist man
sicher im Befehlsmodus.<br />
Generell ist zu empfehlen, <code class="western">:help tutor</code>
zu machen.
<br />
Mit <code class="western">:version</code> erhält man
Informationen zur Variable <code class="western">$VIM</code> .
<br />
Der <code class="western">vi</code> bzw. <code class="western">vim</code>
speichert regelmäßig gemachte Änderungen in eine Datei, die mit <code class="western">.</code>
(Punkt) beginnt und mit <code class="western">.swp</code> (oder <code class="western">.swb</code>,
<code class="western">.swc</code> usw.) endet. Dazwischen befindet
sich der Name der editierten Datei (Aufruf <code class="western">vim
hello.c</code>, Sicherungsdatei <code class="western">.hello.swp</code>).
Beim Speichern und Beenden wird diese Datei gelöscht. Wird der <code class="western">vi</code>
bzw. <code class="western">vim</code> gewaltsam terminiert
(Stromausfall, <code class="western">killall -KILL vim</code>,
schließen des Terminals, in dem der <code class="western">vim</code>
läuft o.ä.), dann wird diese Sicherungsdatei nicht gelöscht. Darin
sind im Allgemeinen fast alle Änderungen gespeichert.<br />
Wird nach dem "Absturz" der <code class="western">vim</code>
wieder mit der vorigen Datei gestartet, so gibt er die Information
aus, dass es eben diese Sicherungsdatei gibt und wie man die letzten
Änderungen wiederherstellt. Das funktioniert normalerweise mit <code class="western">vim
-r datei</code> (<code class="western">-r</code> wie <code class="western">r</code>ecover).
Wenn man dann alles geprüft hat, dann speichert man die Datei.
Danach muss man die Sicherungsdatei löschen, da sonst wieder beim
Starten von <code class="western">vim</code> die Information
angezeigt wird.<br />
<div class="sdfootnote">
</div>
<code class="western">vim</code> ist ein konfigurierbarer Editor,
er hat eine eigene Programmiersprache eingebaut. Es gibt für viele
Aufgaben fertige Scripts im Internet (<code class="western">http://www.vim.org</code>
ist ein guter Einstiegspunkt). Solche Scripts werden automatisch
geladen, wenn sie sich im Verzeichnis <code class="western">~/.vim/plugin</code>
befinden.</div>
Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-68727500660341195272017-09-24T21:39:00.001+02:002017-09-24T21:39:20.262+02:002. Aufgabe 4BHIF<strong>Abgabename: 2017_4bhif_aufgabe2_<i>name_vorname</i>.zip</strong><br />
<strong>Abgabetermin - <span style="background-color: yellow;">10.10.2017 - Abgabe auf edvossh</span></strong><br />
<br />
Schreiben Sie einen Stack-basierten Rechner für einen Ausdruck in <a href="https://de.wikipedia.org/wiki/Umgekehrte_polnische_Notation">umgekehrter polnischer Notation</a> (RPN), der auch die Änderungen im Stack zeigt.
<br /><br />
Nehmen Sie zunächst an, dass nur korrekte, durch Leerzeichen (Tabs oder Zeilenumbrüche, also White Space) getrennte, Strings von Token eines RPN-Ausdrucks übergeben werden.
<br /><br />
Testen Sie mit dem folgenden RPN-Ausdruck:
<pre> 3 4 2 * 1 5 - 2 3 ^ ^ / +</pre>
Obiger Ausdruck in Infix-Notation sieht folgendermaßen aus:
<pre> 3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3</pre>
oder, weil <code>^</code> vor den anderen Operationen ausgewertet werden muss:
<pre> 3 + 4 * 2 / ( ( 1 - 5 ) ^ 2 ^ 3 )</pre>
Die Ausgabe soll so aussehen:
<pre>3 4 2 * 1 5 - 2 3 ^ ^ / +
Input Operation Stack after
3 Push [3.0]
4 Push [4.0, 3.0]
2 Push [2.0, 4.0, 3.0]
* Operate [8.0, 3.0]
1 Push [1.0, 8.0, 3.0]
5 Push [5.0, 1.0, 8.0, 3.0]
- Operate [-4.0, 8.0, 3.0]
2 Push [2.0, -4.0, 8.0, 3.0]
3 Push [3.0, 2.0, -4.0, 8.0, 3.0]
^ Operate [8.0, -4.0, 8.0, 3.0]
^ Operate [65536.0, 8.0, 3.0]
/ Operate [1.220703125E-4, 3.0]
+ Operate [3.0001220703125]
Final answer: 3.0001220703125
</pre>
<strong>Hinweise:</strong>
<dl>
<dt>^</dt> <dd>bedeutet Exponent im obigen Ausdruck.</dd>
<dt>⁄</dt> <dd>bedeutet Division.</dd>
</dl>
<br /><br />
Testen Sie den Rechner auch mit anderen Ausdrücken!
<br /><br />
<strong>Entwurf:</strong>
<br /><br />
Entwerfen Sie das Programm so, dass die Auswertung auch ohne die textuelle Ausgabe des Stacks erfolgt kann.
<br /><br />
Weiters sollen auch <code>double</code>-Zahlen (zB <code>-314.15927E-2</code>) verwendet werden können.
<br /><br />
Was passiert bei ungültigen Ausdrücken?
<br /><br />
<strong>Erweiterung:</strong>
<br /><br />
Wie müssten die Klassen geändert/erweitert werden, sodass man den Rechner mit so einem GUI verwenden kann?
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkRbELkJy23sAwky2g5f6WYqdJ389qEul6qNSljYZ1P0eu1MLE1ABghf7qONKSRa5abpy91Sc00W_0UOyzZHOwVasqryOXmxy0ln-TgXJVoMv892mxG5tpQaT2B4or3KCifrxRTdYkSiJD/s1600/rpn-calc.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkRbELkJy23sAwky2g5f6WYqdJ389qEul6qNSljYZ1P0eu1MLE1ABghf7qONKSRa5abpy91Sc00W_0UOyzZHOwVasqryOXmxy0ln-TgXJVoMv892mxG5tpQaT2B4or3KCifrxRTdYkSiJD/s320/rpn-calc.png" width="220" height="320" data-original-width="503" data-original-height="730" /></a>
<br />
Der Rechner sollte etwa so funktionieren, wie dieser <a href="http://www.alcula.com/calculators/rpn/">Online-Rechner</a>.
<br /><br />
Bei dieser Version brauchen Sie <strong>kein GUI</strong> entwickeln, Sie sollen nur die Klassen so gestalten, dass es dann leicht ist, ein GUI dazu zu programmieren.Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-9509619300641152632017-09-12T16:07:00.001+02:002017-09-12T16:07:05.773+02:00Automatische Header in C# (Visual Studio)Eine Einfache Möglichkeit einen Header in jede Source-Datei eines Projekts einzufügen, ist die Verwendung des Plugins <a href="https://marketplace.visualstudio.com/items?itemName=StefanWenig.LicenseHeaderManager" target="_blank">License Header Manager</a>. Dort findet sich auch ein Hinweis zur Verwendung.Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-65730950058175976982017-09-12T13:47:00.000+02:002017-09-19T05:27:19.763+02:001. Aufgabe 4BHIF<strong>Abgabename: 2017_4bhif_aufgabe1_<i>name_vorname</i>.zip</strong><br />
<strong>Abgabetermin - <span style="background-color: yellow;">26.9.2017 - Abgabe auf edvossh</span></strong><br /><br />
Verwenden Sie eine Projektmappe und teilen Sie die Aufgaben in Projekte oder machen Sie ein einziges Projekt, bei dem man aber irgendwie auswählen kann, welche Teilaufgabe gestartet wird.
<br />
Sie haben nun schon zwei Jahre Java und ein Jahr Python programmiert. Nun geht es darum das bereits erworbene Können möglichst schnell auf die Sprache <strong>C#</strong> zu übertragen. Dazu sind kurze einfache Aufgabenstellungen gut geeignet. Es folgt nun eine Liste von Aufgabenstellungen für Konsolenprogramme. Sie dürfen Ihre Progrämmchen auch mit einer GUI versehen, gefordert ist das jedoch nicht.
<br />
<br />
<ol>
<li><b>Hello World</b><br />
Richten Sie Ihr Visual Studio so ein, dass alle Ihre Dateien automatisch einen Header mit Ihrem Namen, Klasse usw. enthalten.<br />
Erstellen Sie dann ein "Hello World"-Programm. Dieses Programm soll "Hello World!" ausgeben, wenn keine Kommandozeilenparameter angegeben wurden, anderenfalls sollen die Parameter als Namen interpretiert werden, die dann gegrüßt werden. Dabei sollen immer zwei Namen paarweise ausgegeben werden (siehe Beispiel).<br />
Aufruf
<pre>hello.exe Toni Barbara Klaus
</pre>
Ausgabe
<pre>Hello Toni und Barbara!
Hello Klaus!
</pre>
</li>
<li><b>ISBN/EAN</b><br />
Schreiben Sie eine Methode, welche die Prüfziffern von ISBN (Internationale Standardbuchnummer) bzw. EAN (European Article Number) prüfen kann. Dabei wird die Prüfziffer (als String) eingegeben, von welcher die Prüfziffer als Rückgabewert ausgegeben wird.
<pre>int GetCheckDigit(string isbnWithoutCheckDigit);
</pre>
Daraus leitet sich eine zweite Methode ab, welche einen String inklusive Prüfziffer prüft:
<pre>bool CheckISBN(string isbn);
</pre>
Diese Methode entfernt alle Trennzeichen (Leerzeichen, Bindestriche).<br />
Algorithmus:
<ol>
<li><code>s = z<sub>1</sub> + z<sub>2</sub> * 2 + z<sub>3</sub> * 3 + ... + z<sub>9</sub> * 9</code></li>
<li><code>p = s mod 11</code></li>
<li>Falls p gleich 10, dann ist die Prüfziffer "X" sonst die Ziffer selbst.</li>
</ol>
Schreiben Sie analoge Methoden für EAN, ISBN-13 und EAN-13. Informationen zur Berechnung finden Sie im Internet ;-)</li>
<li><b>Römische Zahlen</b><br />
Schreiben Sie Methoden zum Umrechnen von ganzen Zahlen (1 bis 3000) in Römische Zahlen und umgekehrt. Die römischen Ziffern haben folgende Bedeutung:
<pre>I ... 1
V ... 5
X ... 10
L ... 50
C ... 100
D ... 500
M ... 1000
</pre>
Beachten Sie, dass nur jeweils drei gleiche Ziffern hintereinander geschrieben werden. Stattdessen wird die nächst größere Einheit benutzt und eine Einheit abgezogen (XC = 90, XCIX = 99, IX = 9, VIII = 8).<br />
Die Prototypen sollen sein:
<pre>string IntToRoman(int number);
int RomanToInt(string romanNumber);
</pre>
</li>
<li><b>Unit Tests</b><br />
Erstellen Sie für die obigen beiden Aufgaben Unit-Tests. Lesen Sie dazu <a href="http://msdn.microsoft.com/en-us/library/dd264975.aspx">Verifying Code by Using Unit Tests</a>.
</li>
<li><b>Wörter suchen</b><br />
Laden Sie sich die gepackte <a href="https://docs.google.com/file/d/0B9Zs9kdcx6ifZXVmU1hGalpZRDg/edit?usp=sharing">Wortliste</a> herunter. Die Datei enthält nur eine Textdatei <code>deutsch.txt</code>, welche eine sortierte Liste von Wörtern, jeweils ein Wort in einer Zeile enthält (stammt von Firefox). <b>Achtung:</b> der Zeilenumbruch besteht nur aus <code>'\n'</code> (Unix) und die Kodierung ist <b>UTF-8</b>.<br />
Schreiben Sie eine Methode <code>GetWordList(string word)</code>, welche eine Liste von Worten liefert, die mit dem String <code>word</code> beginnen.<br />
Implementieren Sie sowohl lineare als auch binäre Suche und vergleichen Sie diese.<br />
Verwenden Sie unterschiedliche Datenstrukturen (die zwei Typen von C#-Arrays und Collections) und vergleichen Sie die Lösungen punkto Laufzeit und Speicherbedarf.<br />
Schreiben Sie eine weitere Methode <code>GetWordListEnding(string ending)</code>, welche eine Liste von Worten liefert, die mit <code>ending</code> endet. Ist hier binäre Suche möglich?
</li>
<li><b>Unit Tests</b><br />
Erstellen sie für die obige Aufgabe passende Unit Tests.</li>
<li><b>Laufzeitmessungen</b><br />
Schreiben Sie ein Programm <code>runtime</code>, welches die Laufzeiten der unterschiedlichen Implementierungen von <code>GetWordList(string word)</code> und <code>GetWordListEnding(string ending)</code> ermittelt. Verwenden Sie die Wortanfänge <i>"Distanz"</i>, <i>"Erdbi"</i> und <i>"Finanzind"</i> und die Endungen <i>"gulierung"</i>, <i>"dcomputer"</i> und <i>"chsdor"</i>.<br />
Das Programm soll bei jedem Test folgende Informationen ausgeben:<br />
Anzahl der gefundenen Worte und die Laufzeit.<br />
Bilden Sie die Mittelwerte für die einzelnen Methoden (binäre/sequentielle Suche) bzw. die Implementierungen mit Arrays oder Collections.<br />
<b>Wie sind die Ergebnisse zu interpretieren?</b>
</li>
<li><b>25 im Quadrat</b><br />
Auf zwölf quadratischen Kärtchen sind die Zahlen 1 bis 12 gedruckt. Diese Kärtchen sollen so in einem Quadrat angeordnet werden, sodass ein 2x2-Quadrat in der Mitte frei bleibt (die Kantenlänge beträgt insgesamt also 4).<br />
<ol type="a">
<li>Ermitteln Sie eine Anordnung der Karten, sodass die Summe aller Karten einer Kante (4 Karten) jeweils den Wert 25 ergibt.</li>
<li>Ermitteln Sie die Anzahl der Lösungen.</li>
<li>Ermitteln Sie <b>alle</b> Lösungen (es sind sehr viele!).</li>
</ol>
Hinweis: es gibt 12! (~480.000.000) Möglichkeiten, die Kärtchen anzuordnen. Dennoch sollte es in wenigen Minuten möglich sein.
</li>
</ol>
<br />
<br />
Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-89148636263768917362016-03-10T14:15:00.001+01:002016-04-05T15:09:15.843+02:00Aufgabe Regex (POS1: 2CHIF)<style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
<br />
Schreiben Sie eine Klasse <code>AbbreviationMatcher</code>, welche folgendes Interface implementiert:
<br />
<pre class="brush:java">public interface AbbreviationMatcherInterface {
public void setStrings(String[] strings);
public void setSearchString(String searchstring);
public String[] match();
}
</pre>
Zusätzlich muss die Klasse einen Konstruktor mit zwei Parametern besitzen:
<pre class="brush:java"> public AbbreviationMatcher(String searchstring, String[] strings) {
// set the values like setSearchString() and setStrings()
}
</pre>
<br />
Die Methode <code>match()</code> liefert ein Array mit jenen Strings (aus <code>setStrings()</code>), auf die das Muster (ein String), welches mit <code>setSearchString()</code> angegeben wurde, passt.
<br />
Aus dem Suchstring (<code>setSearchString(searchstring)</code>) ist ein passender <b>regulärer Ausdruck</b> zu <b>erzeugen</b>. Ein String passt zum Suchstring, wenn er einfach den String <code>"searchstring"</code> (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.
<br />
Beispiele:
<strong>Beispiele für Muster und das Ergebnis:</strong>
<br />
<dl>
<dt>String <code>"MyList"</code></dt>
<dd>passt auf folgende Beispielstrings:
<br />
<pre><b>MyList</b>
<b>myList</b>
That<b>MyList</b>
<b>Mylist</b>Maker
</pre>
</dd>
<dt>String <code>"CF"</code></dt>
<dd>passt auf folgende Beispielstrings:
<br />
<pre><b>CF</b>
<b>C</b>lass<b>F</b>inder
<b>C</b>haracter<b>F</b>ixer
<b>C</b>har<b>F</b>inderFactory
</pre>
</dd>
</dl>
<br />
<h2>
Testen</h2>
Schreiben Sie eine (JUnit-) Testklasse <code class="brush:java">AbbreviationFinderTest</code>, welche die Methoden ausreichend testet.
<br />
<h2>
Abgabe</h2>
Nennen Sie das Projekt <code><b>name_vorname_regex</b></code> und Checken Sie das Projekt am <code>cvs.htlwrn.ac.at</code> ein.
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-12598882105128682892016-01-19T13:00:00.000+01:002016-02-16T15:06:00.097+01:00Gleitender Mittelwert (POS1: 2CHIF)Erstellen Sie eine Klasse <code>Averager</code>, welche den Durchschnitt beliebig vieler Zahlen berechnen kann:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQRFuqVvdKtMPoKSu1PdEeI9iqn0JK5y_tXx4jNA9uJ8gvSnP_mk3KrxbGaMFkbInvwpLXLvxeZC4CX9iXG0CGCR9GHjTvZqgaG2btf3nDcOmcULFvY62VCPxdxtLT4fIT9oJ9nT3RrvrW/s1600/UML_Averager+(2).png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQRFuqVvdKtMPoKSu1PdEeI9iqn0JK5y_tXx4jNA9uJ8gvSnP_mk3KrxbGaMFkbInvwpLXLvxeZC4CX9iXG0CGCR9GHjTvZqgaG2btf3nDcOmcULFvY62VCPxdxtLT4fIT9oJ9nT3RrvrW/s320/UML_Averager+(2).png" width="246" /></a></div>
<code>add()</code> soll eine Zahl aufnehmen<br />
<code>getAverage()</code> liefert den Mittelwert<br />
<code>getSum()</code> liefert die Summe der Zahlen<br />
<code>getNum()</code> liefert die Anzahl der Zahlen<br />
<code>reset()</code> setzt alles zurück, d.h. ab <code>reset()</code> kann ein neuer Mittelwert einer Folge von Zahlen bestimmt werden.<br />
<br />
Schreiben Sie eine passende Testklasse.<br />
<br />
<b>Hinweis:</b> Dieses Beispiel kann ganz <b>ohne Arrays</b> gelöst werden.
<br />
<br />
<b>Abgabe:</b><br />
Nennen Sie das Projekt <b><code>name_vorname_averager</code></b> und Checken Sie das Projekt am <code>cvs.htlwrn.ac.at</cvs> ein.Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-9011647700895087092015-11-23T11:16:00.000+01:002015-11-23T11:16:17.394+01:00OOP in Java, Beispiel Geld/Währungstabelle (POS1: 2CHIF)<style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
<p>Laut <a href="http://de.wikipedia.org">Wikipedia</a> kann <a href="http://de.wikipedia.org/wiki/Objektorientierte_Programmierung">Objektorientierte Programmierung</a> definiert werden als:</p>
<blockquote>
<p>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.</p>
</blockquote>
<p><a href="http://de.wikipedia.org/wiki/Alan_Kay">Alan Kay</a>, der Erfinder der Programmiersprache Smalltalk und des Begriffs „object oriented“, definierte ihn im Kontext von Smalltalk folgendermaßen:</p>
<blockquote>
<p>
<i>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</i>
</p>
<p>
„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“
<br />
– Alan Kay: The Early History of Smalltalk (1993)
</p>
</blockquote>
<h3>Beispielanwendung</h3>
<p>Anhand des folgenden Beispiels soll ein kurzer Einblick in die Objektorientierte Programmierung gegeben werden.</p>
<p>Es soll <b>Geld</b> 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.
<p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY2dJygEFPL-_fXahsa3Utqse8rwMZKGA6pWFwq022DEaaSG3N1_ii02Ff23gM8dSpem-5OG90EWKW5VnZaxhkgVAY14bT2Mm7ZNUDYwsUZ-P-3xqJv6NZs_LAmlghHFaVyn3WSbQNX6de/s1600/Geld.png"><img style="cursor: pointer; width: 160px; height: 119px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY2dJygEFPL-_fXahsa3Utqse8rwMZKGA6pWFwq022DEaaSG3N1_ii02Ff23gM8dSpem-5OG90EWKW5VnZaxhkgVAY14bT2Mm7ZNUDYwsUZ-P-3xqJv6NZs_LAmlghHFaVyn3WSbQNX6de/s200/Geld.png" alt="" id="BLOGGER_PHOTO_ID_5410284306490642338" border="0" /></a>
<p>
Die Währungstabelle <code>wechselkurs</code> könnte natürlich auch wieder in eigenen Klassen/Objekten realisiert werden (im Java-Code ist das auch tatsächlich der Fall).
<p>
Die Attribute (Eigenschaften) sind alle öffentlich (<code>public</code>), da damit das Beispiel kürzer wird. Tatsächlich werden normalerweise die Attribute nach außen unsichtbar gemacht (<code>private</code>) und nur Methoden (Methoden-Aufrufe entsprechen Alan Kays "Nachrichten") öffentlich gemacht, um den Zugriff auf das Innere der Objekte zu verhinden (<a href="http://de.wikipedia.org/wiki/Datenkapselung_%28Programmierung%29">Information Hiding oder Datenkapselung</a>).
<p>
Die Methode <code>getEuro()</code> liefert den auf Euro umgerechneten Geldbetrag.
<br />
Die Methode <code>add(geld)</code> addiert den Wert des Parameters <code>geld</code> zum Wert des aktuellen Objekts und erzeugt ein neues Objekt mit der Summe und liefert es als Returnwert zurück.
<p>
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.
<p>
Die Umsetzung in <strong>Java</strong>:
<p>
In Java heißt die Referenz auf das aktuelle Objekt <code>this</code>. <code>this</code> wird <strong>nicht</strong> als Parameter deklariert (anders als in Python). Den Methoden fehlt ein <code>this</code>-Parameter (bzw. <code>self</code> in Python). Dieser Parameter existiert nur intern.<br />Dennoch kann man <code>this</code> beim Zugriff auf Attribute (und Methoden) angeben. Im folgenden Beispiel wird das auch gemacht.
<p>
Man <strong>muss</strong> <code>this</code> 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).
<p>
Der Kunstruktor heißt in Java <strong>immer</strong> so wie die Klasse, in unserem Fall <code>Geld()</code>.
<p>
Die Währungstabelle <code>wechselkurs</code> wird als Array einer eigenen Klasse <code>Wechselkurs</code> realisiert. Zusätzlich benötigt man mangels Dictionary eine Methode, die zu einer gegebenen Währung den Kurs liefert: <code>getKurs()</code>
<pre class="brush:java">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());
</pre>
<p>
Testausgabe:<br />
<div class="codesnippet"><div class="codetop"></div>
<pre>Summe: USD1602,80, EUR1064,98
</pre>
<div class="codebottom"></div></div>
<p>
Scrapbook <a href="http://programmieren.googlecode.com/files/oop_1_1.jpage">oop.jpage</a> zum Download.
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-48502262016026792912015-11-23T10:53:00.000+01:002015-11-23T10:58:25.328+01:00Java ArraysFolgendes 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.
<p>
<iframe width="750" height="500" frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=//+Demo+eines+%22schr%C3%A4gen%22+Arrays+(dreieckig%29%0Apublic+class+ArrayDemo+%7B%0A++++public+static+void+main(String%5B%5D+args%29+%7B%0A++++++++int%5B%5D%5B%5D+schraeg+%3D+new+int%5B3%5D%5B%5D%3B+//+3+Zeilen%0A++++++++for+(int+zeile+%3D+0%3B+zeile+%3C+schraeg.length%3B+zeile%2B%2B%29+%7B%0A++++++++++++schraeg%5Bzeile%5D+%3D+new+int%5Bzeile+%2B+1%5D%3B+//+Spalten...%0A++++++++++++for+(int+spalte+%3D+0%3B+spalte+%3C+schraeg%5Bzeile%5D.length%3B+spalte%2B%2B%29+%7B%0A++++++++++++++++schraeg%5Bzeile%5D%5Bspalte%5D+%3D+(zeile%2B1%29+*+(spalte%2B1%29%3B%0A++++++++++++%7D%0A++++++++%7D%0A++++++++for+(int+zeile+%3D+0%3B+zeile+%3C+schraeg.length%3B+zeile%2B%2B%29+%7B%0A++++++++++++for+(int+spalte+%3D+0%3B+spalte+%3C+schraeg%5Bzeile%5D.length%3B+spalte%2B%2B%29+%7B%0A++++++++++++++++System.out.printf(%22%25d+%22,+schraeg%5Bzeile%5D%5Bspalte%5D%29%3B%0A++++++++++++%7D%0A++++++++++++System.out.println(%29%3B%0A++++++++%7D%0A++++%7D%0A%7D&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=java&rawInputLstJSON=%5B%5D&curInstr=64&codeDivWidth=350&codeDivHeight=400"> </iframe>
<p>
<a href="http://www.pythontutor.com/visualize.html#code=//+Demo+eines+%22schr%C3%A4gen%22+Arrays+(dreieckig%29%0Apublic+class+ArrayDemo+%7B%0A++++public+static+void+main(String%5B%5D+args%29+%7B%0A++++++++int%5B%5D%5B%5D+schraeg+%3D+new+int%5B3%5D%5B%5D%3B+//+3+Zeilen%0A++++++++for+(int+zeile+%3D+0%3B+zeile+%3C+schraeg.length%3B+zeile%2B%2B%29+%7B%0A++++++++++++schraeg%5Bzeile%5D+%3D+new+int%5Bzeile+%2B+1%5D%3B+//+Spalten...%0A++++++++++++for+(int+spalte+%3D+0%3B+spalte+%3C+schraeg%5Bzeile%5D.length%3B+spalte%2B%2B%29+%7B%0A++++++++++++++++schraeg%5Bzeile%5D%5Bspalte%5D+%3D+(zeile%2B1%29+*+(spalte%2B1%29%3B%0A++++++++++++%7D%0A++++++++%7D%0A++++++++for+(int+zeile+%3D+0%3B+zeile+%3C+schraeg.length%3B+zeile%2B%2B%29+%7B%0A++++++++++++for+(int+spalte+%3D+0%3B+spalte+%3C+schraeg%5Bzeile%5D.length%3B+spalte%2B%2B%29+%7B%0A++++++++++++++++System.out.printf(%22%25d+%22,+schraeg%5Bzeile%5D%5Bspalte%5D%29%3B%0A++++++++++++%7D%0A++++++++++++System.out.println(%29%3B%0A++++++++%7D%0A++++%7D%0A%7D&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=java&rawInputLstJSON=%5B%5D&curInstr=53">hier</a> finden Sie die Animation direkt am <a href="http://www.pythontutor.com/">Python-Tutor</a>.Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-42406990075469098842015-11-17T15:39:00.001+01:002015-11-17T15:39:47.010+01:00Java-for Schleife wie in Python <style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
Python arbeitet mit Sequenzen. Manchmal ist es praktisch, wenn man eine Sequenz direkt bei der <code>for</code>-Schleife hin schreiben kann. Ein Beispiel:
<pre class="brush:python">
for i in [1, 3, 2, 5, 10, -3]:
print(i, end=" ")
print()
</pre>
In Java ist das ganz ähnlich möglich. Hier ein zwei Varianten:
<pre class="brush:java">
class T {
// helper method
public static int[] list(int... values) {
return values;
}
public static void main(String[] args) {
// use helper to generate array
for (int i : list(1, 3, 2, 5, 10, -3)) {
System.out.printf("%d ", i);
}
System.out.println();
// use locally defined array
for (int i : new int[] { 1, 3, 2, 5, 10, -3 }) {
System.out.printf("%d ", i);
}
System.out.println();
}
}
</pre>
Die Ausgabe sind dann die Zahlen in der Liste:
<div class="codesnippet"><div class="codetop"></div>
<pre>1 3 2 5 10 -3
1 3 2 5 10 -3
</pre>
<div class="codebottom"></div></div>
<p>
Die Hilfsmethode <code>helper()</code> nützt das Java-Feature der variablen Parameterliste, die dann in eine Sequenz (Array) umgewandelt wird.
<p>
Die zweite Variante verwendet die Initialisierung von Arrays.
<p>
Auch mit beliebigen Objekten ist das Prinzip machbar:
<pre class="brush:python">
for o in [1, "a", 23.3, "hallo", 3]:
print(o, end=" ")
print()
</pre>
<pre class="brush:java">
public class ListsInForLoop {
// helper
public static Object[] olist(Object... objects) {
return objects;
}
public static void main(String[] args) {
// different kinds of Objects
for (Object o : olist(1, "a", 23.3, "hallo", 3)) {
System.out.print(o);
System.out.print(" ");
}
System.out.println();
// use locally defined Object array
for (Object o : new Object[] { 1, "a", 23.3, "hallo", 3 }) {
System.out.print(o);
System.out.print(" ");
}
System.out.println();
}
}
</pre>
Die Ausgabe ist dann so:
<div class="codesnippet"><div class="codetop"></div>
<pre>1 a 23.3 hallo 3
1 a 23.3 hallo 3
</pre>
<div class="codebottom"></div></div>
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-35924700935062968612015-11-10T10:03:00.001+01:002015-11-10T10:03:18.849+01:00Aufgabe Java Wurzelberechnung (POS1: 2CHIF)<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">Man kann die Wurzel einer Zahl berechnen mit folgender Formel</span><br />
<br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" />
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">n</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> = (x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">n-1</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> + a / x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">n-1</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">) / 2</span><br />
<br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" />
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">Man beginnt damit, dass a und x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">0</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> gleich der Zahl, aus der man die Wurzel ziehen will, setzt und x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">1</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> berechnet. Dann berechnet man x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">2</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> usw. bis sich die beiden letzten Werte nur mehr gering unterscheiden (z.B. die Differenz kleiner 0,0000001 ist).</span><br />
<br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" />
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">Schreiben Sie eine Methode (Funktion) </span><code class="prettyprint" style="background-color: white; color: #333333; font-size: 14px; line-height: 19px; text-align: justify;">wurzel(zahl, genauigkeit)</code><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">, welche nach obigem Verfahren die Wurzel berechnet.</span><br />
<br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" />
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">Erstellen Sie eine Klasse SquareRoot</span><code style="background-color: white; color: #333333; font-size: 14px; line-height: 19px; text-align: justify;">.java</code><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">, welche eine Tabelle der Wurzeln der Zahlen 1 bis 20 bei den Genauigkeiten 0.01, 0.0001 sowie 0.0000001 ausgibt:</span><br />
<pre style="background-color: white; color: #333333; font-size: 14px; line-height: 19px; text-align: justify;"> 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</pre>
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"><br /></span>
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">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 </span><span style="background-color: white; color: #333333; font-family: monospace; font-size: 14.44444465637207px; line-height: 18.99305534362793px; text-align: justify;">wurzel(zahl, genauigkeit)</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> zu ändern?</span>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-24901401078687573932015-11-10T10:00:00.004+01:002015-11-10T10:00:47.948+01:00Aufgaben zu Java (POS1: 2CHIF) <style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
<br />
<ol>
<li>Schreiben Sie ein einfaches Java Programm, welches <code>"Hello World"</code> ausgibt. Nennen Sie das Programm <code>Hello.java</code>. Verwenden Sie dazu einen <b>Texteditor</b> und übersetzen Sie das Programm auf der <b>Kommandozeile</b>.</li>
<li>Schreiben Sie ein einfaches Java-Programm, welches das kleine Einmaleins ausgibt. Welchen Namen könnte das Programm haben?<br />
<div class="codesnippet">
<div class="codetop">
</div>
<pre> 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
</pre>
<div class="codebottom">
</div>
</div>
<br />Verwenden Sie wieder einen <b>Texteditor</b> und den Java-Compiler auf der <b>Kommandozeile</b>.</li>
<li>Erstellen Sie mit <b>eclipse</b> ein Java-Projekt <code>java-intro</code>. Erzeugen Sie ein package <code>intro1</code> ("intro eins").<br />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 <b>eclipse</b> aus.</li>
<li>Starten Sie die beiden Klassen von der <b>Kommandozeile</b> aus. Wo sind die Class files zu finden, wie sieht der Aufruf aus?</li>
<li>Erstellen Sie im package <code>intro1</code> eine Klasse <code>Schleife</code>, die (im <code>main</code>) eine Zahl einliest und dann alle Zahlen von 1 bis zu der gegebenen Zahl ausgibt. Beispielaufruf:
<div class="codesnippet">
<div class="codetop">
</div>
<pre>Grenze ? 10
1
2
3
4
5
6
7
8
9
10
</pre>
<div class="codebottom">
</div>
</div>
</li>
<li>Erweitern Sie die Klasse <code>Schleife</code> 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:
<div class="codesnippet">
<div class="codetop">
</div>
<pre>von? 15
bis? 10
15
14
13
12
11
10
</pre>
<div class="codebottom">
</div>
</div>
</li>
</ol>
Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-58190582129885674962015-11-10T09:58:00.000+01:002015-11-10T09:58:44.563+01:00eclipse einrichten (POS1: 2CHIF)Machen Sie sich mit der Entwicklungsumgebung <a href="http://www.eclipse.org/">eclipse</a> vertraut!<br />
<ol>
<li>Richten Sie den "Formatter" ein, sodass nur Leerzeichen für die Einrückung verwendet werden:<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTIRoGZMMSEHDnU0a4FCS2zYM7kIOmA6YCDeb_s3k9pTFwm7Pn6pxSQuNjDk5xdwXc-viS1AQjBNZXwfyLFtefTeZ_oA3-7zi0Rh2zHLHpGlG2MU4Y0Rbe9AEL7bxh2n98KBwObmTM6-Ck/s1600/2014-11-10-100709_1024x768_scrot.png" imageanchor="1"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTIRoGZMMSEHDnU0a4FCS2zYM7kIOmA6YCDeb_s3k9pTFwm7Pn6pxSQuNjDk5xdwXc-viS1AQjBNZXwfyLFtefTeZ_oA3-7zi0Rh2zHLHpGlG2MU4Y0Rbe9AEL7bxh2n98KBwObmTM6-Ck/s1600/2014-11-10-100709_1024x768_scrot.png" /></a>
</li>
<li>Richten Sie sich ein File-Template mit einem Header nach unseren Programmierrichtlinien ein:
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTef56bD4HyorDeKo5YBXhS5QVr2Jt8sZq4pZ3fqmYiuyXCUtVUdqbrtXB_zCZ7J-HeELLk6AOmzG2DTnEsVj0MaD9fShVkx-k4IzJMqn0z-mzjZBRb32AmiLYEctHxOCxq-SynbE4xEqz/s1600/2014-11-10-101028_1024x768_scrot.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTef56bD4HyorDeKo5YBXhS5QVr2Jt8sZq4pZ3fqmYiuyXCUtVUdqbrtXB_zCZ7J-HeELLk6AOmzG2DTnEsVj0MaD9fShVkx-k4IzJMqn0z-mzjZBRb32AmiLYEctHxOCxq-SynbE4xEqz/s640/2014-11-10-101028_1024x768_scrot.png" /></a>
</li>
<li>Richten Sie sich ein Code-Template mit einem Header für Klassen nach unseren Programmierrichtlinien ein:
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZbAXQwIWnbOynM6PmEqDm9nXRSUH0t6qP22gUmLDiGta4yPvQedTF273r65noqcT5YO_XC7pI__bP5d0r4LCXzqp4Onw07nQ1w1SBl-i3IA_Lypk3pqFyGtRJ62LsiCfaRUWZ2UMophRu/s1600/2014-11-10-101347_1024x768_scrot.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZbAXQwIWnbOynM6PmEqDm9nXRSUH0t6qP22gUmLDiGta4yPvQedTF273r65noqcT5YO_XC7pI__bP5d0r4LCXzqp4Onw07nQ1w1SBl-i3IA_Lypk3pqFyGtRJ62LsiCfaRUWZ2UMophRu/s640/2014-11-10-101347_1024x768_scrot.png" /></a>
</li>
</ol>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-84545215225683081782015-06-15T09:47:00.000+02:002015-09-13T22:36:25.412+02:00Java Swing Währungsumrechner (POS1: 2BHIF)Erstellen Sie eine Swing-GUI mit Texteingabefeldern und Labels für 5 verschiedene <a class="external text" href="http://www.umrechner-euro.de/waehrungstabelle.htm" rel="nofollow">Währungen</a>. Es soll ein Neu/Löschen und ein Umrechnen-Button vorhanden sein.
<br />
Wenn der Umrechnen-Button gedrückt wird, wird erkannt in welcher
Währung die Eingabe erfolgte und diese Währung in alle anderen
umgerechnet.
<br />
Der Neu/Löschen-Button löscht alle Eingaben.
<br />
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 <a class="external text" href="http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html" rel="nofollow">Fehlerdialog</a> darauf hinweisen.<br />
Das User-Interface könnte etwa so aussehen:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqSpr3MHQQRg2Qsq66YlPHZmUq_jCtLrvyeihcJpOacWYYUwuU3teFT4NGUM6In7wCsrYuw-RPxN8PiFIsuV27qjx1EBgBqPtdwKefOWPIAqFMCxN2gw4MGa-651n1dbN6b7V3TnG8QJFv/s1600/2015-06-15-100011_409x269_scrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqSpr3MHQQRg2Qsq66YlPHZmUq_jCtLrvyeihcJpOacWYYUwuU3teFT4NGUM6In7wCsrYuw-RPxN8PiFIsuV27qjx1EBgBqPtdwKefOWPIAqFMCxN2gw4MGa-651n1dbN6b7V3TnG8QJFv/s320/2015-06-15-100011_409x269_scrot.png" width="320" /></a></div>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-64846463067635345162015-05-28T13:10:00.000+02:002015-05-28T13:10:10.705+02:00Aufgabe JTable (POS1:3BHIF)<p>Erstellen Sie ein Java-Programm, welches einfache CSV-Dateien erzeugen, darstellen und ändern kann. Verwenden Sie zur Darstellung der CSV-Datei eine JTable. Beim Neuanlegen wird die Anzahl der Spalten festgelegt. Beim Laden einer CSV-Datei wird die Anzahl der Zeilen/Spalten durch die Datei gegeben. Das Programm soll es ermöglichen, jede Zelle (definiert durch Zeile und Spalte) zu ändern. Sehen Sie eine Möglichkeit zum Einfügen neuer Zeilen vor. Eine markierte Zeile soll gelöscht werden können.</p>
<p>Die Beschriftung der Spalten soll in der ersten Zeile der Datei gespeichert werden bzw. wird beim Laden aus der ersten Zeile der Datei entnommen.</p>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-47545608315797466252015-05-20T11:54:00.002+02:002015-11-12T13:57:59.772+01:00Berechnungen mit Threads parallelisieren (POS1: 3BHIF)<p><b>π</b> kann mit Hilfe der folgenden Formel von Strömer (1986) berechnet werden:</p>
<p><sup>π</sup> / <sub>4</sub> = 44 · arctan <sup>1</sup>/<sub>57</sub> + 7 · arctan <sup>1</sup>/<sub>239</sub> - 12 · arctan <sup>1</sup>/<sub>682</sub> + 24 · arctan <sup>1</sup>/<sub>12943</sub></p>
<p>Der Arcustangens wird mit der folgenden Reihenentwicklung</p>
<p>arctan(x) = x - <sup>x<sup>3</sup></sup>/<sub>3</sub> + <sup>x<sup>5</sup></sup>/<sub>5</sub> - <sup>x<sup>7</sup></sup>/<sub>7</sub> + ...</p>
<p>berechnet.</p>
<p>Folgendes Java-Programm verwendet die Klasse <code>BigDecimal</code> zur Berechnung von π. Es soll mittels Threads parallelisiert werden.</p>
<pre class="brush:java">
import java.math.*;
/**
* @author Hans Joachim Pflug, RZ, RWTH Aachen
*
* Berechnet PI auf eine beliebige Anzahl von Stellen genau
*/
public class Pi {
private int dec; //Anzahl der Dezimalstellen
private BigDecimal pi = new BigDecimal(0); //Ergebnis
private MathContext m; //Zur Bestimmung der Laenge der Brueche
private static final BigDecimal one = new BigDecimal(1);
private static final BigDecimal four = new BigDecimal(4);
private BigDecimal r57; // 1/57
private BigDecimal r239; // 1/239
private BigDecimal r682; // 1/682
private BigDecimal r12943; // 1/12943
/**
* Erzeugt ein Objekt mit PI auf die angegebene Stellenzahl genau
* @param dec Die Stellenzahl, auf die PI berechnet werden soll.
*/
public Pi(int dec) {
this.dec = dec;
m = new MathContext(dec + 5); //5 als Reserve
r57 = one.divide(new BigDecimal(57), m);
r239 = one.divide(new BigDecimal(239), m);
r682 = one.divide(new BigDecimal(682), m);
r12943 = one.divide(new BigDecimal(12943), m);
calculate();
}
/**
* Berechnet den Wert von PI nach der Formel von Stoermer (1896):
* pi/4 = 44 * arctan(1/57) + 7 * arctan(1/239) - 12 * arctan(1/682)
* + 24 * arctan(1/12943)
*/
private void calculate() {
BigDecimal sum1 = arctan(r57).multiply(new BigDecimal(44), m);
BigDecimal sum2 = arctan(r239).multiply(new BigDecimal(7), m);
sum1 = sum1.add(sum2, m);
sum2 = arctan(r682).multiply(new BigDecimal(12), m);
sum1 = sum1.subtract(sum2, m);
sum2 = arctan(r12943).multiply(new BigDecimal(24), m);
sum1 = sum1.add(sum2, m);
pi = sum1.multiply(four, m);
}
/**
* Berechnet den Arcustangens einer BigDecimal-Zahl.
* Benutzt die Reihe:
* arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...
* @param arg Eingabewert
* @return arctan(arg)
*/
private BigDecimal arctan(BigDecimal arg) {
BigDecimal result = new BigDecimal(0);
BigDecimal z;
//Abschätzung der Anzahl der Iterationen
//Nach der Formel n = - d / log10(x)
// n: Anzahl der Iterationen
// d: Anzahl der Stellen fuer Genauigkeit
// x: Argument des Arcustangens
//Zwei Stellen Genauigkeit zur Sicherheit
int iter = (int) -((dec + 2)/ Math.log10(arg.doubleValue()));
//Reihenentwicklung
for (int i = 0; i < iter; i++) {
int pow = 2 * i + 1;
z = arg.pow(pow, m).divide(new BigDecimal(pow), m);
if (i % 2 == 1) {
z = z.negate();
}
result = result.add(z, m);
}
return result;
}
/**
* Gibt PI formatiert in 100er Bloecken zurueck
*/
public String toString() {
String piS = pi.toString();
StringBuffer b = new StringBuffer();
b.append("3.1");
for (int i = 1; i < dec; i++) {
if (i % 100 == 0) {
b.append("\n ");
} else if (i % 10 == 0) {
b.append(" ");
}
b.append(piS.charAt(i + 2));
}
return b.toString();
}
public static void main(String args[]) {
Pi p = new Pi(1000);
System.out.println(p);
}
}
</pre>
<p>Wieviele Threads sind hier sinnvoll?</p>
<h3>Vergleich zwischen serieller und paralleler Berechnung:</h3>
<p>Zeitmessungen unter Linux auf einem <a href="http://ark.intel.com/products/53422/">Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz (Quadcore)</a> (<a href="http://ark.intel.com/products/50177/Intel-Core-i3-560-Processor-4M-Cache-3_33-GHz"><font color="blue">Intel(R) Core(TM) i3 CPU 560 @ 3.33GHz</font></a>) mit 8GB RAM. Daneben wurden eclipse und chrome verwendet.
<table>
<thead>
<tr><th width="15%" align="right">Stellen</th> <th width="15%" align="right">sequentiell</th>
<th width="15%" align="right">4 Threads</th>
</tr>
</thead>
<tbody>
<tr><td align="right"> 1000</td> <td align="right"> 4,395s</td> <td align="right"> 2,530s</td>
</tr>
<tr><td align="right"> 2000</td> <td align="right"> 35,814s</td> <td align="right"> 19,260s</td>
</tr>
<tr><td align="right"> 3000</td> <td align="right"> 126,145s</td> <td align="right"> 65,693s</td>
</tr>
<tr><td align="right"> 4000</td> <td align="right"> 321,916s</td> <td align="right"> 163,393s</td>
</tr>
<tr><td align="right"> 5000</td> <td align="right"> 626,394s</td> <td align="right"> 323,876s</td>
</tr>
<tr><td align="right"> 6000</td> <td align="right">1132,480s</td> <td align="right"> 568,905s</td>
</tr>
<tr><td align="right"> 7000</td> <td align="right">1800,781s</td> <td align="right"> 912,360s</td>
</tr>
<tr><td align="right"> 8000</td> <td align="right"><font color="blue">2753,654s</font></td> <td align="right">1462,561s</td>
</tr>
<tr><td align="right"> 9000</td> <td align="right"><font color="blue">3941,230s</font></td> <td align="right">2134,741s</td>
</tr>
<tr><td align="right">10000</td> <td align="right"><font color="blue">5527,330s</font></td> <td align="right"><font color="blue">2878,974s</font></td>
</tr>
</tbody>
</table>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd64vXvnYxT9IsXwzYX8wNkxDaq7XmX9LP9Uz4uw92ZtCK1DYASyThcXC5w15jwEuE846sWjUPqpRXIStRG5IYpyOhBsbZik77A70vrDD8yX2IHdPbjXI3CwyKw8F6wMGGGPugViyCz9XF/s1600/pi-berechnung-threads.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd64vXvnYxT9IsXwzYX8wNkxDaq7XmX9LP9Uz4uw92ZtCK1DYASyThcXC5w15jwEuE846sWjUPqpRXIStRG5IYpyOhBsbZik77A70vrDD8yX2IHdPbjXI3CwyKw8F6wMGGGPugViyCz9XF/s1600/pi-berechnung-threads.jpg" /></a>
</p>
<p>Bei der JVM kann man nicht bestimmen, ob und wie die Threads auf die CPUs (Kerne) aufgeteilt werden sollen. Die JVM und das Betriebssystem bestimmen, wie die Threads auf CPU-Kerne abgebildet werden. Das ist natürlich auch von der allgemeinen Systemlast abhängig.</p>
<p>Die Messungen zeigen, dass sich die <b>Rechenzeit bei 4 Threads halbiert</b>. Die CPU trägt zwar im Namen "Quadcore", tatsächlich ist es aber nur ein Dualcore mit vier Threads (siehe Link oben). Das bedeutet bei dieser Anwendung, dass <i>nur zwei Threads echt parallel laufen können</i> (weiter geteilt mit den anderen Prozessen, die auf dem System laufen).</p>
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-54887562234917301872015-05-11T09:56:00.000+02:002015-05-11T09:56:36.176+02:00Worthäufigkeiten mit binärem Baum ermitteln (POS1: 2BHIF)<style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
Erstellen Sie ein Java-Programm welches für jedes gelesene Wort bestimmt, wie oft es vorkommt. Nach dem Ende der Eingabe (<code>EOF</code>) ist eine Liste von Worten und deren Häufigkeiten auszugeben.<br />
Ein Beispiel, gegeben sei folgende Eingabe:<br />
<br />
<div class="codesnippet"><div class="codetop"></div>
<pre>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.
</pre><div class="codebottom"></div></div>
<br />
Das Programm soll dann diese Ausgabe liefern.<br />
<br />
<div class="codesnippet"><div class="codetop"></div>
<pre>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
</pre><div class="codebottom"></div></div>
<br />
Es erzeugt also eine Liste von Worten (in der zuerst vorkommenden Schreibweise), mit der Anzahl der Vorkommnisse.<br />
Das Programm soll von der Standardeingabe oder von beliebig vielen Dateien lesen.<br />
Zur Erkennung von Wörtern lesen Sie hier: <a href="http://programmierblog.blogspot.com/2009/05/worter-in-der-eingabe-erkennen.html" style="text-decoration: none;">Wörter in der Eingabe erkennen</a><br />
<br />
<div>Verwenden Sie dazu einen binären Baum für die Wörter.</div><div>Nennen Sie das Projekt <code>hauf</code>.</div>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-67633345596662314082015-05-11T09:48:00.002+02:002015-05-11T09:48:19.539+02:00Aufgabe: Gruppenwechsel (POS1: 2BHIF)<style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
Schreiben Sie eine Java-Klasse <code>Grw.java</code>, welches aus dem Datenbestand <a href="http://programmieren.googlecode.com/files/ski.csv">ski.csv</a> die beigelegte Statistik erzeugt.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGjMptYlhDpmlk-vZ-arvpJVF4RHE0R8ngkFl50EFlxx-qU95fHazHCG6rZ5Bf7QIZzOwbmzgabWwxK9IH-xqaHzEBRgDx1YCpAhMyBMzlUBuzMv-m36K0nMjKSvOpm2lQh_rH7HNE4s0/s1600/ski-csv.png" imageanchor="1" ><img alt="Ausschnitt csv-Datei ski.csv als Bild" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGjMptYlhDpmlk-vZ-arvpJVF4RHE0R8ngkFl50EFlxx-qU95fHazHCG6rZ5Bf7QIZzOwbmzgabWwxK9IH-xqaHzEBRgDx1YCpAhMyBMzlUBuzMv-m36K0nMjKSvOpm2lQh_rH7HNE4s0/s320/ski-csv.png" /></a><br />
<br />
Lesen Sie die <code>csv</code> -Datei zeilenweise und erstellen Sie aus jeder Zeile ein Objekt einer Klasse <code>SkiDaten</code>, die alle notwendigen Attribute (Klasse, Name, Geb.Datum,....) enthält.<br />
Nennen Sie das Projekt <code>grwski</code>. <br />
Sollte eine neue Sortierung des Sätze notwendig sein, bitte mit OpenOffice Calc oder Excel sortieren. 1-er Kandidaten sortieren bitte mit eigenem Sortprogramm.<br />
INFO: es handelt sich um einen <b>zweistufigen</b> Gruppenwechsel mit den Gruppen<br />
<pre>KLASSE und GESCHL
</pre>und einer Gesamtdarstellung des Durchschnitts!<br />
Eine Einführung in den Gruppenwechsel finden Sie in der Datei <a href="http://programmieren.googlecode.com/files/gruppenwechsel.pdf">gruppenwechsel.pdf</a><br />
Aufruf des Programms:<br />
<div class="codesnippet"><div class="codetop"></div>
<pre>java Grw [-h | -o ausgabedat] [-d] eingabedatei
</pre><div class="codebottom"></div></div><br />
Die Option <code>-d</code> bewirkt die Ausgabe der Detailzeilen, ohne <code>-d</code> nur Summenzeilen ausgeben!<br />
Beispiel Statistik:<br />
<div class="codesnippet"><div class="codetop"></div>
<pre>------------------------------------------------------------------
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
</pre><div class="codebottom"></div></div>
<br />
<b>Achtung:</b> Die obige Ausgabe stellt nur einen Ausschnitt dar (Aufruf mit Option <code>-d</code>) 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 <code>11,37</code> Sekunden betragen.<br />
<br />
<h3>Binäres Dateiformat für Eingabe</h3><br />
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):<br />
<pre class="brush:c">typedef struct umsatz {
char artikel[25];
char verkaeufer[25];
int vkpreis;
int monat;
} umsatz_t;</pre>Dabei ist <code>char artikel[25]</code> ein maximal 24-Zeichen langer String, bei dem jedes Zeichen (ASCII) als ein Byte gespeichert wird. Das Ende des Strings wird durch das Zeichen <code>'\0'</code> abgeschlossen (das hat tatsächlich den Wert <code>0</code>). D.h. es müssen bis zu 25 Bytes gelesen werden, wobei nur die Zeichen bis exklusive <code>'\0'</code> (direkt) in Java-<code>char</code>s umgewandelt werden können (verwenden Sie z.B. <code class="brush:java">RandomAccessFile.read(byte[] buf)</code>).<br />
<code>int</code> entspricht einem 32-Bit-Integer und passt zum Java-Typ <code>int</code>.<br />
Die passende Datei mit Testdaten finden Sie hier: <a href="http://programmieren.googlecode.com/files/daten.dat">daten.dat</a>.<br />
<br />
Den Inhalt dieser Datei kann man <b>nur</b> mit einem Programm öffnen, das die Daten binär lesen kann und sinnvoll, z.B. im Hexadezimalsystem, anzeigen kann. <code>khexedit</code> oder das Konsolenprogramm <code>hexdump</code> eignen sich dafür.<br />
<br />
Die Ausgabe von <code>hexdump</code> könnte so aussehen (gekürzt):<br />
<div class="codesnippet"><div class="codetop"></div><pre class="prettyprint shell">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..........|
</pre><div class="codebottom"></div></div><br />
Es soll wieder ein 2-stufiger Gruppenwechsel programmiert werden (Artikel und Verkäufer).<br />
Zum Vergleich können Sie die Daten auch im CSV-Format verwenden: <a href="http://programmieren.googlecode.com/files/daten.csv">daten.csv</a>.<br />
<br />
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.
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-49766981956184946052015-01-19T09:50:00.001+01:002015-01-19T09:50:31.256+01:00Worthäufigkeiten mit Collections ermitteln (POS1: 2BHIF)<style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
Erstellen Sie ein Java-Programm welches für jedes gelesene Wort bestimmt, wie oft es vorkommt. Nach dem Ende der Eingabe (<code>EOF</code>) ist eine Liste von Worten und deren Häufigkeiten auszugeben.<br />
Ein Beispiel, gegeben sei folgende Eingabe:<br />
<br />
<div class="codesnippet"><div class="codetop"></div>
<pre>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.
</pre><div class="codebottom"></div></div>
<br />
Das Programm soll dann diese Ausgabe liefern.<br />
<br />
<div class="codesnippet"><div class="codetop"></div>
<pre>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
</pre><div class="codebottom"></div></div>
<br />
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 <b>nicht</b> unterschieden werden (zum Beispiel <code>"Und" == "und"</code>).<br />
Das Programm soll von der Standardeingabe oder von beliebig vielen Dateien lesen.<br />
Zur Erkennung von Wörtern lesen Sie hier: <a href="http://programmierblog.blogspot.com/2009/05/worter-in-der-eingabe-erkennen.html" style="text-decoration: none;">Wörter in der Eingabe erkennen</a><br />
<br />
<div>Verwenden Sie dazu eine <code>Map</code> für die Wörter.</div><div>Nennen Sie das Projekt <code>hauf</code>.</div>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-21734023122973388512015-01-11T21:12:00.000+01:002015-01-11T21:13:01.870+01:00Aufgabe einfache Java Klassen (POS1: 2BHIF) <style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
<p>Erstellen Sie ein Projekt <code>java-klassen</code> mit zwei Klassen:
<ol>
<li>Person</li>
<li>PersonManager</p>
</ol>
nach dem folgenden Klassendiagramm:
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGo9eudAfega13ikbd5JIkhj96bz1hHmD69zkEXo999ZjepV0zJBPUCQ__BwbgWWqKmm81Hl3zxq3VQ8lKJkVsYEPoXlxXRhg4ERFAJ6kEVFS3P7ebQB0YvCW0_Ta5dtQrp1Ag-57AS_4g/s1600/Person.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGo9eudAfega13ikbd5JIkhj96bz1hHmD69zkEXo999ZjepV0zJBPUCQ__BwbgWWqKmm81Hl3zxq3VQ8lKJkVsYEPoXlxXRhg4ERFAJ6kEVFS3P7ebQB0YvCW0_Ta5dtQrp1Ag-57AS_4g/s400/Person.png" /></a></div>
</p>
<p>
Die Methoden der Klasse <code>Person</code> sollen folgende Funktionalität bereitstellen:
<ol>
<li>Der Konstruktor <code>Person(String vn, String fn, int gj, char g)</code> soll einfach die passenden Attribute setzen.</li>
<li><code>print()</code> soll Vorname, Nachname, Alter und Geschlecht auf der Konsole ausgeben.</li>
<li><code>getName()</code> liefert den Vornamen und Nachnamen mit einem Leerzeichen getrennt.</li>
<li><code>getAlter(int jahr)</code> soll das Alter in Jahren bezogen auf das im Parameter angegebene Jahr zurückliefern.</li>
<li><code>toString()</code> liefert einen String, der alle Informationen lesbar enthält.</li>
<li><code>main()</code> ist optional und enthält einfach Tests der Klasse.</li>
</ol>
</p>
<p>
Die Methoden der Klasse <code>PersonManager</code> sollen folgende Funktionalität bereitstellen:
<ol>
<li><code>print()</code> soll einfach alle Personen ausgeben (<code>print()</code> von <code>Person</code> verwenden).</li>
<li><code>add(Person person)</code> nimmt eine neue Person in die interne Liste/Array auf.</li>
<li><code>main()</code> soll mindestens zwei verschiedene Personen anlegen, die dann in einen Manager aufgenommen werden. Alle Personen sollen ausgegeben werden.</li>
</ol>
</p>
<p>
Beispielaufruf auf Konsole:
<div class="codesnippet"><div class="codetop"></div>
<pre>hp@if205-2l $ <b>java PersonManager</b>
Max Meier, geboren 1998 (16 Jahre alt), männlich
Katrin Huber, geboren 1996 (18 Jahre alt), weiblich
</pre>
<div class="codebottom"></div></div>
</p>
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-43802851491898844072014-12-03T11:02:00.000+01:002014-12-03T11:02:10.016+01:00Java Swing Währungsumrechner (POS1: 3BHIF)<p>Erstellen Sie eine Swing-GUI mit Texteingabefeldern und Labels für 5 verschiedene <a class="external text" href="http://www.umrechner-euro.de/waehrungstabelle.htm" rel="nofollow">Währungen</a>. Es soll ein Neu/Löschen und ein Umrechen-Button vorhanden sein.
<br />
Wenn der Umrechen-Button gedrückt wird, wird erkannt in welcher
Währung die Eingabe erfolgte und diese Währung in alle anderen
umgerechnet.
<br />
Der Neu/Löschen-Button löscht alle Eingaben.
<br />
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 <a class="external text" href="http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html" rel="nofollow">Fehlerdialog</a> darauf hinweisen.
</p>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-27117732887033689652014-12-03T10:14:00.000+01:002014-12-03T10:18:28.270+01:00OOP in Java, Beispiel Geld/Währungstabelle (POS1: 2BHIF)<style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
<p>Laut <a href="http://de.wikipedia.org">Wikipedia</a> kann <a href="http://de.wikipedia.org/wiki/Objektorientierte_Programmierung">Objektorientierte Programmierung</a> definiert werden als:</p>
<blockquote>
<p>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.</p>
</blockquote>
<p><a href="http://de.wikipedia.org/wiki/Alan_Kay">Alan Kay</a>, der Erfinder der Programmiersprache Smalltalk und des Begriffs „object oriented“, definierte ihn im Kontext von Smalltalk folgendermaßen:</p>
<blockquote>
<p>
<i>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</i>
</p>
<p>
„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“
<br />
– Alan Kay: The Early History of Smalltalk (1993)
</p>
</blockquote>
<h3>Beispielanwendung</h3>
<p>Anhand des folgenden Beispiels soll ein kurzer Einblick in die Objektorientierte Programmierung gegeben werden.</p>
<p>Es soll <b>Geld</b> 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.
<p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY2dJygEFPL-_fXahsa3Utqse8rwMZKGA6pWFwq022DEaaSG3N1_ii02Ff23gM8dSpem-5OG90EWKW5VnZaxhkgVAY14bT2Mm7ZNUDYwsUZ-P-3xqJv6NZs_LAmlghHFaVyn3WSbQNX6de/s1600/Geld.png"><img style="cursor: pointer; width: 160px; height: 119px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY2dJygEFPL-_fXahsa3Utqse8rwMZKGA6pWFwq022DEaaSG3N1_ii02Ff23gM8dSpem-5OG90EWKW5VnZaxhkgVAY14bT2Mm7ZNUDYwsUZ-P-3xqJv6NZs_LAmlghHFaVyn3WSbQNX6de/s200/Geld.png" alt="" id="BLOGGER_PHOTO_ID_5410284306490642338" border="0" /></a>
<p>
Die Währungstabelle <code>wechselkurs</code> könnte natürlich auch wieder in eigenen Klassen/Objekten realisiert werden (im Java-Code ist das auch tatsächlich der Fall).
<p>
Die Attribute (Eigenschaften) sind alle öffentlich (<code>public</code>), da damit das Beispiel kürzer wird. Tatsächlich werden normalerweise die Attribute nach außen unsichtbar gemacht (<code>private</code>) und nur Methoden (Methoden-Aufrufe entsprechen Alan Kays "Nachrichten") öffentlich gemacht, um den Zugriff auf das Innere der Objekte zu verhinden (<a href="http://de.wikipedia.org/wiki/Datenkapselung_%28Programmierung%29">Information Hiding oder Datenkapselung</a>).
<p>
Die Methode <code>getEuro()</code> liefert den auf Euro umgerechneten Geldbetrag.
<br />
Die Methode <code>add(geld)</code> addiert den Wert des Parameters <code>geld</code> zum Wert des aktuellen Objekts und erzeugt ein neues Objekt mit der Summe und liefert es als Returnwert zurück.
<p>
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.
<p>
Die Umsetzung in <strong>Java</strong>:
<p>
In Java heißt die Referenz auf das aktuelle Objekt <code>this</code>. <code>this</code> wird <strong>nicht</strong> als Parameter deklariert (anders als in Python). Den Methoden fehlt ein <code>this</code>-Parameter (bzw. <code>self</code> in Python). Dieser Parameter existiert nur intern.<br />Dennoch kann man <code>this</code> beim Zugriff auf Attribute (und Methoden) angeben. Im folgenden Beispiel wird das auch gemacht.
<p>
Man <strong>muss</strong> <code>this</code> 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).
<p>
Der Kunstruktor heißt in Java <strong>immer</strong> so wie die Klasse, in unserem Fall <code>Geld()</code>.
<p>
Die Währungstabelle <code>wechselkurs</code> wird als Array einer eigenen Klasse <code>Wechselkurs</code> realisiert. Zusätzlich benötigt man mangels Dictionary eine Methode, die zu einer gegebenen Währung den Kurs liefert: <code>getKurs()</code>
<pre class="brush:java">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());
</pre>
<p>
Testausgabe:<br />
<div class="codesnippet"><div class="codetop"></div>
<pre>Summe: USD1602,80, EUR1064,98
</pre>
<div class="codebottom"></div></div>
<p>
Scrapbook <a href="http://programmieren.googlecode.com/files/oop_1_1.jpage">oop.jpage</a> zum Download.
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-15466467286460440672014-12-01T10:08:00.002+01:002014-12-01T10:08:55.048+01:00Aufgabe Java Wurzelberechnung (POS1: 2BHIF)<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">Man kann die Wurzel einer Zahl berechnen mit folgender Formel</span><br />
<br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" />
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">n</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> = (x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">n-1</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> + a / x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">n-1</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">) / 2</span><br />
<br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" />
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">Man beginnt damit, dass a und x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">0</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> gleich der Zahl, aus der man die Wurzel ziehen will, setzt und x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">1</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> berechnet. Dann berechnet man x</span><sub style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: justify;">2</sub><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> usw. bis sich die beiden letzten Werte nur mehr gering unterscheiden (z.B. die Differenz kleiner 0,0000001 ist).</span><br />
<br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" />
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">Schreiben Sie eine Methode (Funktion) </span><code class="prettyprint" style="background-color: white; color: #333333; font-size: 14px; line-height: 19px; text-align: justify;">wurzel(zahl, genauigkeit)</code><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">, welche nach obigem Verfahren die Wurzel berechnet.</span><br />
<br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" />
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">Erstellen Sie eine Klasse SquareRoot</span><code style="background-color: white; color: #333333; font-size: 14px; line-height: 19px; text-align: justify;">.java</code><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">, welche eine Tabelle der Wurzeln der Zahlen 1 bis 20 bei den Genauigkeiten 0.01, 0.0001 sowie 0.0000001 ausgibt:</span><br />
<pre style="background-color: white; color: #333333; font-size: 14px; line-height: 19px; text-align: justify;"> 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</pre>
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"><br /></span>
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;">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 </span><span style="background-color: white; color: #333333; font-family: monospace; font-size: 14.44444465637207px; line-height: 18.99305534362793px; text-align: justify;">wurzel(zahl, genauigkeit)</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"> zu ändern?</span>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0tag:blogger.com,1999:blog-395734929939336689.post-34356915468059047272014-11-19T11:22:00.000+01:002014-11-19T12:22:27.264+01:00Java Grafik/GUI (POS1: 3BHIF)<style type="text/css">
.codesnippet pre
{
margin: 0px;
padding: 0px 9px;
font-family: Consolas,monospace;
font-size: 14px;
}
.codesnippet pre
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYC-kHH_dKOMtysiPJEHrDZ_BNe5LO4GST3npa1pbByFJDHAZRJVBII_hifSFrolh7sjsilGJBv5UrHmbume5uCPpHSbfmkYW_cRYx7nhBRTixAmxZk9kZ8gqT1xqRrabW0TbuSpYLDCC/s800/terminal-middle.png) repeat-y;
}
.codesnippet pre strong
{
font-size: larger;
}
.codesnippet .codetop
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9PVPHMHDz3sZ0LSF8hkU0f2tYP0tUSpAIBiKgrm3HBKMUIfex1beV_3i32IJeGG2KcOhYUP0w7AxNNzUZOJpgaM7NQFVQUzYFebZ6xzt36opXqZSc41QLfPLoQoeKWDSz2_uCOpGswZA/s800/terminal-top.png) no-repeat;
height: 29px;
width: 738px;
}
.codesnippet .codebottom
{
height: 19px;
width: 738px;
}
.codesnippet .codebottom
{
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYf8-p9eQqGkGnAe5hBM1hLEHgjOUIHCDZhVIkZxodV1QlUVsdDT-rXju_vl9DjZLdz46rgULizLTeKJWzk6rkYMw8VeRjzAPMpkh5yOX7_hTA7er9rFZbWmcnpku9bTWTUSqD7Spg4UPw/s800/terminal-bottom.png) no-repeat;
}
</style>
<b>Einfache Grafik</b>
<br />
<br />
Schreiben Sie eine Klasse <code>PaintQuadrats</code>, welche in einem Fenster (JFrame) eine Reihe von Quadraten zeichnet, die fortlaufend nummeriert sind:
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdJaFezbZMb4KDgYYfVdhLwfO3808sw74Mrw8PG1FHuJbzmi9APwFPBM2GyoxWvNIkOyPDeo1u_nKD9f_5CUZteQ7Gr5NKWgrGS_1TX62QmWJWm6jnyuhjEPwGuASv0PIC1nyDEPgsv8Oo/s1600/quadrate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdJaFezbZMb4KDgYYfVdhLwfO3808sw74Mrw8PG1FHuJbzmi9APwFPBM2GyoxWvNIkOyPDeo1u_nKD9f_5CUZteQ7Gr5NKWgrGS_1TX62QmWJWm6jnyuhjEPwGuASv0PIC1nyDEPgsv8Oo/s400/quadrate.png" width="400" /></a></div>
<br />
Verwenden Sie eine Liste (<code>ArrayList</code> oder ein Feld) von Knoten (<code>Node</code>), die "sich zeichnen" (<code>paint(Graphics g)</code>) können. In der Methode <code>paintComponents(Graphics g)</code> des <code>JPanels</code> müssen dann für alle Knoten deren <code>paint()</code>-Methode aufgerufen werden.
<br />
<br />
<b>Experimente mit Swing-Komponenten</b>
<br />
<br />
Alle Steuerelemente von Swing (<code>javax.swing.*</code>) und AWT können auch als sogenannte <a href="http://de.wikipedia.org/wiki/JavaBeans">Java Beans</a> verwendet werden und damit auch dynamisch geladen werden. Eine JavaBean besitzt immer einen Standardkonstruktor. Dies ermöglicht eine standardisierte Instanzierung (vgl. <a href="http://de.wikipedia.org/wiki/JavaBeans">Java Beans</a>).
<br />
<br />
Im <code>public/3bhif/java-gui-experiments/.hg</code> finden Sie ein Mercurial Repository, welches ein Eclipse-Projekt mit den nötigen Klassen für die folgenden Beispiele enthält. Sie können in der Schule das Repository einfach klonen:
<br />
<div class="codesnippet">
<div class="codetop">
</div>
<pre>$ hg clone /home/teachers/hp/public/3bhif/java-gui-experiments
Zielverzeichnis: java-gui-experiments
Aktualisiere auf Zweig default
25 Dateien aktualisiert, 0 Dateien zusammengeführt, 0 Dateien entfernt, 0 Dateien ungelöst
$
</pre>
<div class="codebottom">
</div>
</div>
<br />
Damit wird im aktuellen Verzeichnis ein Projektverzeichnis <code>java-gui-experiments</code> erzeugt.
<br />
Das Projekt wird eventuell um neue Klassen ergänzt. Sie können sich die Änderungen holen:
<br />
<div class="codesnippet">
<div class="codetop">
</div>
<pre>$ cd java-gui-experiments
$ hg pull /home/teachers/hp/public/3bhif/java-gui-experiments
Hole von /home/teachers/hp/public/3bhif/java-gui-experiments
Suche nach Änderungen
Keine Änderungen gefunden
$
</pre>
<div class="codebottom">
</div>
</div>
<br />
Sollten Sie nicht auf einem Schul-PC das Repository klonen wollen, dann müssen Sie das Verzeichnis erst "mounten" und dann klonen:
<br />
<div class="codesnippet">
<div class="codetop">
</div>
<pre>$ mkdir ~/edvossh
$ sshfs <b>user</b>@edvossh.htlwrn.ac.at:/home/teachers/hp/public/3bhif ~/edvossh
$ hg clone ~/edvossh/java-gui-experiments
Zielverzeichnis: java-gui-experiments
Aktualisiere auf Zweig default
25 Dateien aktualisiert, 0 Dateien zusammengeführt, 0 Dateien entfernt, 0 Dateien ungelöst
$
</pre>
<div class="codebottom">
</div>
</div>
<br />
<code><b>user</b></code> ist natürlich mit Ihrem Usernamen in der Schule zu ersetzen. Die Eingabe des Passworts ist in obigen Beispielen nicht angezeigt,
<br />
Neue Versionen bekommen Sie sinngemäß mit <code>hg pull</code> ins lokale Repository.
<br />
<b>Zurück zu den Steuerelementen/JavaBeans.</b>
<br />
Im Projekt <code>java-gui-experiments/bin</code> können Sie Klassen nun aufrufen. Ein Beispiel zum Demonstrieren eines JButtons mit der Beschriftung "Hello World!" in einer 48 Punkt Schriftart:
<br />
<div class="codesnippet">
<div class="codetop">
</div>
<pre>$ cd java-gui-experiments/bin/
$ java je3.gui.ShowBean javax.swing.JButton 'text=Hello World!' font=helvetica-bold-48
</pre>
<div class="codebottom">
</div>
</div>
<br />
Das sieht etwa folgendermaßen aus:
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ39hGIXYgguG84vFMhpWpOp5kXkSsTD46_TxraTkjzyl4RdXZweF2S_A-uKKcyWCQmnwCdETKuvJ6mtZB7HTREz7qytTdmYGBqLrqEqz_FlrgoUDlqvcy2QnIbkjpuW3EEQiPWk62cCkI/s1600/showbean.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ39hGIXYgguG84vFMhpWpOp5kXkSsTD46_TxraTkjzyl4RdXZweF2S_A-uKKcyWCQmnwCdETKuvJ6mtZB7HTREz7qytTdmYGBqLrqEqz_FlrgoUDlqvcy2QnIbkjpuW3EEQiPWk62cCkI/s320/showbean.png" width="320" /></a></div>
<br />
Sie können auch mehrere Steuerelemente auf der Kommandozeile angeben. Z.B.:
<br />
<div class="codesnippet">
<div class="codetop">
</div>
<pre>$ cd java-gui-experiments/bin/
$ java je3.gui.ShowBean javax.swing.JButton 'text=Hello World!' font=helvetica-bold-48\
javax.swing.JRadioButton 'text=pick me'\
java.awt.Button label=Hello javax.swing.JSlider
</pre>
<div class="codebottom">
</div>
</div>
<br />
Experimentieren Sie mit weiteren Steuerelementen (<a href="https://docs.oracle.com/javase/tutorial/uiswing/start/index.html">Lesson: Getting Started with Swing</a>).
<br />
<br />
Experimentieren Sie mit folgender Klasse. Sie zeigt die Verschachtelung verschiedener Container:
<br />
<pre class="brush:java">package je3.gui;
import javax.swing.*;
import java.awt.*;
/**
* A component subclass that demonstrates nested containers and components.
* It creates the hierarchy shown below, and uses different colors to
* distinguish the different nesting levels of the containers
*
* Containers---panel1----button1
* | |---panel2----button2
* | | |----panel3----button3
* | |------panel4----button4
* | |----button5
* |---button6
*/
public class Containers extends JPanel {
public Containers( ) {
this.setBackground(Color.white); // This component is white
this.setFont(new Font("Dialog", Font.BOLD, 24));
JPanel p1 = new JPanel( );
p1.setBackground(new Color(200, 200, 200)); // Panel1 is darker
this.add(p1); // p1 is contained by this component
p1.add(new JButton("#1")); // Button 1 is contained in p1
JPanel p2 = new JPanel( );
p2.setBackground(new Color(150, 150, 150)); // p2 is darker than p2
p1.add(p2); // p2 is contained in p1
p2.add(new JButton("#2")); // Button 2 is contained in p2
JPanel p3 = new JPanel( );
p3.setBackground(new Color(100, 100, 100)); // p3 is darker than p2
p2.add(p3); // p3 is contained in p2
p3.add(new JButton("#3")); // Button 3 is contained in p3
JPanel p4 = new JPanel( );
p4.setBackground(new Color(150, 150, 150)); // p4 is darker than p1
p1.add(p4); // p4 is contained in p1
p4.add(new JButton("#4")); // Button4 is contained in p4
p4.add(new JButton("#5")); // Button5 is also contained in p4
this.add(new JButton("#6")); // Button6 is contained in this component
}
}
</pre>
<br />
Starten/verwenden kann man diese Klasse mit:
<br />
<div class="codesnippet">
<div class="codetop">
</div>
<pre>$ cd java-gui-experiments/bin/
$ java je3.gui.ShowBean je3.gui.Containers
</pre>
<div class="codebottom">
</div>
</div>
<br />
Im package <code>je3.gui</code> finden Sie ein paar Klassen <code>*Layout*</code>, welche die verschiedenen Layoutmanager demonstrieren. Dokumentation finden Sie hier: <a href="http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html">Lesson: Laying Out Components Within a Container</a>
<br />
<br />
Ein Beispiel für das <a href="http://docs.oracle.com/javase/tutorial/uiswing/layout/group.html">GroupLayout</a> finden Sie in <code>layout.Find</code>, welches etwa so aussieht:
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRGTCdplE5UkZVgZb5WbeH5CLozPZ9MOpkVu8Tnjjnm2vD_oIaPX4MRW4iJZeynjYi-yGIPuzMaSsbyZpsq53Z_TImaJJbAii2Jp30LJGvXoLA7vVjndlwWDq2khDmtRpG96jD4v_L2WS2/s1600/find.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="84" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRGTCdplE5UkZVgZb5WbeH5CLozPZ9MOpkVu8Tnjjnm2vD_oIaPX4MRW4iJZeynjYi-yGIPuzMaSsbyZpsq53Z_TImaJJbAii2Jp30LJGvXoLA7vVjndlwWDq2khDmtRpG96jD4v_L2WS2/s320/find.png" width="320" /></a></div>
<br />
<br />
<br />
Verwenden Sie diese Beispiele als Basis für eigene Projekte!
<script src="http://www.haberstroh.at/lib/syntax.js"></script>Harald R. Haberstrohhttp://www.blogger.com/profile/18419691497498350689noreply@blogger.com0