Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Übungsaufgaben SS2010
1. Fachhochschule Ingolstadt Übungsaufgaben Ingenieurinformatik
Fakultät für Maschinenbau
Prof. Dr. Edwin Naroska
Übungsaufgaben für die Klausur
Ingenieurinformatik SS 2010
Vorbemerkungen
Die Aufgaben in diesem Dokument dienen der Vorbereitung auf die Klausur im Fach
Ingenieurinformatik für das Sommersemester 2010. 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äre Zahlen sind im 2er-
Komplementformat (9 Bitstellen, einschließlich „Vorzeichen“) anzugeben!
Binär Dezimal
010110111
128
111111111
-12
2. Aufgabe
Bestimmen Sie für die folgenden 2er-Komplementformate mit „n“ Stellen (einschließlich „Vorzeichen“)
den darstellbaren Zahlenbereich. Geben Sie den Zahlenbereich in dezimaler und (binärer) 2er-
Komplementdarstellung an.
Bitstellen „n“ Kleinste darstellbare Zahl Größte darstellbare Zahl
(Dezimal und 2er- (Dezimal und 2er-
Komplement) Komplement)
3
5
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
-128 + 1
127 - 1
-124 - 4
4. Aufgabe
Gegeben sei ein Prozessor ohne Pipelining, der seine Instruktionen in 5 Phasen abarbeitet und mit 1,0
GHz (1 GHz = 109 Hz) getaktet wird.
a. Wie viele Instruktionen verarbeitet der Prozessor pro Sekunde, wenn er für jede Phase genau
einen Taktzyklus benötigt?
Jetzt soll der Prozessor seine Befehle im Pipeline-Betrieb verarbeiten (bei gleicher Taktfrequenz).
b. Wie viele Instruktionen kann der Prozessor jetzt pro Sekunde im günstigsten Fall abarbeiten?
c. Wie viele Instruktionen pro Sekunde (bei gleicher Taktfrequenz) verarbeitet der Prozessor,
wenn 20% der verarbeiteten Instruktionen Sprünge sind, die alle einen Pipeline-Stall von 2
Takten verursachen?
d. Wie viele Instruktionen pro Sekunde verarbeitet der Prozessor, wenn 50% der verarbeiteten
Sprünge durch eine Sprungvorhersage korrekt vorhergesagt wurden? Bei einer korrekten
Vorhersage gibt es keine Pipeline-Stalls, während falsche vorhergesagte Sprünge 2 Pipeline-
Stall-Takte verursachen.
5. Aufgabe
Warum werden Daten- und Programm-Caches bei Prozessoren eingesetzt? Welches Problem wird
durch die Caches gemildert?
3. 6. 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, 2
2 addi r3, r0, 3
3 add r4, r0, r0
4 add r1, r1, r2
5 add r2, r2, r2
6 sub r2, r0, r2
7 addi r4, r4, 1
8 ble r4, r3, -4
9 halt
Welche Werte sind in den Register r1, bis r4 gespeichert, wenn der Prozessor den halt-Befehlt erreicht
hat? Wie oft wird die Sprunganweisung „ble r4, r3, -4“ (Anweisung Nr. 8) verarbeitet? Wie oft wird die
Anweisung Nr. 1 verarbeitet?
7. 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 199 bis 204 seien 0):
Adresse Speicherinhalt Speicherinhalt
Vorher Nachher
… 0
199 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 store r3, 199(r1)
6 addi r1, r1, 1
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 199 bis 204?
4. 8. Aufgabe
Wandeln Sie die folgende Java-Programmsequenz in ein entsprechendes Maschinenprogramm für den
RUN10000 um.
int i = 1;
int sum = 0;
do {
if (i < 100)
sum += 2*i;
else
sum += i;
} while (++i < 1000);
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.
9. Aufgabe
Welche Ausgabe erzeugt die folgende Java-Programmsequenz auf dem Bildschirm:
int i = 1;
int sum = 0;
for ( ; i < 10; i += i) {
sum += i;
i += 1;
}
System.out.println(sum + " " + i);
Wie oft wird der Rumpf der „For“-Schleife in dieser Programmsequenz ausgeführt?
10. Aufgabe
Erzeugen Sie eine Java-Programmsequenz, die das Ergebnis der mathematische Formel
berechnet. Verwenden Sie NICHT die mathematische Library-Funktion „Math.Pow“!
5. 11. Aufgabe
Gegeben sei die nachfolgende Klassendefinition:
class Test {
public int[] value = null;
public Test(int i) {
this.value = new int[i];
for (int j = 0; j < i; j++)
this.value[j] = i;
}
public int calc(Test a, Test b) {
int sum = 0;
for (int i = 0; i < a.value.length; i++)
sum += a.value[i];
for (int i = 0; i < b.value.length; i++)
sum += b.value[i];
return sum;
}
}
Basierend auf diesem Klassen-Code wurde nun ein Hauptprogramm erstellt, welches die folgende
Programmsequenz enthält:
Test x = new Test (2);
Test y = new Test (3);
System.out.println(x.calc(x, y));
System.out.println(y.calc(y, x));
Welche Ausgabe erzeugt diese Programmsequenz auf dem Bildschirm? Was passiert, wenn man die
Sequenz etwas abändert (siehe unten) und laufen lässt?
Test x = new Test (2);
Test y = new Test (4);
Int[] v = new int[] { 1, 1, 1, 1, 1 };
System.out.println(x.calc(x, y));
y.value = v;
System.out.println(x.calc(x, y));
6. 12. Aufgabe
Entwickeln Sie eine Klasse „Vec3D“, welche zur Speicherung von dreidimensionalen Vektoren genutzt
werden kann.
Erzeugen Sie zunächst passende Member, um die drei Koordinatenwerte aufnehmen zu können. Die
Koordinatenwerte sollen hierbei als Fließkommazahlen abgelegt werden und öffentlich zugänglich sein:
class Vec3D {
// Member bitte
// hier einfügen
…
}
Erstellen Sie als nächstes eine Methode „length“, die von jedem aufgerufen werden kann (öffentlich
zugänglich) und keine Aufrufparameter übergeben bekommt. Die Methode soll die Länge des Vektors als
Rückgabewert zurück geben. Bitte tragen Sie auch den Funktionskopf ein!
{ // Tragen Sie auch den
// Funktionskopf ein!
}
Erstellen Sie eine öffentlich zugängliche Methode „add“, die als Parameter einen Objekt vom Typ
„Vec3D“ übergeben bekommt und diesen Vektoren zum aktuellen Vektor hinzuaddiert! Hinweis: Zwei
Vektoren werden addiert, indem man die entsprechenden Koordinatenwerte summiert.
{ // Ergänzen Sie auch den
// Funktionskopf ein!
}
Erstellen Sie einen Konstruktor, der die Initialisierungswerte für die drei Koordinaten als Parameter
übergeben bekommt.
Vec3D( ) { // Aufrufparameter Definieren
}
Erstellen Sie als nächstes eine Konstruktor, der zwei „Vec3D“-Objekte als Parameter übergeben
bekommt und den aktuellen Vektor mit der Summe aus den beiden Parametervektoren initialisiert. Nutzen
Sie dazu die oben definierte Methode „add“.
7. Vec3D ( ) // Ergänzen sie auch den
{ // Methodenkopf!
}
Mit Hilfe der eben erstellten Klasse werde nun in einem Hauptprogramm der nachfolgende
Programmcode ausgeführt. Was gibt die Routine auf dem Bildschirm aus? Hinweis: Sie brauchen den
ausgegebenen Zahlenwert nicht auszurechnen (die Angabe der entsprechenden Formel reicht aus)!
public static void test ()
{
Vec3D a = new Vec3D(1, 2, 3);
Vec3D b = new Vec3D(3, 2, 1);
Vec3D c = new Vec3D(a, b);
a.add(b);
a.add(c);
System.out.println(a.length());
}
8. Anhang A: Kurzbeschreibung des Prozessors RUN1000
Soweit in der Aufgabenstellung nicht anders angegeben, besitzt der Prozessor RUN10000 die
folgenden Eigenschaften:
Der Prozessor besitzt 32 Register r0, r1, … r31. Das Register r0 ist hierbei immer 0, das
Register r31 ist der Programcounter PC. Alle Register sind 32 Bit groß.
Soweit nicht anders angegeben führt der Prozessor alle arithmetischen Berechnungen
(auch die Berechnungen zur Ermittlung einer Speicheradresse) vorzeichenbehaftet
durch.
Wenn nicht anders angegeben, besitzt der Prozessor keinen Branch-Delay-Slot.
Wenn nicht anders angegeben, nutzt der Prozessor kein Pipelining.
Wenn nicht anders angegeben, sind in Maschinenprogrammen alle Zahlenkonstanten
in Dezimalnotation angegeben.
Im Folgenden sind die verfügbaren Befehle des RUN10000 aufgelistet. „ra“, „rb“ und
„rc“ stehen für beliebige Register r0 bis r31. „offset“ und „imm“ stehen für
Zahlenkonstanten.
Befehl Bezeichnung Beschreibung
load ra, offset(rb) Lade indirekt mit Lade das Register ra mit dem Inhalt der
offset Hauptspeichers von der Adresse
(rb + offset)
store ra, offset(rb) Speicher indirekt Speichere den Inhalt des Register ra in
mit offset den Hauptspeicher an die Adresse
(rb + offset)
add ra, rb, rc Addiere ra = rb + rc
sub ra, rb, rc Subtrahiere ra = rb – rc
addi ra, rb, imm Addiere mit ra = rb + imm
Immediate
subi ra, rb, imm Subtrahiere mit ra = rb – imm
Immediate
and ra, rb, rc Bitweise ra = rb & rc
Verundung rb und rc werden bitweise und-verknüpft
or ra, rb, rc Bitweise ra = rb | rc
Veroderung rb und rc werden bitweise oder-
verknüpft
bne ra, rb, offset Branch not equal Springe nach PC + offset, falls ra != rb
beq ra, rb, offset Branch equal Springe nach PC + offset, falls ra == rb
bgt ra, rb, offset Branch greater Springe nach PC + offset, falls ra > rb
than
bge ra, rb, offset Branch greater Springe nach PC + offset, falls ra >= rb
equal
blt ra, rb, offset Branch less than Springe nach PC + offset, falls ra < rb
ble ra, rb, offset Branch less Springe nach PC + offset, falls ra <= rb
equal