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
575 lines
24 KiB
Plaintext
8 years ago
|
<!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">
|
||
|
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 < b < 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
|
||
|
< i <= 10 und 0 < j <= 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() < 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 > 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 (< 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 !, &, ^, | (und => als Implikation).
|
||
|
Die aus den Ermittlungen formalisierten Erkenntnisse sind:
|
||
|
</p><ul>
|
||
|
<li>hutmacher ^ schnapphase ^ maus</li>
|
||
|
<li>(hutmacher => ! (schnapphase | maus))
|
||
|
& (schnapphase => ! (hutmacher | maus))
|
||
|
& (maus => ! (hutmacher | schnapphase))</li>
|
||
|
<li>schnapphase => ! hutmacher</li>
|
||
|
<li>hutmacher => ! maus</li>
|
||
|
</ul>
|
||
|
Die Implikation <code>A => 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> <= 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>>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>
|