Sie sind auf Seite 1von 7

• Variablen: Wechselnde Werte, besitzen: Name, • L-Werte: Ausdruck mit: Adresse, Wert, Na- Flag Beschreibung

Typ, Wert, Adresse men Typ, Wert, Effekt (potentiell) volatile Für Optimierungszwecke
register Variable wird in Prozessorregister
anstelle des RAM’s gespeichert,
Informatik I dadurch ist der Zugriff schnell.
• R-Werte: Alle L-Werte können als R-Werte, static Variable ist global gespeichert für
Dominik Werner aber nicht umgekehrt, verwendet werden. Kann die Dauer der Ausführung.
seinen Namen nicht ändern (Bsp.: Literal) mutable Variable kann von const-
dowerner@student.ethz.ch • Literale: Konstante Werte (fester Typ)
Funktionen editiert werden.
• Operatoren: Verknüpfen Ausdrücke zu neuen extern Definiert, dass eine Variable an ei-
19. August 2014 nem anderen Ort deklariert ist.
Ausdrücken.

Operatoren Präzedenz
Datentypen
Programmbestandteile

Beschreibung
• Konstanten: ”Variablenmit unveränderbarem

Assoziation
Wert Typ Grösse Bereich

Präzedenz

Operator
char 1 Byte −128 bis 127
– Es ist üblich, die nicht verändert werden short 2 Bytes −320 768 bis 320 767
müssen als Konstanten zu definieren int 2/4 Bytes oben/unten
→ Constcorrectness −20 1470 4830 648 bis
long int 4 Bytes
20 1470 4830 647 1 :: Scope resolution →
• Bezeichner und Namen: Erstes Zeichen, im- bool 1 Byte 0/1 ++ -- Suffix/postfix Ink/Dek
mer ein Buchstabe. Erlaubt: AZ, az, 09, float 4 Bytes 1.2e − 38 bis 3.4e38 type() Function-type-cast
• Kommentare/Layout: Spielen für den Compi- Qualifizierter Name: double 8 Bytes 2.2e − 308 bis 1.8e308 () Funktionsaufruf
ler keine Rolle (nur zu Übersichtszwecken) 2 →
• Objekte: Repräsentation eines Speicherwertes long double 12 Bytes [] Array-Subscript
(mit oder ohne Namen), haben immer: Typ, wchart t 2 Bytes −320 768 bis 320 767 . Selek. über Ref.
• Include-Direktiven: So werden externe Re- Adresse, Wert void - kein Typ -> Selek. über Ptr.
sourcen eingebunden → Grössen von Typen hängen von der Plattform ++ -- Prefix Ink/Dek
ab (x86, x64). + - Unary plus, minus
Allgemein gilt: sizeof(char)==2 ≤ short ≤ int ≤ ! ~ logisch NOT, bitweise NOT
– Um Methoden einer bestimmten Klasse ein- long int ... (type) C-Style Typecast
facher aufrufen zu können, kann ein using- 3 * Dereferenzieren ←
statement verwendet werden. unsigned: Bewirkt, dass keine negativen Werte & Adress-Operator
möglich sind ⇒ doppelter positiver Wert sizeof Grösse (in Bytes)
• main-Funktion: Wird beim Programmstart new Dynamic memory alloc.
ausgeführt. delete Dynamic memory dealloc.
Inline Typen-Spezifikation 4 .* -> Pointer to member →
5 * / % Mult, Div, Modulo →
6 + - Addition, Subtraktion →
7 << >> Bitwise Shift →
< <= Relationsop. < und ≤
• Werte, Effekte: Bestimmen, was das Programm 8 →
> >= Relationsop. > und ≥
macht. 9 == != Relationsop. = und 6= →
10 & Bitwise AND →
Variablen Deklaration 11 ^ Bitwise XOR →
12 | Bitse OR →
13 && Logisch AND →
14 || Logisch OR →
• Typen und Funktionalität: Jeder Typ in C++
? bedingte Zuweisung
hat einen Wertebereich und eine Funktionalität.
= direkte Zuweisung
• Literale: Konstante Werte (fester Typ) += -= Summen/Differenz Zuwei.
15 ←
*= = %= Prod./Div./Mod. Zuwei.
• Ausdrücke Expressions: Repräsentieren Be- <<= >> = Shift Zuweisung
rechnungen, haben: Typ, Wert, Effekt (poten- &= ∧= |= AND/OR/XOR Zuwei.
tiell) 16 throw Throw Operator ←
17 , Komma →
Inkrement/Dekrement etc. Const-Regeln

