Ganze zahlen
This presentation is the property of its rightful owner.
Sponsored Links
1 / 117

Ganze Zahlen PowerPoint PPT Presentation


  • 55 Views
  • Uploaded on
  • Presentation posted in: General

Ganze Zahlen. Die Typen int , unsigned int ; Auswertung arithmetischer Aus-drücke, arithmetische Operatoren. Celsius to Fahrenheit. // Program: fahrenheit.cpp // Convert temperatures from Celsius to Fahrenheit. #include <iostream> int main() { // Input

Download Presentation

Ganze Zahlen

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Ganze Zahlen

Die Typen int, unsigned int; Auswertung arithmetischer Aus-drücke, arithmetische Operatoren


Celsius to Fahrenheit

// Program: fahrenheit.cpp

// Convert temperatures from Celsius to Fahrenheit.

#include <iostream>

int main()

{

// Input

std::cout << "Temperature in degrees Celsius =? ";

int celsius;

std::cin >> celsius;

// Computation and output

std::cout << celsius << " degrees Celsius are "

<< 9 * celsius / 5 + 32 << " degrees Fahrenheit.\n";

return 0;

}


Celsius to Fahrenheit

// Program: fahrenheit.cpp

// Convert temperatures from Celsius to Fahrenheit.

#include <iostream>

int main()

{

// Input

std::cout << "Temperature in degrees Celsius =? ";

int celsius;

std::cin >> celsius;

// Computation and output

std::cout << celsius << " degrees Celsius are "

<< 9 * celsius / 5 + 32 << " degrees Fahrenheit.\n";

return 0;

}

15 degrees Celsius are 59 degrees Fahrenheit.


9 * celsius / 5 + 32

  • arithmetischer Ausdruck

  • enthält drei Literale, eine Variable, drei Operatorsymbole


9 * celsius / 5 + 32

  • arithmetischer Ausdruck

  • enthält drei Literale, eine Variable, drei Operatorsymbole

    Wie ist der Ausdruck geklammert?


Assoziativität und Präzedenz

9 * celsius / 5 + 32

bedeutet

(9 * celsius / 5) + 32

Regel 1: Punkt- vor Strichrechnung


Assoziativität und Präzedenz

(9 * celsius / 5) + 32

bedeutet

((9 * celsius) / 5) + 32

Regel 2: Von links nach rechts


Assoziativität und Präzedenz

Regel 1: Multiplikative Operatoren (*, /, %) haben höhere Präzedenz (“binden stärker”) als additive Operatoren (+, -)

