Nennen Sie Ursachen, wodurch in der Fließkommaarithmetik Ungenauigkeiten oder Fehler ent-
stehen können
- Rundungsfehler: durch begrenzte Bit Anzahl muss bei Rechnungen gerundet werden, was zu Ungenauigkeiten führt
- Darstellungsfehler: Manche Zahlen können durch Fließkommazahlen nicht genau dargestellt werden z.B. 0,1
Was für eine Ausgabe erhalten wir hier?
int a = 1;
std::cout << (1 + a -- ) << std::endl;
std::cout << a << std::end;
2
0
Wie löscht man ein mittels int* p = new[10]; erzeugtes dynamisches Feld?
delete[] p
Was ist der Unterschied zwischen "call by value" und "call by reference"
call by value: Wert der Argumente wird in neue Varablen kopiert, die an anderer Stelle gespeichert sind
call by reference: Variablen in Funktion beziehen sich auf den selben Speicherort wie Argument
Geben sie 71 (dezimal) als Hexadezimalzahl an
47 (hex)
Wann ist ein Algorithmus deterministisch?
In jedem Schritt ist bekannt, welcher Schritt als
nächstes ausgeführt wird
Wo liegt hier der Fehler?
const int n = 5;
int feld[n] = {1, 2, 4, 5, 6};
for (int i = 0; i <= n; i++)
{
std::cout << feld[i] << std::endl;
}
Die Schleife zählt ein Wert zu weit und es wird auf Speicher außerhalb des Feldes zugegriffen (undefiniertes Verhalten)
Wie erzeugt man ein Feld auf dem Heap der Größe 5 und initialisiert es mit aufsteigenden Werten von 0 bis n
int* x = new int[5];
for(int i= 0; i < 5; i++){
x[i] = i;
}
Nenne Nachteile davon viele globale Variablen zu definieren und welche Alternativen man hat
Nachteile:
- unübersichtlich (Unbeabsichtigte Änderung eines Wertes)
- Fehlersuche schwieriger, da Daten von mehr Orten verändert werden können
- Nicht so gut als Gesamtpaket wiederverwendbar
- Nicht gut skalierbar
Alternativen:
- Werte der Variablen übergeben
- Pointer/Referenz auf Variablen übergeben
- Daten und Operationen in Klasse zusammenfassen
- keine extra Funktion anlegen
Geben sie 471 (dezimal) als Hexadezimalzahl an
1D7
Erkläre den Unterschied zwischen einem linear Iterativen und einem linear rekursiven Verfahren
linear Rekursiv:
• Selbstaufruf bevor tatsächliche Rechnung
fertig ist
• Mehrer „Instanzen“ der Funktion staffeln
sich auf dem Speicher
Linear Iterativ:
• Selbstaufruf nachdem tatsächliche
Rechnung fertig ist, Ergebnis wird
weitergegeben
• Vorherige „Instanz“ kann geschlossen
werden (keine Staffelung)
Wo liegt hier der Fehler:
int function_call(int* y){
*y = *y * *y;
return *y;
}
int main(){
int* x = new int;
*x = 7;
int result = function_call(x);
}
Der dynamisch allokierte Speicher wird nicht wieder freigegeben
Geben sie die Komplexität in O-Notation für das Zugreifen auf einen Wert an bekanntem Index in einem Feld?
O(1)
Was kann passieren wenn eine Variable gelöscht wird und man anschließend den Pointer auf die Variable dereferenziert
Entweder Segementation fault (Programm stürzt ab) oder man ließt Wert von der Speicherstelle
Wandele (a * b) + (c - q) in Präfixschreibweise um
+(*(a, b), -(c, q))
Welche Vorteile bieten struct/class und in welchen Aspekten unterscheiden sie sich
- Definition einer Schnittstelle
- Organisation von Daten und Operationen in einem Objekt
- Übersichtlich und einheitlich
- Kapselung und Abstraktion
Unterschiede:
- struct Attribute standardmäßig public, class standardmäßig private
- Beide fast identisch
Wo liegt hier der Fehler?
{
const int n = 5;
int feld[5];
feld[1] = 7.3;
feld[0] = 5;
feld[1] = feld[3];
}
Zugreifen auf uninitialisierten Wert
Geben sie die Komplexität in O-Notation für die Suche nach dem n-ten Element in einer einfach verketteten Liste an (keine Optimierungen vorgenommen)
O(n)
int f = 9;
int blub() { f--; }
int bla(short m)
{ m = 7;
int y = 4;
if(y%2 == 0)
{ blub(); y = 2*x; }
if(y%2 == 0) { blub();
//An diesem Punkt das Umgebungsmodell angeben } return f;
}
int main()
{ short m = 10; bla(m); }
Tafel
Gebe die Binärdarstellung von 34 an.
100010
Was ist der Unterschied zwischen Definition, Deklaration und Initialisierung in Bezug auf Funktionen/Variablen
Deklaration:
- Informiert Compiler über Existenz und Typ eines Objekts
- z.B. void fun();
Definition:
- alle notwendigen Informationen um Speicher für das Objekt zu erstellen
- Definition gibt mehr Informationen als Deklaration
- z.B. void fun() { /* ... */ }
Initialisierung:
- Zuweisung eines Anfangswertes zum Zeitpunkt der Erstellung
- z.B. int a = 5;
Schreibt eine ggT Funktion, die zur Eingabe a und b den größten gemeinsamen Teiler zurückgibt
int ggt(int a, int b)
{
while (b != 0)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}
Geben Sie eine EBNF Grammatik an, die ein beliebiges Inhaltsverzeichnis bestehend aus Titel und den (nummerierten) Unterpunkten für die jeweiligen Kapitel erzeugt. Es soll mindestens ein Kapitel geben. Was kann durch die Regeln der Grammatik nicht garantiert werden? Als Terminalsymbole steht die Menge T := {A, ..., Z, a, ..., z, 0, ..., 9, ., "newline", -}
(- steht für ein Leerzeichen)
Tafel
int bal(short* j)
{ *j = 54;
//An diesem Punkt das Umgebungsmodell angeben return 18;
}
int main()
{ int y = 7;
short s = 7;
int* p = &y;
*y = 3;
y = bla(&s);
}
Tafel
Addieren sie die Zahlen 12 und -17 im Zweierkomplement
01100 (12)
10001 (17)
01111 (-17)
##
01100 (12)
+ 01111 (-17)
11011 = Einerkomp: 11010 = - 00101 = -5