if, else, switch
#include <iostream>
int main() {
int punkte = 73;
if (punkte >= 90) std::cout << "sehr gut\n";
else if (punkte >= 75) std::cout << "gut\n";
else if (punkte >= 50) std::cout << "bestanden\n";
else std::cout << "nicht bestanden\n";
// if mit Initialisierung (C++17): Variable gilt nur im if-Block
if (int rest = punkte % 10; rest == 3) std::cout << "endet auf 3\n";
switch (punkte / 25) {
case 0: case 1: std::cout << "unter 50\n"; break;
case 2: std::cout << "50 bis 74\n"; break;
default: std::cout << "ab 75\n";
}
std::cout << (punkte >= 50 ? "ok" : "nicht ok") << '\n';
return 0;
}Ausgabe
bestanden endet auf 3 50 bis 74 ok
Schleifen
#include <iostream>
#include <vector>
#include <map>
#include <string>
int main() {
for (int i = 1; i <= 5; i++) std::cout << i << ' ';
std::cout << '\n';
int n = 1;
while (n < 100) n *= 2;
std::cout << n << '\n';
int versuche = 0;
do { versuche++; } while (versuche < 3);
std::cout << versuche << '\n';
// Bereichs-for: durch Container laufen (der Normalfall)
std::vector<int> zahlen{5, 3, 9, 1};
for (int z : zahlen) std::cout << z << ' ';
std::cout << '\n';
for (auto& z : zahlen) z *= 10; // Referenz: Elemente ändern
for (const auto& z : zahlen) std::cout << z << ' '; // const&: nur lesen, ohne Kopie
std::cout << '\n';
std::map<std::string, int> alter{{"Mia", 17}, {"Tom", 19}};
for (const auto& [name, jahre] : alter) // Structured Binding (C++17)
std::cout << name << "=" << jahre << ' ';
std::cout << '\n';
for (char c : std::string("abc")) std::cout << c << '-';
std::cout << '\n';
return 0;
}Ausgabe
1 2 3 4 5 128 3 5 3 9 1 50 30 90 10 Mia=17 Tom=19 a-b-c-
Das bereichsbasierte for ist kürzer und sicherer als Indizes. Nimm auto& zum Ändern, const auto& zum Lesen großer Elemente, auto (Kopie) für kleine Typen.
break, continue
#include <iostream>
int main() {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) continue;
if (i > 7) break;
std::cout << i << ' ';
}
std::cout << '\n';
bool gefunden = false;
for (int a = 1; a < 10 && !gefunden; a++)
for (int b = 1; b < 10; b++)
if (a * b == 42) { std::cout << a << '*' << b << '\n'; gefunden = true; break; }
return 0;
}Ausgabe
1 3 5 7 6*7
Algorithmen statt Schleifen
Für viele Aufgaben gibt es fertige Algorithmen in <algorithm> und <numeric>:
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
int main() {
std::vector<int> z{5, 3, 9, 1, 7};
int summe = std::accumulate(z.begin(), z.end(), 0);
auto [kleinste, groesste] = std::minmax_element(z.begin(), z.end());
int gerade = std::count_if(z.begin(), z.end(), [](int x) { return x % 2 == 0; });
std::sort(z.begin(), z.end());
bool da = std::binary_search(z.begin(), z.end(), 7);
std::cout << summe << ' ' << *kleinste << ' ' << *groesste << ' ' << gerade << ' ' << da << '\n';
for (int x : z) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Ausgabe
25 7 5 0 1 1 3 5 7 9
Merke
if (init; bedingung)begrenzt Hilfsvariablen auf den Block- Bereichs-for
for (const auto& x : container)ist der Standard; Structured Bindings zerlegen Paare break,continuewie in C- Algorithmen (
sort,accumulate,count_if) ersetzen oft handgeschriebene Schleifen - Zählschleifen mit
size_t-Vergleichen vorsichtig schreiben (vorzeichenlos!)
Aufgabe
Lies Zahlen aus einem std::vector und gib mit Algorithmen Summe, Mittelwert und Anzahl der Elemente über dem Mittelwert aus.