Sie sind auf Seite 1von 21

Kapitel 2

Kapitel 2: Darstellung von Information


Inhalt
Einfache Datentypen

Einfhrung in die Programmierung

Zahldarstellungen im Rechner

Wintersemester 2011/12

Bezeichner
Datendefinition, Zuweisung, Initialisierung
Erste Programme
Exkurs: Grammatiken

Prof. Dr. Gnter Rudolph

Zusammengesetzte Datentypen

Lehrstuhl fr Algorithm Engineering

- Feld (array)

Fakultt fr Informatik

- Verbund (struct)

TU Dortmund

- Aufzhlung (enum)
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
2

Kapitel 2

Wiederholung

Realisierung eines Programms

Kapitel 2

Darstellung von Information

Notwendig fr Programmierung:

Problemanalyse

Ausschnitte der realen Welt mssen im Rechner abgebildet werden knnen!

Spezifikation
Algorithmenentwurf

Dazu gehren etwa Daten in vielerlei Form!

Formulierung eines Programms

Bestimmte Formen dieser Daten haben gemeinsame, typische Eigenschaften!


Programm
(in C/C++)

Compiler

AssemblerProgramm

Assemblierer

MaschinenProgramm

Solche werden zusammengefasst zu so genannten Datentypen.

Ausfhrung erfolgt mit Hilfe des Laufzeitsystems

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


3

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


4

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Unterscheidung:

Wie werden Zahlen im Rechner dargestellt?

Einfache Datentypen

Bit { 0, 1 }

sind elementar bzw. nicht auf andere Typen zurckfhrbar.

8 Bit = 1 Byte
Speicher im Rechner = lineare Folge von Bytes bzw. Bits

Beispiel: positive ganze Zahlen

Duales Zahlensystem:
n Bits: (bn-1 bn-2 b2 b1 b0) mit bk { 0, 1 }

Zusammengesetze Datentypen

2n mgliche Kombinationen (= verschiedene Zahlen)

entstehen baukastenartig durch Zusammensetzen


von einfachen Datentypen.

Umwandlung in Dezimalzahl:

Beispiel: ein Paar aus zwei positiven ganzen Zahlen

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


5

Kapitel 2

Darstellung von Information


Einfache Datentypen

Byte

Kapitel 2

Darstellung von Information

Negative Zahlen?
Gleicher Vorrat an verschiedenen Zahlen!

Ganzzahlen ohne Vorzeichen (unsigned)


Bit

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


6

Vorrat muss anders aufgeteilt werden!

Wertevorrat

Name in C/C++

0 255

unsigned char

16

0 65 535

unsigned short int

32

0 ... 4 294 967 295

unsigned int

32

0 ... 4 294 967 295

unsigned long int

Naiver Ansatz:
Man verwendet n-1 Bit zur vorzeichenlosen Zahldarstellung
Das ergibt Zahlen im Bereich 0 2n-1-1, also 0 bis 127 fr n=8
Bit n reprsentiert das Vorzeichen: 0 = positiv, 1 = negativ
Bei n = 8 ergibt das Zahlen im Bereich -127 bis 127
so

Probleme:
Die Null zhlt doppelt: +0 und -0

ACHTUNG: Wertebereiche rechnerabhngig! Hier: PC mit Pentium IV.


G. Rudolph: Einfhrung in die Programmierung WS 2011/12
7

nicht!

Eine mgliche Zahldarstellung wird verschenkt!


G. Rudolph: Einfhrung in die Programmierung WS 2011/12
8

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Negative Zahlen?

Bitreprsentation von negativen Zahlen:

Gleicher Vorrat an verschiedenen Zahlen!

Man muss nur das Stellengewicht des hchstwertigen Bits negativ machen!

Vorrat muss anders aufgeteilt werden!


unsigned char
0

Bit

unsigned

128

64

32

16

signed -128

64

32

16

255

Beispiel: 101010012 = -128 + 32 + 8 + 1 = -87


0

-128

127

Mit Bit 0 6 sind Zahlen zwischen 0 und 127 darstellbar.


Falls Bit7 = 0 )
0 bis 127
Falls Bit7 = 1 ) -128 bis -1

signed char
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
9

Kapitel 2

Darstellung von Information

unsigned

signed

127

127

128

-128

129

-127

130

-126

255

-1

Kapitel 2

Darstellung von Information

Bitreprsentation von Ganzzahlen mit Vorzeichen: (n = 8)

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


10

Einfache Datentypen
Ganzzahlen mit Vorzeichen
Bit

Byte

Wertevorrat

Name in C/C++

-128 127

char

16

-32768 32767

short int

32

-2147483648 ... 2147483647

int

32

-2147483648 ... 2147483647

long int

ACHTUNG: Wertebereiche rechnerabhngig! Hier: PC mit Pentium IV.


G. Rudolph: Einfhrung in die Programmierung WS 2011/12
11

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


12

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Zwischenfragen:

Datendefinition (DD)

Wie werden Daten im Programm angelegt bzw. abgelegt?

unsigned int Postleitzahl;

