Informatik W02

Levin Ceglie

Outline

  • Admin
  • Fragen zu den Aufgaben letzter Woche
  • Repitition Vorlesung via Quiz
  • Division und Modulo (Theorie und Aufgabe)
  • Binärdarstellung
  • Expressions
  • Binärdarstellung von negativen ganzen Zahlen

Admin

Fragen aus letzter Woche

  • Kann der Bonus von letztem Jahr übernommen werden?
    • Alle hatten recht :). Die Dozenten haben fälschlicherweise in der Vorlesung gesagt, dass man den Bonus aus dem letzten Jahr übertragen kann. In der Kursausschreibung (und auf den organisatorischen Slides) steht jedoch genau das Gegenteil. Leider hat hier die Kursausschreibung das letzte Wort und kann nicht mehr geändert werden. Also kann der Bonus aus dem letzten Jahr nicht übertragen werden.

Weiteres

  • Die Testcases werden bei den Bonusaufgaben, sowie an der Prüfung am Ende durch ähnliche ausgetauscht um zu vermeiden, dass jemand die Antworten hard-coded.
  • Wenn ihr ein warning vom Compiler kriegt in den Aufgaben, führt dies automatisch zu 0 Punkten (z.B. Eine Variable int a; zu initialisieren, aber sie nicht zu benutzen löst ein warning vom Compiler aus). Beachtet dies bei dem Lösen der Aufgaben.

Division und Modulo

Bei der Division mit int und unsigned int wird alles nach dem Punkt vergessen bzw. es wird immer abgerundet!

Division:

7 / 3 == 2
15 / 4 == 3
16 / 4 == 4
17 / 6 == 2

Modulo:

7 % 3 == 1
15 % 4 == 3
16 % 4 == 0
17 % 6 == 5

Bemerke: Durch Kombination der beiden Operatoren, kann man trotz Informationsverlust bei der Division die ursprüngliche Zahl wie folgt wieder bekommen

(15 % 4) * 4 + 15 % 4 == 15

Frage: Welche Frage beantwortet folgender Code:

int a;
std :: cin >> a;
if ( a % 2 == 0) {
	std :: cout << "Yes " << std :: endl;
} else {
	std :: cout << "No" << std :: endl;
}

Antwort: Ist die vom User eingegebene Zahl gerade?

Aufgabe (Even Number)

Schreibe ein C++ Programm, welches eine ganze Zahl einliesst und die nächst kleinere gerade Zahl (kann auch selbst sein) ausgiebt.
Input: Eine ganze Zahl
Output:

  • Falls , gebe die grösste gerade Zahl
  • Falls , gebe 0 aus

Beispiele: , ,

Gemeinsame Implementation: ETH Code Expert.

Aufgabe (Last Three Digits)

Schreibe ein C++ Programm, welches für eine ganze Zahl die letzten 3 Ziffern ausgibt.
Input: Eine ganze Zahl
Output: Die letzten drei Ziffern der Zahl getrennt durch einen Abstand.
Beispiele: a=15234 2 3 4, a=1020 0 2 0

Individuelle Implementation.

Hinweis: Für int a = 12453 gilt

a % 1000 == 453
a % 100 == 53
a % 1000 - a % 100 == 400

Allgemein: Für und entspricht der -ten Ziffer von .

Lösung
#include <iostream>
#include <cassert>
 
int main() {
  
  int a;
  std::cin >> a;
  
  std::cout << (a%1000 - a%100) / 100 << " ";
  std::cout << (a%100 - a%10) / 10 << " ";
  std::cout << a %10;
  
  return 0;
}

Zusatz: Überlege dir, wie man das Programm mithilfe einer for-loop verallgemeinern kann.
Hinweis für Zusatz: Verwende std::pow(basis,exponent) aus #include<cmath> um zu berechnen und beachte, dass std::pow() ein float zurückgibt, welcher wieder zu einem int zurückverwandelt werden muss mit (int)std::pow().

Bemerkung: Benutze Python Tutor zur interaktive Ausführen von Code.

Binärdarstellung

Frage: Wie könnten wir das Programm aus der vorherigen Aufgaben (Last Three Digits) so veränder, dass es die letzten 3 bits ausgibt?
Antwort: Ändere alle zu .

Frage: Was ist die Bedeutung der bzw. in dem Programm?
Antwort: Es ist die Basis des Systems in welches wir die Zahl umwandeln.

Frage: Wie könnte ein Algorithmus aussehen, welcher die Binärdarstellung einer Zahl aus seiner Dezimaldarstellung herleitet? Wie würde man z.B. 61 ins Binärsystem umwandeln?
Antwort: Dividiere die Zahl durch 2 und behalte den Rest separat. Dividiere die neue Zahl wieder durch 2 und wiederhole dies bis du 0 erhälst.

das lesen der blauen Ziffern von unten nach oben ergibt nun die Binärdarstellung von .

Bemerke: Falls wir gegeben haben erhalten wir die bzw. die (aus der obigen Auflistung) wie folgt

61 / 2 == 30
61 % 2 == 1

Frage: Wie kann man eine Zahl in Binärdarstellung in Dezimaldarstellung umwandeln?
Antwort: Addiere die “Gewichte” aller Einsen in der Binärdarstellug

Expressions

C++ Expressions, welche Addition und Multiplikation beinhalten folgen denselben Regeln wie in der Mathematik. Wir können folgende Expression durch richtige Klammerung berechnen:

5u + 5u * 3u
5u + (5u * 3u)
5u + 15u
20u

Bemerkung: Das u steht dafür, dass es sich bei diesem Literal um ein unsigned int handelt, standard (ohne u) ist int.

Frage: Welche der folgenden Expressions sind innerhalb von C++ nicht valide? Wieso nicht? Hier sind a und b Variablen vom Typ int.
(i) 1*(2*3)
(ii) (a=1)
(iii) (1
(iv) (a*3)=(b*5)

Antwort: (iii) und (iv). (iii) ist nicht valide, da die Klammerung nicht aufgeht. (iv) ist nicht valide, da wir einem R-Wert versuchen etwas zuzuweisen.

Frage: Handelt es sich bei (i) und (ii) um einen L- oder R-Wert

Binärdarstellung von negative ganzen Zahlen

Siehe Two’s complement - Wikipedia.

Weiteres

  • Falls noch nicht gemacht, wird das C++ Tutorial (auf der Vorlesungshomepage verlinkt) sehr empfohlen: E.Tutorial
  • Bei Fragen könnt ihr mir jederzeit ein Email schreiben.