Kapitel 5

Alle Codedateien dieses Kapitels herunterladen

05_7_1_Lagerregal.cpp

Datei herunterladen

/*
 * Lösung für Übung 5.7.1 - Lagerregal
 */
#include <iostream>
#include <string>
#include <algorithm>

bool isPalindrome(std::string input)
{
  // Zuerst in Kleinbuchstaben umwandeln, sodass der Vergleich funktioniert
  std::transform(input.begin(), input.end(),
    input.begin(), tolower);

  for (int i = 0; i < input.size(); i++)
  {
    // Vergleiche das erste mit dem letzten Zeichen, das zweite mit dem vorletzten, etc
    if (input.at(i) != input.at(input.size() - 1 - i))
    {
      // Kann kein Palindrom sein. Der Rest muss nicht weiter überprüft werden
      return false;
    }
  }
  return true;
}

int main()
{
  std::string test;
  test = "a";
  std::cout << test << ": " << isPalindrome(test) << std::endl;
  test = "Lagerregal";
  std::cout << test << ": " << isPalindrome(test) << std::endl;
  test = "kein palindrom";
  std::cout << test << ": " << isPalindrome(test) << std::endl;

  test = "aba";
  std::cout << test << ": " << isPalindrome(test) << std::endl;
  test = "abba";
  std::cout << test << ": " << isPalindrome(test) << std::endl;
  test = "abca";
  std::cout << test << ": " << isPalindrome(test) << std::endl;
  return 0;
}

05_7_2_AmpelLampe.cpp

Datei herunterladen

/*
 * Lösung für Übung 5.7.2 - Ampel-Lampe
 */
#include <iostream>
#include <string>
#include <algorithm>

bool isAnagram(std::string first, std::string second)
{
  // Wenn die Worte nicht dieselbe Länge haben, können sie kein Anagramm sein
  if (first.size() != second.size())
  {
    return false;
  }

  // In Kleinbuchstaben umwandeln, sodass der Vergleich funktioniert
  std::transform(first.begin(), first.end(),
    first.begin(), tolower);
  std::transform(second.begin(), second.end(),
    second.begin(), tolower);

  for (char character : first)
  {
    size_t position = second.find(character);
    if (position == std::string::npos)
    {
      // Zeichen nicht gefunden, dies kann kein Anagramm sein
      return false;
    }
    // Das Zeichen wurde gefunden. Nun muss es entfernt werden, damit es nicht
    // ein zweites Mal gefunden wird. Für zwei gleiche Buchstaben im ersten String
    // müssen auch zwei gleiche Buchstaben im zweiten String auftauchen und nicht nur einer.
    second.erase(position, 1);
  }
  return true;
}

int main()
{
  std::string first;
  std::string second;
  first = "Ampel";
  second = "Lampe";
  std::cout << first << " - " << second << ": " << isAnagram(first, second) << std::endl;
  first = "Lagerregal";
  second = "Regallager";
  std::cout << first << " - " << second << ": " << isAnagram(first, second) << std::endl;
  first = "Lagerregal";
  second = "Regallager";
  std::cout << first << " - " << second << ": " << isAnagram(first, second) << std::endl;
  first = "Geburt";
  second = "Erbgut";
  std::cout << first << " - " << second << ": " << isAnagram(first, second) << std::endl;
  first = "Garkein ";
  second = "Anagramm";
  std::cout << first << " - " << second << ": " << isAnagram(first, second) << std::endl;

  first = "asa";
  second = "asb";
  std::cout << first << " - " << second << ": " << isAnagram(first, second) << std::endl;
  return 0;
}

05_7_3_DasMathegenie.cpp

Datei herunterladen

/*
 * Lösung für Übung 5.7.3 - Das Mathegenie
 */
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

// Die Funktion split() auf Kapitel 5.3
std::vector<std::string> split(const std::string& str,
  char delimiter = ',')
{
  std::vector<std::string> parts;
  size_t start = 0;
  size_t end = str.find(delimiter);
  // Wenn die Suche zu keinem Ergebnis führt, nimmt der
  // Rückgabewert den speziellen Wert npos an
  while (end != std::string::npos)
  {
    parts.push_back(str.substr(start, end - start));
    start = end + 1;
    end = str.find(delimiter, start);
  }
  parts.push_back(str.substr(start, end));
  return parts;
}

int parseComputation(std::string input)
{
  // Alle Leerzeichen entfernen
  // Für Profis gäbe es auch die Standard Library-Variante:
  // input.erase(remove_if(input.begin(), input.end(), isspace), input.end());
  for (int i = 0; i < input.size(); i++)
  {
    if (input.at(i) == ' ')
    {
      input.erase(i, 1);
    }
  }
  std::vector<std::string> parts = split(input, '+');
  int result = 0;
  for (std::string part : parts)
  {
    result += std::stoi(part);
  }
  return result;
}

int main()
{
  std::string test;
  test = "4 + 2";
  std::cout << test << ": " << parseComputation(test) << std::endl;
  test = "2+3+4";
  std::cout << test << ": " << parseComputation(test) << std::endl;
  test = "3+1 + 10 +123 ";
  std::cout << test << ": " << parseComputation(test) << std::endl;
  return 0;
}

05_7_4_Charakterstudie.cpp

Datei herunterladen

/*
 * Lösung für Übung 5.7.4 - Charakterstudie
 */
#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <vector>

std::map<char, int> countCharacters(std::string input)
{
  // In Kleinbuchstaben umwandeln. Es ist Ansichtssache, ob wir das hier wollen.
  // Falls Sie das in Ihrer Lösung nicht gemacht haben, ist das auch in Ordnung.
  std::transform(input.begin(), input.end(),
    input.begin(), tolower);

  std::map<char, int> characterCounts;
  for (char c : input)
  {
    characterCounts[c] = characterCounts[c] + 1;
  }
  return characterCounts;
}

void printCharacterCounts(const std::map<char, int>& characterCounts)
{
  for (std::pair<char, int> count : characterCounts)
  {
    std::cout << count.first << ":\t" << count.second << std::endl;
  }
}

int main()
{
  std::string test;
  test = "aaAbbc";
  std::cout << test << ": " << std::endl;
  printCharacterCounts(countCharacters(test));
  test = "1234567";
  std::cout << test << ": " << std::endl;
  printCharacterCounts(countCharacters(test));
  test = "Ein anderer Text";
  std::cout << test << ": " << std::endl;
  printCharacterCounts(countCharacters(test));
  return 0;
}

05_7_5_Erbsenzaehler.cpp

Datei herunterladen

/*
 * Lösung für Übung 5.7.5 - Erbsenzähler
 */
#include <iostream>
#include <string>

int main()
{
  std::cout << "Willkommen beim Erbsenz\204hler!" << std::endl;
  std::cout << "Geben Sie eine Reihe an Punkten ein und best\204tigen mit der Enter-Taste:" << std::endl;
  while (true)
  {
    std::cout << "> ";
    std::string input;
    std::getline(std::cin, input);
    if (input == "exit")
    {
      // Schleife verlassen
      break;
    }
    // Die Punkte zählen. Alle anderen Zeichen ignorieren
    int count = 0;
    for (char character : input)
    {
      if (character == '.')
      {
        count++;
      }
    }
    std::cout << count << " Erbsen gez\204hlt." << std::endl;
  }
  return 0;
}