Wie kann ich sie wieder finden und abrufen bzw. verndern?

Was geschieht?
Rechner muss angewiesen werden Speicherplatz fr Daten zu reservieren.

1. DD reserviert Speicher

Das geschieht formal im Programm durch eine Datendefinition:

2. DD legt Wertevorrat fest


3. DD ermglicht eindeutige Interpretation des Bitmusters

Angabe von Datentyp und Bezeichner.

Adresse

Daten

Name

11100110

00001001

Beispiele:

11100101

10001100

11100100

01101001

11100011

10011101

Was geschieht nicht?

11100010

11110011

DD weist keinen Wert zu!

11100001

10101000

11100000

00110001

char a;
short b;
unsigned long c;

4. DD legt zulssige Operatoren fest

Zufllige Bitmuster im Speicher! Hufige Fehlerquelle!


c

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


13

Kapitel 2

Darstellung von Information


Zuweisung

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


14

Kapitel 2

Darstellung von Information

Bezeichner

Beispiel: Postleitzahl = 44221;

Bauplan:

Vor einer Zuweisung muss eine Datendefinition stattgefunden haben!


Was geschieht?

Es drfen nur Buchstaben a bis z, A bis Z, Ziffern 0 bis 9 und der


Unterstrich _ vorkommen.

Die Zahl wird gem Datentyp interpretiert & in ein Bitmuster kodiert.

Das erste Zeichen muss ein Buchstabe oder ein Unterstrich sein.

Das Bitmuster wird an diejenige Stelle im Speicher geschrieben, die


durch den Bezeichner symbolisiert wird.

Prinzipiell keine Lngenbeschrnkung.

Initialisierung
Beispiel: unsigned int Postleitzahl = 44221;
Datendefinition mit anschlieender Zuweisung

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


15

Schlsselwrter drfen nicht verwendet werden.


Winkel
EinkomSteuer
Einkom_Steuer
einkom_Steuer
_OK
x3
_x3_und_x4_
_99
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
16

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Schlsselwrter

Schlsselwrter

sind reservierte Wrter der jeweiligen Programmiersprache!

sind reservierte Wrter der jeweiligen Programmiersprache!

auto

double

int

struct

break

else

long

switch

bool

false

protected

try

case

enum

register

typeof

const_cast

friend

public

typeid

char

extern

return

union

catch

inline

static_cast

typename

const

float

short

unsigned

class

mutable

template

using

continue

for

signed

void

delete

namespace

reinterpret_cast

virtual

default

goto

sizeof

volatile

dynamic_cast

new

this

do

if

static

while

explicit

operator

throw

Schlsselwrter der Programmiersprache C

asm

export

private

Zustzliche Schlsselwrter der Programmiersprache C++

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


17

Kapitel 2

Darstellung von Information

true

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


18

Darstellung von Information

Kapitel 2

Ganzzahlen: Binre Operatoren

Ganzzahlen: Modulo-Operator %

Addition

Operator: +

liefert den Rest der Ganzzahldivision

Subtraktion

Operator: -

aus Alltagsleben bekannt, aber selten unter diesem Namen

Multiplikation

Operator: *

Ganzzahldivision

Operator: /

Beispiel:

Modulo

Operator: %

Wertevorrat: 0:00 bis 23:59

Digitaluhr

Stundenanzeige springt nach 23 auf 0


Beispiele:

Minutenanzeige springt nach 59 auf 0

A + b;
3 * x3 - 8 / Faktor;
wert % 12;

C/C++:
unsigned int stunde, laufendeStunde = 37;
stunde = laufendeStunde % 24;
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
19

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


20

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Ganzzahlen: Hufige Fehlerquellen

Ganzzahlen: Hufige Fehlerquellen

Zahlenberlauf

Zahlenberlauf: Addition

short m = 400, n = 100, p = 25, k;


k = m * n / p;

short a = 32600, b = 200,


c = a + b;

Resultat:

Resultat: c = -32736;

k = -1021;

Programmiertes

Unheil!

Zahlenberlauf: Subtraktion

Warum?
400 * 100 ergibt 40000 zu gro fr Datentyp short (< 32768)
40000 = 1001 1100 0100 00002
Interpretation als Datentyp short: -32768 + 7232 = -25536

unsigned short m = 100, n = 101, k;


k = m n;
Resultat: k = 65535;

Schlielich: -25536 / 25 = -1021


G. Rudolph: Einfhrung in die Programmierung WS 2011/12
21

Kapitel 2

Darstellung von Information

Darstellung von Information

Ganzzahlen: Hufige Fehlerquellen

Wird Zahlenbereich bei Ganzzahlen ber- oder unterschritten


(auch bei Zwischenergebnissen),
dann entstehen unvorhersehbare, falsche Ergebnisse
ohne Fehlermeldung!

Beispiel:

240

80

Kapitel 2

Merken!

Ganzzahldivision ist reihenfolgeabhngig!

20 * 12

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


22

20

/
6

*
*

12
12

72

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


23

