Algorithmen und Programmierung II

Zusatzblatt 1 - Musterlösung


Aufgabe 1
    /* erkennt Palindrome (inkl. deutscher Umlaute) */
static boolean palindrom(char[] text) {
char[] sauber = new char[text.length]; // Text in Kleichbuchstaben
 
int anz = 0; // ohne Satz-/Sonderzeichen
 
for (int i = 0; i < text.length; i++) {
char c = text[i];
if (c>='a' && c<='z' || c=='ä' || c=='ö' || c=='ü' || c=='ß')
sauber[anz++] = c;
else if (c>='A' && c<='Z' || c=='Ä' || c=='Ö' || c=='Ü')
sauber[anz++] = (char) (c - 'A' + 'a'); // groß -> klein
}
for (int i = 0; i < anz - 1 - i; i++)
if (sauber[i] != sauber[anz - 1 - i]) return false;
return true;
}

Aufgabe 2
public class Bruch {

final int z, n; // Zähler, Nenner

/** erzeugt Bruch, dieser wird vollständig gekürzt */
Bruch(int zaehler, int nenner) {
if (nenner == 0) throw new IllegalArgumentException("Nenner ist 0");
zaehler = nenner > 0 ? zaehler : -zaehler;
nenner = Math.abs(nenner);
int a = Math.abs(zaehler), b = nenner;
while (b > 0) {
int r = a % b;
a = b;
b = r;
}
z = zaehler / a;
n = nenner / a;
}

static Bruch addieren(Bruch a, Bruch b) {
return new Bruch(a.z * b.n + b.z * a.n, a.n * b.n);
}

static Bruch dividieren(Bruch a, Bruch b) {
if (b.z == 0) throw new IllegalArgumentException("Division durch 0");
return new Bruch(a.z * b.n, a.n * b.z);
}

public String toString() {
if (z == 0 || n == 1)
return Integer.toString(z);
else
return z + "/" + n;
}
}
Aufgabe 3
import java.io.*;

public class Histogramm {

/** erzeugt Histogramm von englischsprachigem Text (ignoriert Umlaute) */
public static void main(String[] args) throws IOException {
FileReader fr = null;
try { fr = new FileReader(args[0]); }
catch (Exception e) {
System.out.println(
"Datei nicht gefunden, Aufruf: java Histogramm <Datei>");
System.exit(1);
}
char[] buffer = new char[1024]; // aktueller Ausschnitt aus der Datei
int[] stats = new int[26]; // #Vorkommen von a-z bzw. A-Z
int count = 0, total = 0; // Index in buffer, gezählte Zeichen
while( (count = fr.read(buffer)) > 0 ) {
for (int i = 0; i < count; i++) {
char c = buffer[i];
if ('a' <= c && c <= 'z') {
stats[c-'a']++; // -'a': "Normierung" Kleinbuchstaben
total++;
} else if ('A' <= c && c <= 'Z') {
stats[c-'A']++; // -'A': "Normierung" Großbuchstaben
total++;
}
}
}
System.out.println("Histogramm von \"" + args[0] + "\"" +
"\nAnzahl gezaehlte Buchstaben: " + total +
"\nRelative Haeufigkeiten:");
for (int i = 0; i < 26; i++)
System.out.printf( "%c: %5.2f %%\n", ('a' + i),
(
float) stats[i] / total * 100 ); // Java 1.5 !
}
}
Testläufe: Alice, Moby Dick, TCP RFC