Kapitel 5
Alle Codedateien dieses Kapitels herunterladen
05_7_1_Lagerregal.cpp
/*
* 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
/*
* 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
/*
* 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
/*
* 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
/*
* 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;
}