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
		
	
| <!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> |