Interne Darstellung von Gleitkommazahlen

Interne Darstellung von Gleitkommazahlen 0.6 ist im Binärsystem: 1001 1001 1001 1001 1001 1001 1001 1001 ... 32 Bits (Mantisse genannt) Dieses bedeute...
Author: Werner Holst
0 downloads 2 Views 63KB Size
Interne Darstellung von Gleitkommazahlen 0.6 ist im Binärsystem: 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 Fällen 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(a) / static_cast(b);

Peter Sobe

Informatik I, Wintersemester 11/12

32

Aufzählungstypen Manchmal ist es sinnvoll, eine Vielzahl gleichartiger Konstanten zu einer Menge zusammenzufassen. Jedes Element dieser Menge bekommt eine Ordinalzahl Das erste Element erhält 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 Aufzählungen: enum AufzTyp { Bezeichnerl, Bezeichner2, ... } Variable; enum { Bezeichnerl, Bezeichner2, ... } Variable; enum AufzTyp { Bezeichnerl = 2, Bezeichner2, ... }; Peter Sobe

Informatik I, Wintersemester 11/12

33

Operatoren (1) Binäre Operatoren + * / %

Addition Subtraktion Multiplikation Division Divisionsrest

< = >

Vergl. auf kleiner Vergl. auf kleiner oder gleich Vergl. auf gleich Vergl. auf ungleich Vergl. auf größer oder gleich Vergl. auf größer

Vergleich

Alle Typen

& | ^ >

bitw. UND-Verknüpfung bitw. ODER-Verknüpfung bitw. Exkl.-Oder-Verknüpfung bitw. Linksverschieben bitw. Rechtsverschieben

Bitoperationen

Ganzzahlige Typen

&& ||

log. UND-Verknüpfung log. ODER-Verknüpfung

Logische Verknüpfungen

Boolesche Werte

Peter Sobe

Arithmetik

Zahlen, mit Einschränkung Adressen nur ganze Zahlen

Informatik I, Wintersemester 11/12

34

Operatoren (2) Unäre Operatoren, Postfix- und Präfix-Operatoren & *

Adresse von Inhalt von

Refernzierung Dereferenzierung

alle Typen Zeiger

+ -

pos. Vorzeichen neg. Vorzeichen

Arithmetik

Zahlen

~

bitw. Invertierung

Bitoperationen

ganzz. Typen

!

logische Invertierung

Log. Verknüpfung

boolesche Werte

Typecast

C-Allzweck-Cast

viele Typen

(type)

sizeof sizeof ++ --

Peter Sobe

sizeof expr.: Speicherbedarf sizeof (type):Speicherbedarf

Inkrementierung Dekrementierung

Ausdrücke Typen Postfix und Präfix

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 Einschränkungen, Adressen nur ganze Zahlen

&= |= ^= =

bitw. UND-Verknüpfung bitw. ODER-Verknüpfung bitw. Eckl.-Oder-Verkn. bitw. Linksverschieben bitw. Rechtsverschieben

Bitoperationen und Zuweisung

?: ,

Formulierung bed. Ausdrücke Aufzählung in Klammerausdr.

ganzz. Typen

Ausdrücke Ausdrücke

Fragezeichen-Operator zur verkürzten Formulierung bedingter Ausdrücke, 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 größer gleich >= Peter Sobe

Informatik I, Wintersemester 11/12

38

Vergleich Beispiele: if (zahl < 64) ... if (zahl == 16) ... if ((zahl >= 0) && (zahl 7; // bo erhält den Wert false int a = 5 > 7; // a erhält den Wert 0 int b = 5 < 7; // b erhält den Wert 1

Peter Sobe

Informatik I, Wintersemester 11/12

39

Logische Verknüpfungen Logische Verknüpfungsoperatoren • Logisches Und && • Logisches Oder || • Logisches Nicht ! Beispiele: if ( (!(zahl < 0)) && (!(zahl > 64))) ... // Alle drei Abfragen sind gleich if ( (zahl >= 0) && (zahl = 0 && zahl

Shift-Operationen

5 6

< >= == !=

Vergleichsoperatoren

7 8 9

& ^ |

Bitoperationen

10 11

&& ||

logische Verknüpfungen

12

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

Zuweisungsoperatoren

13

,

Komma-Operator

1 ist die höchste Priorität, 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 Größen (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 können 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 schließenden geschweiften Klammer, steht allerdings kein Semikolon. if (i>100) {printf(" i ist gross \n");} In C ++ können 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 für 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 (monat12) { printf(„falscher Wert für 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 zusätzlich 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 ausgeführt, wie die Bedingung zutrifft.  Durch Änderungen der Variablenwerte wird die Bedingung i.d.R. nach endlich vielen Durchläufen 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) ausgeführt. 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 ausgeführt, wie die Bedingung nach der Ausführung zutrifft.  Typischerweise ändert die Anweisung oder Verbundanweisung den Inhalt der Variable, die für 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:

Zählzyklus: Lv = awert (s) ewert

Anw

for (Lv=awert; Lv 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 für while-, do-while- und for-Schleifen Beispiel: for (i=0; i=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 Größen (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.Großmann / P. Sobe

Informatik I, Wintersemester 11/12

64

Deklaration von Feldern in C Felder als eine spezielle Datenstruktur müssen 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.Großmann / 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 für die maximale Anzahl reserviert, aber es werden aktuell ggf. weniger Elemente belegt.

R.Großmann / P. Sobe

Informatik I, Wintersemester 11/12

66

Initialisierung von Feldelementen / Zugriff auf Feldelemente Feldelemente können 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 prüfen, ob der Index in den Deklarationsgrenzen des Feldes liegt. R. Großmann / P. Sobe

Informatik I, Wintersemester 11/12

67

Beispiel eines Feldprogramms #include #include //arithmetisches Mittel einer Messreihe void main() { int i,n; float a[50],s; printf("\nEingabe Anzahl=");scanf("%d",&n); // n