Es liegt im Verantwortungsbereich des Programmierers,


die geeigneten Datentypen auszuwhlen (Problemanalyse!).
Die Verwendung von greren Datentypen verschiebt das Problem
nur auf grere Wertebereiche: es wird i.A. dadurch nicht gelst!
Es mssen ggf. Vorkehrungen getroffen werden:
z. B. Konsistenzprfungen.

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


24

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Reelle Zahlen

Reelle Zahlen

In C/C++ gibt es zwei Datentypen fr reelle Zahlen:

Float vs. Long:


beide 4 Byte, aber riesiger Unterschied im Wertebereich!

Bit

Byte Wertebereich

Name in C/C++ Stellen

Wie geht das denn?


Durch Verlust an Genauigkeit im niederwertigen Bereich der Zahl!

32

3.4 * 10-38 3.4 * 10+38

64

1.7 * 10-308 1.7 * 10+308

float

double

15

Reprsentation ist standardisiert: IEEE-Standard P754 (1985)


Beispiel: float (32 bit)

Stellen = signifikante Stellen

e7e0

m22 m0

Vorzeichen

Exponent

Mantisse

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


25

Darstellung von Information

Kapitel 2

Reelle Zahlen

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


26

Kapitel 2

Darstellung von Information

Reelle Zahlen
7 signifikante Stellen

Reprsentation ist standardisiert: IEEE-Standard P754 (1985)


Beispiel: float (32 bit)
v

e7e0

1 ) 1

255

= 3.141592;

double pi2

= 3.14159265358979;

15 signifikante Stellen
korrekte

m22 m0

unsigned
char
0 ) +1

float pi1

normiert: 1 m 2,

Weitere gltige Schreibweisen:

Achtung:

12345.678

Festkommazahl (fixed format)

Dezimaldarstellung

1.23456e5

Fliekommazahl (floating point)

immer mit Punkt,


niemals mit Komma!

wobei virtuelles Bit m23 = 1


.345
+34.21e-91

e = E + 127
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
27

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


28

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Exkurs: Typumwandlung

Exkurs: Typumwandlung

Automatisch (Promotionen)

Automatisch (Promotionen)

das Rechenwerk braucht gleiche Typen fr Rechenoperation

das Rechenwerk braucht gleiche Typen fr Rechenoperation


Bsp:

char
signed char
short int
unsigned short int

int (ggf. unsigned int)

wchar_t
enum

int (ggf. unsigned int)

char c = 3;

char c = 3;

short s = 1024;

short s = 1024;

int i = c + s;

short i = c + s;

int

int
false
true

bool

int

Ganzzahlig

Fliekomma

0
1

Umwandlung
zu int

int

Ergebnis: int

int

int

Zuweisung

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


29

Kapitel 2

Darstellung von Information

Umwandlungen

Umwandlungen

Der Compiler warnt vor


mglichem Datenverlust!

Fliekommazahlen
- float

alle Bits aus der Quelle, die ins Ziel passen, werden kopiert
der Rest (hherwertige Bits) wird ggf. ignoriert
unsigned char uc = 1023; // binr 11 1111 1111

Kapitel 2

Darstellung von Information


Exkurs: Typumwandlung

- Zieltyp unsigned

short

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


30

Exkurs: Typumwandlung

Ganze Zahlen

int

int

int -Addition

double

Warnungen des Compiler


nicht ignorieren!

passt immer

- double float
Wertbernahme, wenn im Ziel darstellbar; sonst undefiniert!

8 bit

10 bit

uc = 255

- float/double Ganzzahl

- Zieltyp signed
Wertbernahme, wenn im Ziel darstellbar; sonst undefiniert!
signed char sc = 1023; // plausible Resultate 127 oder -1
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
31

Ungenauigkeiten und mglicher Datenverlust


int i = 2.6;

i = 2;

char c = 2.3e8;

c = -128;

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


32

Kapitel 2

Darstellung von Information


Exkurs: Typumwandlung

Kapitel 2

Darstellung von Information


Exkurs: Typumwandlung

Trauen Sie nicht vorbehaltslos den Ergebnissen des Rechners!


Bsp:

Vorbemerkung:
Die Regeln von C++ garantieren, dass Typfehler unmglich sind.
Theorie: Wenn Programm sauber kompiliert, dann keine Durchfhrung
von ungltigen / unsauberen Operationen an Objekten.
Wertvolle Garantie! nicht leichtfertig aufgeben!
Aber: explizite Typumwandlung (cast) untergrbt das Typsystem!
explizite Typumwandlung:

fr
C Stil:

Resultat bei doppelter Genauigkeit (double):

(T) Ausdruck // wandelt Ausdruck in den Typ T um

mibilligt
(deprecated)

T(Ausdruck)

Nicht
verwenden!

-1.18059e+021
// wandelt Ausdruck in den Typ T um

exakt: -54767 / 66192 = -0.827396...


G. Rudolph: Einfhrung in die Programmierung WS 2011/12
33

Kapitel 2

Darstellung von Information

Vorschau:

Explizite Typumwandlung (C++)


