Kapitel 3

Alle Codedateien dieses Kapitels herunterladen

03_8_1_WhileUndFor.cpp

Datei herunterladen

/*
 * 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

Datei herunterladen

/*
 * 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

Datei herunterladen

/*
 * 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

Datei herunterladen

/*
 * 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

Datei herunterladen

/*
 * 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

Datei herunterladen

/*
 * 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

Datei herunterladen

/*
 * 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;
}