Vous êtes sur la page 1sur 21

Interne Darstellung von Gleitkommazahlen

0.6 ist im Binrsystem:


1001 1001 1001 1001 1001 1001 1001 1001 ...
32 Bits (Mantisse genannt)
Dieses bedeutet:
1* 1/2 + 0 * 1/4 + 0 *1/8 + 1 * 1/ 16 + 1* 1/ 32 ... * 1/268435456

und ergibt: 0.59999999776482500000


Wenn float nur 24-Bit zur Darstellung der Mantisse verwendet (ist
blich, da normalerweise noch 8 Bit zur Darstellung des Exponenten
verwendet werden), ist die Genauigkeit noch etwas geringer.
Die Zuweisung dieser 24 Bit-Genauigkeit an eine double-Zahl
ergibt somit eine Warnung
Peter Sobe

Informatik I, Wintersemester 11/12

31

Explizite Typkonvertierungen
In einigen Fllen ist eine explizite Typkonvertierung unbedingt
erforderlich:
int a = 5;
int b = 2;
// In C/C++
double x = ((double) a ) / ((double) b); // x ist 2.5, sonst 2.0
In C++ auch erlaubt:
double x = double(a) / double(b)
// In C++ empfehlenswert:
double x = static_cast<double>(a) / static_cast<double>(b);

Peter Sobe

Informatik I, Wintersemester 11/12

32

Aufzhlungstypen
Manchmal ist es sinnvoll, eine Vielzahl gleichartiger Konstanten zu
einer Menge zusammenzufassen. Jedes Element dieser Menge
bekommt eine Ordinalzahl Das erste Element erhlt z.B. die
Ordinalzahl 0, das zweite 1 usw.,
Beispiel:
enum Wochentag { Mon, Die, Mit, Don, Fri, Sam, Son };
Wochentag Tag;
Tag = Mon;

Syntax von Aufzhlungen:


enum AufzTyp { Bezeichnerl, Bezeichner2, ... } Variable;
enum { Bezeichnerl, Bezeichner2, ... } Variable;
enum AufzTyp { Bezeichnerl = 2, Bezeichner2, ... };
Peter Sobe

Informatik I, Wintersemester 11/12

33

Operatoren (1)
Binre Operatoren
+
*
/
%

Addition
Subtraktion
Multiplikation
Division
Divisionsrest

<
<=
==
!=
>=
>

Vergl. auf kleiner


Vergl. auf kleiner oder gleich
Vergl. auf gleich
Vergl. auf ungleich
Vergl. auf grer oder gleich
Vergl. auf grer

Vergleich

Alle Typen

&
|
^
<<
>>

bitw. UND-Verknpfung
bitw. ODER-Verknpfung
bitw. Exkl.-Oder-Verknpfung
bitw. Linksverschieben
bitw. Rechtsverschieben

Bitoperationen

Ganzzahlige
Typen

&&
||

log. UND-Verknpfung
log. ODER-Verknpfung

Logische
Verknpfungen

Boolesche Werte

Peter Sobe

Arithmetik

Zahlen, mit
Einschrnkung
Adressen
nur ganze Zahlen

Informatik I, Wintersemester 11/12

34

Operatoren (2)
Unre Operatoren, Postfix- und Prfix-Operatoren
&
*

Adresse von
Inhalt von

Refernzierung
Dereferenzierung

alle Typen
Zeiger

+
-

pos. Vorzeichen
neg. Vorzeichen

Arithmetik

Zahlen

bitw. Invertierung

Bitoperationen

ganzz. Typen

logische Invertierung

Log. Verknpfung

boolesche Werte

Typecast

C-Allzweck-Cast

viele Typen

(type)

sizeof
sizeof
++
--

Peter Sobe

sizeof expr.: Speicherbedarf


sizeof (type):Speicherbedarf

Inkrementierung
Dekrementierung

Ausdrcke
Typen
Postfix und Prfix

ganzz. Typen
und Zeiger

Informatik I, Wintersemester 11/12

35

Operatoren (3)
Zuweisungs-Operatoren und sonstige Operatoren
=

Wertzuweisung

Zuweisung

Alle Typen

+=
-=
*=
/=
%=

Addition
Subtraktion
Multiplikation
Division
Divisionsrest

