Informatik I - Ãœbung 2

Pascal Schärli

pascscha@student.ethz.ch

01.03.2019

Was gibts heute?

Pascal Schärli 01.03.2019

Vorlesung

Pascal Schärli 01.03.2019

Vergleiche

Pascal Schärli 01.03.2019

In C++ können Variablen wie in der Mathematik miteinander verglichen werden.

=
==
<
<
>
>
!=
\le
<=

≠

\ge
>=

If-Statement

Pascal Schärli 01.03.2019

int n = 50;

if(n > 128){
    std::cout << "n is larger than 128";
}
else if(n > 64){
    std::cout << "n is larger than 64";
}
else if(n > 32){
    std::cout << "n is larger than 32";
}
else if(n > 16){
    std::cout << "n is larger than 16";
}
else {
    std::cout << "n is smaller than 17";
}
if
else if
else
  • Falls die Condition in den Runden () Klammern erfüllt ist, wird der Code in den geschweiften {} Klammern ausgeführt.

 

  • Jedes If-Statement besteht aus:
    1. Genau einem
    2. Beliebig vielen
    3. Höchstens einem
n is larger than 32

Scopes

Pascal Schärli 01.03.2019

int a = 0;

if(a == 0){
    int b = 3;
}
else{
    int b = 4;
}

std::cout << b << std::endl;
  • Variablen sind immer nur in einem bestimmten Bereich (=scope) gültig
  • Wenn dieser Bereich verlassen wird, wird die Variable wieder gelöscht

error: ‘b’ was not declared in this scope

Boolean Expressions

Pascal Schärli 01.03.2019

a b a && b
false false false
false true false
true false false
true true true

AND

a b a || b
false false false
false true true
true false true
true true true

OR

a b a != b
false false false
false true true
true false true
true true false

XOR

a !a
false true
true false

NOT

&&
||
!=
!

Kurzschluss Evaluation

Pascal Schärli 01.03.2019

(2 > 3) && (17u - 55 <= ++x % y)
2 > 3 && 17u - 55 <= ++x % y
false && (17u - 55 <= ++x % y)
false

int -> bool

Pascal Schärli 01.03.2019

if( 7 && 8){
    std::cout << "Hello" << std::endl;
}
else{
    std::cout << "World!" << std::endl;
}
Hello

Bei Logischen Operationen werden Integer zu Booleans umgewandelt

0            -> false
alles andere -> true

bool -> int

Pascal Schärli 01.03.2019

if( 3 > false){
    std::cout << "Hello" << std::endl;
}
else{
    std::cout << "World!" << std::endl;
}
Hello

Beim Vergleich mit Integern werden Booleans zuerst in Integer umgewandelt

false -> 0
true  -> 1

Präzedenz

Pascal Schärli 01.03.2019

Präzedenz Operator Assoziativität
2
3
5
6
9
10
14
15
16
a++
a--
++a
--a
!
a*b
a/b
a%b
a+b
a-b
<
<=
>
>=
==
!=
&&
||
=
+=

Präzedenz

Pascal Schärli 01.03.2019

P Op Assoz.
2
3
5
6
9
10
14
15
16
a++
a--
++a
--a
!
a*b
a/b
a%b
a+b
a-b
<
<=
>
>=
==
!=
&&
||
=
+=
 x == 1  ||   1 / (x - 1)  < 1
 x == 1  ||  (1 / (x - 1)) < 1
 x == 1  || ((1 / (x - 1)) < 1)
(x == 1) || ((1 / (x - 1)) < 1)
(1 == 1) || ((1 / (x - 1)) < 1)
    true || ((1 / (x - 1)) < 1)
    true
int x = 1;

Präzedenz

Pascal Schärli 01.03.2019

P Op Assoz.
2
3
5
6
9
10
14
15
16
a++
a--
++a
--a
!
a*b
a/b
a%b
a+b
a-b
<
<=
>
>=
==
!=
&&
||
=
+=
 !(1 && x)  + 1
