Informatik I - Übung 3

Pascal Schärli

pascscha@student.ethz.ch

08.03.2019

Was gibts heute?

  • Self-Assesment
  • Nachbesprechung Serie 1
  • Best-Of Vorlesung
    • Fliesskomma Zahlen
    • Expressions #2
    • Scopes #2
    • Loops #2
  • Vorbesprechung Serie 2

Pascal Schärli 08.03.2019

Pascal Schärli 08.03.2019

1 Werkzeuge

Pascal Schärli 08.03.2019

Wozu dient ein Compiler?

Übersetzen des Quelltexts in
ausführbaren Maschinen-Code

2 Anweisungen

Pascal Schärli 08.03.2019

Sind folgende C++ Anweisungen gültig?

std::cout << "C++ is better than Java.";
int a = 100
if (1<2)
    std::cout << "I knew it!" << std::endl;

3 Ausdrücke

Pascal Schärli 08.03.2019

a) Was repräsentiert ein Ausdruck?

 

b) Geben Sie einen primären Ausdruck an!

 

c) Geben Sie einen zusammengesetzten Ausdruck an!

 

d) Was bedeutet es, einen Ausdruck auszuwerten?

 

e) Welchen Typ haben die folgenden beiden Ausdrücke?

Eine Berechnung
0
1 + 1
Seinen Wert zu bestimmen
int

1/2

int

1*2

4 Ausdrücke II

Pascal Schärli 08.03.2019

Gebt den Wert der folgenden Ausdrücke an

3 + 4 * 5
23
5 / 2
2
0.9 * 10.0
9.0
17 < 4
false

5 Variablen

Pascal Schärli 08.03.2019

Wozu dient eine Variable?

Zur Speicherung eines (veränderbaren) Wertes unter einem Namen

Wahr oder Falsch?

Ein Variablenname ist ein Ausdruck.
Jede Variable hat einen Typ.

6 Variablen II

Pascal Schärli 08.03.2019

Was ist die Ausgabe dieser Programme?

int x = 10;
x = 2 * x;
std::cout << x << std::endl;
20
int y = 5;
int z = 3 * y;
std::cout << y + z << std::endl;
20

7 If-Statement

Pascal Schärli 08.03.2019

Welche Frage beantwortet der folgende Programmabschnitt?

int a;
std::cin >> a;
if (a % 2 == 0) {
    std::cout << "Ja" << std::endl;
}
else {
    std::cout << "Nein" << std::endl;
}
Ist die Eingabezahl a gerade?

8 While-Statement

Pascal Schärli 08.03.2019

Was ist die Ausgabe des folgenden Programmabschnitts?

int b = 1;
while (b < 100) {
    std::cout << b << " ";
    b = 3 * b;
}
1 3 9 27 81

Nachbesprechung

Pascal Schärli 08.03.2019

Task 1: Expressions

Pascal Schärli 08.03.2019

(a = (b = 5)) = 42
 a = (b = 5)
 a =  b = 5

Ist diese Expression ein lvalue oder rvalue?

  • Nicht ob die einzelnen Elemente lvalues sind, sondern die ganze Expression
  • Kann man die ganze Expression umklammern und links von einem Gleichheitszeichen setzten?
  • Ja!
  1. b = 5
  2. a = 5
  3. a = 42

Task 1: Expressions #2

Pascal Schärli 08.03.2019

  a  +  a++

Ist diese Expression valid?

int a = 1;
((a) + (a++))

Was ist der Wert dieser Expression?

Ja
a++ hat höhere Präzedenz als die
Addition, aber das bedeutet nicht,
dass (a++) vor (a) ausgewertet
wird!

Abhängig nach Auswertungsrichtung
ist der Wert 3 oder 4

Vorlesung

Pascal Schärli 08.03.2019

Fliesskomma Zahlen

Pascal Schärli 08.03.2019

Fliesskommazahlen können entweder als float oder double geschrieben werden.

float
double

-> 32 Bit Floating point number

-> 64 Bit, doppelte präzision

double x = 1.5 / 4;
std::cout << x << std::endl;
0.375

Expressions

Pascal Schärli 08.03.2019

Beim Rechnen mit verschiedenen Dateitypen wird immer in den "allgemeineren" Typ umgewandelt

bool
int
unsigned int
float
double

Expressions

Pascal Schärli 08.03.2019

(y++ && y) + 2.0
(y++ * y) + 2.0
y = (x++ = 3)
3.0 + 3 - 4 + 5
5 % 4 * 3.0 + true * x++
  • Welche Expressions sind gültig?

 

  • Welche gültigen Expressions sind lvalues?

 

  • Was ist der Wert der gültigen Expressions?
    (x = 1, y = -1)

Expressions

Pascal Schärli 08.03.2019

(y++ && y) + 2.0
(y++ * y) + 2.0
y = (x++ = 3)
3.0 + 3 - 4 + 5
5 % 4 * 3.0 + true * x++

Welche Expressions sind gültig?

Expressions

Pascal Schärli 08.03.2019

(y++ && y) + 2.0
(y++ * y) + 2.0
y = (x++ = 3)
3.0 + 3 - 4 + 5
5 % 4 * 3.0 + true * x++

Welche Expressions sind lvalues?

rvalue

rvalue

rvalue

rvalue

Expressions

Pascal Schärli 08.03.2019

(y++ && y) + 2.0

Was ist der Wert dieser Expression?