Arithmetik
und
Zuweisung

Zahlen, mit
Einschrnkungen,
Adressen
nur ganze Zahlen

&=
|=
^=
<<=
>>=

bitw. UND-Verknpfung
bitw. ODER-Verknpfung
bitw. Eckl.-Oder-Verkn.
bitw. Linksverschieben
bitw. Rechtsverschieben

Bitoperationen
und
Zuweisung

?:
,

Formulierung bed. Ausdrcke


Aufzhlung in Klammerausdr.

ganzz. Typen

Ausdrcke
Ausdrcke

Fragezeichen-Operator zur verkrzten Formulierung


bedingter Ausdrcke, siehe 4.3
Peter Sobe

Informatik I, Wintersemester 11/12

36

Einfache Anweisungen
Arithmetische Operatoren
Einfache Zuweisung =
Beispiel: summe=64;
Addition + bzw. +=
Beispiele: summe = zahl + 61;
summe = summe + 4;
summe += 4;
Subtraktion - bzw. -=
Multiplikation * bzw. *=
Division / bzw. /=
Modulo-Operator % bzw. %=
und weitere Operatoren ...
Peter Sobe

Jede Anweisung
wird durch ein
Semikolon
abgeschlossen

Informatik I, Wintersemester 11/12

37

Initialisierung von Variablen, Vergleich


Deklaration und Initialisierung:
int i = 7; /* Speicherplatz wird reserviert, der mit 7 initialisiert wird */
Zuweisung:
i = 8; /* Vorhandener Speicherplatz wird mit neuem Wert belegt.*/
Vergleichsoperatoren
gleich ==
ungleich !=
kleiner <
kleiner gleich <=
grer >
grer gleich >=
Peter Sobe

Informatik I, Wintersemester 11/12

38

Vergleich
Beispiele:
if (zahl < 64) ...
if (zahl == 16) ...
if ((zahl >= 0) && (zahl <= 64)) ... // zahl aus dem Bereich [0..64]
bool bo = 5 > 7; // bo erhlt den Wert false
int a = 5 > 7; // a erhlt den Wert 0
int b = 5 < 7; // b erhlt den Wert 1

Peter Sobe

Informatik I, Wintersemester 11/12

39

Logische Verknpfungen
Logische Verknpfungsoperatoren
Logisches Und &&
Logisches Oder ||
Logisches Nicht !
Beispiele:
if ( (!(zahl < 0)) && (!(zahl > 64))) ... // Alle drei Abfragen sind gleich
if ( (zahl >= 0) && (zahl <= 64) ) ... // bedeutend, sie testen, ob zahl
if ( zahl >= 0 && zahl <= 64 ) ... // in dem Bereich 0..64 liegt

Peter Sobe

Informatik I, Wintersemester 11/12

40

Inkrement und Dekrement (1)


zahl = zahl + 1; // kann verkrzt werden zu
zahl += 1; // und nochmals zu
zahl++;
Entsprechend gibt es zahl--; fr das Erniedrigen von zahl um 1.
Beachte:
zahl++; und ++zahl; sind nicht unbedingt das gleiche.
Beispiel:
int zahl1 = 64;
int zahl2 = ++zahl1; // zahl2 und zahl1 sind nun beide 65
int zahl3 = zahl2++; // zahl3 ist 65 und zahl2 66.
Peter Sobe

Informatik I, Wintersemester 11/12

41

Inkrement und Dekrement (2)


Pre-Increment und Post-Increment als Funktionen
Pre-Increment:

Post-Increment:

int zahl2 = ++zahl1;

int zahl2 = zahl1++;

// entspricht
int zahl2 =PreInc(zahl1);

// entspricht
int zahl2 =PostInc(zahl1);

// mit
int PreInc(int& i)
{
i = i + 1;
return i;
}

// mit
int PostInc(int& i)
{
int temp=i;
i = i + 1;
return temp;
}

Peter Sobe

Informatik I, Wintersemester 11/12

42

Prioritten von Operatoren


1

! ~ ++ -- + - * & sizeof (type)

unr, postfix, prfix

2
3

/%
+-

binre arithmetische
Operatoren

<< >>

Shift-Operationen

5
6

< <= > >=


== !=

