Commit 05aa9446 authored by Florian Klemme's avatar Florian Klemme
Browse files

Merge branch 'feinschliff' into 'master'

Stilistische Änderungen.

See merge request !2
parents 22dea3aa af699bd6
Pipeline #91 passed with stages
in 2 minutes and 9 seconds
......@@ -11,14 +11,16 @@ using Zahlen = Vector<int>;
class CppKlausur {
public:
// Definiere Input/Output fuer das Programm
// Definiere Input/Output für das Programm
CppKlausur(std::istream& in, std::ostream& out);
// Programm ausfuehren, entsprechend der Aufgabenbeschreibung
// Programm ausführen, entsprechend der Aufgabenbeschreibung
void run();
private:
// Lese positive Zahlen von m_in bis eine negative Zahl eingegeben wird.
Zahlen lese_zahlen() const;
void einfuegemodus(const Zahlen& key);
void suchmodus(const Zahlen& key) const;
void loeschmodus(const Zahlen& key);
......
......@@ -4,7 +4,7 @@
#include "Vector.hpp"
// Einfache Map, um Key-Value Assoziationen zu speichern.
// Fr ein bisschen Performance benutzen wir binary search.
// Für ein bisschen Performance benutzen wir binary search.
template <typename Key, typename Value>
class Map {
public:
......@@ -20,6 +20,12 @@ class Map {
return m_data[index].second;
}
Value& at(const Key& key) {
int index = search(key);
if (index < m_data.size() && m_data[index].first == key) return m_data[index].second;
throw -1; // std::out_of_range
}
const Value& at(const Key& key) const {
int index = search(key);
if (index < m_data.size() && m_data[index].first == key) return m_data[index].second;
......@@ -40,12 +46,12 @@ class Map {
}
private:
// Binary search im sortiertem Vector
int search(const Key& key) const noexcept {
int low = 0;
int high = m_data.size();
while (low < high) {
int index = (low + high) / 2;
// if (m_data[index] == key) return index;
if (m_data[index].first < key)
low = index + 1;
else
......
......@@ -89,7 +89,7 @@ class Vector {
protected:
T* m_data;
int m_capacitance; // Allokierter Speicher fuer m_data
int m_capacitance; // Allokierter Speicher für m_data
int m_size; // Anzahl der Elemente in m_data
};
......
......@@ -2,7 +2,7 @@
#include "CppKlausur.hpp"
int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv) {
int main() {
// Interaktiv mit Cin und Cout
CppKlausur cppklausur(std::cin, std::cout);
cppklausur.run();
......
......@@ -3,18 +3,14 @@
CppKlausur::CppKlausur(std::istream& in, std::ostream& out) : m_in(in), m_out(out) {}
void CppKlausur::run() {
while (true) {
int modus = 0;
int modus = 0;
m_in >> modus;
while (modus >= 1 && modus <= 3) {
Zahlen key = lese_zahlen();
if (modus == 1) einfuegemodus(key);
if (modus == 2) suchmodus(key);
if (modus == 3) loeschmodus(key);
m_in >> modus;
if (modus < 1 || modus > 3) {
return; // Beenden
} else {
Zahlen key = lese_zahlen();
if (modus == 1) einfuegemodus(key);
if (modus == 2) suchmodus(key);
if (modus == 3) loeschmodus(key);
}
}
}
......@@ -30,45 +26,52 @@ Zahlen CppKlausur::lese_zahlen() const {
}
void CppKlausur::einfuegemodus(const Zahlen& key) {
// Lese ein Wort aus m_in
char buffer[128];
m_in >> buffer;
String value(buffer);
// Speiche Zahlenfolge und Wort für Vorwärts-/Rückwärtssuche
m_forward[key] = value;
m_reverse[value].push_back(key);
}
void CppKlausur::suchmodus(const Zahlen& key) const {
if (m_forward.contains(key)) {
const String& value = m_forward.at(key);
m_out << value << ' ';
// Tue nichts, wenn Zahlen nicht vorhanden sind
if (!m_forward.contains(key)) return;
auto& zahlen_liste = m_reverse.at(value);
m_out << zahlen_liste.size();
// Vorwärtssuche
const String& value = m_forward.at(key);
m_out << value << ' ';
for (int i = 0; i < zahlen_liste.size(); ++i) {
m_out << '\n';
auto& zahlen = zahlen_liste[i];
for (int j = 0; j < zahlen.size(); ++j) {
if (j) m_out << ' ';
m_out << zahlen[j];
}
}
// Rückwärtssuche
auto& zahlen_liste = m_reverse.at(value);
m_out << zahlen_liste.size();
for (int i = 0; i < zahlen_liste.size(); ++i) {
m_out << '\n';
auto& zahlen = zahlen_liste[i];
for (int j = 0; j < zahlen.size(); ++j) {
if (j) m_out << ' ';
m_out << zahlen[j];
}
}
m_out << '\n';
}
void CppKlausur::loeschmodus(const Zahlen& key) {
if (m_forward.contains(key)) {
const String& value = m_forward.at(key);
m_forward.erase(key);
// Tue nichts, wenn Zahlen nicht vorhanden sind
if (!m_forward.contains(key)) return;
// Vorwärtssuche
const String& value = m_forward.at(key);
m_forward.erase(key);
auto& zahlen_liste = m_reverse[value];
for (int i = 0; i < zahlen_liste.size(); ++i) {
if (zahlen_liste[i] == key) {
zahlen_liste.erase(i);
break; // sollte nur einmal vorkommen
}
// Rückwärtssuche
auto& zahlen_liste = m_reverse.at(value);
for (int i = 0; i < zahlen_liste.size(); ++i) {
if (zahlen_liste[i] == key) {
zahlen_liste.erase(i);
break; // key sollte nur einmal vorkommen
}
}
}
\ No newline at end of file
}
......@@ -4,21 +4,25 @@
TEST(Map, access) {
Map<char, int> m1;
const auto& const_m1 = m1;
ASSERT_EQ(m1.size(), 0);
m1['a'] = 5;
ASSERT_EQ(m1.size(), 1);
ASSERT_EQ(m1.at('a'), 5);
ASSERT_EQ(const_m1.at('a'), 5);
ASSERT_TRUE(m1.contains('a'));
ASSERT_FALSE(m1.contains('b'));
m1['b'] = 3;
ASSERT_EQ(m1.size(), 2);
ASSERT_EQ(m1.at('b'), 3);
ASSERT_EQ(const_m1.at('b'), 3);
ASSERT_TRUE(m1.contains('a'));
ASSERT_TRUE(m1.contains('b'));
ASSERT_ANY_THROW(m1.at('z')); // out of range
ASSERT_ANY_THROW(m1.at('z')); // out of range
ASSERT_ANY_THROW(const_m1.at('z')); // out of range
}
TEST(Map, erase) {
......
......@@ -64,7 +64,7 @@ TEST(Vector, insert) {
ASSERT_EQ(v1[2], 2);
ASSERT_EQ(v1[3], 0);
// Am Ende einfuegen geht auch (index == size)
// Am Ende einfügen geht auch (index == size)
v1.insert(4, 42);
ASSERT_EQ(v1.size(), 5);
ASSERT_GE(v1.capacitance(), 5);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment