1. ¨Ubung Computerorientierte Mathematik

Werbung
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
Herunterladen