Neues Beispiel: Zahlen raten
authorAndreas Bilke <andreas@bilke.org>
Tue, 25 Jul 2017 09:07:55 +0000 (11:07 +0200)
committerAndreas Bilke <andreas@bilke.org>
Tue, 25 Jul 2017 09:07:55 +0000 (11:07 +0200)
Zahlen-Raten/cpp/Makefile [new file with mode: 0644]
Zahlen-Raten/cpp/zahlenraten.cpp [new file with mode: 0644]

diff --git a/Zahlen-Raten/cpp/Makefile b/Zahlen-Raten/cpp/Makefile
new file mode 100644 (file)
index 0000000..f5ab283
--- /dev/null
@@ -0,0 +1,5 @@
+all:
+       g++ -Wall -o zahlenraten zahlenraten.cpp
+
+clean:
+       -rm zahlenraten
diff --git a/Zahlen-Raten/cpp/zahlenraten.cpp b/Zahlen-Raten/cpp/zahlenraten.cpp
new file mode 100644 (file)
index 0000000..6af8e12
--- /dev/null
@@ -0,0 +1,78 @@
+/*!
+ * \file zahlenraten.cpp
+ * \brief Finden einer vom Nutzer ausgedachten Zahl
+ *
+ * Der Benutzer denkt sich eine Zahl zwischen MIN_ZAHL
+ * und MAX_ZAHL aus. Anschließend versucht das Programm
+ * mittels binärer Suche die ausgedachte Zahl zu finden.
+ *
+ * \author Andreas Bilke, M. Sc.
+ * \copyright GNU Public License
+ */
+
+#include <cmath>
+#include <cstdlib>
+
+#include <iostream>
+#include <string>
+
+#define MIN_ZAHL 1
+#define MAX_ZAHL 50
+
+/*!
+ * \brief Einstiegspunkt für das Programm "zahlenraten".
+ *
+ * Der Nutzer soll sich eine Zahl ausdenken. Das Programm
+ * versucht anschließend mittels binärer Suche die ausgedachte
+ * Zahl zu finden.
+ *
+ * \param argc Die Anzahl der Kommandozeilenparameter
+ * \param argv Die Kommandozeilenparameter
+ * \return Den Erfolgsstatus des Programms
+ */
+int main(int argc, char** argv) {
+    std::string zeilenpuffer;
+
+    std::cout << "Denke dir eine Zahl zwischen " << MIN_ZAHL
+              << " und " << MAX_ZAHL << " aus. Ich versuche sie "
+              << "so schnell wie möglich zu raten." << std::endl << std::endl;
+
+    int suchBereichLinks = MIN_ZAHL;
+    int suchBereichRechts = MAX_ZAHL;
+    int anzahlVersuche = 0;
+    bool gefunden = false;
+    do {
+        int suchBereichMitte = (suchBereichLinks + suchBereichRechts)/2;
+        std::cout << "Ist die ausgedachte Zahl (k)leiner, (g)rößer oder (e)xakt "
+                  << "der Zahl " << suchBereichMitte << "? ";
+        std::getline(std::cin, zeilenpuffer);
+        if(std::cin.eof()) {
+            return EXIT_FAILURE;
+        }
+
+        if (zeilenpuffer.compare("k") == 0) {
+            suchBereichRechts = std::max(suchBereichMitte - 1, MIN_ZAHL);
+        } else if (zeilenpuffer.compare("g") == 0) {
+            suchBereichLinks = std::min(suchBereichMitte + 1, MAX_ZAHL);
+        } else if (zeilenpuffer.compare("e") == 0) {
+            gefunden = true;
+        } else {
+            std::cout << "Ich verstehe deine Anweisung nicht." << std::endl;
+        }
+
+        if (   suchBereichLinks == suchBereichMitte
+            && suchBereichMitte == suchBereichRechts
+            && !gefunden) {
+            std::cout << "Hast du mich an der Nase herumegfürt? Ich konnte deine Zahl nicht finden." << std::endl;
+            return EXIT_FAILURE;
+        }
+
+
+        anzahlVersuche++;
+    } while (!gefunden);
+
+    std::cout << "Hurra! Ich habe " << anzahlVersuche << " Versuche gebraucht." << std::endl;
+
+    return EXIT_SUCCESS;
+}
+