Wissensfragen
Code-Aufgabe
Anwendung
Umgebung
Rechnen
100

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

100

Was für eine Ausgabe erhalten wir hier?
int a = 1;
std::cout << (1 + a -- ) << std::endl;
std::cout << a << std::end;

2
0

100

Wie löscht man ein mittels int* p = new[10]; erzeugtes dynamisches Feld?

delete[] p

100

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

100

Geben sie 71 (dezimal) als Hexadezimalzahl an

47 (hex)

200

Wann ist ein Algorithmus deterministisch?

In jedem Schritt ist bekannt, welcher Schritt als
nächstes ausgeführt wird

200

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)

200

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;

    }

200

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

200

Geben sie 471 (dezimal) als Hexadezimalzahl an

1D7

300

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)

300

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

300

Geben sie die Komplexität in O-Notation für das Zugreifen auf einen Wert an bekanntem Index in einem Feld?

O(1)

300

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

300

Wandele (a * b) + (c - q) in Präfixschreibweise um

+(*(a, b), -(c, q))

400

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

400

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

400

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)

400

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


400

Gebe die Binärdarstellung von 34 an.

100010

500

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;

500

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;

}

500

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

500

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

500

Addieren sie die Zahlen 12 und -17 im Zweierkomplement

01100 (12)

10001 (17)

01111 (-17)

##

   01100 (12)

+ 01111 (-17)

11011 = Einerkomp: 11010 = - 00101 = -5

M
e
n
u