99 Bottles of Beer (C++11)

von Hubert Schmid vom 2012-06-24

Nicht schön, aber effektiv: Hier ist mein Versuch, die bekannte Programmieraufgabe mit der aktuellen Sprachversion von C++ zu implementieren. Leider fühlt sich C++11 für solche Aufgaben immer noch wesentlich schwerfälliger an als viele andere Programmiersprachen.

Im Code befinden sich drei Neuerungen aus C++11: Erstens wird eine Lambda-Funktion für die mehrfach benötigten Satzbestandteile eingesetzt. Dadurch werden wiederholende Fragmente vermieden ohne zusammengehörigen Code auseinander zu reißen. Zweitens wird die Bibliotheksfunktion std::to_string verwendet, um eine Zahl in eine Zeichenkette zu konvertieren. Diese Form ist in diesem Fall ein wenig kürzer gegenüber der Verwendung eines std::ostringstream. Und drittens wird Typinferenz für die Schleifenvariable genutzt. Dadurch wird die redundante Angabe des Typs vermieden ohne die Lesbarkeit zu beeinträchtigen.

#include <iostream> #include <string> void print_lyrics_of_bottles_song(std::ostream& os, unsigned int count) { std::string dual[] = { " bottles of beer", " bottle of beer", }; auto&& bottles_of_beer = [&dual](unsigned int n) { return (n == 0 ? "no more" : std::to_string(n)) + dual[n == 1]; }; for (auto i = count; i > 0; --i) { os << bottles_of_beer(i) << " on the wall, " << bottles_of_beer(i) << ".\n" << "Take one down, pass it around, " << bottles_of_beer(i - 1) << " on the wall.\n\n"; } os << "No more bottles of beer on the wall, " << bottles_of_beer(0) << ".\n" << "Go to the store and buy some more, " << bottles_of_beer(count) << " on the wall.\n\n"; } int main() { print_lyrics_of_bottles_song(std::cout, 99); }

Auch wenn es auf den ersten Blick nicht danach aussieht: Ich habe mir einige Gedanken über den Code gemacht und mit zahlreichen Varianten experimentiert, um einen guten Kompromiss zwischen Komplexität und Lesbarkeit zu finden. In anderen Programmiersprachen wäre die Aufgabe gefühlt einfacher gewesen, aber schlussendlich gefällt mir auch diese Implementierung ganz gut.

Viele weitere Beispiele in allen möglichen Programmiersprachen finden sich, wenn man einfach mal in der Suchmaschine seiner Wahl nach 99 Bottles of Beer sucht.