Syntax
Aliase
IF/ELSE

Pointer und Referenzen Aliase können verwendet werden um Datentypen


etwas kürzer schreiben zu können:

Arrays
Bedingte Rückgabe
Mit den Operatoren ? : kann eine bedingte
Rückgabe realisiert werden: Vektor-Iteratoren

Die vector-Klasse, gibt dem Programmierer


Iteratoren an die Hand um einfach auf das
Der Index beginnt jeweils bei 0. Ein Array kennt erste und das letzte Element zuzugreifen.
SWITCH seine Länge nicht. Vergleiche zwischen Arrays sind
nicht möglich und müssen elementweise durch-
Pointer Vergleiche geführt werden.
Wenn Pointer auf Gleichheit überprüft werden, lie-
fern diese genau dann true, wenn beider auf diesel-
be Adresse zeigen. Wenn ihre Objekte dieselben Mehrdimensionale Arrays
Werte haben, aber nicht die gleichen Objekte sind,
liefert der Vergleich false.
Schleifen
Pointer und Arrays
Im Grunde genommen, sind Arrays Pointer auf das Strings als Arrays
erste Element des Arrays.
Strings sind als Char-Arrays darstellbar:

FOR-Schleife
möglich ist auch:

Nullpointer Zur Sicherheit, sollten Vektoren mittels Hilfsarray


Kann nicht dereferenziert werden, prüfbar zur Lauf- ABER: Strings können nicht zu Char-Arrays initialisiert werden, da dies im alten wie auch im
While-Schleife zeit. neuen C++ Standard funktioniert. Hierbei gilt aa
konvertiert werden:
== a.begin() und aa+4 == a.end().

Pointer-Arithmetik Strings sind nicht primitiv (aber auch keine wirkli- Referenzen
Durch Addition, kann von Speicherstelle zu Spei- chen Vektoren):
Do-While-Schleife cherstelle gesprungen werden, dabei wird nicht Const-Objekte können nur const-Referenzen zuge-
Byteweise gesprungen, sondern der Grösse des Da- wiesen werden!
Rumpf wird mindestens einmal ausgeführt. Einzi- tentyps entsprechend.
ge Schleife, bei der ein ; am Ende notwendig ist!
Vektoren
Subtraktion von 2 Pointern, gibt den Abstand
im Speicher zurück (dh. Anzahl Objekte dazwi- Vektoren sind KEINE Primitives und kennen ihre
schen). Grösse.
Funktionen Structs

Structs stellen nicht-primitive Datentypen dar. Sie


können Methoden und Membervariablen enthalten,
aber keine Zugriffs-Restriktionen (Klassen).

Funktionen können nur NACH ihrer Deklarati-


on verwendet werden. ABER sie können auch erst
weiter unten definiert werden, wenn sie deklariert
sind:

Templates (Generics)

Mittels Templates können Funktionen für verschie-


dene Datentypen verwendet werden:

C-Assert

Kann verwendet werden um Pre-Conditions zu


überprüfen, bricht das Programm ab (Exception) Speicherallokation und -deallokation
falls nicht erfüllt:

new und delete gehören konzeptionell immer zu-


sammen.

Call by Value/Call by Reference

• Call by Reference: Es wird nicht das Objekt,


