Informatik W07
Levin Ceglie
Outline
- Nachbesprechung
- Referenzen
char- Alte Prüfungsaufgabe
Nachbesprechung
#pragma once- Schöne Lösung zur Roundingaufgabe
int round_number(double x) {
return (x*2) - (int)x;
}- Auslagerung von mehrmals verwendeten identischem Code in eine Funktion.
Referenzen
Referenzen erlauben es uns mit mehreren Variablen/Namen das gleiche Objekt zu verwenden.
#include <iostream>
int main() {
int a = 3;
int& b = a;
b = 7;
std::cout << a << std::endl;
return 0;
}Bemerkung:
Referenzen werden normalerweise als Funktionsparameter oder Rückgabewerte verwendet. Wenn die Parameter einer Funktion nicht vom Referenztyp sind, sagen wir, dass wir sie als Wert an die Funktion übergeben (“pass by value”). Das haben wir bisher in allen unserer Funktionen gemacht. In diesem Fall erstellt die Funktion ihre eigenen Kopien der Werte und verwendet diese Kopien im Funktionskörper.
Wir tracen die folgenden Programme
#include<iostream>
void foo (int i) {
i = 5;
}
int main () {
int i = 4;
foo(i);
std::cout << i << std::endl;
}#include<iostream>
void foo (int& i) {
i = 5;
}
int main () {
int i = 4;
foo(i);
std::cout << i << std::endl;
}Demonstration tracing mit Python Tutor code visualizer: Visualize code in Python, JavaScript, C, C++, and Java.
Referenzen sind nich nur nützlich als Funktionsargumente, sondern auch als Rückgabetypen! Was macht der folgede Code und wie könnte man ihn verbessern?
#include<iostream>
int increment (int& m) {
return ++m;
}
int main () {
int n = 3;
increment(n);
std::cout << n << "\n"; // outputs 5
return 0;
}Kann ich in obigem code eine Variable doppelt inkementieren, also increment(increment(n))? Wieso nicht? Die Funktion erwartet eine Referenz als Argument, jedoch gibt uns die Fuktion einen Wert zurück. Lösung:
#include<iostream>
int& increment (int& m) {
return ++m;
}
int main () {
int n = 3;
increment(n);
increment(increment(n));
std::cout << n << "\n"; // outputs 5
return 0;
}Wir geben eine Referenz zurück!
Achtung!: In diesem Fall ist es wichtig, dass wir den präinkrement Operator ++m verwenden, welcher und auch eine Referenz zurückgibt. Der postinkrement Operator m++ würde uns einen Wert zurückgeben und der Code würde nicht kompilieren.
Aufgabe (Slides)
Aufgabe (Quadratic Equations)
Grosse Aufgabe, wahrscheinlich überspringen bzw. am Ende falls Zeit. Aber:
Key Idee: Man kann Referenzen als extra Ausgaben von Funktionen verwenden!
char
Aufgabe (UPPER CASE)
Bemerkung: puch_back() fügt ein Element am Ende des Vektors hinzu.
Hinweis: Variablen vom Typ char können als Zahlen interpretiert werden.
Hinweis:

Lösung:
#include <iostream>
#include <vector>
#include <ios>
// POST: Converts the letter to upper case.
void char_to_upper(char& letter) {
if ('a' <= letter && letter <= 'z') {
letter -= 'a' - 'A'; // 'a' > 'A'
}
}
// POST: Converts all letters to upper-case.
void to_upper(std::vector<char>& letters) {
for (unsigned int i = 0; i < letters.size(); ++i) {
char_to_upper(letters.at(i));
}
}
int main () {
// Say to std::cin not to ignore whitespace.
std::cin >> std::noskipws;
std::vector<char> letters;
char ch;
// Step 1: Read input.
do {
std::cin >> ch;
letters.push_back(ch);
} while (ch != '\n');
// Step 2: Convert to upper-case.
to_upper(letters);
// Step 3: Output.
for (unsigned int i = 0; i < letters.size(); ++i) {
std::cout << letters.at(i);
}
return 0;
}