(!(1 && x)) + 1
(!(1 && 1)) + 1
(!( true )) + 1
(  false  ) + 1
     0      + 1
              1
int x = 1;

While-Loop

Pascal Schärli 01.03.2019

int i = 0;
while(i < 10){
    std::cout << i << " ";

    i++;
}
0 1 2 3 4 5 6 7 8 9 

Solange die Condition in den Runden () Klammern erfüllt ist, wird der Code in den geschweiften {} Klammern wiederholt.

For-Loop

Pascal Schärli 01.03.2019

int i = 0;
while(i < 10){
    std::cout << i << " ";

    i++;
}
  • While-Loops verfolgen häufig die selbe Struktur:
  1. Initialization
  2. Condition
  3. Increment
0 1 2 3 4 5 6 7 8 9 
int i = 0;
i < 10
i++
  • Diese Struktur kann man daher auch schöner mit einem For-Loop schreiben.
  • Der einzige unterschied ist, dass i nun im inneren Scope ist.
for(int i = 0; i < 10; i++){
    std::cout << i << " ";
}

Pascal Schärli 01.03.2019

// Program: strangesum.cpp

#include <iostream>

int main () {

  // input
  unsigned int strangesum = 0;
  unsigned int n;
  std::cin >> n;
  
  // computation
  // TODO: Implement.
  






  // output
  std::cout << strangesum << "\n";

  return 0;
}
// Program: strangesum.cpp

#include <iostream>

int main () {

  // input
  unsigned int strangesum = 0;
  unsigned int n;
  std::cin >> n;
  
  // computation
  for (unsigned int i = 1; i <= n; i++) {
    if (i%2 == 1) {
      if (i%5 != 0) {
        strangesum += i;
      }
    }
  }
  
  // output
  std::cout << strangesum << "\n";

  return 0;
}

Schreibe ein Programm, welches die Summe aller positiven Zahlen, die ungerade aber nicht durch 5 teilbar sind, bis zur Obergrenze n zurückgibt.

// Program: strangesum.cpp

#include <iostream>

int main () {

  // input
  unsigned int strangesum = 0;
  unsigned int n;
  std::cin >> n;
  
  // computation
  for (unsigned int i = 1; i <= n; i++) {
    if (i%2 == 1 && i%5 != 0) {

        strangesum += i;

    }
  }
  
  // output
  std::cout << strangesum << "\n";

  return 0;
}
// Program: strangesum.cpp

#include <iostream>

int main () {

  // input
  unsigned int strangesum = 0;
  unsigned int n;
  std::cin >> n;
  
  // computation
  for (unsigned int i = 1; i <= n; i+=2) {
    if (i%5 != 0) {

        strangesum += i;

    }
  }
  
  // output
  std::cout << strangesum << "\n";

  return 0;
}

Pascal Schärli 01.03.2019

#include <iostream>
#include <cassert>

int main () {








  
  return 0;
}
#include <iostream>
#include <cassert>

int main () {
  unsigned int n;
  std::cin >> n;
  assert(n >= 1);
  
  unsigned int power = 1;
  for (; power <= n / 2; power *= 2);
  
  std::cout << power << std::endl;
  
  return 0;
}

Schreibe ein Programm, welches für eine Zahl n die grösste Zweierpotenz p zurück gibt, welche kleiner als n ist.

Pascal Schärli 01.03.2019

#include <iostream>
#include <cassert>

int main () {
    const int n = 6;

    // Compute n^12
    int prod = 1;
    
    for (int i = 1; 1 <= i < 13; ++i) {
        prod *= n;

    }
    
    // Output stars
    for (int i = 1; i < prod; ++i) {
        std::cout << "*";
    }
    
    std::cout << "\n";
    return 0;
}

Output von std::cerr wird vom auto-grader ignoriert.