sondern nur die Referenz übergeben. Änderungen
innerhalb der Funktion, wirken sich auf das Ob-
jekt aus.
Operatoren können auch in Klassen und Structs
Überladen von Funktionen selber überladen werden. ABER: Sie haben einen
Parameter weniger, da JEDE Funktion in einer
Funktionen können mehrfach definiert werden, falls Klasse/Struct, implizit mit dem this Pointer auf-
sich ihre Rümpfe unterscheiden. Auf diese Weise, gerufen wird: • Call by Value: Die Parameter werden kopiert,
kann eine Funktion für mehrere Datentypen defi- Änderungen innerhalb der Funktion, wirken sich
niert werden: nicht auf das Orginalobjekt aus.

Klassen
Funktionen können auch Referenzen als
Rückgabetyp haben, sollten dann aber auch Call
Überladen von Operatoren
by Reference sein!
Klassen sind dynamische Datentypen wie Structs,
C++ unterstützt das Überladen von Operatoren Um Performance zu sparen, können Referenzen bieten aber die Möglichkeit, zum Informationhi-
(+,-,*,/,..): verwendet werden, damit nicht jedes Mal eine ding, dh. man kann Zugriffsparameter festlegen.
Kopie des Objekts erstellt werden muss.
– friend → Nur friends haben Zugriff. Binäre Darstellung
Zweierkomplement

Zahl negieren durch: −x = ¬x + 1


Beispiel:

Falls MSB eine 1 ist, ist die Zahl immer


NEGATIV!!!
Beispiel:
0000 1010(2) = 10(10) 1010(2) = −6(10)
| {z } | {z }
8Bit 4Bit

Zurückrechnen: x =6= (−x − 1)


Beispiel:

Kopierkonstruktor

Abstrakte Klassen und Methoden

Der Kopierkonstruktor einer Klasse A ist der ein- Abstrakte Methoden können definiert werden, da- Most (MSB) & Least (LSB) Significant Bit
deutige Konstruktor mit der Deklaration A(const mit eine Methode nicht in der Basisklasse, sondern
in den Subklassen realisiert werden muss. Ein MSB: Bit mit grösstem Stellenwert
A& x); LSB: Bit mit kleinstem Stellenwert
Er wird automatisch aufgerufen, wenn Werte vom Subklassen können auch Methoden in der Ba- Klasse mit einer Abstrakten Methoden, wird selbst
sisklasse überschreiben und so ersetzten, allerdings Abstrakt und kann nicht mehr instanziert werden! 10010101
Typ A mit Werten vom Typ A initialisiert werden.
Falls kein Kopierkonstruktor definiert wurde, wird ist es hierzu notwendig, dass in der Basisklasse
implizit einer angenommen, der mitgliedweise in- das Keyword virtual vor die Methode geschrieben In den Subklassen, müssen alle abstrakten Me- Rechnen im Dualsystem
itialisiert. wird, da sonst wenn die Subklasse als einem Pointer thoden implementiert werden!
des Types der Basisklasse zugewiesen wird, nicht Beide Zahlen müssen die GLEICHE Anzahl
die Methode der Subklasse aufgerufen wird. Bits haben!
→ 1100
| {z0101} − 0110
| {z } ⇒ 1100
| {z0101} − 0000
| {z0110}
8Bit 4Bit 8Bit 8Bit
Destruktor

Der Destruktor wird mit dem delete Keyword auf-


Addition
gerufen. In ihm kann festgelegt werden, was alles
gelöscht werden muss. Auch der Destruktor kann Binärzahlen werden nacheinander addiert:
implizit angenommen werden.
Dieses Verhalten heisst Polymorphie (Mehrdeu-
tigkeit).

• Zugriff: Mit diesen Operatoren, kann festgelegt