Regel 2: Arithmetische Operatoren (*, /, %, +, -) sind linksassoziativ (bei gleicher Präzedenz erfolgt Auswertung von links nach rechts


Assoziativität und Präzedenz

-3 - 4

bedeutet

(-3) - 4

Regel 3: Unäre +,- vor binären +,-


Assoziativität und Präzedenz

Jeder Ausdruck kann mit Hilfe der

  • Assoziativitäten

  • Präzedenzen

  • Stelligkeiten (Anzahl Operanden)

    der beteiligten Operatoren eindeutig

    geklammert werden (Details im Skript).


Ausdrucksbäume

Klammerung ergibt Ausdrucksbaum:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Von oben nach unten im Ausdrucksbaum:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Von oben nach unten im Ausdrucksbaum:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Von oben nach unten im Ausdrucksbaum:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Von oben nach unten im Ausdrucksbaum:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Von oben nach unten im Ausdrucksbaum:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Von oben nach unten im Ausdrucksbaum:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Von oben nach unten im Ausdrucksbaum:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Reihenfolge ist nicht eindeutig bestimmt:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Reihenfolge ist nicht eindeutig bestimmt:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Reihenfolge ist nicht eindeutig bestimmt:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Reihenfolge ist nicht eindeutig bestimmt:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Reihenfolge ist nicht eindeutig bestimmt:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Reihenfolge ist nicht eindeutig bestimmt:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

Reihenfolge ist nicht eindeutig bestimmt:

9 * celsius / 5 + 32

9 * celsius

(9 * celsius) / 5

((9 * celsius) / 5) + 32


Auswertungsreihenfolge

  • Gültige Reihenfolge: Jeder Knoten wird erst nach seinen Kindern ausgewertet.

Kinder

Knoten


Auswertungsreihenfolge

  • Gültige Reihenfolge: Jeder Knoten wird erst nach seinen Kindern ausgewertet.

Kinder

Knoten


Auswertungsreihenfolge

  • Gültige Reihenfolge: Jeder Knoten wird erst nach seinen Kindern ausgewertet.

Kinder

Knoten


Auswertungsreihenfolge

  • Gültige Reihenfolge: Jeder Knoten wird erst nach seinen Kindern ausgewertet.

Kinder

Knoten


Auswertungsreihenfolge

  • Gültige Reihenfolge: Jeder Knoten wird erst nach seinen Kindern ausgewertet.

Kinder

In C++ ist die anzuwend-ende gültige Reihenfolge nicht spezifiziert.

Knoten


Auswertungsreihenfolge

  • Gültige Reihenfolge: Jeder Knoten wird erst nach seinen Kindern ausgewertet.

  • “Guter” Ausdruck: jede gültige Reihen- folge führt zum gleichen Ergebnis

Kinder

In C++ ist die anzuwend-ende gültige Reihenfolge nicht spezifiziert.

Knoten


Arithmetische Operatoren

Operand rechts


Arithmetische Operatoren

Alle Operatoren: R-Wert × R-Wert R-Wert


Division und Modulus

  • Operator / realisiert ganzzahlige Division:


Division und Modulus

  • Operator / realisiert ganzzahlige Division:

  • in fahrenheit.C:

5 / 2 hat Wert 2

9 * celsius / 5 + 32:

15 degrees Celsius are 59 degrees Fahrenheit


Division und Modulus

  • Operator / realisiert ganzzahlige Division:

  • in fahrenheit.C:

5 / 2 hat Wert 2

9 * celsius / 5 + 32:

15 degrees Celsius are 59 degrees Fahrenheit

9 / 5 * celsius + 32:

15 degrees Celsius are 47 degrees Fahrenheit


Division und Modulus

  • Operator / realisiert ganzzahlige Division:

  • in fahrenheit.C:

5 / 2 hat Wert 2

9 * celsius / 5 + 32:

15 degrees Celsius are 59 degrees Fahrenheit

9 / 5 * celsius + 32:

15 degrees Celsius are 47 degrees Fahrenheit


Division und Modulus

  • Operator / realisiert ganzzahlige Division:

  • in fahrenheit.C:

5 / 2 hat Wert 2

9 * celsius / 5 + 32:

15 degrees Celsius are 59 degrees Fahrenheit

1 * celsius + 32:

15 degrees Celsius are 47 degrees Fahrenheit


Division und Modulus

  • Operator / realisiert ganzzahlige Division:

  • in fahrenheit.C:

5 / 2 hat Wert 2

9 * celsius / 5 + 32:

15 degrees Celsius are 59 degrees Fahrenheit

1 * 15 + 32:

15 degrees Celsius are 47 degrees Fahrenheit


Division und Modulus

  • Operator / realisiert ganzzahlige Division:

  • in fahrenheit.C:

5 / 2 hat Wert 2

9 * celsius / 5 + 32:

15 degrees Celsius are 59 degrees Fahrenheit

47:

15 degrees Celsius are 47 degrees Fahrenheit


Division und Modulus

  • Modulus-Operator berechnet Rest der ganzzahligen Division

5 / 2 hat Wert 2

5 % 2 hat Wert 1


Division und Modulus

  • Modulus-Operator berechnet Rest der ganzzahligen Division

  • Es gilt immer:

5 / 2 hat Wert 2

5 % 2 hat Wert 1

(a / b) * b + a % b hat den Wert von a


Division und Modulus

  • Modulus-Operator berechnet Rest der ganzzahligen Division

  • Es gilt immer:

  • Falls a oder b negativ, so gibt es zwei Möglichkeiten:

5 / 2 hat Wert 2

5 % 2 hat Wert 1

(a / b) * b + a % b hat den Wert von a


Division und Modulus

  • Modulus-Operator berechnet Rest der ganzzahligen Division

  • Es gilt immer:

  • Falls a oder b negativ, so gibt es zwei Möglichkeiten:

5 / 2 hat Wert 2

(a / b) * b + a % b hat den Wert von a

-5 / 2 hat Wert -2

-5 % 2 hat Wert -1

Rundung gegen 0


Division und Modulus

  • Modulus-Operator berechnet Rest der ganzzahligen Division

  • Es gilt immer:

  • Falls a oder b negativ, so gibt es zwei Möglichkeiten:

5 / 2 hat Wert 2

(a / b) * b + a % b hat den Wert von a

-5 / 2 hat Wert -3

-5 % 2 hat Wert 1

Rundung gegen unendlich


Division und Modulus

  • Modulus-Operator berechnet Rest der ganzzahligen Division

  • Es gilt immer:

  • Meistens: falls a oder b negativ, so wird gegen 0 gerundet;

5 / 2 hat Wert 2

5 % 2 hat Wert 1

(a / b) * b + a % b hat den Wert von a


Inkrement und Dekrement

  • Erhöhen / Erniedrigen einer Zahl um 1 ist eine häufige Operation

  • geht für einen L-Wert so:

expr = expr + 1


Inkrement und Dekrement

  • Erhöhen / Erniedrigen einer Zahl um 1 ist eine häufige Operation

  • geht für einen L-Wert so:

  • Nachteile:

    • relativ lang

expr = expr + 1


Inkrement und Dekrement

  • Erhöhen / Erniedrigen einer Zahl um 1 ist eine häufige Operation

  • geht für einen L-Wert so:

  • Nachteile:

    • relativ lang

    • expr wird zweimal ausgewertet (Effekte!)

expr = expr + 1


In-/Dekrement-Operatoren


In-/Dekrement-Operatoren


In/Dekrement-Operatoren

Beispiel:

int a = 7;

std::cout << ++a << "\n";

std::cout << a++ << "\n";

std::cout << a << "\n";


In/Dekrement-Operatoren

Beispiel:

int a = 7;

std::cout << ++a << "\n"; // Ausgabe 8

std::cout << a++ << "\n";

std::cout << a << "\n";


In/Dekrement-Operatoren

Beispiel:

int a = 7;

std::cout << ++a << "\n"; // Ausgabe 8

std::cout << a++ << "\n"; // Ausgabe 8

std::cout << a << "\n";


In/Dekrement-Operatoren

Beispiel:

int a = 7;

std::cout << ++a << "\n"; // Ausgabe 8

std::cout << a++ << "\n"; // Ausgabe 8

std::cout << a << "\n"; // Ausgabe 9


In/Dekrement-Operatoren

Ist die Anweisung

++expr;

äquivalent zu

expr++; ?


In/Dekrement-Operatoren

Ist die Anweisung

++expr;

äquivalent zu

expr++; ?

  • Ja, aber…

    • Prä-Inkrement ist effizienter (alter Wert muss nicht gespeichert werden)

    • Post-In/Dekrement sind die einzigen linksasso-ziativen unärern Operatoren (nicht sehr intuitiv)


Arithmetische Zuweisungen


Arithmetische Zuweisungen

Arithmetische Zuweisungen werten expr1 nur einmal aus.


Wertebereich des Typs int

  • b-Bit-Repräsentierung: Wertebereich umfasst die ganzen Zahlen

    {-2b-1, -2b-1+1,…, -1, 0, 1,…,2b-1-1}


Wertebereich des Typs int

  • b-Bit-Repräsentierung: Wertebereich umfasst die ganzen Zahlen

    {-2b-1, -2b-1+1,…, -1, 0, 1,…,2b-1-1}

  • Auf den meisten Plattformen: b = 32


Wertebereich des Typs int

// Program: limits.cpp

// Output the smallest and the largest value of type int.

#include <iostream>

#include <limits>

int main()

{

std::cout << "Minimum int value is "

<< std::numeric_limits<int>::min() << ".\n"

<< "Maximum int value is "

<< std::numeric_limits<int>::max() << ".\n";

return 0;

}


Wertebereich des Typs int

// Program: limits.cpp

// Output the smallest and the largest value of type int.

#include <iostream>

#include <limits>

int main()

{

std::cout << "Minimum int value is "

<< std::numeric_limits<int>::min() << ".\n"

<< "Maximum int value is "

<< std::numeric_limits<int>::max() << ".\n";

return 0;

}

z.B.

Minimum int value is -2147483648

Maximum int value is 2147483647


Überlauf und Unterlauf

  • Arithmetische Operationen (+, -, *) können aus dem Wertebereich herausführen

  • Ergebnisse können inkorrekt sein.


Überlauf und Unterlauf

  • Arithmetische Operationen (+, -, *) können aus dem Wertebereich herausführen

  • Ergebnisse können inkorrekt sein.

power8.cpp: 158 = -1732076671

power20.cpp: 320 = -808182895


Überlauf und Unterlauf

  • Arithmetische Operationen (+, -, *) können aus dem Wertebereich herausführen

  • Ergebnisse können inkorrekt sein.

  • Es gibt keine Fehlermeldung!

power8.cpp: 158 = -1732076671

power20.cpp: 320 = -808182895


Der Typ unsigned int

  • Wertebereich

  • Alle arithmetischen Operatoren gibt es auch für unsigned int

  • Literale: 1u, 17u,…

{0, 1,…, 2b-1}


Gemischte Ausdrücke

  • Operatoren können Operanden verschiedener Typen haben (z.B. int und unsigned int

  • Solche gemischten Ausdrücke sind vom “allgemeineren” Typ unsigned int

  • int-Operanden werden konvertiert nach unsigned int

17 + 17u


Konversion


Konversion

Bei Zweierkomplement-Darstellung passiert dabei intern gar nichts!


Konversion “andersherum”

  • Die Deklaration

    int a = 3u

    konvertiert 3u nach int (Wert bleibt erhalten, weil er im Wertebereich von int liegt; andernfalls ist das Ergebnis implementierungsabhängig)


Wahrheitswerte

Boole’sche Funktionen; der Typ bool; logische und relationale Operatoren; Kurzschlussauswertung


Boole’sche Funktionen

  • Boole’sche Funktion:

    f: {0,1}n -> {0,1}

  • 0 enstpricht “falsch”

  • 1 entspricht “wahr”


Boole’sche Funktionen

  • Boole’sche Funktion:

    f: {0,1}2 -> {0,1}

  • 0 enstpricht “falsch”

  • 1 entspricht “wahr”


Boole’sche Funktionen

  • Boole’sche Funktion:

    f: {0,1}2 -> {0,1}

  • 0 enstpricht “falsch”

  • 1 entspricht “wahr”


Boole’sche Funktionen

  • Boole’sche Funktion:

    f: {0,1}1 -> {0,1}

  • 0 enstpricht “falsch”

  • 1 entspricht “wahr”


Vollständigkeit

  • AND, OR, NOT sind die in C++ verfügbaren Boole’schen Funktionen

  • Alle anderen binären boole’schen Funktionen sind daraus erzeugbar


Vollständigkeit

  • AND, OR, NOT sind die in C++ verfügbaren Boole’schen Funktionen

  • Alle anderen binären boole’schen Funktionen sind daraus erzeugbar


Vollständigkeit

  • AND, OR, NOT sind die in C++ verfügbaren Boole’schen Funktionen

  • Alle anderen binären boole’schen Funktionen sind daraus erzeugbar

XOR (x,y) =

AND (OR (x,y), NOT (AND (x,y)))


Vollständigkeit: Beweis

  • Identifiziere binäre boole’sche Funktion mit ihrem charakteristischem Vektor:


Vollständigkeit: Beweis

  • Identifiziere binäre boole’sche Funktion mit ihrem charakteristischem Vektor:

Charakteristischer Vektor: 0110


Vollständigkeit: Beweis

  • Identifiziere binäre boole’sche Funktion mit ihrem charakteristischem Vektor:

Charakteristischer Vektor: 0110

XOR = f0110


Vollständigkeit: Beweis

  • Schritt 1: erzeuge die Funktionen f0001, f0010, f0100, f1000


Vollständigkeit: Beweis

  • Schritt 1: erzeuge die Funktionen f0001, f0010, f0100, f1000

    f0001 = AND (x, y)


Vollständigkeit: Beweis

  • Schritt 1: erzeuge die Funktionen f0001, f0010, f0100, f1000

    f0001 = AND (x, y)

    f0010 = AND (x, NOT (y))


Vollständigkeit: Beweis

  • Schritt 1: erzeuge die Funktionen f0001, f0010, f0100, f1000

    f0001 = AND (x, y)

    f0010 = AND (x, NOT (y))

    f0100 = AND (y, NOT (x))


Vollständigkeit: Beweis

  • Schritt 1: erzeuge die Funktionen f0001, f0010, f0100, f1000

    f0001 = AND (x, y)

    f0010 = AND (x, NOT (y))

    f0100 = AND (y, NOT (x))

    f1000 = NOT (OR (x, y))


Vollständigkeit: Beweis

  • Schritt 2: erzeuge alle Funktionen

    f1101 = OR (f1000, OR (f0100,f0001))


Vollständigkeit: Beweis

  • Schritt 2: erzeuge alle Funktionen

    f1101 = OR (f1000, OR (f0100,f0001))

    f0000 = 0


Der Typ bool

  • Repräsentiert Wahrheitswerte

  • Literale true und false

  • Wertebereich{true, false}


Der Typ bool

  • Repräsentiert Wahrheitswerte

  • Literale true und false

  • Wertebereich{true, false}

bool b = true; // Variable mit Wert true


bool vs. int: Konversion

  • bool’s können überall dort verwendet werden, wo int’sgefordert sind, und umgekehrt


bool vs. int: Konversion

  • bool’s können überall dort verwendet werden, wo int’sgefordert sind, und umgekehrt


bool vs. int: Konversion

  • bool’s können überall dort verwendet werden, wo int’sgefordert sind, und umgekehrt


bool vs. int: Konversion

  • Existierende Programme verwenden oft keine bool’s, sondern nur die int’s 0 und 1; das ist aber schlechter Stil.


Logische Operatoren


Logische Operatoren

bool (× bool) -> bool


Logische Operatoren

bool (× bool) -> bool

R-Wert (× R-Wert) -> R-Wert


Relationale Operatoren


Relationale Operatoren

Zahlentyp × Zahlentyp -> bool


Relationale Operatoren

Zahlentyp × Zahlentyp -> bool

R-Wert × R-Wert -> R-Wert


DeMorgan’sche Regeln

  • !(a && b) == (!a || !b)

  • !(a || b) == (!a && !b)


DeMorgan’sche Regeln

  • !(a && b) == (!a || !b)

  • !(a || b) == (!a && !b)

! (reichundschön) == ( arm oderhässlich )


Präzedenzen

Binäre arithmetischeOperatoren

binden stärker als

Relationale Operatoren,

und diese binden stärker als

binäre logischeOperatoren.


Präzedenzen

Binäre arithmetischeOperatoren

binden stärker als

Relationale Operatoren,

und diese binden stärker als

binäre logischeOperatoren.

7 + x < y && y != 3 * z


Präzedenzen

Binäre arithmetischeOperatoren

binden stärker als

Relationale Operatoren,

und diese binden stärker als

binäre logischeOperatoren.

((7 + x) < y) && (y != (3 * z))


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

x != 0 && z / x > y


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

X hat Wert 1:

x != 0 && z / x > y


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

X hat Wert 1:

x != 0 && z / x > y


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

X hat Wert 1:

true && z / x > y


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

X hat Wert 1:

true && z / x > y


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

X hat Wert 0:

x != 0 && z / x > y


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

X hat Wert 0:

x != 0 && z / x > y


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

X hat Wert 0:

false && z / x > y


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

X hat Wert 0:

false


Kurzschlussauswertung

  • Logische Operatoren && und ||werten den linken Operanden zuerst aus

  • Falls das Ergebnis dann schon feststeht, wird der rechte Operand nicht mehr ausgewertet

x != 0 && z / x > y

keine Division durch Null!


  • Login