Algorithmen und Programmierung II

Übungsblatt 3 - Musterlösung


Aufgabe 1
/**
* berechnet den Näherungswert von sin(x). Das letzte Glied der verwendeten
* Potenzreihe macht weniger als eps % des Näherungswertes aus.
*/

static double sin(double x, double eps) {
if (x == 0.) return 0.;
double res = 0; // Rückgabewert
double pot = x; // Zähler
double x2 = x*x; // Quadrat vorberechnen
double fak = 1; // Nenner
double summand = x; // Reihenglied

for (int i = 1; summand >= Math.abs(res*eps/100); i += 2) {
summand = pot/fak;
if ((i-1) % 4 == 0)
res += summand;
else
res -= summand;
pot *= x2;
fak *= (i+1) * (i+2);
}
return res;
}
Test mit verschiedenen Werten für x/eps: Je kleiner x ist, desto schneller gehen die berechneten Glieder gegen 0. Obwohl der Näherungswert in die Abbruchbedingung eingeht und im betrachteten Intervall auch die Näherungswerte mit x gegen 0 gehen, fallen die Glieder so stark, dass das Verfahren mit kleinerem x schneller terminiert. Bei x=0.001 bleibt der berechnete Näherungswert im Rahmen der Rechengenauigkeit schon ab 2 Interationsschritten konstant, bei x=0.1 ab ca. 5 (eps=10-8), bei x=1 ab ca. 8 Schritten (eps=10-8) und bei x = pi/2 ab 10 Schritten (eps=10-10). x=0 stellt einen Sonderfall dar. Hier ist der Näherungswert identisch mit dem tatsächlichen Wert sin(x)=0.


Aufgabe 2
/**
* berechnet die Darstellung der Zahl number zur Basis base.
* Der Wertebereich der Basis ist 2-10, die Repräsentation wird als
* int geliefert der zur entsprechenden Basis zu interpretieren ist.
*/

public static int show(int number, int base) {
int result = 0;
int power = 1;
while(number > 0) {
result += number % base * power;
number /= base;
power *= 10;
}
return result;
}

Aufgabe 3
/**
* gibt Zahlen im Bereich 0-99 "in Worten" aus.
* (Beschränkt auf die Mittel, die zum Zeitpunkt der Aufgabe zur Verfügung
* standen, also ohne Unterprogramme, Verkettung von Zeichenketten usw.)
*/

static void zahlZuText(int zahl) {
switch(zahl) {
case 0: System.out.print("null"); break;
case 1: System.out.print("eins"); break;
case 11: System.out.print("elf"); break;
case 12: System.out.print("zwoelf"); break;
case 16: System.out.print("sechzehn"); break;
case 17: System.out.print("siebzehn"); break;
default:
if (zahl % 10 > 0) {
switch(zahl % 10) {
case 1: System.out.print("ein"); break;
case 2: System.out.print("zwei"); break;
case 3: System.out.print("drei"); break;
case 4: System.out.print("vier"); break;
case 5: System.out.print("fuenf"); break;
case 6: System.out.print("sechs"); break;
case 7: System.out.print("sieben"); break;
case 8: System.out.print("acht"); break;
case 9: System.out.print("neun"); break;
}
if (zahl / 10 > 1)
System.out.print("und");
}
switch(zahl / 10) {
case 1: System.out.print("zehn"); break;
case 2: System.out.print("zwanzig"); break;
case 3: System.out.print("dreissig"); break;
case 4: System.out.print("vierzig"); break;
case 5: System.out.print("fuenfzig"); break;
case 6: System.out.print("sechzig"); break;
case 7: System.out.print("siebzig"); break;
case 8: System.out.print("achtzig"); break;
case 9: System.out.print("neunzig"); break;
}
}
System.out.println();
}