Vererbung werden, was von wo aus verfügbar ist. Generell
gilt: Möglichst wenig nach Aussen Sichtbar zu Subtraktion
machen (Abstraktion, Kapselung):
Binärzahlen werden mittels Addition des Zweier-
– public → Von Extern alles Zugreifbar. komplements subtrahiert:
Klassen können von anderen Klassen vererbt
werden, dadurch haben die Subklassen die Eigen- – private → Nur in der Klasse selber zugreifbar.
schaften der Basisklasse und könne diese auch
erweitern. Sie können allerdings nicht auf Private – protected → Subklassen und friends haben
Member aus der Basisklasse zugreifen. zugriff.
Multiplikation – 52 Bit Mantisse (ohne führendes Bit) Wichtige Zahlensysteme
Binärzahlen werden stellenweise addiert und dann
multipliziert: – 11 Bit für den Exponenten (2046 Exponenten, Binär Octal Dezimal HEX
2 Spezialwerte: 0, ∞, ...) 0000 0 0 0
0001 1 1 1
0010 2 2 2
0011 3 3 3
Codierung 0100 4 4 4
0101 5 5 5
0110 6 6 6

Excess-3
3. Vorkommazahl und Nachkommazahl addieren:

O’Brian
Division 0111 7 7 7

4-2-2-1
101 + 010111101
| {z } = 101.010111101

Aiken
Binär
1000 10 8 8

BCD
HEX