Vergleichsoperatoren

7
8
9

&
^
|

Bitoperationen

10
11

&&
||

logische
Verknpfungen

12

= += -= *= /= %= &= = |= <<= >>=

Zuweisungsoperatoren

13

Komma-Operator

1 ist die hchste Prioritt, 13 die niedrigste


Peter Sobe

Informatik I, Wintersemester 11/12

43

Inhalt

Inhalt:
4. Programmiersprache C
4.1 Programmaufbau in C
4.2 Basisdatentypen und einfache Anweisungen
4.3 Steuerfluss-Konstrukte
4.4 Arbeit mit indizierten Gren (Felder)
4.5 Arbeit mit Pointern
4.6 Zeichen und Zeichenketten
4.7 Funktionen
4.8 Strukturen
4.9 Typen, Variable und Konstante

Peter Sobe

Informatik I, Wintersemester 11/12

44

4.3 Steuerfluss-Konstrukte

Peter Sobe

Verbundanweisung
if-Anweisung
switch-case-Konstrukt
while-Schleife
do-Schleife
for-Schleife
break-Anweisung
continue-Anweisung

Informatik I, Wintersemester 11/12

45

Verbundanweisung
Verbundanweisung
Eine Verbundanweisung dient dazu, mehrere Anweisungen zu
einer zusammenzufassen.
Zu Beginn knnen auch Vereinbarungen stehen, die
dann aber nur innerhalb dieser Verbundanweisung gelten.
Eine Verbundanweisung kann auch leer sein, sie kann nur
Anweisungen enthalten, und sie kann auch nur Vereinbarungen
enthalten. Letzteres ist im allgemeinen nicht sinnvoll.
Beispiel in C:
{ float buffer;
buffer = x; x = y; y = buffer;
}
Peter Sobe

Informatik I, Wintersemester 11/12

46

Vereinbarungen, Anweisung, Verbundanweisung


Jede Vereinbarung oder Anweisung wird in C und C++ durch ein
Semikolon beendet.
int i;
i=99;
i=i*2;
Am Ende einer Verbundanweisung, d.h. nach der schlieenden
geschweiften Klammer, steht allerdings kein Semikolon.
if (i>100) {printf(" i ist gross \n");}
In C ++ knnen sich Vereinbarungen und Anweisungen beliebig
abwechseln. In C stehen die Vereinbarungen vor den Anweisungen.
Peter Sobe

Informatik I, Wintersemester 11/12

47

if-Anweisung (1)
Die if-Anweisung ist das Ausdrucksmittel fr die Selektion in C, C++.

Bedingung
ja

nein
Anw

if ( Bedingung) Anw;
if (Bedingung)
Verbundanweisung

