In Java gibt es eine Klasse
java.lang.Math
,
die wichtige mathematische Funktionen bereitstellt. Möchte man den Sinus einer Zahl
berechnen, schreibt man etwa:
double d = Math.sin( 0.23 );
Die Funktion sin()
ist demnach eine Operation der Math
-Klasse.
max()
-Funktion geben, oder?a
, b
, c
sind vom Typ
long
und mit beliebigen Zahlen belegt. Wie bekommt man das Minimum
auf dem Bildschirm angezeigt?Lösung für
das Maximum
Lösung für
das Minimum dreier Zahlen
Was ist an folgendem Beispiel ungünstig?
double tmp = 2 * ( höhe + breite ); System.out.println( tmp ); tmp = höhe * breite; System.out.println( tmp );
Mit Hilfe der Klasse
javax.swing.JOptionPane
kann man einfache Dialogfelder darstellen. Folgendes Programm liefert eine Eingabezeile,
die mit Return bestätigt werden kann.
public class Input { public static void main( String[] args ) { String s = javax.swing.JOptionPane.showInputDialog( "Bitte Zahl eingeben" ); System.exit( 0 ); } }
xxx
, so soll ausgegeben werden:
xxx xxx
s
kann über
int x = Integer.parseInt( s );in eine Ganzzahl
x
konvertiert werden.javax.swing.JOptionPane
, denn wo es showInputDialog()
gibt, wird es sicherlich auch etwas für die reine Ausgabe geben. Ein Tipp: Den
unbekannten Parameter kann man mit null
füllen. Schreibe ein Programm, welches dazu auffordert, die Anzahl der Münzen zu je einem Cent, zwei Cent, fünf Cent, 10 Cent einzugeben. Berechne den Gesamtbetrag.
Wie kann man das Absolute einer Zahl (den positiven Teil) mit dem Bedingungsoperator berechnen? Nenne zwei Möglichkeiten.
double zahl = ....; double abs = ? : ; System.out.println( abs );
x
echt zwischen -1 und 1 befindet. Man kann Und-Anfragen
mit dem &&
-Operator formulieren. Fülle dazu folgendes Gerüst:double x = Math.sin( 0.123456 ); // Zahl ist Überraschung if ( ... ) System.out.println( "passt" );
Wie kann man einen Programmabschnitt formulieren, der zu einer Ganzzahl
n
ausgibt, ob sie gerade oder ungerade ist?
%
in die Überlegung ein.&
nutzen.
Wie geht das? Das folgende Programmstückchen vertauscht den Inhalt der Variablen x
und y
, wenn x
größer als y
ist. Stimmt das?
if ( x > y ) int swap = x; x = y; y = x;
Welche Ausgabe erzeugt folgendes Programm:
if ( true ) { if ( false ) if ( 3!=4 ) ; else System.out.println( "Klabautermann" ); else System.out.println( "Pumuckel" ); }
Finde das Ergebnis, ohne das Programm zu übersetzen.
30 Sternchen soll in einer Reihe stehen. Wir könnten zwar
System.out.println( "*******...*" );
schreiben, doch dann würde die Anpassung von 30 auf eine andere Zahl wieder Zählen
erfordern. Wie kann man dies mit einer while
-Schleife lösen?
Nimm eine beliebige double
-Variable t
zwischen 0 und
1 durch Math.random()
.
double t = Math.random();
Multipliziere t
mit 2, wenn t < 1
und ziehe 1 ab, wenn
t >= 1
ist. Setze diese Berechung in eine while
-Schleife,
die endet, wenn t
gleich 0 ist.
Wie viele Sternchen würden bei den folgenden Programmausschnitten auf dem Bildschirm erscheinen?
for ( int sternchen = 0; sternchen <= 7; sternchen=sternchen+2 ) System.out.println( "***" );
Beziehungsweise:
for ( int sternchen = 10; sternchen < 0; sternchen++ ) System.out.println( "**" );
sternchen++
ist eine Abkürzung für sternchen=sternchen+1
.
Folgendes Programm soll die Zahlen zwischen 1 und 100 aufaddieren und das Ergebnis ausgeben. Leider sind einige Fehler im Programm enthalten.
class Sűmme { private static int getSum() { int j == 0; for ( /* int */ i = 0, i <= 1OO, j++ ); j += i ; } public static void Main( String args ) { system.out.println( getsum() ); } }
Ordne die Fehler in folgende Typen ein: Syntaktische Fehler, Semantische Fehler, Verstoß gegen Styleguide.
Schreibe eine Methode, welche die Dekaden des 20. Jahrhunderts ausgibt, also 1900, 1910, ...
Erzeuge folgende Ausgabe:
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
Optional, wenn Zeit und Lust vorhanden: Die Ausgabe soll zentriert erscheinen.
Eine Zeitschrift druckt die folgende Denksportaufgabe ab:
X | O | L | |
+ | L | X | X |
= | T | L | T |
Da wir keine Lust zu denken haben, soll ein Programm entwickelt werden, welches durch Ausprobieren aller Möglichkeiten eine Lösung findet.
Mehr dieser schönen Aufgaben liefert Alphametic Puzzles.
Wir sollen untersuchen, ob wir bei einem Spiel mit zwei Würfeln gute Chancen auf Gewinn haben. Gespielt wird mit zwei Würfeln mit den Augen 1 bis 6, deren Werte addiert werden. Wir beginnen das Spiel mit 50 Cent. Der Gewinn berechnet sich nach der unten stehenden Auszahlungstabelle.
Augensumme | Auszahlung | Gewinn |
12 | 4facher Einsatz | +1,50 Euro |
11 | 3facher Einsatz | +1,00 Eruo |
10 | 2facher Einsatz | +0,50 Euro |
7,8,9 | Einsatz zurück | +0,00 Euro |
2,3,4,5,6 | keine | -0,50 Euro |
Lohnt es sich, an diesem Spiel teilzunehmen? Simuliere in einer Schleife (etwa mit 1.000 Durchläufen), ob man auf Dauer gewinnt oder eher verliert. Die Würfelsumme kann man mit Zufallszahlen simulieren. Gib das erwirtschaftete oder verlorene Geld am Ende aus.
Eine Collatz-Folge (bekannt auch als Syracuse-Problem, Kakutani-Poblem, Hasse-Algorithmus und Ulam-Problem) von Lothar Collatz, 1937 ist definiert durch
n -> n/2, falls n gerade ist, n -> 3n+1,
falls n ungerade ist. Die Folge ist beendet, wenn 1 erreicht ist.
Beginnt man etwa mit n = 7, durchläuft der Algorithmus die folgenden Zahlen:
long iterate(int n)
, die den jeweils
größten zwischendurch erreichten Wert zurückgibt.iterate
, um die ersten 100 Zahlen n zu finden,
für die die größte zwischendurch erreichte Zahl w echt größer ist als n.iterate()
programmieren, sodass sie rekursiv aufgerufen
wird und als Ergebnis den maximal angenommenen Wert liefert?Lösung
Lösung
für die Rekursion
Fülle die folgenden Zeilen für die Funktion linie(int n)
mit Programmcode,
sodass eine Linie mit "-" der Länge n
gezeichnet wird. Setzte die Methode
in eine Klasse LineUtils
.
static void linie( int n ) { }
Setze zunächst eine Test-main()
-Funktion in die gleiche Klasse.
Setze anschließend die main()
-Funktion in eine neue Klasse LineUtilsTest
.
Schreibe eine Funktion, die den Durchschnitt zweier Zahlen zurückgibt. Der Rückgabewert
wird mit return-Wert
eingeleitet. Wähle einen passenden Datentyp aus.
Eine Primzahl ist eine Zahl, die nur durch 1 und sich selbst teilbar ist.
boolean isPrime(int n)
, die für eine
gegebene, positive ganze Zahl n>=2 feststellt, ob diese Zahl eine Primzahl ist
oder nicht.isPrime()
, um die ersten 100 Primzahlen
auszugeben.Implementiere zwei Linienfunktionen
linie( int len )
linie( int len, char c )
Die erste Funktion erzeugt Linien gegebener Länge aus Minuszeichen. Bei der zweiten lässt sich das Füllzeichen angeben. Kann die erste Funktion die zweite nutzen?
Bei Lust und Laune: Implementiere linie(int len, String s)
, die
Strings nebeneinander setzt. Mit s.length()
bekommt man die Länge eines
Strings s
und mit s.charAt(int index)
an ein Zeichen an
der Stelle index
; der Index beginnt bei 0. Beachte die korrekte Länge,
zum Beispiel beim Aufruf von
linie( 3, "*=" );
Erzeuge eine Zeichenkette, die alle Zeichen im Alphabet erzeugt ("ABCDEF....Z"). Ändere dazu die nicht so schlaue Lösung ab. Wieso sollte sie überhaupt dumm sein?
static String abcz() { String s; s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; return s; }
Erweitere die Implementierung durch eine Funktion String abcz(char start,
char end)
.
Schreibe eine Funktion String abcz(char start, int anz)
, die ab
start
dann anz
Zeichen liefert.
Lösung
Dokumentiere die Methode abcz()
mit einem JavaDoc-Kommentar. Mache
anschließend die Klasse und ihre Methode öffentlich (stelle das Schlüsselwort
public
voran.