Aufgabe 20
- Aufgabenstellung
- Lösung
Schreiben Sie ein Programm, das einen Text in Form eines Strings von der Konsole einliest und anschließend zählt, wie oft jedes Zeichen in diesem Text vorkommt.
Um jedes Zeichen zusammen mit seiner Häufigkeit zu speichern, verwenden Sie folgende Klasse:
class Letter
{
public:
char letter;
unsigned count;
Letter(char l, unsigned c) : letter(l), count(c) {}
};
Speichern Sie alle gefundenen Zeichen in einem Vektor von Letter. Jedes neue Zeichen, das noch nicht erfasst wurde, soll als neues Element in den Vektor aufgenommen werden. Wenn ein Zeichen bereits vorhanden ist, erhöhen Sie lediglich den Zähler für dieses Zeichen.
Damit Groß- und Kleinbuchstaben nicht doppelt gezählt werden (z. B. A und a), schreiben Sie eine Funktion void lowercase(string &str).
Diese Funktion soll den gesamten String in Kleinbuchstaben umwandeln, indem sie jeden Buchstaben zwischen 'A' und 'Z' in den entsprechenden Kleinbuchstaben umrechnet (addieren Sie 32 zum ASCII-Wert des Buchstabens).
Hinweis: Verarbeiten Sie nur Buchstaben entsprechend. Andere Zeichen (z. B. Satzzeichen oder Ziffern) sollen unverändert bleiben und ebenfalls gezählt werden.
Programmablauf:
1. Lesen Sie einen String von der Konsole ein.
2. Wandeln Sie den String mit Ihrer Funktion lowercase in Kleinbuchstaben um.
3. Zählen Sie, wie oft jedes Zeichen im String vorkommt.
4. Speichern Sie jedes Zeichen und seine Häufigkeit im Vektor.
5. Geben Sie am Ende eine übersichtliche Liste aus, in der jedes Zeichen zusammen mit seiner Anzahl angezeigt wird.
Beispielausgabe:
Eingegebener String: Hallo Welt!
Ausgabe:
h: 1
a: 1
l: 3
o: 1
: 1
w: 1
e: 1
t: 1
!: 1
Optional können Sie die Ausgabe nach den Zeichen alphabetisch sortieren, um sie übersichtlicher zu gestalten.
#include <iostream>
using std::cout, std::endl, std::cin;
#include <vector>
using std::vector;
#include <string>
using std::string;
class Letter
{
public:
char letter;
unsigned count;
Letter(char l, unsigned c) : letter(l), count(c) {}
};
void lowercase(string &str)
{
for (unsigned i = 0; i < str.size(); i++)
{
if (str[i] >= 'A' && str[i] <= 'Z')
{
str[i] += 32; // Convert uppercase to lowercase in ASCII
}
}
}
void checkLetter(char current, vector<Letter> &letters)
{
if (letters.empty())
{
letters.push_back(Letter(current, 1));
return;
}
for (unsigned j = 0; j < letters.size(); j++)
{
if (letters[j].letter == current)
{
letters[j].count++;
return;
}
}
letters.push_back(Letter(current, 1));
}
int main()
{
string input;
cout << "Enter a string: ";
getline(cin, input);
lowercase(input);
vector<Letter> letters;
for (unsigned i = 0; i < input.size(); i++)
{
checkLetter(input[i], letters);
}
cout << "Letter counts:" << endl;
for (unsigned i = 0; i < letters.size(); i++)
{
cout << letters[i].letter << ": " << letters[i].count << endl;
}
}