#include <iostream>
#include <cassert>

int main () {
    const int n = 6;

    // Compute n^12
    int prod = 1;
    std::cerr << "Reached 1" << std::endl;
    for (int i = 1; 1 <= i < 13; ++i) {
        prod *= n;

    }
    std::cerr << "Reached 2" << std::endl;
    // Output stars
    for (int i = 1; i < prod; ++i) {
        std::cout << "*";
    }
    std::cerr << "Reached 3" << std::endl;
    std::cout << "\n";
    return 0;
}
#include <iostream>
#include <cassert>

int main () {
    const int n = 6;

    // Compute n^12
    int prod = 1;
    std::cerr << "Reached 1" << std::endl;
    for (int i = 1; 1 <= i && i < 13; ++i) {
        prod *= n;

    }
    std::cerr << "Reached 2" << std::endl;
    // Output stars
    for (int i = 1; i < prod; ++i) {
        std::cout << "*";
    }
    std::cerr << "Reached 3" << std::endl;
    std::cout << "\n";
    return 0;
}
#include <iostream>
#include <cassert>

int main () {
    const int n = 6;

    // Compute n^12
    int prod = 1;
    std::cerr << "Reached 1" << std::endl;
    for (int i = 1; 1 <= i && i < 13; ++i) {
        prod *= n;
    std::cerr << prod << std::endl;
    }
    std::cerr << "Reached 2" << std::endl;
    // Output stars
    for (int i = 1; i < prod; ++i) {
        std::cout << "*";
    }
    std::cerr << "Reached 3" << std::endl;
    std::cout << "\n";
    return 0;
}
#include <iostream>
#include <cassert>

int main () {
    const int n = 6;

    // Compute n^12
    unsigned int prod = 1;
    std::cerr << "Reached 1" << std::endl;
    for (int i = 1; 1 <= i && i < 13; ++i) {
        prod *= n;
    std::cerr << prod << std::endl;
    }
    std::cerr << "Reached 2" << std::endl;
    // Output stars
    for (int i = 1; i < prod; ++i) {
        std::cout << "*";
    }
    std::cerr << "Reached 3" << std::endl;
    std::cout << "\n";
    return 0;
}

Vorbesprechung

Pascal Schärli 01.03.2019

1 - Expression Evaluation

Pascal Schärli 01.03.2019

3 >= 3
 true || false  && false
(true || false) && false
3 > (1 < true)
8 > 4 > 2 > 1
2 < a < 4

Welche dieser Expressions sind true, welche sind false?

Tipps:

3 - Decimal to Binary

Pascal Schärli 01.03.2019

Schreibt ein Programm, welches die Binärrepräsentation einer positiven, ganzen Zahl bestimmt.

Tipps:

4a - Fibonacci Primes

Pascal Schärli 01.03.2019

Tipps:

  • Fibonacci: Benutzt schleife mit zwei Variablen, welche den letzten und vorletzten Wert speichern
  • Prim: Implementiert eine Schleife, welche die Definition von oben prüft

Schreibt ein Programm, welches bis zu einer Zahl m alle Zahlen ausgibt, welche sowohl Fibonacci als auch Primzahlen sind.

Fibonacci Zahlen:

1 1 2 3 5 8 13 21

Primzahlen:

n ist eine Primzahl, falls für alle d zwischen 2 und n-1 gilt, dass n%d != 0

4b - Fibonacci Overflow

Pascal Schärli 01.03.2019

Tipps:

  • Bei einem 32 Bit unsigned int passiert der overflow  wenn die Zahl grösser als 2^32-1 wird

Fibonnacci Zahlen wachsen schnell. Schreibe ein Programm, welches Fibonacci Zahlen berechnet aber aufhört bevor es einen Overflow gibt.

Program of the Week

Pascal Schärli 01.03.2019

Viel Spass!

Pascal Schärli 01.03.2019