const_cast<T>(Ausdruck)
beseitigt Konstanz von Objekten

Hier nur zur Vollstndigkeit.


Wir kommen spter darauf
zurck!

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


34

Kapitel 2

Darstellung von Information


Exkurs: Typumwandlung
Wenn im Code viele Casts notwendig sind,

dann stimmt meistens etwas mit dem Design des Programms nicht!

dynamic_cast<T>(Ausdruck)
zum Downcasten bei polymorphen Quelltypen
umwandeln in einen abgeleiteten Typ
Fehlschlag bei * ergibt Nullpointer, bei & Ausnahme bad_cast

Wenn im Code ein Cast notwendig ist,


dann die Cast-Operation von C++ verwenden, weil
1. minimale automatische Typprfung mglich (statisch / dynamisch);

reinterpret_cast<T>(Ausdruck)

2. man sich mehr Gedanken darber macht, was man eigentlich tut;

verwendet auf niedriger Ebene (Uminterpretation des Bitmusters)


Ziel muss mindestens soviele Bits wie Quelle haben, sonst

3. fr Auenstehende prziser angezeigt wird, was Sie tun.

static_cast<T>(Ausdruck)

Wenn im Code ein Cast notwendig ist,

zum Erzwingen von impliziten Typumwandlungen

dann die Cast-Operation in einer Funktion verbergen.

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


35

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


36

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Einfache Datentypen

Einige wichtige nicht druckbare Steuerzeichen:

Zeichen
Ein Zeichen wird in einem Byte gespeichert (char)

horizontal
tabulation

Zuordnung: Zeichen Zahl (Code)

line
feed

carriage
return

ASCII (American Standard Code for Information Interchange), 7-Bit-Code


NUL

SOH

STX

ETX

EOT

ENQ

ACK

BEL

BS

TAB

LF

VT

FF

CR

SO

SI

DLE

DC1

DC2

DC3

DC4

NAK

SYN

ETB

CAN

EM

SUB

ESC

FS

GS

RS

US

&

<

>

DEL

NUL

SOH

STX

ETX

EOT

ENQ

ACK

BEL

BS

TAB

LF

VT

FF

CR

SO

SI

16

DLE

DC1

DC2

DC3

DC4

NAK

SYN

ETB

CAN

EM

SUB

ESC

FS

GS

RS

US

32

SP

&

SP

48

<

>

64

80

96

DEL

112

Steuerzeichen

null
space

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


37

Kapitel 2

Darstellung von Information

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


38

Kapitel 2

Darstellung von Information

Zeichen

Zeichen

Zeichen werden gem ihrem Code als Zahl gespeichert

Datendefinition:

char Zeichen;

deshalb kann man mit Zeichen rechnen:

Zuweisung:

Zeichen = x;

char c = 7;

Code von 7 ist 55

Resultat:

int zahl = c 0;

Code von 0 ist 48

zahl = 7

und man kann Zeichen vergleichen:


a < b

ist wahr, weil 97 < 98

Darstellbare Zeichen:

Buchstaben:

a bis z und A bis Z

Ziffern:

0 bis 9

Satzzeichen:

z.B. ! oder :

Sonderzeichen:

z.B. @ oder > oder } oder Leerzeichen

Steuerzeichen
Erst bei der Ausgabe wird Datentyp char wieder als Zeichen interpretiert.

mit Fluchtsymbol
(Umschalter): \

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


39

delete

\a

alarm (BEL)

\b

backspace

\ Hochkomma

\t

horizontal tabulator (TAB)

\? Fragezeichen

\n

new line

\\ backslash

\ Anfhrungsstriche

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


40

Kapitel 2

Darstellung von Information

Datendefinition etc.
kommt spter!

Zeichenketten (Strings)
Aneinanderreihung von Zeichen

Kapitel 2

Darstellung von Information

Das erste C++ Programm:


#include <iostream>

Gekennzeichnet durch doppelte Hochkommata:

int main()
{
std::cout << Das ist eine Zeichenkette! << \n;
return 0;
}

Beispiele:
Dies ist eine Zeichenkette!
Dies ist eine Zeichenkette!
Das ist jetzt\nneu.

#include <iostream> bindet Ein-/Ausgabemglichkeit aus Bibliothek ein

Das ist jetzt


neu.

int main() kennzeichnet Hauptprogramm, gibt Datentyp integer zurck

\The C++ Programming Language\\n\tby B. Stroustrup

std::cout ist der Ausgabestrom; alles rechts von << wird ausgegeben
return 0 gibt den Wert 0 an das Betriebssystem zurck (0: alles OK!)

The C++ Programming Language


by B. Stroustrup
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
41

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information


Einfache Datentypen

Noch ein C++ Programm:

Logischer Datentyp bool

#include <iostream>
#include <climits>
int main()
{
std::cout << "int:
<< INT_MIN
<< INT_MAX
return 0;
}

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


42

Zum Speichern von Wahrheitswerten wahr und falsch


Wertevorrat: true und false
"
<< " ... "
<< std::endl;