Beispiel:
int monat;
printf("Bitte Monat Ihres Geburtsdatums eingeben:");
scanf("%d",&monat);
if (monat<1 || monat>12)
{ printf(falscher Wert fr Monat eingegeben!\n");
exit(EXIT_FAILURE);
}

Peter Sobe

Informatik I, Wintersemester 11/12

48

if-Anweisung (2)
if ( Bedingung ) Anw1;
else Anw2;

Bedingung
ja
Anw1

nein
Anw2

if (Bedingung)
Verbundanweisung1
else
Verbundanweisung2

Beispiel:
char kuehlen = 0, heizen = 0;

if (temperatur-zielwert > 2)
{ printf("zu warm -> kuehlen\n");
kuehlen = 1;
}
else {
if (zielwert temperatur > 2 )
{ printf(zu kalt -> heizen\n");
heizen = 1;
}
} Peter Sobe
Informatik I, Wintersemester 11/12

49

?-Operator anstelle if
Bedingung
ja
nein
var1 = var2 var1 = var3
If else Konstruktion:
if ( Bedingung ) var1 = var2;
else var1 = var3;

Mit ?-Operator:
// Bedingte Zuweisung
var1 = (Bedingung ? var2 : var3 );

Bedingung

ja
nein
var1 = wert var2 = wert
If else Konstruktion:
if ( Bedingung ) var1 = wert;
else var2=wert;
Peter Sobe

Mit ?-Operator:
// Bedingte Zuweisung
(Bedingung ? var1 : var2 ) = wert;

Informatik I, Wintersemester 11/12

50

switch-case-Konstrukt (1)
Zur Selektion unter mehreren alternativen Zweigen

Fallausdruck
Wert1 Wert2
Anw_1 Anw_2

...
sonst
... Anw_n Anw_0

switch(Fallausdruck)
{
case Wert_1:
Anw_1; break;
case Wert_2:
Anw_2; break;

case Wert_n:
Anw_n; break;
default: // kann entfallen
Anw_0;
}

Peter Sobe

Informatik I, Wintersemester 11/12

51

switch-case-Konstrukt (2)
Beispiel
unsigned int tag, monat, jahr;
// Eingabe des Datums
switch(monat)
{
case 1:
printf("Januar"); break;
case 2:
printf("Februar"); break;
case 3:
printf("Maerz");break;

default:
printf("-undefiniert-");
}
Peter Sobe

In einen Fall (case) wird bei


entsprechendem Wert
(Konstante) des
Fallausdrucks gesprungen.
Nach case folgt eine oder
mehrere Anweisungen.
Achtung keine
Verbundanweisung mit {}
Die break-Anweisung ist
erforderlich, damit nicht
zustzlich der jeweils
folgende Fall auch
abgehandelt wird!

Informatik I, Wintersemester 11/12

52

while-Schleife (1)
Allgemeine Formen:

Bedingung

while ( Bedingung ) Anweisung;

Anweisung

while ( Bedingung )
Verbundanweisung

Die Anweisung oder Verbundanweisung wird solange wiederholt


ausgefhrt, wie die Bedingung zutrifft.
Durch nderungen der Variablenwerte wird die Bedingung i.d.R.
nach endlich vielen Durchlufen irgendwann nicht mehr zutreffen
und die Wiederholung endet.
Trifft die Bedingung bei Eintritt in die Schleife nicht zu, wird die
Anweisung nicht (auch nicht ein einziges mal) ausgefhrt.
Peter Sobe

Informatik I, Wintersemester 11/12

53

while-Schleife (2)
Beispiel:
int summe = 0;
int i = 10;
while (i >= 1)
{ // entspricht while (i>0), entspricht while (i)
summe += i;
--i; // oder i--;
}
printf(Die Summe der Zahlen von 1 bis 10 ist %d \n, summe);
.

Peter Sobe

Informatik I, Wintersemester 11/12

54

do-while-Schleife (1)
Allgemeine Formen:

Anweisung
Bedingung

do Anweisung while ( Bedingung);


do Verbundanweisung
while (Bedingung);

Die do-while-Schleife wird mindestens einmal durchlaufen.


Die Anweisung oder Verbundanweisung wird solange noch einmal
ausgefhrt, wie die Bedingung nach der Ausfhrung zutrifft.
Typischerweise ndert die Anweisung oder Verbundanweisung den
Inhalt der Variable, die fr die Bedingung benutzt werden. Damit wird
erreicht, dass die Wiederholung irgendwann endet.
Peter Sobe

Informatik I, Wintersemester 11/12

55

do-while-Schleife (2)
Beispiel:
int summe = 0;
int i = 10;
do {
summe += i;
--i;
} while (i >= 1);
printf(Die Summe der Zahlen von 1 bis 10 ist %d \n,summe);

Peter Sobe

Informatik I, Wintersemester 11/12

56

for-Schleife (1)
Entsprechende Form:

Zhlzyklus:
Lv = awert (s) ewert

Anw

for (Lv=awert; Lv<=ewert ; Lv=Lv+s)


Anw
Lv dient hier als Zhlvariable

Allgemeine Form:
for ( Init-Ausdruck ; Bedingung ; Schritt-Ausdruck )
Anweisung
for ( Init-Ausdruck ; Bedingung ; Schritt-Ausdruck )
Verbundanweisung
Solange die Bedingung erfllt ist, wird die Anweisung wiederholt.
Die Ausdrcke in der for-Schleife knnen auch leer sein.
Peter Sobe

Informatik I, Wintersemester 11/12

57

for-Schleife (2)
Beispiel:
int i;
int summe = 0;
for (i = 10; i > 0; --i)
{
summe += i;
}
printf(Die Summe ist %d \n,summe);

Peter Sobe

Informatik I, Wintersemester 11/12

58

for-Schleife (3)
Wirkungsweise einer for-Schleife als PAP:
for ( Init-Ausdruck ; Bedingung ; Schritt-Ausdruck )
Anweisung
Init-Ausdruck

nein
Bedingung

ja
Anweisung

Schritt-Ausdruck
Peter Sobe

Informatik I, Wintersemester 11/12

59

break-Anweisung
Die break-Anweisung kann in allen Schleifen verwendet werden, um
die aktuelle Iteration vorzeitig zu beenden, d.h. vor Erreichen der
normalen Ende-Bedingung. Es wird danach aus der Schleife
herausgegangen.
Anwendung fr while-, do-while- und for-Schleifen
Beispiel:
for (i=0; i<imax; i++)
{ if (bedingung1) { break; }
...
if (bedingung2) { break; }
...
if (bedingung3) { break; }
...
}
Peter Sobe

Informatik I, Wintersemester 11/12

60

continue-Anweisung
Die continue-Anweisung kann in allen Schleifen verwendet werden,
um die aktuelle Ausfhrung des Schleifenkrpers vorzeitig zu
beenden, d.h. vor Erreichen der normalen Ende-Bedingung. Es wird
dann mit der folgenden Iteration weiter gemacht.
Anwendung fr while-, do-while- und for-Schleifen
Beispiel:
for (i=0; i<imax; i++)
{
// do something
...
if (bedingung) { continue; }
...
// do somethinge else
...
}
Peter Sobe

Informatik I, Wintersemester 11/12

61

Nutzung der verschiedenen Schleifen


Die drei verschiedenen Varianten einer Schleife while, do-while
und for knnen alternativ verwendet werden.
Aspekte fr eine sinnvolle Auswahl:
Verwendung der while-Anweisung, wenn die Anzahl der
Iterationen n unbekannt ist, mit n >= 0 (auch null Durchlufe
mglich!)
Verwendung der do-while-Anweisung, wenn im Gegensatz dazu
n>=1 (mindestens ein Durchlauf!)
und Bevorzugung der for-Schleife dann, wenn die Anzahl der
Iterationen schon bekannt ist.

Peter Sobe

Informatik I, Wintersemester 11/12

62

Inhalt

Inhalt:
4. Programmiersprache C
4.1 Programmaufbau in C
4.2 Basisdatentypen und einfache Anweisungen
4.3 Streuerfluss-Konstrukte
4.4 Arbeit mit indizierten Gren (Felder)
4.5 Arbeit mit Pointern
4.6 Zeichen und Zeichenketten
4.7 Funktionen
4.8 Strukturen
4.9 Typen, Variable und Konstante

Peter Sobe

Informatik I, Wintersemester 11/12

63

Felder in C
Felder stellen eine Reihung von Elementen gleichen Typs dar. Man
spricht auch von Vektoren oder arrays. Durch die Reihung
(hintereinander speichern) wird eine Ordnungsrelation ber die
Nummer (Position) des Elementes festgelegt. ber diese Nummer
(Index) wird dabei auch der Zugriff zum betreffenden Element
vorgenommen. In C hat das 1.Element die Nummer 0!

Element 0 Element 1 Element 2

Element n-1

In C werden Felder durch die Verwendung der Indexklammern [ ]


gekennzeichnet:
Beispiel: int vektor[10];
R.Gromann / P. Sobe

Informatik I, Wintersemester 11/12

64

Deklaration von Feldern in C


Felder als eine spezielle Datenstruktur mssen deklariert werden.
Die Deklarationsanweisung legt den Namen des Feldes, die Anzahl
der Elemente und den Typ der Elemente fest.

Beispiel:
float a[10];
a ist der Name des Feldes
10 ist die Anzahl der Elemente (a0 a1 a2 ... a9)
float ist der Typ der Elemente

R.Gromann / P. Sobe

Informatik I, Wintersemester 11/12

65

Deklaration von Feldern in C


float a[10];

Man beachte, dass die Anzahl der Elemente eine Konstante sein
muss. D.h. sind von Fall zu Fall unterschiedliche Elementanzahlen
vorhanden, so muss trotzdem das Feld mit einer konstanten, max.
notwendigen Elementeanzahl deklariert werden.
Innerhalb dieser maximalen Anzahl kann jeweils mit unterschiedlich
vielen Elementen gearbeitet werden. Der Speicherplatz ist fr die
maximale Anzahl reserviert, aber es werden aktuell ggf. weniger
Elemente belegt.

R.Gromann / P. Sobe

Informatik I, Wintersemester 11/12

66

Initialisierung von Feldelementen /


Zugriff auf Feldelemente
Feldelemente knnen in der Deklarationsanweisung mit Werten
belegt werden.
Beispiel: float a[10]={-3.22,0.0,1,-7.234,55.5,6.6,-0.77,8,0.09,3};
Der Zugriff auf die Elemente eines Feldes erfolgt ber den Index
(Positionsnummer) des Elementes. Dieser Index wird in der
Indexklammer angegeben.
Beispiel: es soll auf das 7.Element von a zugegriffen werden:
x = a[6];
(da das 1.Element den Index 0 hat, ist 6 der Index des 7.Elementes)

Bei Zugriffen auf Feldelemente ist stets zu prfen, ob der Index in


den Deklarationsgrenzen des Feldes liegt.
R. Gromann / P. Sobe

Informatik I, Wintersemester 11/12

67

Beispiel eines Feldprogramms


#include <stdio.h>
#include <math.h>
//arithmetisches Mittel einer Messreihe
void main()
{ int i,n; float a[50],s;
printf("\nEingabe Anzahl=");scanf("%d",&n); // n<=50
printf("\nEingabe des Vektors:\n");
for (i=0;i<n;i++)
//Eingabe der n Feldelemente
{ printf("a[%2d]=",i); scanf("%f", &a[i] );}; //auch hier ist der &-Operator zu
s=0;
//verwenden
for (i=0;i<n;i++) s=s+a[i];
//Zhlschleifen sind die typischen
s=s/n;
//Steuerfluss-Konstr. fr Felder
printf("\n arithmetisches Mittel=%f \n",s);
}
R.Gromann / P. Sobe

Informatik I, Wintersemester 11/12

68

Mehrdimensionale Felder
Mehrdimensionale Felder (z.B. Matrizen als 2-dimensionale
Felder in der Mathematik) werden analog zum
eindimensionalen Fall deklariert.
Eine zustzliche Dimension wird durch eine weitere
Indexklammer angegeben.
Beispiel: float matrix[3][4];
dies ist eine Matrix mit 3 Zeilen und 4 Spalten. Der Zeilenindex
wird immer zuerst variiert. Diese Matrix hat die Struktur:
a00 a01 a02 a03
a10 a11 a12 a13
a20 a21 a22 a23
R.Gromann / P. Sobe

Informatik I, Wintersemester 11/12

69

Initialisierung mehrdimensionaler Felder /


Zugriff auf Elemente
Mehrdimensionale Felder knnen auch in der Deklarationsanweisung initialisiert werden. Dabei muss die Verarbeitungsreihenfolge Zeile -> Spalte usw. beachtet werden.
Beispiel: float matrix[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
dies ist eine Matrix mit 3 Zeilen und 4 Spalten.
Der Zugriff auf Elemente erfolgt analog durch Angabe der
Folge der Indexklammern in der Reihenfolge Zeile, Spalte,
usw..
Da die Indizierung mit Null beginnt, selektiert die Angabe
matrix[2][3] die dritte Zeile, und darin das vierte Element,
also 12.
R.Gromann / P. Sobe

Informatik I, Wintersemester 11/12

70

Mehrdimensionale Felder - Beispiel


Beispiel Matrix-Transposition:
#define N 10
float matrix[N][N];
float t;
int zeile, spalte;
// Eingabe Matrix
//
for(zeile=0; zeile<N; zeile++)
{ for(spalte=zeile+1;spalte<N; spalte++)
{ // Tausch matrix[zeile][spalte] mit matrix[zeile_neu][spalte_neu]
// wobei zeile_neu = spalte und spalte_neu = zeile
t = matrix[zeile][spalte];
matrix[zeile][spalte] = matrix[spalte][zeile];
matrix[spalte][zeile] = t;
}
} R.Gromann / P. Sobe
Informatik I, Wintersemester 11/12

71

Vous aimerez peut-être aussi