Informatik W03

Levin Ceglie

Outline

  • Admin
  • Repetition Vorlesung via Quiz
  • Expressions
  • For-Loops
  • Debugging
  • Freies Aufgabenlösen

Admin

Fragen aus letzter Woche

Weiteres

  • Haben alle das Email erhalten?
  • Link für anonymes Feedback auf der Webseite.
  • Fragen zu den Aufgaben letzter Woche?

L- und R-Werte

a=b=c=2;

Die Frage: Ist expr ein lvalue? Lässt sich beantworten, indem man folgende Frage betrachten: Kann ich expr = 5; schreiben?

Demonstration Code Expert (geht über den momentanen Stoff hinaus).

Expressions

Präzedenzen

Länge nicht geklammerte Ausdrucke werden vom Compiler mittels einer Präzedenztabelle gelesen (siehe C++ Operator Precedence - cppreference.com). Allgemeine Merkregel: (American Rugby League)

Persönliche Empfehlung: Präzedenztabelle auf dem Spick für die Prüfung!

Assoziativität

Für manche Expressions reicht es nicht nur die Präzedenzen zu kennen. Betrachte

false && false && true

Wenn man versucht diesen Ausdruck nur unter Benutzung der Präzedenzen zu lesen führt dies zu Ambiguität. Man muss zusätzlich die sogenannte Assoziativität beachten (siehe wiederum C++ Operator Precedence - cppreference.com). Der && Operator ist links-assoziativ. Das bedeutet, dass die Expression wie folgt ausgewertet wird.

(false && false) && true

Also der Operator der weiter Links steht wird zuerst ausgelesen.

Short Circuit Evaluation

Bei den Operatoren && und || werden die Expressions nur ausgewertet solange der Wert nicht eindeutig ist. Zum Beispiel muss bei 5 < 2 && x < 3 nur 5<2 ausgewertet werden, da dies bereits false ist, ist der Wert der ganzen Expression schon eindeutig und die rechte Seite (x<3) muss nicht ausgewertet werden.

Beispiele

Klammere den folgende Ausdrücke so dass es der Auswertung des Compilers entspricht.

3 < 4 + 1 && 2 < 3
3 == 3 * 2 || 5 <= 2+3 && true

Lösung:

(3 < (4 + 1)) && (2 < 3)
(3 == (3 * 2)) || ((5 <= (2+3)) && true)

Werte die folgende Expression aus:

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

Hinweis: Klammere zuerst die Expression

Lösung:

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

Werte die folgende Expression aus:

!(1 < 2 && x == 1) + 1

Lösung:

(!((1 < 2) && (x == 1))) + 1
(!(true && (x == 1))) + 1
(!(true && true)) + 1
(!true) + 1
false + 1
0 + 1
1

Bemerkung: Vom Konvertieren von Integers zu Booleans wird generell abgeraten. Die Umkehrung, also das Konvertieren von Booleans zu Integers ist kein Problem.

ACHTUNG: Die Operatoren && und || haben die Spezielle Eigenschaft, das in den folgenden Expressions a garantiert vor b ausgewertet wird.

a && b
a || b

Dies gilt nicht für Operatoren wie +, die folgende Expression gilt nach unserem C++ Standard als undefiniertes Verhalten

int i = 1;
int a = ++i + i;

For Loops

Um die For Loop in C++ zu verstehen muss man bloss folgendes Darstellung verstehen.

Aufgabe (Strange Sum)

Schreibe ein C++ Programm, welches eine natürliche Zahl einliest und alle positiven ungeraden Zahlen kleiner gleich , welche nicht durch 5 teilbar sind ausgibt.

Musterlösung:

#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;
}

Bemerke: Man könnte die if statements kombinieren zu

if (i % 2 == 1 && i % 5 != 0) {
	strangesum += i;
}

und man könnte sogar die erste Bedingung weglassen, indem man die for-loop anpasst:

for (unsigned int i = 1; i <= n; i += 2) {
	if (i % 5 != 0) {
		strangesum += i;
	}
}

Aufgabe (Largest Power)

Schreibe ein C++ Programm, welches eine positive natürliche Zahl einliest und dann die grösste Zweierpotenz () ausgibt, welche kleiner oder gleich der Zahl ist.

Musterlösung:

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

Debugging

Gemeinsames Debuggen von non_terminating.cpp