Datendefinition:

bool b;

Zuweisung:
oder:

b = true;
int x = 9; b = x > 7;

Zum berprfen von Bedingungen


Operationen:

#include <climits> bindet Konstanten fr Wertebereiche ein


INT_MIN und INT_MAX sind Konstanten aus Bibliothek climits
std::endl ist eine Konstante fr Beginn einer neuen Zeile
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
43

Name

C/C++

AND

&&

Beispiel

OR

||

b || x > 8

NOT

!b

b && x < 7

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


44

Kapitel 2

Darstellung von Information


Wahrheitstafeln
A

Weitere ableitbare Operationen

A && B

false false

Kapitel 2

Darstellung von Information

false

false false

A || B

!A

A NAND B

!(A && B)

false

false

true

A NOR B

!(A || B)
!A || B
!A && B || A && !B

false

true

false

false

true

true

false

true

A B (Implikation)

true

false

false

true

false

true

true

false

A XOR B (Antivalenz)

true

true

true

true

true

true

true

false
||

Prioritt der Operatoren


&&

1. NOT
2. AND

&&

3. OR
A

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


45

Kapitel 2

Darstellung von Information

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


46

Kapitel 2

Darstellung von Information

Auswertung von links nach rechts

Boolesche Ausdrcke

Abbruch, sobald Ergebnis feststeht:

Vergleiche:

<

kleiner

A && false = false

<=

kleiner oder gleich

A || true

>

grer

= true

Beispiel:
bool A = false, B = true;
||
true
&&

&&

>=

grer oder gleich

==

gleich

!=

ungleich

keine
Auswertung
Achtung:

!
A

!
B

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


47

==

testet auf Gleichheit

wird bei einer Zuweisung verwendet


G. Rudolph: Einfhrung in die Programmierung WS 2011/12
48

Kapitel 2

Darstellung von Information

Kapitel 2

Exkurs: namespace std

Wofr werden boolesche Ausdrcke gebraucht?

Im Standard-Namensraum wird Standardfunktionalitt bereitgestellt:

um Bedingungen formulieren zu knnen

z.B. Ausgaben auf den Bildschirm, Eingaben von der Tastatur,

um den Kontrollfluss steuern zu knnen


fr Fallunterscheidungen: if Bedingung wahr then mache etwas;

#include <iostream>
int main()
{
int a = 10,
if (a < b)
if (a > b)
if (a == b)
return 0;
}

b = 20;
std::cout << kleiner;
std::cout << groesser;
std::cout << gleich;

#include <iostream>
using namespace std;
int main()
{
int a = 10, b = 20;
if (a < b) std::cout << kleiner;
if (a > b) std::cout << groesser;
if (a == b) std::cout << gleich;
return 0;
}

falls Compiler einen


Bezeichner nicht findet,
dann Erweiterung mit
std.
Beispiel:
Bezeichner

???

std::Bezeichner

) fhrt zu kleineren Programmtexten


G. Rudolph: Einfhrung in die Programmierung WS 2011/12
49

Kapitel 2

Darstellung von Information

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


50

Kapitel 2

Exkurs: Grammatiken

Anmerkung:
In Programmiersprache C und vor 1993 auch in C++ existierte kein
boolescher Datentyp!

Woher wei man, was man in C++ schreiben darf und was nicht?

Stattdessen: Simulation mit Datentyp int

Natrliche Sprache festgelegt durch

Konvention: Wert ungleich Null bedeutet true sonst false

Alphabet

Beispiele:

Orthografie

Wortbedeutungen

Grammatik

int x = 8;
if ( x ) x = 0;
char c = y;
if ( c ) c = \n;

Aktueller C++ Standard: ISO/IEC 14882:2002


Es wurde u.a. eine formale Grammatik fr C++ festgelegt (fr alle verbindlich).

Das ist auch jetzt noch mglich!


Empfehlung: Besser den booleschen Datentyp verwenden!

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


51

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


52

Kapitel 2

Exkurs: Grammatiken

Grafische Darstellung

Ganzzahl mit Vorzeichen :=

Ziffer :=

+
0

Ohne Pfeile: von links nach rechts, von oben nach unten

Ziffernfolge

Festkommazahlen :=

+
Ziffernfolge:=

Kapitel 2

Exkurs: Grammatiken

Ziffer

Ziffernfolge

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


53

Exkurs: Grammatiken

Kapitel 2

Ziffernfolge

Ziffernfolge
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
54

Kapitel 2

Exkurs: Grammatiken

Grafische vs. textuelle Darstellung von Grammatiken

Definition

Grafische Darstellung anschaulich aber Platz raubend

Eine kontextfreie Grammatik G = (N, T, S, P) besteht aus

Textuelle Darstellung kompakter und automatisch zu verarbeiten

einer endlichen Menge von Nichtterminalen N,


einer endlichen Menge von Terminalen T,

Ziel

einem Startsymbol S N,

Beschreibung von syntaktisch korrekten C++ Programmen

einer endlichen Menge von Produktionsregeln der Form u v, wobei

