1. Fachhochschule Ingolstadt Übungsaufgaben Ingenieurinformatik
Fakultät für Maschinenbau
Prof. Dr. Edwin Naroska
Übungsaufgaben für die Klausur
Ingenieurinformatik WS 09/10
Vorbemerkungen
Die Aufgaben in diesem Dokument dienen der Vorbereitung auf die Klausur im Fach
Ingenieurinformatik für das Wintersemester 09/10. Bitte beachten Sie, dass Anzahl und Format der hier
gestellten Aufgaben nicht notwendiger Weise denen der Klausur entsprechen.
Beachten Sie bitte zudem, dass in der Klausur keinerlei Hilfsmittel zugelassen
sind (keine handschriftlichen Unterlagen, keine Bücher, keine Taschenrechner,
etc.)!
1. Aufgabe
Ergänzen Sie die fehlenden Darstellungen der jeweiligen Zahlen.
Binär Dezimal Hexadezimal
0110111
25
2A
2. Aufgabe
Wandeln Sie die folgenden negativen dezimalen Zahlen in die 2er-Komplementdarstellung um. Die
binäre 2er-Komplement-Zahlen soll hierbei aus insgesamt 7 Bitstellen bestehen.
Dezimal Binäre 2er-Komplement
-1
-12
-33
2. 3. Aufgabe
Führen Sie folgende Additionen/Subtraktionen im binären Zahlensystem durch. Wandeln Sie also vor
der eigentlichen Addition/Subtraktion die Dezimalzahlen in entsprechende Binärzahlen (gegebenenfalls
2er-Komplementdarstellung) um. Die Binärzahlen sollen hierbei 8 Stellen besitzen.
Operation Rechnung im
(vorzeichenbehafteten)
Binärformat
12 - 34
-33 + 23
-40 - 21
4. Aufgabe
Gegeben sein ein Prozessor ohne Pipelining, der seine Instruktionen in 6 Phasen abarbeitet. Wie viele
Instruktionen verarbeitet der Prozessor pro Sekunde, wenn er mit einer Taktfrequenz von 1,2 GHz (1 GHz =
109 Hz) getaktet wird und jede Phase genau einen Taktzyklus benötigt?
Jetzt soll der Prozessor seine Befehle im Pipeline-Betrieb verarbeiten. Wie viele Instruktionen kann der
Prozessor jetzt pro Sekunde (bei gleicher Taktfrequenz) im günstigsten Fall abarbeiten?
5. Aufgabe
Nennen Sie zwei gebräuchliche Block-Austauschstrategien bei Cache-Speichern und erläutern Sie diese
kurz.
6. Aufgabe
Was ist ein Branch-Delay-Slot bei Prozessoren?
7. Aufgabe
Gegeben sei ein Prozessor mit Pipelining, der unter optimalen Bedingungen eine Instruktion pro Takt
fertigstellen kann. Bei einer Messung wurde aber unter realen Bedingungen festgestellt, dass bei 5% der
ausgeführten Instruktionen ein Pipeline-Stall von 2 Takten und in 10% der Fälle ein Pipeline-Stall von einem
1 Takt auftritt. Wie viele Instruktionen pro Sekunde arbeitet der Prozessor im Durchschnitt ab?
3. 8. Aufgabe
Gegeben sei das folgende Programm für den RUN10000. Der Prozessor beginnt seine
Programmausführung mit der Anweisung 0.
0 addi r1, r0, 0
1 addi r2, r0, 255
2 add r3, r0, r1
3 or r3, r3, r1
4 addi r1, r1, 1
5 ble r1, r2, -2
6 halt
Welche Werte sind in den Register r1, r2 und r3 gespeichert, wenn der Prozessor den halt-Befehlt
erreicht hat? Wie oft wird die Sprunganweisung „ble r1, r1, -2“ verarbeitet? Wie oft verzweigt der
Prozessor dabei? Wie oft führt er die direkt nachfolgende Anweisung („halt“) durch?
9. Aufgabe
Gegeben sei ein System mit dem Prozessor RUN10000, welcher ein Programm abarbeiten soll. Der
Datenspeicher habe vor Beginn der Programmabarbeitung den nachfolgenden Inhalt (alle Werte außerhalb
des Adressbereichs 200 bis 204 seien 0):
Adresse Speicherinhalt Speicherinhalt
Vorher nachher
… 0
200 10
201 20
202 30
203 40
204 50
… 0
Der Prozessor führe nun ein Programm beginnend mit der Anweisung an Adresse 0 aus:
0 addi r1, r0, 0
1 addi r2, r0, 5
2 add r3, r0, r0
3 load r4, 200(r1)
4 add r3, r3, r4
5 addi r1, r1, 1
6 store r3, 199(r1)
7 ble r1, r2, -4
8 halt
Welche Werte stehen in den Register r1, r2, r3 und r4, wenn der Prozessor die „halt“-Anweisung
erreicht hat? Welche Werte stehen in den Speicherstellen 200 bis 204 im Datenspeicher?
4. 10. Aufgabe
Wandeln Sie die folgende Java-Programmsequenz in ein entsprechendes Maschinenprogramm für den
RUN10000 um.
int i;
int sum = 0;
for (i = 10; i < 1000; i += i)
sum += i;
Speichern Sie in dem Programm die Variable „i“ im Register r1 und die Variable „sum“ im Register r2.
Diese Variablen müssen nicht zusätzlich im Speicher abgelegt werden.
11. Aufgabe
Bedeutung haben die Begriffe „Klasse“ und „Instanz“ bei objektorientierten Programmiersprachen?
12. Aufgabe
Welche Ausgabe erzeugt die folgende Java-Programmsequenz auf dem Bildschirm:
int i = 2;
int sum = 0;
for ( ; i < 1000; i += i) ; // Achtung!
sum += i;
System.out.println(sum);
Wie oft wird die Java-Anweisung „sum += i“ in dieser Programmsequenz ausgeführt?
13. Aufgabe
Erzeugen Sie eine Programmsequenz, die das Ergebnis der mathematische Formel
berechnet.
5. 14. Aufgabe
Gegeben sei die nachfolgende Klassendefinition:
class Test {
int[] value = null;
Test(int i) {
this.value = new int[i];
for (int j = 0; j < i; j++)
this.value[j] = 2;
}
int calc(Test t) {
int sum = 0;
for (int i = 0; i < this.value.length; i++)
sum += this.value[i] + t.value[i];
}
}
Basierend auf diesem Klassen-Code wurde nun ein Hauptprogramm erstellt, welches die folgende
Programmsequenz enthält:
Test a(5);
Test b(5);
System.out.println(a.calc(b));
Welche Ausgabe erzeugt diese Programmsequenz auf dem Bildschirm? Was passiert, wenn man die
Sequenz etwas abändert (siehe unten) und laufen lässt?
Test a(5);
Test b(6); // Achtung: Änderung in dieser Zeile
System.out.println(a.calc(b));
15. Aufgabe
Erweitern Sie die aus der Vorlesung bekannte Klasse Rational so, dass der ganzzahlige Anteil eines
Bruchs separat gespeichert werden kann. Somit soll es also möglich sein den Bruch als abzulegen. Die
Klasse braucht hierbei nur positive Zahlen verarbeiten zu können!
Erweitern Sie zunächst die Member-Definition in geeigneter Weise:
class Rational {
// Neue Member
// bitte hier einfügen
int num;
int denom;
…
}
6. Erstellen Sie als nächstes eine Methode „normalize“ für die Klasse Rational, die die aktuelle Instanz
Rational so umrechnet, dass der ganzzahlige Anteil maximal wird. So soll z.B. eine Zahl in
umgewandelt werden.
void normalize () {
}
In allen nachfolgenden Aufgabenteilen kann nun die Methode „normalize“ genutzt werden.
Ergänzen Sie die beiden unten angegebenen Konstruktoren, so dass die neuen Member passend
initialisiert werden. Achten sie dabei darauf, dass nach Beenden der Konstruktoren der ganzzahlige Anteil
maximal und der Code möglichst kompakt ist!
Rational () {
num = 0;
denom = 1;
}
Rational (int n, int z) {
num = n;
denom = z;
}
Erstellen Sie als nächstes eine Methode „mult“ für die Klasse Rational. Die Methode soll als Parameter
eine Instanz vom Typ Rational übergeben bekommen und das (mathematisch korrekte) Produkt aus der
aktuellen Instanz mit dem Parameter berechnen, wobei das Ergebnis in die aktuelle Instanz ablegt werden
soll. Stellen Sie sicher, dass der ganzzahlige Anteil am Ende der Methode maximal ist.
void mult ( ) // Ergänzen sie auch den
{ // Methodenkopf!
}
Erstellen Sie als nächstes eine Routine „output“, die den Wert der aktuellen Instanz geeignet auf dem
Bildschirm ausgibt. So soll z.B. eine Zahl als „2+7/8“ auf den Bildschirm geschrieben werden.
7. void output ()
{
}
Erzeugen Sie schließlich eine Programmsequenz „test“, die die Berechnung mit Hilfe der
Klasse Rational ausführt und das Ergebnis auf den Bildschirm ausgibt.
public static void test ()
{
}