Institut für Informatik Universität Osnabrück, 01.11.2016 Prof. Dr. Oliver Vornberger http://www-lehre.inf.uos.de/~ainf Lukas Kalbertodt, B.Sc. Testat bis 09.11.2016, 14:00 Uhr Nils Haldenwang, M.Sc. Übungen zu Algorithmen Wintersemester 2016/2017 Blatt 2: Schleifen Aufgabe 2.1: Unix-Kommandos (0 Punkte) Machen Sie sich mit den folgenden UNIX-Kommandos vertraut: Kommando man vi ls -l mkdir Blatt1 rmdir Blatt1 cd Blatt1 cd.. cd pwd cp <Pfad/Dateiname>. javac Collatz.java java Collatz Erklärung Ausgabe der Manualseite zum Kommando vi. Auflisten aller Dateien und Verzeichnisse in Tabellenform (list). Anlegen des Verzeichnisses Blatt1 (make directory). Löschen des (leeren) Verzeichnisses Blatt1 (remove directory). Wechsel in das Verzeichnis Blatt1 (change directory). Wechsel in das übergeordnete Verzeichnis. Wechsel in das Heimatverzeichnis. Gibt das aktuelle Verzeichnis aus (print working directory). Kopiert eine Datei in das aktuelle Verzeichnis. Übersetzen der Programmdatei Collatz.java, Ergebnis ist die Datei Collatz.class. Ausführen des Programms Collatz. Legen Sie sich am besten für jedes Aufgabenblatt ein Verzeichnis an. Sollten Sie eine Endlosschleife verursacht haben, können Sie Ihr Programm mit der Tastenkombination Ctrl c abbrechen. Schließen Sie nicht achtlos das Terminalfenster, da der Prozess ansonsten im Hintergrund weiterläuft. Aufgabe 2.2: Fragen (30 Punkte) Beantworten Sie Ihrer Tutorin beziehungsweise Ihrem Tutor Fragen zu den Inhalten der Veranstaltung.
Aufgabe 2.3: Quersumme (15 Punkte) Schreiben Sie ein Programm Quersumme.java, welches eine ganze Zahl n > 0 einliest und die Quersumme der Zahl berechnet und ausgibt. Die Quersumme bezeichnet die Summe der einzelnen Ziffern. Beispiele: 123 -> 6 23 -> 5 42 -> 6 Musterlösung: /****************************** Quersumme.java *************************/ import AlgoTools.IO; /** * Liest eine Zahl >= 0 ein und gibt die Quersumme der Zahl aus. */ public class Quersumme { public static void main(string[] args) { int zahl; do { zahl = IO.readInt("Zahl > 0 zur Berechnung Quersumme eingeben: "); while(zahl <= 0); int quersumme = 0; // So lange Stellen abschneiden und addieren, bis keine mehr // da sind. while(zahl > 0) { // letzte Stelle aufaddieren quersumme = quersumme + zahl % 10; // letzte Stelle durch ganzzahliges Teilen abschneiden zahl = zahl / 10; IO.println("Die Quersumme ist: " + quersumme); Aufgabe 2.4: Tabelle (20 Punkte) Schreiben Sie ein Java-Programm Tabelle.java, das eine Zahl k mit 1 k 15 einliest und für alle Paare (x,y) {1,...,k {1,...,k den Wert x%y ausgibt. Benutzen Sie für die Darstellung der Ergebnisse eine Tabelle, in der Sie die Werte rechtsbündig eintragen. Beispiel für k = 4: 2
1 2 3 4 ---+----------------- 1 0 1 1 1 2 0 0 2 2 3 0 1 0 3 4 0 0 1 0 Achten Sie darauf, dass der Benutzer keinen nicht erlaubten Wert eingeben kann. Musterlösung: /****************************** Tabelle.java ********************************/ import AlgoTools.IO; /** * Liest eine natuerliche Zahl k kleinergleich 15 ein und gibt für alle * Paare (x,y) aus {0,...,k-1x{0,...,k-1 den Wert x % y aus. */ public class Tabelle { public static void main(string[] args) { int abstand = 4; //Groesse einer Spalte // Benutzereingabe mit Validierung int k; do { k = IO.readInt("Bitte eine Zahl zwischen 1 und 15 eingeben: "); while (k <= 0 k > 15); // Leerzeichen in die linke obere Ecke IO.print(" ", abstand); // Tabellenkopf for (int spalte = 1; spalte <= k; spalte++) { IO.print(spalte, abstand); // Trennlinie for (int i = 1; i < abstand; i++) { IO.print("-"); IO.print("+"); for (int i = 0; i <= k * abstand; i++) { 3
IO.print("-"); // aeussere Schleife fuer Zeilen for (int zeile = 1; zeile <= k; zeile++) { // mit Trennstrich IO.print(zeile + " ", abstand); // innere Schleife fuer Spalten for (int spalte = 1; spalte <= k; spalte++) { //hier erfolgt die Berechnung des Zelleninhalts IO.print((zeile % spalte), abstand); // Zeilenumbruch Aufgabe 2.5: Zahlen ausprechen (35 Punkte) Schreiben Sie ein Java-Programm Zahlen.java, welches eine eingelesene Zahl aus [10, 999] in englischer Sprache ausspricht. Verwenden Sie ein geeignetes switch-case-konstrukt, um die einzelnen Stellen der Zahl (Hunderter, Zehner, Einer) entsprechend zusammenzusetzen. Beispiele: 12 -> twelve 42 -> forty-two 100 -> one hundred 140 -> one hundred and forty 142 -> one hundred and forty-two Musterlösung: /***************************** Zahlen.java *********************************/ import AlgoTools.IO; /** * Gibt die textuelle Darstellung einer Zahl aus [10,999] in englischer Sprache * aus. * * @author Sebastian Buescher (sbuesche@uos.de) * @author Nicolas Neubauer (nneubauer@uos.de) * @author Jana Lehnfeld (jlehnfel@uos.de) 4
*/ public class Zahlen { public static void main(string[] args) { // sicheres Einlesen int zahl; do { zahl = IO.readInt("Bitte eine Zahl aus [10,999]: "); while (zahl < 10 zahl > 999); //Ziffern int hunderter = zahl / 100; int zehner = (zahl % 100) / 10; int einer = zahl % 10; //Hunderter-Stelle switch (hunderter) { case 0: //nichts ausgeben bei 0 case 1: IO.print("one hundred "); case 2: IO.print("two hundred "); case 3: IO.print("three hundred "); case 4: IO.print("four hundred "); case 5: IO.print("five hundred "); case 6: IO.print("six hundred "); case 7: IO.print("seven hundred "); case 8: IO.print("eight hundred "); case 9: IO.print("nine hundred "); IO.println("Fehler: Hunderter kann nicht umgewandelt werden"); // and muss nur eingefügt werden, wenn danach noch etwas // kommt if(hunderter > 0 && (zehner > 0 einer > 0)) IO.print("and "); //Sonderfaelle (elf, zwoelf...) und Einer-Stelle switch (zehner) { case 1: //Sonderfaelle switch (einer) { case 0: IO.print("ten"); case 1: IO.print("eleven"); case 2: IO.print("twelve"); case 3: IO.print("thirteen"); case 4: IO.print("fourteen"); case 5: IO.print("fifteen"); case 6: IO.print("sixteen"); 5
case 7: IO.print("seventeen"); case 8: IO.print("eighteen"); case 9: IO.print("nineteen"); case 0: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: //Zehner-Stelle switch(zehner) { case 0: case 1: //1xer sind schon behandelt case 2: IO.print("twenty"); case 3: IO.print("thirty"); case 4: IO.print("forty"); case 5: IO.print("fifty"); case 6: IO.print("sixty"); case 7: IO.print("seventy"); case 8: IO.print("eighty"); case 9: IO.print("ninety"); IO.println("Fehler: Zehner kann nicht umgewandelt werden"); // Bindestrich einfügen, wenn Zehnerstelle nicht 0 ist if(zehner > 0 && einer!= 0){ IO.print("-"); switch(einer) { case 0: //nichts ausgeben case 1: IO.print("one"); case 2: IO.print("two"); case 3: IO.print("three"); case 4: IO.print("four"); case 5: IO.print("five"); case 6: IO.print("six"); case 7: IO.print("seven"); case 8: IO.print("eight"); case 9: IO.print("nine"); IO.println("Fehler: Einer kann nicht umgewandelt werden"); IO.println("Fehler: Einer/Sonderfall kann nicht umgewandelt" + " werden"); 6
//Absatz fuer die Optik 7