Konkreter
Sie sollen lernen, formale Grammatiken zu lesen und zu verstehen,
-

um sie in dieser Veranstaltung fr ihre Zwecke nutzen zu knnen,

um einen fundamentalen Formalismus in der Informatik kennen zu lernen,

um andere Programmiersprachen leichter erlernen zu knnen.


G. Rudolph: Einfhrung in die Programmierung WS 2011/12
55

u N und

v eine endliche Sequenz von Elementen von N und T ist, sowie

der Randbedingung N T = .

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


56

Kapitel 2

Exkurs: Grammatiken

Kapitel 2

Exkurs: Grammatiken

Beispiel

Beispiel

T = { +, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

T = { +, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

N = { Z, A, D }

N = { Z, A, D }

S =

S = { Z }

{ Z }

Z +A

Z +A|-A|A

Z -A

A D|AD

Z A

Kompaktere Notation:

A D

Z +A|-A|A

A AD

=P

D 0

D 0|1|2|3|4|5|6|7|8|9

A D|AD

Nichtterminale sind Platzhalter.

D 0|1|2|3|4|5|6|7|8|9

Man kann dort eine Produktionsregel anwenden.

D 1

Der Ersetzungsprozess endet,


wenn alle Nichtterminale durch Terminale ersetzt worden sind.

D 9
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
57

Kapitel 2

Exkurs: Grammatiken
Beispiel

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


58

Kapitel 2

Exkurs: Grammatiken

Notation der Grammatik im C++ Buch von Bjarne Stroustrup

T = { +, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
N = { Z, A, D }

Nichtterminale: Wrter in kursiver Schrift


Terminale: Zeichen in nicht proportionaler Schrift

S = { Z }

Alternativen wie

Z +A|-A|A
A D|AD

D 0|1|2|3|4|5|6|7|8|9 sind dargestellt via

D 0|1|2|3|4|5|6|7|8|9

D: eins von
0 1 2 3 4 5 6 7 8 9

Knnen wir mit dieser Grammatik +911 erzeugen?


Start mit Z +A, wende Produktionsregel A AD auf A an, ergibt Z +AD
Wende A AD auf A an, ergibt Z +ADD

Optionale (Nicht-)Terminale durch tiefgestelltes opt


-

signopt

Wende A D auf A an, ergibt Z +DDD,


Wende D 9 auf das erste D, D 1 auf die brigen D an, ergibt Z +911.
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
59

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


60

Kapitel 2

Exkurs: Grammatiken

Kapitel 2

Darstellung von Information

Beispiel: Bezeichner

Zusammengesetze Datentypen

identifier:
nondigit
identifier nondigit
identifier digit

Array (Feld)
Einfhrendes Beispiel:
Temperaturen von gestern stndlich speichern

nondigit: eins von


universal-character-name
_ a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

hex-quad:
hex hex hex hex

10

11

12

13

14

15

16

17

18

19

20

21

22

23

8.4 8.3 8.0 7.4 7.2 7.0 7.0 7.5 8.0 8.8 9.8 11.1 13.4 13.6 13.7 13.6 12.4 12.0 10.1 9.6 9.0 8.9 8.7 8.5

Mglicher Ansatz:

digit: eins von


0 1 2 3 4 5 6 7 8 9
universal-character-name:
\u hex-quad
\U hex-quad hex-quad

float x00, x01, x02, x03, x04, x05, x06, x07,


x08, x09, x10, x11, x12, x13, x14, x15,
x16, x17, x18, x19, x20, x21, x22, x23;

hex: eins von


digit
a b c d e f
A B C D E F

Besser:
Unter einem Namen zusammenfassen und
zur Unterscheidung der Werte einen Index verwenden.

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


61

Kapitel 2

Darstellung von Information

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


62

Kapitel 2

Darstellung von Information

Anzahl bereitzustellender Speicherpltze

Array

Eindimensionales Array

Datendefinition: float x[24];


Ein Array ist eine Aneinanderreihung von identischen Datentypen
Gemeinsamer
Datentyp

- mit einer vorgegebenen Anzahl und

Gemeinsamer
Bezeichner

- unter einem gemeinsamen Bezeichner.

Zugriff auf das Feldelement: x[12];

Der Zugriff auf einzelne Elemente erfolgt ber einen Index


- der immer bei 0 beginnt und
- dessen maximaler Wert genau Anzahl 1 ist.

Achtung:
Der Index beginnt immer bei 0!

Fataler

x[12] greift also auf das 13. Feldelement zu!

Fehler!

Der maximale Index wre hier also 23.


Was passiert bei Verwendung von x[24] ?

(Fast) alle Datentypen knnen verwendet werden.

ABSTURZ!

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


63

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


64

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information


Eindimensionales Array: Initialisierung

Eindimensionales Array: Beispiele

unsigned int Lotto[6] = { 27, 10, 20, 5, 14, 15 };

unsigned int Lotto[6];


double Monatsmittel[12];

unsigned int Lotto[]

char Vorname[20];

unsigned int Lotto[6] = { 27, 10 };

bool Doppelgarage_belegt[2];

Compiler ermittelt
erforderliche Anzahl

= { 27, 10 };

ist identisch zu
unsigned int Lotto[6] = { 27, 10, 0, 0, 0, 0 };
unsigned int Lotto[6] = { 0 };

Datendefinition

ist identisch zu
unsigned int Lotto[6] = { 0, 0, 0, 0, 0, 0 };

Datentyp Bezeichner[Anzahl];

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


65

Kapitel 2

Darstellung von Information


Eindimensionales Array: Verwendung

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


66

Kapitel 2

Darstellung von Information


Eindimensionales Array: Verwendung

float Temp[12] = { 2.3, 4.6, 8.9, 12.8 };

float Temp[12] = { 2.3, 4.6, 8.9, 12.8 };

float x, y, z = 1.2;

float TempNeu[12];

Temp[4] = z;

TempNeu = Temp;

x = Temp[0] * 0.25;
y = Temp[1] + 2.3 * Temp[2];
int i = 2, j = 3, k = 4, m = 11;
z = ( Temp[i] + Temp[j] + Temp[k] ) / 3.0;
Temp[m] = z + Temp[k - i];

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


67

Merken!
Ein Array kann nicht als Ganzes einem anderen Array zugewiesen werden!
Eine Zuweisung muss immer elementweise verfolgen!

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


68

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Zwei- und mehrdimensionales Array

Zwei- und mehrdimensionales Array

Einfhrendes Beispiel

Einfhrendes Beispiel

- Pro Tag drei Temperaturmessungen: morgens, mittags, abends

float tag0[3], tag1[3], tag2[3] usw. bis tag6[3];

- Werte fr eine Woche (7 Tage) ablegen

8.0

20.3

14.2

7.8

18.3

12.2

Tabelle

5.3

12.3

8.8

oder

5.8

13.7

7.5

Matrix

8.0

19.8

10.2

der Temperaturen

9.3

21.3

11.1

7.4

17.3

9.9

tag0

8.0

20.3

14.2

tag1

7.8

18.3

12.2

tag2

5.3

12.3

8.8

tag3

5.8

13.7

7.5

tag4

8.0

19.8

10.2

tag5

9.3

21.3

11.1

tag6

7.4

17.3

9.9

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


69

Kapitel 2

Darstellung von Information

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


70

Kapitel 2

Darstellung von Information

Zwei- und mehrdimensionales Array

Zwei- und mehrdimensionales Array

Einfhrendes Beispiel

Einfhrendes Beispiel

Statt

Spaltenindex

float tag0[3], tag1[3], tag2[3] usw. bis tag6[3];

Zeilen

Naheliegend:

Spalten

float tag[7][3];
Gemeinsamer
Datentyp

Gemeinsamer
Bezeichner
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
71

Zeilenindex

bruchte man ein Array von Arrays vom Typ float!

8.0

20.3

14.2

7.8

18.3

12.2

tag[0][2] hat Wert 14.2

5.3

12.3

8.8

tag[2][0] hat Wert 5.3

5.8

13.7

7.5

tag[4][2] hat Wert 10.2

8.0

19.8

10.2

9.3

21.3

11.1

7.4

17.3

9.9

tag[2][4] ist ungltig!

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


72

Kapitel 2

Darstellung von Information

Kapitel 2

Darstellung von Information

Zwei- und mehrdimensionales Array

Zwei- und mehrdimensionales Array

Initialisierung

float tag[7][3] = {
{
{
{
{
{
{
{
};

8.0,
7.8,
5.3,
5.8,
8.0,
9.3,
7.4,

20.3,
18.3,
12.3 ,
13.7 ,
19.8 ,
21.3 ,
17.3 ,

14.2
12.2
8.8
7.5
10.2
11.1
9.9

1. int feld[n];

float tag[][3] = {
},
},
},
},
},
},
}

{
{
{
{
{
{
{
};

oder

8.0,
7.8,
5.3,
5.8,
8.0,
9.3,
7.4,

20.3,
18.3,
12.3 ,
13.7 ,
19.8 ,
21.3 ,
17.3 ,

14.2
12.2
8.8
7.5
10.2
11.1
9.9

Datendefinition bei ansteigender Dimension

},
},
},
},
},
},
}

2. int feld[m][n];
3. int feld[k][m][n];
4. usw.

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


73

Kapitel 2

Darstellung von Information


Zusammengesetze Datentypen

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


74

Kapitel 2

Darstellung von Information

Zeichenkette

Zeichenkette
-

ist eine Aneinanderreihung von Zeichen

also ein Array/Feld von Zeichen

Das Ende wird durch das ASCII Steuerzeichen NUL (mit Code 0)
gekennzeichnet!

Bei der Datendefinition muss also immer ein Zeichen mehr


angefordert werden als zur Speicherung der Daten bentigt wird!
Falsch ist: char wort[3] = abc;

Datendefinition:

char wohnort[40];
kennzeichnet Ende
der Zeichenkette

Falsch ist: char wort[4];


oder
:

Initialisierung:
char wohnort[40] = {D,o,r,t,m,u,n,d,\0};
char wohnort[40] = Dortmund;
char wohnort[]

= Dortmund;

riskant!

Zuweisung einer Zeichenkette an eine andere nicht zulssig


(weil array von char)

wort[4] = abc;
wort[] = abc;

Zuweisung muss immer elementweise erfolgen!


Beispiel: char wort[4] = abc; wort[0] = z;

sicher: Compiler zhlt!

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


75

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


76

Kapitel 2

Darstellung von Information


Zusammengesetze Datentypen

Zusammengesetze Datentypen

Datenverbund (Struktur)

Datenverbund (Struktur)

Einfhrendes Beispiel:

Kapitel 2

Darstellung von Information

Wir definieren uns unseren eigenen Datentyp!

Zu speichern sei Namen und Matrikelnummer von Studierenden


und ob Proseminar bestanden ist

Wir mssen die Struktur / den Bauplan definieren!


Wir mssen einen Namen fr den Datentyp vergeben!

Mglicher Ansatz:
Drei verschiedene Datentypen (char[], unsigned int, bool)
in Array lsst sich nur ein gemeinsamer Datentyp speichern
alles als Zeichenketten, z.B. char stud[3][40];

struct UnserDatenTyp

Name des
Datentyps

{
char name[40];

Besser:

unsigned int matrikel;

Zusammen gehrende Daten unter einem Namen zusammenfassen


aber die natrlichen Datentypen verwenden!

Bauplan /
Struktur

bool proseminar;
};

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


77

Kapitel 2

Darstellung von Information


Zusammengesetze Datentypen
Zuerst das Schlsselwort: struct
Dann folgt der gewhlte Name (engl. tag).

In gescheiften Klammern {} steht der Bauplan. Am Ende ein Semikolon ;


Name des
Datentyps

{
char name[40];
unsigned int matrikel;

Kapitel 2

Darstellung von Information


Datenverbund (Struktur)

Datenverbund (Struktur)

struct UnserDatenTyp

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


78

Bauplan /
Struktur

Achtung:
Soeben wurde ein Datentyp definiert.
Es wurde noch kein Speicherplatz reserviert!
Datendefinition:
UnserDatenTyp student, stud[50000];

Reihenfolge
beachten!

Initialisierung:
UnserDatenTyp student = { Hugo Hase, 44221, true };
Zugriff mit Punktoperator:
unsigned int mnr = student.matrikel;
cout << student.name << << mnr << endl;

bool proseminar;
};
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
79

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


80

Kapitel 2

Darstellung von Information


Datenverbund (Struktur)

Datenverbund (Struktur)

Im Bauplan kann wieder jeder Datentyp vorkommen!

Zuweisungen:

Also auch wieder Datenverbunde (struct)!

Kapitel 2

Darstellung von Information

UnserDatenTyp stud[50000];
UnserDatenTyp student = { Hugo Hase, 44221, true };
stud[500] = student;
student = stud[501];

Beispiel:
struct UniStud {
char ort[40];
unsigned int plz;
UnserDatentyp daten;
};

Ganze Datenstze knnen strukturidentischen Variablen zugewiesen werden.


Komponentenweises Zuweisen nicht ntig!

UniStud studX = {
Dortmund, 44221, { Jane Doe, 241398, true }
};
unsigned int mnr = studX.daten.matrikel;

Achtung:
Anderer Name (tag) Anderer Datentyp!
Gilt selbst bei identischen Bauplnen!
struct S1 { int x; float y; };
struct S2 { int x; float y; };
S1 v1, vx; v1 = vx;
S2 v2;
v2 = vx;

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


81

Kapitel 2

Darstellung von Information

Fehler!
G. Rudolph: Einfhrung in die Programmierung WS 2011/12
82

Kapitel 2

Darstellung von Information

Zusammengesetze Datentypen

Zusammengesetze Datentypen

Aufzhltyp (enum)

Aufzhltyp (enum)

Umwelt beschreiben durch Begriffe statt durch Ziffern.

Was passiert im Rechner?

Farben: rot, blau, grn, orange, gelb, schwarz,

Interne Zuordnung von Zahlen (ein Code)

Spielkarten: Kreuz, Pik, Herz, Karo.

enum KartenTyp { kreuz, pik, herz, karo };

Internet-Domains: de, uk, fr, ch, fi, ru,


0

1. Schlsselwort enum (Enumeration, Aufzhlung)


Zuordnung der Zahlen durch Programmierer kontrollierbar:

2. Name der Aufzhlung


3. In geschweiften Klammern die Elementnamen.
enum KartenTyp { kreuz, pik, herz, karo };

enum KartenTyp { kreuz=1, pik=2, herz=4, karo=8 };


Initialisierung: KartenTyp Spielfarbe = kreuz;
Aber: cout << Spielfarbe << endl;
Ausgabe ist Zahl!

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


83

G. Rudolph: Einfhrung in die Programmierung WS 2011/12


84