(y++ * y) + 2.0
y = (x++ = 3)
3.0 + 3 - 4 + 5
5 % 4 * 3.0 + true * x++

2.0

undefined

7.0

4.0

Scopes

Pascal Schärli 08.03.2019

int a = 2;

if (x < 7) {
    int a = 8;
    std::cout << a;
}

std::cout << a;
82
int a = 2;

if (x < 7) {
    a = 8;
    std::cout << a;
}

std::cout << a;
88

Scopes

Pascal Schärli 08.03.2019

int sum = 0;
for (int i = 0; i < 5; ++i) {
    int a;
    std::cin >> a;
    sum += a;
}

Was ist der Scope dieser Variablen?

sum

Mindestens das ganze Code Snippet

i

Innerhalb der for-Schleife

a

Innerhalb einer Iteration der for-Schleife

Do-While

Pascal Schärli 08.03.2019

int i = 1;
do{
    std::cout << i << " ";
    i*=2;
} while(i < 10);
1 2 4 8 

 

  • Kondition wird erst am Ende geprüft

 

  • Schleifenkörper wird mindestens ein Mal ausgeführt

Loops

Pascal Schärli 08.03.2019

#include <iostream>

int main () {
    std::cout << "Enter a number: ";
    int n;
    std::cin >> n;
    
    // loop 1
    for (int i = 1; i <= n; ++i)
        std::cout << i << "\n";
    
    // loop 2
    int i = 0;
        while (i < n)
    std::cout << ++i << "\n";
    
    // loop 3
    i = 1;
    do
        std::cout << i++ << "\n";
    while (i <= n);
    
return 0;
}
  • Gibt es unterschiede zwischen diesen drei Loops?
  • Falls ja, warum entstehen diese Unterschiede?

Lösung:

  • Der letzte Loop hat den Output 1 falls \(n \le 0 \)
  • Loops 1 und 3 terminieren nie wenn n der grösstmögliche Integer ist

Loops

Pascal Schärli 08.03.2019

Wie müsste man die folgende for-Schleife in eine while-Schleife umwandeln?

for (int i = 0; i < n; ++i)
    BODY
{
    int i = 0;
    while (i < n) {
        BODY
        ++i;
    }
}

Loops

Pascal Schärli 08.03.2019

Wie müsste man die folgende while-Schleife in eine for-Schleife umwandeln?

while (condition)
    BODY
for ( ;condition; )
    BODY

Loops

Pascal Schärli 08.03.2019

Wie müsste man die folgende do-while-Schleife in eine for-Schleife umwandeln?

do
    BODY;
while (condition);
BODY;
for ( ;condition; )
    BODY;

Vorbesprechung

Pascal Schärli 08.03.2019

Loop Snippets

Pascal Schärli 08.03.2019

unsigned int n;
std::cin >> n;
unsigned int f = 1;
if(n != 0) {
  do {
    f = f * n;
    --n;
  } while(n > 0);
}
std::cout << f << std::endl;
while(true) {
  int i1, i2;
  std::cin >> i1 >> i2;
  std::cout << i1+i2 << "\n";
  int again;
  std::cout << "Again?(0/1)\n";
  std::cin >> again;
  if(!again)
    break;
}
unsigned int z;
unsigned int d;

for(std::cin >> z >> d ; z >= d ; z = z-d);
std::cout << z << std::endl;
  • Was berechnen diese Loops?
  • Welcher Loop würde jeweils besser passen?
  • Schreibt die Loops in eine besser passende Form um

Tipp:

  • Es gibt zu jedem Task eine eigene "Sandbox" um den Code auszuprobieren

Pascal Schärli 08.03.2019

unsigned int n;
std::cin >> n;

unsigned int x = 1;
if (n > 0) {
  unsigned int k = 0;
  bool e = true;
  do {
    if (++k == n) { 
      e = false;
    }
    x *= 2;
  } while(e);
}
std::cout << x << std::endl;
  • Was berechnen dieser Loop?
  • Für welche n ist der Output korrekt?
  • Beweise, dass das Programm für alle n mit korrektem Output teriminiert (Induktion)
  • Findet eine elegantere Implementation.
    -> Andere Schleifenart

Pascal Schärli 08.03.2019

\frac{\pi}{4} = \sum\limits_{n\ge 0}{\frac{(-1)^n}{2n+1}} = 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \ldots
  • Die Zahl Pi kann durch verschiedene Summen approximiert werden.
  • Schreibt ein Programm welches diese Summe bis auf eine angegebene Anzahl Summanden approximiert
  • Tipp: benutzt
double

Pascal Schärli 08.03.2019

\frac{\pi}{2} = 1 + \sum\limits_{1\le n}{\frac{\prod_{0 < 1\le n}{i}}{\prod_{0 < i\le n}{(2i+1)}}}\\
= 1 + \frac{1}{3} + \frac{1\times 2}{3\times 5} + \frac{1 \times 2 \times 3}{3 \times 5 \times 7} + \frac{1 \times 2 \times 3 \times 4}{3 \times 5 \times 7 \times 9} + \ldots
  • Auch mit dieser Summe kann pi approximiert werden
  • Schreibt ein Programm welches diese Summe bis auf eine angegebene Anzahl Summanden approximiert
  • Tipp: benutzt
double

Program of the Week

Pascal Schärli 08.03.2019

Viel Spass!

Pascal Schärli 08.03.2019