Gray
DEZ
|{z}
Binärzahlen werden mittels Modulo Operation di- 5 0.37 1001 11 9 9
vidiert, wobei dies beim MSB beginnt und dann je- 1010 12 10 A
4. Normalisieren: 5.3710 = 1.010101111012 · 22
weils der Rest vor jede weitere Stelle angefügt wird: 0 0 0000 0 0 0 -3 0 1011 13 11 B
Addition/Subtraktion 1 1 0001 1 1 1 -2 1 1100 14 12 C
2 2 0010 2 3 2 -1 0 2 1101 15 13 D
Wie bei normalen Binärzahlen, wobei es wichtig ist,
3 3 0011 3 2 3 0 3 1110 16 14 E
dass beide Zahlen den selben Exponenten haben.
4 4 0100 4 7 4 1 4 1111 17 15 F
→ De-normalisieren
5 5 0101 5 6 2 3
Richtlinien für Fliesskommazahlen 6 6 0110 6 4 3 1 4
7 7 0111 7 5 4 2 5 Zweierpotenzen
• Regel 1: Teste keine zwei Fliesskommazahlen auf
Fliesskommazahlensysteme 8 8 1000 8 15 5
Gleichheit!
Stattdessen überprüfen, ob sich ein Wert inner- 9 9 1001 9 14 6 20 1 2−1 0.5
halb einer gewissen Toleranz befindet. 10 A 1010 12 7 9 21 2 2−2 0.25
F ∗ (β, p, emin , emax ) b0 .b1 b2 b3 b4 · β e
11 B 1011 13 5 8 22 4 2−3 0.125
12 C 1100 8 6 9 5 8 23 8 2−4 0.0625
• β ≥ 2, die Basis: Gibt das Zahlensystem an 13 D 1101 9 7 10 6 9 24 16 2−5 0.03125
(zB.: Binär). 14 E 1110 11 8 11 8 25 32 2−6 0.015625
15 F 1111 10 9 12 7 26 64 2−7 0.0078125
• p ≥ 1, die Präzision: Anzahl Stellen, das Vor-
zeichenbit kommt beim Zweierkomplement noch 27 128 2−8 0.00390625
dazu! 28 256 2−9 0.001953125
29 512 2−10 0.0009765625
• emin , der kleinste Exponent Eigenschaften 210 1024
• Regel 2: Vermeide die Addition von Zahlen sehr 211 2048
• emax , der grösste Exponent unterschiedlicher Grösse! 212 4096
• Gray: keine Hazards beim linearen Zählen (nur 213 8192
Normalisierte Darstellung: • Regel 3: Vermeide die Subtraktion von Zahlen 1 Bit Schritte) 214 16384
sehr ähnlicher Grösse!
4 215 32768
| {z } ·2 = 10110.01
1.011001
M atisse Float / Double (IEEE Standard 754) 216 65536
• BCD: Binary coded digit → Ziffern
• Single precision (float) Zahlen:
Umrechnung: Dezimal → Binär Algorithmen und Datenstrukturen
F ∗ (2, 24, −126, 127) (32 Bit)
• 9er-Komplement durch invertieren: Exc3, Aiken
1. Vorkommastelle von der Zahl subtrahieren und
als Binärzahl darstellen: – 1 Bit für das Vorzeichen
Ägyptische Multiplikation
– 23 Bit Mantisse (ohne führendes Bit)
• Einschrittige Codes (Hazard-frei): O’Brian, Gray
– 8 Bit für den Exponenten (256 Werte, 254 Ex-
2. Für die negativen Stellen, binäre Expansion ponenten, 2 Spezialwerte: 0, ∞, ...)
durchführen: • Einschrittige, zyklische Codes: O’Brian, Gray
• Double precision (double) Zahlen:
F ∗ (2, 53, −1022, 1023) (64 Bit)
(
1 x0i ≥ 1
bi = • Kein Wert bei Speisungsausfall (0000): Excess-3,
0 x0i < 1
– 1 Bit für das Vorzeichen O’Brian
Ackermann-Funktion Insertion Sort Heap Sort Quick Sort

Best Average Worst



n + 1
 m=0 Best Average Worst Aufwand:
Aufwand: n log(n) n log(n) n2
f (m, n) = f (m − 1, 1) m > 0, n = 0 n n2 n2

f (m − 1, f (m, n − 1)) m > 0, n > 0

Best Average Worst
Aufwand:
n log(n) n log(n) n log(n)
Werte von f(m,n)
m/n 0 1 2 3 4
0 1 2 3 4 5
1 2 3 4 5 6
2 3 5 7 9 11
3 5 12 29 61 125

Merge Sort

Best Average Worst


Backtracking Aufwand:
n log(n) n log(n) n log(n)
Beim Backtracking, geht es meist um Rekursive
Algorithmen, die ab einem bestimmten Punkt
abbrechen können und auf einer früheren Ebene
fortfahren.

Bäume

Sortieralgorithmen
Bubble Sort
Darstellung: A(B(D(I, J, K), F ), C(G, H))
Best Average Worst
Aufwand: Wurzelbäume
n n2 n2

Baum Isomorph Isomorph als Wurzelbaum


W1 x
W2 x
W3 x x
W4 x x
Ebene Wurzelbäume PreOrder/InOrder/PostOrder: Heap stappelt”werden und mit der pop() Funktion An-
gefangen, beim neuesten Element wieder abbauen
Bei einem Min-Heap ist das Kleinste Element zu-
und gleichzeitig die Werte zurückgeben.
oberst und die Kinder sind jeweils grösser (analog
dazu Max-Heap).

W 1 und W 2 sind beides Isomorphe Wurzelbäume,


Aber nicht ebene isomorphe Wurzelbäume.
Syntaxdiagramme
Binäre Bäume
Binäre Bäume bestehen aus Knoten, welche maxi- Einfügen:
mal 2 Kinder haben.
1. Neues Element zuunterst einfügen.
2. Element mit Vater vergleichen und tauschen, Coding Samples
falls Vater grösser ist.
Linked List
3. Element ”hinaufwandern lassen”, bis der Vater
kleiner ist.

Binäre Suchbäume

Delete:

1. Oberstes (kleinstes) Element entfernen und


Operatorbäume
grösstes Element an die Stelle.
Bei binären Suchbäumen ist jeweils das linke Kind
kleiner als der Vater und das rechte Kind grösser 2. Oberstes Element mit den Kindern vergleichen
als der Vater. und mit dem kleineren tauschen.
3. Wiederholen, bis das Element an seinem Platz
ist.

Stack (LIFO)
Ein Stack oder LIFO (Last In First Out), speichert
Daten welche durch die push(a) Funktion äufge-

Das könnte Ihnen auch gefallen