SS 2004 Technische Universität Darmstadt FB Mathematik, AG 7, Diskrete Optimierung Prof. Dr. Alexander Martin Daniel Junglas Lars Schewe 1. Übung Computerorientierte Mathematik Abgabe der Hausübungen am 3. Mai vor der Übung Praxis P1. Verzeichnisse In dieser Übung soll ein Verzeichnisbaum angelegt werden. Sollten Sie sich Ihren Praktikumsaccount mit anderen Studenten teilen, dann sollte zunächst jeder dieser Studenten im Heimatverzeichnis des Praktikumsaccounts ein Verzeichnis mit seinem Namen anlegen und in dieses wechseln. (a) Erstellen Sie die Verzeichnisse Uebung01 und Data. (b) Erstellen Sie unter dem neuen Verzeichnis Uebung01 ein weiteres Verzeichnis namens Heute und wechseln Sie in dieses. (c) Erstellen Sie weitere Verzeichnisse mit Unterverzeichnissen. Welche dieser neu erstellten Verzeichnisse können Sie mit Hilfe von rmdir löschen? Welche nicht und warum nicht? P2. xemacs Starten Sie den Editor xemacs, indem Sie in der Shell xemacs & eingeben. Das Ampersand am Ende der Zeile bewirkt, dass die Shell nicht bis zum Beenden von xemacs wartet, sondern direkt wieder ein Prompt anbietet. Beachten Sie: die meisten der Kommandos lassen sich in xemacs durch Verwendung von Tastenkombinationen (,,Shortcuts”) schneller ausführen als mit der Maus. Diese Kombinationen sind in den Menüs jeweils neben den Kommandos angegeben, wobei gilt C M ≡ ≡ Ctrl bzw. Strg Alt Versuchen Sie ruhig auch einmal diese Kürzel zu verwenden, Sie werden Ihnen die Arbeit in Zukunft erleichtern. Beachten Sie ausserdem, dass man in xemacs ab und zu die mittlere und nicht die linke Maustaste benutzen muss, um Dinge aus- oder anzuwählen. (a) Erstellen Sie eine neue Datei A und eine neue Datei B und speichern Sie beide. (b) Öffnen Sie die Dateien A und B jeweils in einem eigenen ,,Frame”. (c) Schließen Sie den Frame, der Datei A anzeigt (ohne das ’x’ in der rechten oberen Ecke des Frames zu verwenden). (d) Erstellen Sie eine neue Datei C in einem neuen ,,Window” und speichern Sie diese. (e) Schließen Sie nun das ,,Window”, dass die Datei B anzeigt. (f) Schreiben Sie folgenden Text in C Drei Chinesen mit dem Kontrabass sassen auf der Strasse und erzählten sich was. und ersetzen Sie alle ’e’s durch ein ’a’ und dann alle Doppel-’s’ durch ein einzelnes. Hinweis: Der Suchen/Ersetzen-Dialog wird in der untersten Zeile von xemacs angezeigt. Eingaben müssen hier meist mit Enter bestätigt werden. Soll der Dialog abgebrochen werden, muss man Ctrl +G betätigen. (g) Hilfreiche Einstellungen. i. Suchen Sie die Option ,,Syntax-Highlighting” und stellen Sie sie an. Diese Option sorgt dafür, dass beim Eingeben von Programmcode bestimmte Schlüsselwörter farblich gekennzeichnet werden. ii. Suchen Sie die Optionen ,,Line Number Mode” und ,,Column Number Mode” und stellen Sie beide an. Diese beiden Optionen sorgen dafür, dass in der Statuszeile sowohl Zeilenals auch Spaltennummer angezeigt werden. iii. Speichern Sie die Optionen ab. P3. Zugriffsrechte Für den letzten Teil dieser Aufgabe brauchen Sie einen Kollegen, der unter einem anderen Praktikumsaccount arbeitet als Sie. (a) Erstellen Sie in dem in Aufgabe P1 angelegten Heute-Verzeichnis (leere) Dateien mit Namen und Zugriffsrechten entsprechend der folgenden Tabelle. Zugriffsrechte Dateiname file rw-rw-rw- rw-rw-rwfile -w------- -w------file r-------- r-------file ---rw-rw- ---rw-rwfile rw-r--r-- rw-r--r-file r--r--r-- r--r--r-file rw--w--w- rw--w--wLösung: touch file_rw-rw-rwchmod ugo-x file_rw-rw-rwchmod ugo+rw file_rw-rw-rwtouch file_-w------chmod ugo-rwx file_-w------chmod u+w file_-w------touch file_r-------chmod ugo-rwx file_r-------chmod u+r file_r-------touch file_---rw-rwchmod u-rwx file_---rw-rwchmod go+rw file_---rw-rwtouch chmod chmod chmod file_rw-r--r-ugo-x file_rw-r--r-ugo+r file_rw-r--r-u+w file_rw-r--r-- touch file_r--r--r-chmod ugo-wx file_r--r--r-chmod ugo+r file_r--r--r-touch chmod chmod chmod file_rw--w--wugo-rx file_rw--w--wugo+w file_rw--w--wu+r file_rw--w--w- (b) Testen Sie, welche der Dateien aus Aufgabe P3a Sie jetzt noch lesen, ändern oder löschen können. Lösung: Dateiname file rw-rw-rwfile -w------file r-------file ---rw-rwfile rw-r--r-file r--r--r-file rw--w--w- lesen ja nein ja ja ja ja ja ändern ja ja nein ja ja nein ja löschen ja ja nein ja ja nein ja (c) Suchen Sie sich einen Kollegen, der diese Aufgabe schon bearbeitet hat und unter einem anderen Praktikumsaccount arbeitet. Testen Sie, welche der Dateien, die Ihr Kollege in Aufgabe P3a erstellt hat, Sie lesen, ändern oder löschen können. (d) freiwillig Finden Sie heraus, wie Sie Ihr System so einstellen können, dass Dateien per Default mit den Zugriffsrechten -rw------ erstellt werden. Lösung: Das geht mit dem Shell-Befehl umask. Erläuterungen zu diesem Befehl findet man, indem man die Manual-Seite zur bash aufruft (man bash) und nach umask sucht. Um die Defaultrechte für Dateien auf -rw------ zu setzen, schreibt man umask 077 in seine .bashrc. P4. Hello World! (a) Implementieren Sie das ,,Hello World!”-Programm aus der Vorlesung, übersetzen Sie es und lassen Sie es laufen. (b) Ändern Sie das Programm so ab, dass es jetzt Hello! This is my first program in C. ausgibt. Lösung: #include <stdio.h> /* * File: hello.c * Author: Daniel Junglas * Purpose: Enhanced "Hello World!" program. */ int main (void) { printf("Hello!\n"); printf("This is my first program in C.\n"); return 0; } P5. Fibonacci (a) Implementieren, übersetzen und testen Sie das Fibonacci-Programm aus der Vorlesung. (b) Ändern Sie das Programm so ab, dass alle Zahlen bis 100 ausgegeben werden und ausserdem am Ende die Anzahl der ausgegebenen Fibonacci-Zahlen auf dem Bildschirm erscheint. (c) Ändern Sie das Programm so ab, dass in der while-Schleife nicht nur sum ausgegeben wird, sondern stattdessen ein Text der Bauart: low = 0, high = 1, sum = 1. Rufen Sie zu diesem Zweck die Funktion printf() nach Möglichkeit nur einmal für jede ausgegebene Zeile auf. Hilfe finden Sie mit man 3 printf (die ,,3” ist wichtig!). Lösung: #include <stdio.h> /* * File: fib2.c * Author: Daniel Junglas * Purpose: Print the first few numbers of the Fibonacci sequence. */ int main (void) { int low, high; int sum = 0; int count = 0; /* declare integer variables "low" and "high" */ /* declare AND initialise integer variable "sum" */ /* count displayed numbers. */ /* first Fibonacci number */ low = 0; printf("%d\n", low); count++; /* second Fibonacci number */ high = 1; printf("%d\n", high); count++; /* subsequent Fibonacci numbers */ while (high + low < 100) { sum = high + low; printf("low = %d, high = %d, sum = %d\n", low, high, sum); count++; low = high; high = sum; } printf("%d fibonacci numbers printed.\n", count); return 0; } Theorie T1. Binäre Zahlen Wir betrachten positive ganze Zahlen im Dualsystem (d.h. binäre Zahlen), die genau acht Stellen haben (möglicherweise mit führenden Nullen). Dabei bezeichnen wir die einzelnen Stellen als Bits und numerieren diese von rechts nach links durch: 45 2 = 0 0 1 0 1 1 0 1 bit0 bit7 Auf diesen Zahlen sei die normale (binäre) Addition mit der folgenden Ausnahme definiert: 11111111 + 00000001 = 00000000 (1) (Die Operation in (1) sorgt dafür, dass niemals Zahlen mit mehr als acht binären Stellen auftreten und ist genau so auch in Computern implementiert.) Subtraktion von solchen Zahlen betrachten wir zunächst nicht. (a) Überlegen Sie sich ein Verfahren, wie man eine ganze Zahl zwischen 0 und 255 (inklusive) in eine Binärzahl umwandeln kann. Lösung: Binäre Darstellung von x: i. i ← 7. ii. d ← 128. iii. Falls x > d: biti ← 1, x ← x − d. Andernfalls: biti ← 0. iv. i ← i − 1. v. d ← d/2. vi. Falls i ≥ 0 gehe zu T1(a)iii. (b) Wie lautet die binäre Darstellung von 16, 32, 127 und 213? Lösung: 162 = 00010000 322 = 00100000 1272 = 01111111 2132 = 11010101 T2. 1-Komplement In T1 haben wir mit Hilfe der achtstelligen binären Zahlen nur positive ganze Zahlen und deren Addition dargestellt. Nun wollen wir mit diesen Zahlen auch negative Zahlen repräsentieren, ohne allerdings ein explizites Vorzeichen zu verwenden. Mit negativen Zahlen können wir dann auch Subtraktion von x als Addition von −x auffassen. Dazu definieren wir: • Bei einer positiven Zahl ist bit7 gleich 0 (d.h. die größte positive Zahl ist jetzt 1272 = 01111111. • Ist x eine positive Zahl 0 ≤ x ≤ 127, dann definieren wir und x12 x̄ = (28 − 1) − x. (2) ( x2 = x̄2 (3) falls x ≥ 0, falls x < 0. Die Darstellung von binären Zahlen nach (3) bezeichnen wir als 1-Komplement. Also z.B. +612 −612 = 00000110 = 11111001 (a) Welchen Wert hat bit7 in der binären 1-Komplement-Darstellung von x wenn x < 0 gilt? Lösung: Falls x < 0 ist, dann ist bit7 in der 1-Komplement-Darstellung gleich 1. (b) Wie muss die Operation in (1) definiert werden, damit die Addition von x und x̄ für x ≥ 0 das richtige Ergebnis (im 1-Komplement) liefert und binäre Addition von Zahlen im 1-Komplement ebenfalls korrekte Ergebnisse im 1-Komplement liefert? Beachten Sie hierbei insbesondere, dass auch 0 eine ,,negative” Variante (wie sieht diese aus?) hat. (Hinweis: Was stellen die 1-Komplement-Zahlen 11111111 und 00000001 dar und was sollte das Ergebnis ihrer Addition sein?). Lösung: Es muss definiert werden 11111111 + 00000001 = 00000001 D.h. es wird zunächst normal (binär) addiert. Tritt an bit7 ein Uebertrag auf, so wird zu bit0 noch einmal 1 addiert. Es gilt +012 −012 = 00000000 = 11111111 (c) Überzeugen Sie sich an den folgenden Beispielen, dass die Definition von 1-Komplement-Zahlen zusammen mit der Definition aus Teil T2b zu korrekten Rechenergebnissen (im 1-Komplement) bei Addition und Subtraktion führt: i. −112 + 112 = ii. −012 + 112 = iii. 112 − 212 = Lösung: i. −112 + 112 = 11111110 + 00000001 = 11111111 = −012 ii. −012 + 112 = 11111111 + 00000001 = 00000001 = 112 iii. 112 − 212 = 112 + (−212 ) = 00000001 + 11111101 = 11111110 = −112 (d) Zeigen Sie: Ist 0 ≤ x ≤ 127, dann erhält man x̄ indem man in der binären Darstellung von x jedes Bit ,,umdreht”, d.h. eine 1 durch eine 0 ersetzt und umgekehrt. Lösung: Offensichtlich gilt: (28 − 1) = 27 + 26 + . . . + 20 . Demnach gilt für eine Bitnummer i, das Bit bi in x und das Bit b̄i in x̄: 2i b̄i = 2i · (1 − bi ) also b̄i = 1 ⇐⇒ bi = 0 und b̄i = 0 ⇐⇒ bi = 1. Insbesondere gilt wegen der Annahme x ≤ 127 immer b̄7 = 1. (e) Wie müssten Sie das Verfahren aus T1a ändern, damit Zahlen im 1-Komplement erzeugt werden? Lösung: Sei −127 ≤ x ≤ 127. i. Falls x ≥ 0 verfahre wie in T1a. ii. Falls x < 0 verfahre wie folgt: A. Berechne mit T1a die binäre Darstellung für −x. B. Drehe alle Bits in der binären Darstellung von −x um (siehe auch die vorherige Aufgabe). T3. 2-Komplement Ähnlich dem 1-Komplement definieren wir das 2-Komplement wie folgt • Für 0 ≤ x ≤ 127 definieren wir x̄ = 28 − x (4) • ( x2 x22 = x̄2 falls 0 ≤ x ≤ 127, falls x < 0. (5) Damit sehen ±6 jetzt so aus: +622 −622 = 00000110 = 11111010 (a) Wie muss (1) nun definiert werden, damit x̄ das additive Inverse im 2-Komplement ist? Lösung: Es muss definiert werden 11111111 + 00000001 = 00000000 Ein eventueller Übertrag an bit7 wird also ignoriert. (b) Überzeugen Sie sich an den Beispielen aus T2c, dass die Definition von 2-Komplement-Zahlen zusammen mit der Definition aus T3a zu korrekten Rechenergebnissen im 2-Komplement führt. Lösung: i. −122 + 122 = 11111111 + 00000001 = 00000000 = 022 . ii. −022 + 122 = 00000000 + 00000001 = 00000001 = 122 . iii. 122 − 222 = 122 + (−222 ) = 00000001 + 11111110 = 11111111 = −122 (c) Welche ganze Zahl x wird durch 10000000 dargestellt? Was wäre −x, wie würde die Binärdarstellung aussehen? Welches Problem ergibt sich hier? Wodurch entsteht dieses Problem (Hinweis: Wie sieht 0 im 2-Komplement aus? Wie −0?). Lösung: Es ist x = 10000000 = −12822 . Die binäre Darstellung von −x wäre (ebenfalls) 10000000. 128 kann nicht mit acht binären Stellen im 2-Komplement dargestellt werden. Es können also 128 verschiedene negative, aber nur 127 verschiedene positive Zahlen mit acht binären Stellen im 2-Komplement dargestellt werden. Das liegt daran, dass die 022 = 00000000 den Platz einer positiven Zahl ,,verbraucht”, es im Gegensatz zum 1-Komplement aber keine −0 gibt. (d) Zeigen Sie: Ist 0 ≤ x ≤ 127, dann erhält man x̄ indem man in der binären Darstellung von x jedes Bit ,,umdreht”, d.h. eine 1 durch eine 0 ersetzt und umgekehrt und zu dem Ergebnis binär 00000001 addiert. Lösung: Mit Aufgabe 2d und den Definitionen (2) - (5) ergibt sich das direkt. (e) Vergleichen Sie 1-Komplement- und 2-Komplement-Zahlen bzgl. folgender Fragen: i. Was ist die größte positive Zahl, die mit acht binären Stellen dargestellt werden kann? ii. Was ist die kleinst negative Zahl, die mit acht binären Stellen dargestellt werden kann? iii. Wieviele Darstellungen gibt es für die 0? Lösung: Die Tabelle beantwortet alle Teilfragen auf einmal: 1-Komplement 2-Komplement größte positive Zahl +127 +127 kleinste negative Zahl −127 −128 Darstellungen der Null 2 (±0) 1