Übungen zu Algorithmen - Universität Osnabrück
Übungen zu Algorithmen - Universität Osnabrück
Übungen zu Algorithmen - Universität Osnabrück
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Institut für Informatik <strong>Universität</strong> <strong>Osnabrück</strong>, 29.10.2013<br />
Prof. Dr. Oliver Vornberger<br />
http://www-lehre.inf.uos.de/~ainf<br />
Nils Haldenwang, M.Sc.<br />
Testat bis 06.11.2013, 14:00 Uhr<br />
Nicolas Neubauer, M.Sc.<br />
<strong>Übungen</strong> <strong>zu</strong> <strong>Algorithmen</strong><br />
Wintersemester 2013/2014<br />
Blatt 2: Schleifen<br />
Aufgabe 2.1: Unix-Kommandos (0 Punkte)<br />
Machen Sie sich mit den folgenden UNIX-Kommandos vertraut:<br />
Kommando<br />
man vi<br />
ls -l<br />
mkdir Blatt1<br />
rmdir Blatt1<br />
cd Blatt1<br />
cd ..<br />
cd<br />
pwd<br />
cp .<br />
javac Collatz.java<br />
java Collatz<br />
Erklärung<br />
Ausgabe der Manualseite <strong>zu</strong>m Kommando vi.<br />
Auflisten aller Dateien und Verzeichnisse in Tabellenform (list).<br />
Anlegen des Verzeichnisses Blatt1 (make directory).<br />
Löschen des (leeren) Verzeichnisses Blatt1 (remove directory).<br />
Wechsel in das Verzeichnis Blatt1 (change directory).<br />
Wechsel in das übergeordnete Verzeichnis.<br />
Wechsel in das Heimatverzeichnis.<br />
Gibt das aktuelle Verzeichnis aus (print working directory).<br />
Kopiert eine Datei in das aktuelle Verzeichnis.<br />
Übersetzen der Programmdatei Collatz.java, Ergebnis ist<br />
die Datei Collatz.class.<br />
Ausführen des Programms Collatz.<br />
Legen Sie sich am besten für jedes Aufgabenblatt ein Verzeichnis an.<br />
Um das Grundgerüst eines Java-Programms im vi <strong>zu</strong> erzeugen, geben Sie _head_ im Einfüge-Modus<br />
ein und schließen Sie den Befehl mit einem Leerzeichen ab.<br />
Sollten Sie eine Endlosschleife verursacht haben, können Sie Ihr Programm mit der Tastenkombination<br />
Ctrl c abbrechen. Schließen Sie nicht achtlos das Terminalfenster, da der Prozess ansonsten im<br />
Hintergrund weiterläuft.<br />
Aufgabe 2.2: Fragen (30 Punkte)<br />
Beantworten Sie Ihrer Tutorin beziehungsweise Ihrem Tutor Fragen <strong>zu</strong> den Inhalten der Veranstaltung.
Aufgabe 2.3: Quersumme (15 Punkte)<br />
Schreiben Sie ein Programm Quersumme.java, welches eine ganze Zahl n > 0 einliest und die<br />
Quersumme der Zahl berechnet und ausgibt. Die Quersumme bezeichnet die Summe der einzelnen<br />
Ziffern.<br />
Beispiele:<br />
123 -> 6<br />
23 -> 5<br />
42 -> 6<br />
Musterlösung:<br />
/****************************** Quersumme.java *************************/<br />
import AlgoTools.IO;<br />
/**<br />
* Liest eine Zahl >= 0 ein und gibt die Quersumme der Zahl aus.<br />
*/<br />
public class Quersumme {<br />
public static void main(String[] args) {<br />
int zahl;<br />
do {<br />
zahl = IO.readInt("Zahl > 0 <strong>zu</strong>r Berechnung Quersumme eingeben: ");<br />
} while(zahl 0) {<br />
// letzte Stelle aufaddieren<br />
quersumme = quersumme + zahl % 10;<br />
}<br />
// letzte Stelle durch ganzzahliges Teilen abschneiden<br />
zahl = zahl / 10;<br />
}<br />
}<br />
IO.println("Die Quersumme ist: " + quersumme);<br />
Aufgabe 2.4: Tabelle (20 Punkte)<br />
Schreiben Sie ein Java-Programm Tabelle.java, das eine Zahl k mit 1 ≤ k ≤ 15 einliest und für alle Paare<br />
(x,y) ∈ {1,...,k} × {1,...,k} den Wert x%y ausgibt. Benutzen Sie für die Darstellung der Ergebnisse eine<br />
Tabelle, in der Sie die Werte rechtsbündig eintragen.<br />
Beispiel für k = 4:<br />
2
| 1 2 3 4<br />
---+-----------------<br />
1| 0 1 1 1<br />
2| 0 0 2 2<br />
3| 0 1 0 3<br />
4| 0 0 1 0<br />
Achten Sie darauf, dass der Benutzer keinen nicht erlaubten Wert eingeben kann.<br />
Musterlösung:<br />
/****************************** Tabelle.java ********************************/<br />
import AlgoTools.IO;<br />
/**<br />
* Liest eine natuerliche Zahl k kleinergleich 15 ein und gibt für alle<br />
* Paare (x,y) aus {0,...,k-1}x{0,...,k-1} den Wert x % y aus.<br />
*/<br />
public class Tabelle {<br />
public static void main(String[] args) {<br />
int abstand = 4; //Groesse einer Spalte<br />
// Benutzereingabe mit Validierung<br />
int k;<br />
do {<br />
k = IO.readInt("Bitte eine Zahl zwischen 1 und 15 eingeben: ");<br />
} while (k 15);<br />
IO.println();<br />
// Leerzeichen in die linke obere Ecke<br />
IO.print("|", abstand);<br />
// Tabellenkopf<br />
for (int spalte = 1; spalte
IO.print("-");<br />
}<br />
IO.println();<br />
// aeussere Schleife fuer Zeilen<br />
for (int zeile = 1; zeile
} while (zahl < 10 || zahl > 999);<br />
//Ziffern<br />
int hunderter = zahl / 100;<br />
int zehner = (zahl % 100) / 10;<br />
int einer = zahl % 10;<br />
//Versuche die Ausgabe als dreihundert-zweiund-vierzig<br />
//Hunderter-Stelle<br />
switch (hunderter) {<br />
case 0: break; //nichts ausgeben bei 0<br />
case 1: IO.print("hundert"); break;<br />
case 2: IO.print("zweihundert"); break;<br />
case 3: IO.print("dreihundert"); break;<br />
case 4: IO.print("vierhundert"); break;<br />
case 5: IO.print("fuenfhundert"); break;<br />
case 6: IO.print("sechshundert"); break;<br />
case 7: IO.print("siebenhundert"); break;<br />
case 8: IO.print("achthundert"); break;<br />
case 9: IO.print("neunhundert"); break;<br />
}<br />
default:<br />
IO.println("Fehler: Hunderter kann nicht umgewandelt werden");<br />
break;<br />
//Sonderfaelle (elf, zwoelf...) und Einer-Stelle<br />
switch (zehner) {<br />
case 1: //Sonderfaelle<br />
switch (einer) {<br />
case 0: IO.print("zehn"); break;<br />
case 1: IO.print("elf"); break;<br />
case 2: IO.print("zwoelf"); break;<br />
case 3: IO.print("dreizehn"); break;<br />
case 4: IO.print("vierzehn"); break;<br />
case 5: IO.print("fuenfzehn"); break;<br />
case 6: IO.print("sechzehn"); break;<br />
case 7: IO.print("siebzehn"); break;<br />
case 8: IO.print("achtzehn"); break;<br />
case 9: IO.print("neunzehn"); break;<br />
}<br />
break;<br />
5
case 0: case 2: case 3: case 4: case 5:<br />
case 6: case 7: case 8: case 9:<br />
switch(einer) {<br />
case 0: break; //nichts ausgeben<br />
case 1: IO.print(zehner == 0 ? "eins": "ein"); break;<br />
case 2: IO.print("zwei"); break;<br />
case 3: IO.print("drei"); break;<br />
case 4: IO.print("vier"); break;<br />
case 5: IO.print("fuenf"); break;<br />
case 6: IO.print("sechs"); break;<br />
case 7: IO.print("sieben"); break;<br />
case 8: IO.print("acht"); break;<br />
case 9: IO.print("neun"); break;<br />
default:<br />
IO.println("Fehler: Einer kann nicht umgewandelt werden");<br />
break;<br />
}<br />
}<br />
break;<br />
default:<br />
IO.println("Fehler: Einer/Sonderfall kann nicht umgewandelt" +<br />
" werden");<br />
break;<br />
//Verbindung -und- wenn Einer und Zehner getrennt werden muessen<br />
if(einer>= 1 && zehner >= 2) {<br />
IO.print("und");<br />
}<br />
//Zehner-Stelle<br />
switch(zehner) {<br />
//10er sind schon behandelt, bei 0 nichts ausgeben<br />
case 0: case 1: break;<br />
case 2: IO.print("zwanzig"); break;<br />
case 3: IO.print("dreissig"); break;<br />
case 4: IO.print("vierzig"); break;<br />
case 5: IO.print("fuenfzig"); break;<br />
case 6: IO.print("sechszig"); break;<br />
case 7: IO.print("siebzig"); break;<br />
case 8: IO.print("achtzig"); break;<br />
case 9: IO.print("neunzig"); break;<br />
default:<br />
IO.println("Fehler: Zehner kann nicht umgewandelt werden");<br />
break;<br />
6
}<br />
}<br />
}<br />
IO.println(); //Absatz fuer die Optik<br />
7