You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

575 lines
24 KiB
Plaintext

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Java-Programmieraufgaben - Kontrollanweisungen</title>
<link rel="stylesheet" type="text/css" href="OOP-B-Pr%C3%BCfung_files/aufgaben.css">
<link rel="shortcut icon" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/java.png.ico" type="image/ico">
</head>
<body>
<div id="header">
<h1><img src="OOP-B-Pr%C3%BCfung_files/java_logo.png" alt="Java Logo" title="" height="43" width="25">&nbsp;
Java-Programmieraufgaben - Kontrollanweisungen</h1>
</div>
<div id="navigation">
<ul>
<li><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/christian_pape.html">Prof.
Dr. Christian Pape</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/java.html">Übersicht</a>
<ul>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/datentypen.html">Datentypen und
Ausdrücke</a></li>
<li>Kontrollanweisungen</li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/objekt_orientierung.html">Objekt-Orientierung</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/felder.html">Felder</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/rekursion.html">Rekursion</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/backtracking.html">Backtracking</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/suchen.html">Suchen</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/sortieren.html">Sortieren</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/interfaces.html">Java Interfaces</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/sonstige.html">Sonstiges</a></li>
<li><a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/turtle.html">Schildkrötengrafik</a></li>
</ul>
</li>
</ul>
</div>
<div id="inhalt">
<a name="dreizahlensortieren"></a>
<h2>Drei Zahlen sortieren</h2>
<p>Schwierigkeit 3</p>
<p>Schreiben Sie eine
Java-main-Methode, in der die Werte von drei lokalen int-Variablen a, b und c
aufsteigend sortiert werden. Verwenden Sie als Kontrollstruktur nur die
if-Anweisung. Vertauschen Sie die Werte dieser
Variablen so, dass zum Schluss a &lt; b &lt; c gilt.
Prüfen Sie Ihre Methode mit allen Permutationen der Zahlen 1,
2 und 3 (es gibt insgesamt 6
Kombinationen). Nach der Ausführung Ihrer Anweisungen muss in
all diesen Fällen also immer
a=1, b=2 und b=3 gelten. Man kann die Aufgabe mit drei if-Anweisungen
(ohne else) lösen,
da im schlimmsten Fall drei Vertauschungen nötig sind.
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/DreiZahlenSortieren.html">Lösung</a></p>
<a name="einmaleins"></a>
<h2>Ein-mal-Eins auf dem Bildschirm ausgeben</h2>
<p>Schwierigkeit 3</p>
<p>Schreiben Sie eine Java-main-Methode, in der das grosse Ein-Mal-Eins
berechnet und tabellarisch
auf dem Bildschirm ausgegeben wird. Um die auszugebenen Zahlwerte
geeignet einzurücken, sollten Sie bei der Ausgabe den
Tabulator "\n" verwenden. Verwenden Sie die for-Schleife.
</p>
<p>Beim grossem Ein-Mal-Eins werden alle Produkte i * j mit 0
&lt; i &lt;= 10 und 0 &lt; j &lt;= 10 gebildet. Die
Ausgabe sollte also etwa wie folgt aussehen:
</p>
<pre>1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
</pre>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/EinMalEins.html">Lösung</a></p>
<a name="notenberechnung"></a>
<h2>Berechnen von Noten aus Punktzahlen</h2>
<p>Schwierigkeit 3</p>
<p>In der Klausur Informatik 1 können Sie maximal 120 Punkte erreichen.
Bei 60 Punkte gilt die Klausur als bestanden (4,0). Für jede weiteren 5 Punkte verbessert
sich die Note um eine Notenstufe. Für jeweils 5 Punkte weniger verschlechtert sich die Note
um eine Notenstufe (bis 5,0). Aus rechtlichen Gründen gibt es keine 4,3 - sondern in diesem
Fall auch eine 4,7. Es können auch halbe Punkte vergeben werden.</p>
<table>
<tbody><tr><td>Note</td><td>Punkte</td></tr>
<tr><td>5,0</td><td>0 - 49,5</td></tr>
<tr><td>4,7</td><td>50 - 59,5</td></tr>
<tr><td>4,0</td><td>60 - 64,5</td></tr>
<tr><td>3,7</td><td>65 - 69,5</td></tr>
<tr><td>3,3</td><td>70 - 74,5</td></tr>
<tr><td>3,0</td><td>75 - 79,5</td></tr>
<tr><td>2,7</td><td>80 - 84,5</td></tr>
<tr><td>2,3</td><td>85 - 89,5</td></tr>
<tr><td>2,0</td><td>90 - 94,5</td></tr>
<tr><td>1,7</td><td>95 - 99,5</td></tr>
<tr><td>1,3</td><td>100 - 104,5</td></tr>
<tr><td>1,0</td><td>105 - 120</td></tr>
</tbody></table>
<p>Implementieren Sie eine Java-Funktion, die für eine Punktzahl von 0 bis 120 die entsprechende
Note berechnet und zurückgibt. Schreiben Sie eine Java-main-Methode, die für alle Punkte von 0 bis 120
in Schritten von 0,5 die zugehörige Note auf dem Bildschirm ausgibt.</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/Notenvergabe.html">Lösung</a></p>
<a name="wochentage"></a>
<h2>Berechnen des Wochentags eines Datums</h2>
<p>Schwierigkeit 2</p>
<p>Implementieren Sie ein Java-Programm, das für einen Tag (1..31), den Monat (1..12) und das Jahr
den zugehörigen Wochentag bestimmt und auf dem Bildschirm ausgibt.</p>
<p>Folgendes Verfahren berechnet diesen Wochentag für ein Datum, dass zwischen März 1900
und Februar 2100 liegt.</p>
<p>Zuerst muss die Gesamtanzahl der Wochentage von 1900 bis zum gegeben
Datum errechnet werden (s.u.). Dies ist letztlich die Hauptschwierigkeit.
Wenn diese Zahl berechnet ist, muss sie nur noch mit Rest durch 7 geteilt werden.
Das ergibt den Wochentag, wobei 0 der Sonntag ist</p>
<p>Die Gesamtanzahl Wochentage berechnet sich schrittweise wie folgt:
</p><ul>
<li>Vom gegebenen Jahr 1900 abziehen und dies mit 365 multiplizieren.</li>
<li>Die fehlenden Schalttage hinzuaddieren (jahr - 1900) / 4.
Wenn das jahr selbst ein Schaltjahr ist, dann ist für Januar und Februar ein Tag zuviel
berechnet. In diesem Fall Eins abziehen. </li>
<li>Pro Monat die entsprechende Anzahl Tage pro Monat hinzuaddieren (beim Februar immer 28 Tage,
da das Schaltjahr schon berücksichtigt ist).</li>
<li>Noch den Tag dazu.</li>
</ul>
<p></p>
<p>Hier einige Daten mit Wochentagen zum Testen des Java-Programms:
</p><ul>
<li>Ostersonntage: 23. April 1916, 8. April 2007, 4. April 2010</li>
<li>Aschermittwoch: 1. März 2006, 21. Februar 2007, 17. Februar 2010</li>
<li>Gründungstag der BRD (Montag): 23. Mai 1949</li>
</ul>
<p></p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/Wochentag.html">Lösung</a></p>
<a name="roulette"></a>
<h2>Gewinnstrategie beim Roulette</h2>
<p>(für Glückspilze)</p>
<p>Schwierigkeit 2</p>
<p>Eine "todsichere" Gewinnstrategie beim Roulettespiel ist es, immer
auf die selbe Farbe zu setzen. Wenn man verloren hat, dann
verdoppelt man einfach den Einsatz, um den vorherigen Verlust
wieder wett zu machen.
Die Wahrscheinlichkeit das immer rot (oder schwarz) kommt ist
50% (wir ignorieren das Auftreten der 0).
</p>
<p>Implementieren sie eine Java-main-Methode, die berechnet, wieviel Geld
man ungefähr als Kapital benötigt, wenn man 1 000 000 mal spielt
und der Anfangseinsatz ein Euro ist.</p>
<p>
Die Eintreffenswahrscheinlichkeit 50% kann man mit Math.random() &lt; 0.5
überprüfen.</p>
<p>
Wie viel Geld werden Sie mitbringen, damit Sie ihren Einsatz nicht
verlieren?
</p>
<p>
Erweitern Sie ihr Java-Programm, so dass ausgehend von einem Startkapital berechnet wird, nach wie
vielen Spielen sie mit dieser Strategie ihr Geld verloren haben.
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/Roulette.html">Lösung</a></p>
<a name="metrikbytes"></a>
<h2>Anzahl Bytes in passende metrische Einheit umwandeln</h2>
<p>Schwierigkeit 3</p>
<p>Eine Anzahl Bytes gegeben als int-Wert soll so mit Hilfe der
metrischen Einheiten (K, M, G) auf dem Bildschirm ausgegeben werden,
dass höchstens 3 Vorkommastellen angezeigt werden. Die Ausgabe soll in
etwa wie folgt aussehen:
</p>
<pre>123 Byte sind 123.0 Byte
15323 Byte sind 15.323 KByte
15323000 Byte sind 15.323 MByte
1532300001 Byte sind 1.532300001 GByte
</pre>
<p>
Verwenden Sie keine Schleifen (nur if-else). Die Ausgabeanweisungen dürfen ausschliesslich am Ende der main-Methode sein.
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/EinheitBytesUmwandeln.html">Lösung</a></p>
<a name="wallissche_produkt"></a>
<h2>Berechnen Sie die Kreiszahl Pi mit dem Wallisschen Produkt</h2>
<p>Schwierigkeit 2</p>
<p>
Der englische Mathematiker John Wallis nutzte folgende Methode zur Berechnung der Zahl Pi:
</p>
<center>
Pi / 2 = (2/1) * (2/3) * (4/3) * (4/5) * (6/5) * (6/7) * ..
</center>
<p>Es heißt nach ihm benannt <em>Wallissches Produkt</em>.
Programmieren Sie eine Java-Klasse WallisschesProdukt, welche eine
Methode enthält, die das Wallissche Produkt bis zum n-ten Faktor
berechnet und zurückgibt. Diese Klasse darf keine Ein-/Ausgabefunktionen
wie System.out.println() enthalten. Schreiben Sie eine Testklasse
WallisschesProduktTest, in der Sie in einer for-Schleife für alle n von 1
bis 1000 das Produkt ausgeben. Vergleichen Sie die berechneten
Ergebnisse mit dem konstanten Wert Math.PI (etwa in dem Sie zusätzlich
die Differenz ihres berechneten Wertes zu Math.PI ausgeben).
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/WallisscheProdukt.html">Lösung</a></p>
<a name="abundante_zahl"></a>
<h2>Berechnen Sie abundante und vollkommene Zahlen</h2>
<p>Schwierigkeit 2</p>
<p><em>Abundante Zahlen</em> sind Zahlen deren Summe aller Teiler dieser Zahl außer der Zahl selbst
<em>größer</em> ist als die Zahl. Ist die Summe <em>gleich</em> der Zahl, dann handelt es sich um eine <em>vollkommene Zahl</em>
(auch perfekte oder ideale Zahlen genannt).
</p>
<p> 12 hat zum Beispiel die Teiler 1, 2, 3, 4 und 6. Deren Summe ist 16 &gt; 12. Deswegen ist 12 eine abundante Zahl.
6 ist eine vollkommene Zahl, da 1 + 2 + 3 = 6 gilt.
</p>
<p> Schreiben Sie ein Java-Programm, das für eine Zahl überprüft, ob Sie abundant bzw. vollkommen ist oder nicht.
Finden Sie alle vollkommenen und <em>ungeraden</em> abundanten Zahlen von 1 bis 1000.
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/AbundanteZahl.html">Lösung</a></p>
<a name="harshad_zahl"></a>
<h2>Berechnen Sie Harshad-Zahlen</h2>
<p>Schwierigkeit 3</p>
<p>Eine natürliche Zahl heißt <em>Harshad-Zahl</em>, wenn Sie durch ihre Quersumme teilbar ist.
</p>
<p> 777 ist durch 7 + 7 + 7 = 21 teilbar und damit eine Harshad-Zahl.
</p>
<p> Schreiben Sie ein Java-Programm, das alle Harshad-Zahlen von 1 bis 100 berechnet und am Bildschirm ausgibt.
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/HarshadZahl.html">Lösung</a></p>
<a name="lychrel_zahl"></a>
<h2>Berechnen Sie Lychrel-Zahlen</h2>
<p>Schwierigkeit 1</p>
<p>Eine natürliche Zahl ist ein <em>Palindrom</em>, wenn die umgekehrte Reihenfolge ihrer Dezimalziffern identisch zur Zahl ist:
121 und 8813200023188 sind zum Beispiel Palindrome.
Die Zahl, die sich durch Umkehrung der Dezimalziffern eine Zahl <code>n</code> entsteht, kürzen wir ab als <code>u(n)</code>.
Also gilt u(1236) = 6321.
</p>
<p>Ausgehend von einer Zahl <code>z</code> kann man wie folgt versuchen, schrittweise ein Palindrom zu erzeugen:
</p><pre> p := z;
do {
p := p + u(z);
while ( p != u(p) );
</pre>
Beispiel: Wenn wir mit z = 57 anfangen. Dann ist p = 57 + 75 = 132 nach dem ersten Durchlauf.
Nach dem zweiten Durchlauf gilt p = 132 + 231 = 353. Die Schleife bricht dann ab.
<p></p>
<p>
Wenn für eine Zahl <code>z</code> dieser Algorithmus <em>nie</em> terminiert, also endlos weiterläuft, dann
heißt <code>z</code> <em>Lychrel-Zahl</em>. Es ist derzeit nicht bekannt, ob es solche Zahlen überhaupt gibt!
Als kleinster Kandidat gilt 196.
</p>
<p> Schreiben Sie ein Java-Programm, das derartige Palindrome im
Intervall von 1 bis 1000 findet. Beachten Sie, dass Sie die
Iteration nach eine vorgegebenen Obergrenze (&lt; 2 000 000 000)
abbrechen müssen, da sie sonst bei Lychrel-Zahlen nicht terminiert.
Beachten Sie auch den
gültigen Wertebereich von int bzw. long: die Zahlen werden immer grösser
und es kann ein Überlauf auftreten.
</p>
<p>Bei maximal 1 000 000 000 Iterationen habe ich folgende (bereits bekannte) Kandidaten für Lychrel-Zahlen gefunden:
196, 295, 394, 493, 592, 689, 691, 788, 790, 879, 887, 978, 986.</p><p>
</p><p>Alternativ gibt es zu diesem Algorithmus auch einen <a target="_blank" href="http://www.jasondoucette.com/worldrecords.html#Most">Wettbewerb</a>,
bei dem für alle n-stelligen Dezimalzahlen, die Zahl
gefunden werden soll, bei dem am wenigsten Iterationen benötigt werden,
um mit obigen Algorithmus ein Palindrom zu erzeugen. Diese Zahlen heißen
verzögerte Palindromzahlen (delayed palindromic numbers).
Rekordhalter für 19-stellige Dezimalzahlen ist derzeit 1 186 060 307 891
929 990.</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/LychrelZahl.html">Lösung</a></p>
<a name="primzahl_zwillinge"></a>
<h2>Berechnen Sie Primzahlzwillinge</h2>
<p>Schwierigkeit 2</p>
<p>Zwei Primzahlen p und q heissen <em>Primzahlzwilling</em> (oder Primzahlpaar), wenn ihre Differenz 2 ist.
3 / 5,
5 / 7,
11 / 13 sind zum Beispiel die ersten drei Primzahlzwillinge.</p>
<p>Implementieren Sie ein Java-Programm, welches alle Primzahlzwillinge bis zu einer vorgegebenen Obergrenze berechnet
und auf dem Bildschirm ausgibt. Verwenden Sie zur Berechnung aller Primzahlen von 2 bis zur Obergrenze
dieses <a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/doc/de/hska/info1/felder/Primzahlsieb.html">Primzahlsieb</a>
</p><p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/PrimzahlZwillinge.html">Lösung</a></p>
<a name="raetselloeser"></a>
<h2>Lösen logischer Rätsel</h2>
<p>Schwierigkeit 2</p>
<p>Logische Rätsel lassen sich formal oft auflösen, indem man Sie aussagenlogisch formuliert.</p>
<p>Im folgenden Rätsel von Raymond Smullyan geht es um einen Hutmacher, einen Schnapphase und eine (Hasel-)Maus.
Unter diesen drei Verdächtigen gibt es einen Dieb.
Die Ermittlungen haben folgendes ergeben:
</p><ul>
<li>Genau einer von den drei ist der Dieb</li>
<li>Unschuldige sagen immer die Wahrheit</li>
<li>Der Schnapphase sagt, dass der Hutmacher unschuldig ist</li>
<li>Der Hutmacher sagt, dass die Haselmaus unschuldig ist</li>
</ul>
Dieser Sachverhalt kann mit drei booleschen Variablen <code>hutmacher</code>,
<code>schnapphase</code> und <code>maus</code> codiert werden. Diese sollen genau dann
<code>true</code> sein , wenn die entsprechende Person der Dieb ist.<p></p>
<p>
Wir verwenden die Java-Operatoren !, &amp;, ^, | (und =&gt; als Implikation).
Die aus den Ermittlungen formalisierten Erkenntnisse sind:
</p><ul>
<li>hutmacher ^ schnapphase ^ maus</li>
<li>(hutmacher =&gt; ! (schnapphase | maus))
&amp; (schnapphase =&gt; ! (hutmacher | maus))
&amp; (maus =&gt; ! (hutmacher | schnapphase))</li>
<li>schnapphase =&gt; ! hutmacher</li>
<li>hutmacher =&gt; ! maus</li>
</ul>
Die Implikation <code>A =&gt; B</code> kann durch <code>! A | B</code> ersetzt werden.<p></p>
<p>Implementieren Sie ein Java-Programm, mit dem derartig formalisierte Rätsel gelöst werden können.
Das Rätsel ist gelöst, wenn man eine Belegung der booleschen Variablen gefunden hat, so dass
jede der Formeln war ist. Dazu kann man einfach alle Kombinationen der Belegungen aufzählen und
ausprobieren. Für die drei booleschen Variablen gibt es 2<sup>3</sup> mögliche Kombinationen.
Das Programm berechnet also die Wahrheitstafel für die Formel.</p>
<p>Alle Kombinationen für n boolesche Variablen können Sie über fortgesetztes Inkrementieren einer
int-Zahl z bekommen: die Folge der 0en und 1en in der Binärcodierung der Zahl gibt ihnen
die booleschen Wahrheitswerte für die zugehörige boolesche Variable an.
</p>
<p>Wenn das dritte Bit von z den Wahrheitswert für die boolesche Variable <code>schnapphase</code>
angeben soll, dann bekommen Sie zum Beispiel den booleschen Wert mit
<code>schnapphase = (z / 4 % 2) == 1</code></p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/Raetselloeser.html">Lösung</a></p>
<a name="pi_kreisgleichung"></a>
<h2>Berechnen Sie die Zahl Pi näherungsweise über die Kreisgleichung</h2>
<p>Schwierigkeit 3</p>
<p>Die Zahl Pi kann wie folgt näherungsweise im kartesischen Koordiantensystem über die Kreisgleichung
x<sup>2</sup> + y<sup>2</sup> &lt;= r bestimmt werden.
</p><p>
Wir nehmen r = 1. Es werden n zufällige Koordinate (x,y) im Bereich (0,0) und (1,1) erzeugt.
Über die Kreisgleichung kann bestimmt werden, wie viele davon sich im Einheitskreis befinden.
Die Anzahl Punkte im Einheitskreis oder im Quadrat ist proportional zur Fläche.
Das Vierfache des Verhältnis Flache Quadrat zu Fläche Einheitskreis nähert sich deswegen Pi an.
Siehe dazu folgende Abbildung:
</p>
<p>
<img src="OOP-B-Pr%C3%BCfung_files/pi.png" alt="Viertel des Einheitskreises im ersten Quadrant innerhalb des Einheitsquadrats. Die Zahl Pi ist gleich
dem Vierfachen der Fläche des Viertelkreises.">
</p>
<p>Programmieren Sie ein Java-Programm, das für ein n die Zahl Pi mit dieser Methode näherungsweise berechnet und
auf dem Bildschirm ausgibt. Sie können Zufallszahlen zwischen 0 und 1 mit Math.random() erzeugen.
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/PiBerechnen.html">Lösung</a></p>
<a name="teiler"></a>
<h2>Geben Sie für eine ganze Zahl alle Teiler aus</h2>
<p>Schwierigkeit 3</p>
<p>Schreiben Sie ein Java-Programm, das zu einer ganzen Zahl alle Teiler auf dem Bildschirm ausgibt.</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/Teiler.html">Lösung</a></p>
<a name="versicherung"></a>
<h2>Prämienberechnung einer Hausratversicherung</h2>
<p>Schwierigkeit 3</p>
<p>Wir betrachten eine fiktive Hausratversicherung, bei der die Prämie wie folgt von der Anzahl Personen <code>personen</code> und
Quadratmeteranzahl <code>flaeche</code> der Wohnung abhängt:</p>
<table border="solid">
<tbody><tr><td>personen</td><td>Prämie</td></tr>
<tr><td>1-2</td><td>10 + flaeche / 2</td></tr>
<tr><td>3</td><td>15 + flaeche</td></tr>
<tr><td>4</td><td>15 + 1,5 * flaeche</td></tr>
<tr><td>&gt;4</td><td>25 + 2 * flaeche</td></tr>
</tbody></table>
<p>Welche Kontrollanweisung eignet sich für die Implementierung am besten?</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/Hausratversicherung.html">Lösung</a></p>
<a name="minimum"></a>
<h2>Minimum in einer Folge von Eingaben finden</h2>
<p>Schwierigkeit 2</p>
<p><i>Gegeben</i> sei eine Folge von ganzen positiver Zahlen. Die Anzahl
der Zahlen ist im Voraus nicht bekannt. Diese Zahlen werden vom
Benutzer online über die
Konsole eingegeben.
</p>
<p><i>Gesucht</i> ist das Minimum der Zahlen. Das Programm wird durch Eingabe einer negativen Zahl beendet. Es soll dann das gefundene Minimum
auf dem Bildschirm ausgeben.</p>
<p>Algorithmen zu Problemen, bei denen die Eingabemenge vorab nicht bekannt ist, werden
<em>online-Algorithmen</em> genannt.</p>
<p>Implementieren Sie eine main-Methode, die dieses Problem löst.
Zur Eingabe von Zahlen können Sie die Klasse <a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/Eingabe.java">Eingabe.java</a> verwenden. Sie enthält eine
statische Methode readInt(), die eine neue Zahl von der Tastatur einließt und als int-Wert zurückgibt.</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/MinimumSuchen.html">Lösung</a></p>
<a name="geometrische-reihe"></a>
<h2>Grenzwert einer geometrischen Reihe bestimmen</h2>
<p>Schwierigkeit 3</p>
<p>
Wir betrachten folgende unendliche Reihe, welche die Summe der Kehrwerte aller 2er-Potenzen berechnet.
</p>
<img src="OOP-B-Pr%C3%BCfung_files/geometrische-reihe.png" alt="Summe der Kehrwerte aller 2er-Potenzen">
<p>Diese Reihe konvergiert gegen einen konstanten Wert.</p>
<p>Implementieren Sie ein Java-Programm, welche diesen Grenzwert bestimmt. Implementieren Sie dazu eine
Schleife, die solange die nächste 2er-Potenz zum bisherigen Teilergebnis hinzuaddiert, bis sich
das Resultat nicht mehr ändert. Dies stell den - vermutlichen - Grenzwert der Reihe dar.</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/GeometrischeReihe.html">Lösung</a></p>
<a name="goldbach"></a>
<h2>Goldbachsche Vermutung überprüfen</h2>
<p>Schwierigkeit 2</p>
<p>
Im Jahr 1742 hat Christian Goldbach eine Vermutung aufgestellt, nach
der jede ungerade Zahl größer als fünf als Summe dreier Primzahlen
dargestellt werden kann.</p>
<p></p>
<p>Die nach ihm benannte Goldbachsche Vermutung lautet in einer stärkeren, heute gebräuchlichen Version:</p>
<p><em>Jede gerade natürliche Zahl (größer als zwei) kann als Summe zweier Primzahlen repräsentiert werden.</em></p>
<p>Beispiele sind: 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, …</p>
<p>Die Summe muß nicht eindeutig sein: 5 + 5 = 3 + 7 = 10 .</p>
<p>Die Vermutung wurde bisher nicht bewiesen. Sie wurde für alle Zahlen bis 10<sup>18</sup> (Stand 2007) bestätigt.</p>
<p>Implementieren Sie ein Programm, daß für alle geraden Zahlen bis zu
einer Obergrenze, zwei Primzahlen findet, deren Summe gleich der Zahl
ist. Verwenden Sie das Primzahlsieb zur Berechnung aller Primzahlen bis
zu dieser Obergrenze (die Klasse Primzahlsieb.java ist in den <a href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/aufgaben.zip">Lösungen zu den Aufgaben</a> enthalten).
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/GoldbachscheVermutung.html">Lösung</a></p>
<a name="giuga"></a>
<h2>Giuga-Zahlen berechnen</h2>
<p>Schwierigkeit 2</p>
<p>Eine natürliche Zahl n ist eine <em>Giuga-Zahl</em>, wenn alle ihre Primteiler p den Wert
n/p - 1 teilen.</p>
<p>Implementieren Sie Java-Programm, die alle Giuga-Zahlen bis zu einer festen Obergrenze ausgibt.</p>
<p></p>
<p>Hinweis: Jede Primzahl ist eine Giuga-Zahl. Es ist derzeit (2008)
nicht bekannt, ob die Umkehrung dieser Aussage gilt. Ihr Programm müsste
also alle Primzahlen als Giuga-Zahlen identifizieren (und sonst keine).
</p>
<p><a target="_blank" href="http://www.home.hs-karlsruhe.de/%7Epach0003/informatik_1/aufgaben/doc/de/hska/java/aufgaben/kontrollstrukturen/GiugaZahl.html">Lösung</a></p>
</div>
</body></html>