Kapitel 3
Alle Codedateien dieses Kapitels herunterladen
03_8_1_WhileUndFor.cpp
/*
* Lösung für Übung 3.8.1 - Von while zu for übersetzen
*/
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> movieQuotes = {
"May the Force be with you",
"I'm the king of the world",
"I'll be back",
"E.T. phone home" };
std::string shortestQuote;
int indexOfShortestQuote = -1;
for (int i=0; i < movieQuotes.size(); i++)
{
std::string quote = movieQuotes.at(i);
std::cout << "Checking: " << quote << std::endl;
if (indexOfShortestQuote == -1
|| quote.size() < shortestQuote.size())
{
shortestQuote = quote;
indexOfShortestQuote = i;
}
}
std::cout << "Shortest quote found at index "
<< indexOfShortestQuote << ": "
<< shortestQuote << std::endl;
return 0;
}
03_8_2_Rueckwaerts.cpp
/*
* Lösung für Übung 3.8.2 - Eine Runde rückwärts
*/
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> movieQuotes = {
"May the Force be with you",
"I'm the king of the world",
"I'll be back",
"E.T. phone home" };
std::string shortestQuote;
int indexOfShortestQuote = -1;
for (int i = movieQuotes.size() - 1; i >= 0; i--)
{
std::string quote = movieQuotes.at(i);
std::cout << "Checking: " << quote << std::endl;
if (quote.size() < shortestQuote.size())
{
shortestQuote = quote;
indexOfShortestQuote = i;
}
}
std::cout << "Shortest quote found at index "
<< indexOfShortestQuote << ": "
<< shortestQuote << std::endl;
return 0;
}
03_8_3_Vokalzaehlung.cpp
/*
* Lösung für Übung 3.8.3 - Vokalzählung mit switch/case
*/
#include <iostream>
#include <string>
int main()
{
std::string input;
std::cin >> input;
int vowels = 0;
for (char character : input)
{
switch (character)
{
case 'a': // Intentional fall-trough
case 'e':
case 'i':
case 'o':
case 'u':
vowels++;
// Da dies der letzte Fall ist und wir auch keinen
// default-Fall brauchen, kann die break-Anweisung
// auch weggelassen werden.
}
}
std::cout << "Das eingegebene Wort " << input
<< " hat " << vowels << " Vokale" << std::endl;
return 0;
}
03_8_3_Vokalzaehlung_Alternativloesung.cpp
/*
* Alternative Lösung für Übung 3.8.3 - Vokalzählung mit switch/case
*/
#include <iostream>
#include <string>
int main()
{
std::string input;
std::cin >> input;
int vowels = 0;
for (char character : input)
{
switch (character)
{
case 'a':
vowels++;
break;
case 'e':
vowels++;
break;
case 'i':
vowels++;
break;
case 'o':
vowels++;
break;
case 'u':
vowels++;
break;
}
}
std::cout << "Das eingegebene Wort " << input
<< " hat " << vowels << " Vokale" << std::endl;
return 0;
}
03_8_4_Ewigkeit.cpp
/*
* Lösung für Übung 3.8.4 - Bis in alle Ewigkeit
*/
#include <iostream>
#include <string>
int main()
{
int wordLength = 0;
while (true)
{
std::string input;
std::cin >> input;
if (input == "exit")
{
break;
}
wordLength += input.size();
}
std::cout << "Anzahl der Zeichen in allen Eingaben: "
<< wordLength << std::endl;
return 0;
}
03_8_5_Tipparbeit.cpp
/*
* Lösung für Übung 3.8.5 - Tipparbeit
*
* Code auf diese Art umzuschreiben, macht ihn leichter verständlich und vor
* allem leichter erweiterbar. Im vorliegenden Fall ist es zum Beispiel relativ
* einfach, eine weitere Frage hinzuzufügen.
*/
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> questions = {
"Wie ist Ihr Name",
"Wie alt sind Sie",
"Welche Fremdsprachen beherrschen Sie"
};
std::string answer;
for (int i = 0; i < questions.size(); i++)
{
// Natürlich können Sie auch den Teil "Frage X" sowie
// das Fragezeichen in die Fragenliste übernehmen und
// hier einfach nur das jeweilige Element ausgeben.
// Die vorliegende Lösung reduziert hier aber die
// Code-Wiederholung auf ein Minimum:
std::cout << "Frage " << i + 1 << ": "
<< questions.at(i) << "?" << std::endl;
std::getline(std::cin, answer);
std::cout << "Antwort notiert: " << answer;
}
return 0;
}
03_8_6_Quizmaster.cpp
/*
* Lösung für Übung 3.8.6 - Quiz Master
*/
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::cout << "Willkommen zum Quizmaster 3000!" << std::endl;
std::cout << "Geben Sie jeweils eine Frage und eine dazu passende Antwort ein:" << std::endl;
// Eine leere Liste für die vom Nutzer eingegebenen Fragen
std::vector<std::string> questions;
// Eine leere Liste für die vom Nutzer eingegebenen Antwort
std::vector<std::string> answers;
for (int i = 0; i < 3; i++)
{
// Die Frage in einer Variable speichern
std::cout << "Frage Nr. " << i + 1 << ": " << std::endl;
std::string question;
std::getline(std::cin, question);
// Die Antwort in einer Variable speichern
std::cout << "Antwort für Frage Nr. " << i + 1 << ": " << std::endl;
std::string answer;
std::getline(std::cin, answer);
// Frage und Antwort der jeweiligen Liste hinzufügen
questions.push_back(question);
answers.push_back(answer);
}
// Die Eingabe der Antworten über eine Menge an leeren Zeilen verstecken
for (int i = 0; i < 30; i++)
{
std::cout << std::endl;
}
// Einen kleinen Willkommens-Bildschirm für die Fragerunde anzeigen
std::cout << "*******************************" << std::endl;
std::cout << "Willkommen zum Quizmaster 3000!" << std::endl;
std::cout << " -- Die Fragenrunde beginnt -- " << std::endl;
std::cout << "*******************************" << std::endl;
if (questions.size() != answers.size())
{
/*
* Dieser Check wäre eigentlich nicht notwendig, da es keine Möglichkeit im Code
* gibt, dass die Längen der Listen unterschiedlich sind.
* Dennoch können wir uns mit solchen Tests vor Programmierfehlern schützen.
* Stellen Sie sich vor, Sie hätten oben aus Versehen "answers.push_back(answers);"
* vergessen (nicht dass mir etwa genau das beim Erstellen der Musterlösung passiert wäre).
* Dann würde dieser Test fehlschlagen und damit auf diesen Tippfehler hinweisen.
*/
std::cerr << "Unerwarteter Fehler: Die Menge an Fragen (" << questions.size() << ") "
<< "und die Menge an Antworten (" << answers.size() << ") unterscheiden sich.";
return 1;
}
/*
* Da beide Listen gleich lang sind, macht es keinen Unterschied, ob wir von Null bis
* questions.size() oder von Null bis answers.size() gehen.
*/
for (int i = 0; i < questions.size(); i++)
{
std::cout << "Frage Nr. " << i + 1 << ": " << questions.at(i) << std::endl;
std::cout << "Was ist Ihre Antwort?" << std::endl;
// Die Antwort des Nutzers entgegennehmen
std::string answer;
std::getline(std::cin, answer);
// Mit der vorgegebenen Antwort vergleichen
if (answer == answers.at(i))
{
std::cout << "Korrekt!" << std::endl << std::endl;
}
else
{
std::cout << "Leider falsch! Die richtige Antwort ist: " << std::endl;
std::cout << answers.at(i) << std::endl << std::endl;
/*
* Hinweis: std::cerr wird für Fehlermeldungen verwendet, allerdings handelt es
* sich hier nicht um einen Programmfehler. Es gehört sozusagen zum normalen
* Programmablauf, dass eine Quizfrage falsch beantwortet wird. std::cerr wird
* für unerwartete Situationen (z.B. siehe oben) oder bei Fehlbedienungen benutzt
* Hier ist allerdings std::cout passender.
*/
}
}
return 0;
}