• Teuflische Folge

      0 comments

    Soderle,

    dann werde ich mal den Grundlagen Bereich einweihen 🙂

    Wir fangen mal nicht ganz unten mit den Grundlagen an, sondern mit einem kleinen, aber feinen Algoritmus (keine Angst, Grundlagen zu Variabeln etc. kommen auch noch :))

    Wir betrachten heute mal die teuflische Zahlenfolge. Diese ist mathematisch in der folgenden Formel definiert:

    x_{n+1} =\left\{ \begin {array} {cc} x_n/2 & wenn x_n gerade \\ (3*x_n+1)/2 & wenn x_n ungerade \end {array} \right.

    Die Formel besagt, dass wir eine beliebige Zahl n

    • wenn sie gerade ist durch 2 teilen => n/2
    • wenn sie jedoch ungerade ist, wird auf n 1 addiert, also n+1.

    Wie bilden wir nun diese doch relativ einfache mathematische Formel nun in C++ ab?

    Dazu erstellt eine Source Datei. Diese Datei hat die Endung .cpp
    Ich habe meine Datei „folge.cpp“ genannt.

    Nun müssen wir noch eine Bibliothek unserem Sourcecode hinzufügen.
    Diese Bibliothek ist nur für die Ausgabe unserer berechneten Zahlenfolgen notwendig. Natürlich hat die Bibliothek noch andere Funktionen,
    aber auf diese gehen wir in einem anderen Beitrag ein.
    Die Bibliothek die wir für die Ausgabe benötigen heisst „iostream“. Folgendermaßen wird die Bibliothek in den Sourcecode eingefügt:

    #include <iostream>

    Mit dieser #include Anweisung können noch weitere Bibliotheken in euren Sourcecode eingebunden werden, ist hier aber nicht sinnvoll.

    Um nun ein Lauffähiges Programm zu haben, brauchen wir eine Funktion, die beim Starten der Anwendung immer aufgerufen wird. Das ist die „main()“ Funktion.

    Jedesmal wenn ihr ein Programm startet, wird diese Funktion als erstes ausgeführt.
    Der einfachheit halber habe ich den ganzen Algoritmus zur Berechnung der „Teuflischen Zahlenfolge“ in die Main Funktion gepackt.
    So sieht der Code im ganzen aus:

    #include "stdafx.h"
    #include  <iostream>
     
    using namespace std;
     
    int main(int argc, _TCHAR* argv[]) 
    {
       int n = 666; //Eine Teuflische Zahl für einen Teuflischen Algoritmus
       while (n != 1) 
       {
         if ((n % 2) == 0) 
         {
    	n = n / 2;
         } 
         else 
         {
    	n = (n * 3 + 1) / 2;
         }
         cout << n << endl;
       }
       cin >> n;
       return 0;
    }

    In diesem Code haben wir verschiedene Bedingte Anweisungen und Schleifen.
    Zum einen haben wir die „while“ Schleife. Diese wiederholt den Code, der innerhalb des Schleifenrumpes steht solange, bist die Bedingung erfüllt ist,
    die im Schleifenkopf angegeben ist.
    In dem Fall durchläuft die Schleife den Schleifenrumpf, solange „n != 1“ (gesprochen: n ist ungleich 1) ist.

    Innerhalb der Schleife haben wir die Bedingte Anweisung (oder auch If-Statement genannt).
    Mit ihr können wir eine True-False Bedingung abfragen.
    Im Sourcecode steht

    if ((n % 2) == 0)

    Hier wird der Modulo von n zur Zahl 2 berechnet. Es wird also nichts anderes gemacht, als den Rest der Division von n durch 2 zu ermitteln.
    Ist das Ergebnis der Berechnung 0, ist die Zahl gerade.
    Ist das Ergebnis der Berechnung ungleich 0, ist die Zahl ungerade.
    Wers mir nicht glaubt, kanns ja selber mal nachrechnen 😉

    Nun ist es so, falls das Ergebnis der Berechnung gerade, also 0 (oder true) ist , wird der obere Teil des If-Statements „betreten“ und auch nur dieser ausgeführt.
    Somit wird die Berechnung n=n/2 ausgeführt.
    Ist das Ergebnis der Berechnung ungerade, also ungleich 0 (oder eben false), wird der „else“ Teil des If-Statements „betreten“ und ebenfalls nur dieser ausgeführt.
    Es wird praktisch der obere Teil des If-Statements übersprungen.

    Als letzes haben wir noch eine Einfache Ausgabe für die berechneten Zahlen.
    Dies wird mittels std::cout bewerkstelligt.

    Ich hoffe Ihr habt nun viel Spass mit den Teuflischen Zahlen.

    P.S.: Wer mehr erfahren will, kann auch mal nach dem „Collatz-Problem“ suchen. Das ist im Grunde genau dieses Problem hier.

  • Mit der libRocket zum perfekten GUI

      0 comments

    Hier wollen wir uns mit verschiedensten Themen aus dem Bereich C++, C# oder ähnliches beschäftigen. Den Anfang macht das Thema libRocket.
    Im Zuge der Programmierherausforderung zum Pythagorasbaum habe ich mich nach Frameworks für die grafische Oberfläche (GUI) im Bereich ISO C++ umgesehen. Damals haben wir uns für das gute alte MFC entschieden, da es einfach zu benutzen ist und auch relativ leicht zu erlernen. Aber es ist auch etwas angestaubt und kommt nicht an modernere GUIs heran wie z.B. WPF (welches allerdings bisher nur sinnvoll unter C# zu beenutzen ist und wir werden uns wohl später hier damit mal beschäftigen).
    Bei der Suche nach Alternativen bin ich über libRocket gestolpert bzw. wurde es mir empfohlen. Dabei handelt es sich um eine plattformunabhängige user interface middleware in ISO C++. Sie eignet sich speziell für Spiele und wird auch schon in einigen Projekten ( für Android, IOS) eingesetzt. Die Benutzung ist kostenlos und genaue Bedingungen können der libRocket Homepage entnommen werden.
    Was macht nun libRocket so besonders? Zum definieren der GUI wird HTML und CSS verwendet. Benutzer, die sich im Erstellen von Webseiten heimisch fühlen, sollten also schnell damit zurecht kommen und alle anderen finden Unmengen an Tutorials im Internet. Außerdem gibt es auf der libRocket Seite eine sehr ausführliche Doku.
    Nun müssen wir noch klären, was mit „middleware“ gemeint ist. libRocket selbst enthält selbst keinen Code zur Ein/Ausgabe. Dieser Teil wird von uns zur Verfügung gestellt. Im Bereich Eingabe übergeben wir daher die Aktionen der Maus (Position und Tasten) und der Tastatur an libRocket und die GUI reagiert dann entsprechend. Dadurch kann man es auf vielen Systemen einsetzen und auf dem Smartphone z.B. per Touch steuern, aber auf dem PC per Maus. Zur Eingabe zählt auch das Dateisystem, welches libRocket braucht, um auf die HTML und CSS Dateien zugreifen können, sowie auf Font-Dateien. Dies müssen wir aber nicht unbedingt zur Verfügung stellen, da ansonsten einfach das normale Dateisystem des jeweiligen Systems verwendet wird. Hat man aber in seinem Spiel z.B. ein eigenes Dateisystem, bei dem die Daten vielleicht in komprimierten Zip-Archiven stecken, dann kann man dies einfach in libRocket einbinden, wenn man möchte.
    Bleibt also noch das Thema Ausgabe. Hier produziert libRocket für uns einfach Dreiecksdaten (vertices) und eventuell dazu Texturen. Da es vor allem für Spiele gedacht ist, ist das natürlich praktisch, da dort in der Regel sowieso Dreiecke gerendert werden. libRocket in die bestehende Renderloop zu hängen sollte also nicht schwer sein. Damit können wir zur Darstellung z.B. einfach OpenGL oder DirectX verwenden.
    Wir füttern also libRocket mit Inputs, beschreiben unsere GUI mittels HTML und CSS Dateien und libRocket spuckt Dreiecke und Texturen aus, die wir einfach rendern. Klingt nicht ganz einfach? Ok kann ich verstehen und fordert normal auch etwas mehr Ahnung, aber wenn man sich libRocket herunter lädt, erhält man auch einige Demo-Projekte. Diese enthalten ein kleines Projekt, welches uns einen Großteil der Arbeit abnimmt (Eingabe und Ausgabe per OpenGL). Alles was wir dann noch tun müssen, ist der Aufruf einiger Initialisierungsfunktionen, das Laden der Fonts und schließlich die Darstellung unserer GUI aus unseren HTML/CSS Dateien.
    Daraus habe ich nun ein kleines Projekt erstellt, was man leicht benutzen kann, um mit libRocket herumzuspielen. Dieses Projekt werde ich dann im nächsten Artikel im Detail vorstellen. Dann sehen wir auch endlich wieder etwas Code 🙂
    Bis dahin frohes coden wünscht euch NicoB!

  • Slotmachine Teil 1 in – ISO C++

      0 comments

    Was der Engel kann, kann ich schon lang 😉

    Ok wir haben die gleichen Rahmenbedingungen, wie für den „engelhaften“ Weg. Auch ist in dem Fall die Entwicklungsumgebung Visual Studio 2010.

    Als Projekt nutzen wir eine Win32 Konsolenanwendung und auch hier ist uns Visual Studio behilflich und erstellt das Grundgerüst für unser Anwendung.

    #include "stdafx.h"
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }

    Anders wie im in der C++/CLI Version müssen wir noch ein Header includieren, damit wir schöne Ausgaben in die Konsole schreiben können … das Leben ist so ungerecht… Gut includieren wir den Header iostream

    Der IOStream Header erlaubt uns das wir mit cout unsere Ausgaben schön an die Konsole rausschicken können, ohnedas wir groß mit Klammern und so arbeiten müssen. fügen wir gleich noch unsere Variablen ein 4 Integer, davon eine gleich mit 100 initialisieren und ein Char …. so erledigt

    #include "stdafx.h"
    #include <iostream>
    int _tmain(int argc, _TCHAR* argv[])
    {
            int punkte = 100;	
    	int i, j, k;		
    	char wahl;
    	return 0;
    }

    Was wir auf unserem teuflischen Weg nicht brauchen ist eine Variable für den Random, in Visual Studio kommt die Funktion mit der stdafx.h mit, ansonsten benötigt man den Header stdlib.h

    #include "stdafx.h"
    #include <iostream>
    int _tmain(int argc, _TCHAR* argv[])
    {
            int punkte = 100;	
    	int i, j, k;		
    	char wahl;
    	i = (rand() % 10) + 1;
    	j = (rand() % 10) + 1;
    	k = (rand() % 10) + 1;		
    	return 0;
    }

    Ein weiteren Unterschied zu dem engelhaften Weg ist die Angabe der Grenzen für die Randomfunktion. Während man unter CLI sowohl die untere als auch obere Grenze genau angeben kann, so läuft die Randomfunktion unter ISO von 0 bis zu einer oberen Grenze, dabei ist die Obere Grenze in den Bereich nicht mit eingeschlossen, d.h. mit anderen Worten wie ermitteln eine Zahl zwischen 0 und 9 und verschieben danach den Wertebereich um ein Zähler nach oben.

    Den, je nach dem wie uns Lady Luck oder der Spieler mag, endlosen Spielablauf erreichen wir auch mit einer Do – While schleife. So spielt der Benutzer mindestens einmal (keinmal wäre ja auch doof)
    Abbruchbedingungen sind wie vorgegeben weiter spielen solange man noch Punkte hat in dem man „j“ drückt.
    Mit noch ein wenig Künstlerischen ausschmücken in Text und Form haben wir schon ein fast fertiges exemplar.
    Das cin ist dann für uns so nett und liest den Benutzerinput ein und übergibt es an unsere wahl Variable, die wir dann in unserer While Anweisung auswerten

    #include "stdafx.h"
    #include <iostream>
    int _tmain(int argc, _TCHAR* argv[])
    {
       int punkte = 100;	
       int i, j, k;		
       char wahl;
       do
       {
          i = (rand() % 10) + 1;
          j = (rand() % 10) + 1;
          k = (rand() % 10) + 1;
          cout << "Position1 hat den Wert: " << i << endl;
          cout << "Position2 hat den Wert: " << j << endl;
          cout << "Position3 hat den Wert: " << k << endl;
          cout << "Sie haben jetzt " << punkte <<endl;
          cout<< " Punkte" << endl;
          cout <<"Wollen sie noch eine Runde spielen?" << endl;
          cin >> wahl;
       } while (wahl == 'j' && punkte != 0);
       cout << "Ihr Spiel wurde beendet."<<endl;
       cout << "Ihre Punktzahl ist: " << punkte << endl;	
       return 0;
    }

    Fehlt nur noch der Gewinn und der Verlust … *hust* Einsatz natürlich, wir verlieren ja nicht und der Vergleich ob wir gewonnen haben und bitte schön fertig ist die erste Slot in Iso C++

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
       int punkte = 100;	
       int i, j, k;		
       char wahl;			
       do
       {
    	i = (rand() % 10) + 1;
    	j = (rand() % 10) + 1;
    	k = (rand() % 10) + 1;
    	if (i == j && j == k)
    	{
                punkte += 5;
    	    cout << "Position1 hat den Wert: " << i << endl;
                cout << "Position2 hat den Wert: " << j << endl;
                cout << "Position3 hat den Wert: " << k << endl;
                cout << "Sie haben jetzt " << punkte <<endl;
                cout<< " Punkte" << endl;
    	}
    	else
    	{
    	   punkte -= 5;
    	   cout << "Position1 hat den Wert: " << i << endl;
               cout << "Position2 hat den Wert: " << j << endl;
               cout << "Position3 hat den Wert: " << k << endl;
               cout << "Sie haben jetzt " << punkte <<endl;
               cout<< " Punkte" << endl;
    	}
          cout <<"Wollen sie noch eine Runde spielen?" << endl;
          cout << "Druecken sie fuer JA die Taste j und" << endl;
          cout << "bestaetigen sie ihre Auswahl mit Enter" << endl;
          cin >> wahl;
         } while (wahl == 'j' && punkte != 0);
         cout << "Ihr Spiel wurde beendet."<<endl;
         cout << "Ihre Punktzahl ist: " << punkte << endl;	
    	return 0;
    }

    Gar nicht so schwer oder? Naja vielleicht wird Version 2 eine größere Herrausforderung.

    Eure littleDevil

  • Wer sind littleAngel und littleDevil?

      0 comments

    Wie Goethe es schon in Faust erster Teil schrieb …

    Zwei Seelen wohnen, ach! in meiner Brust,
    die eine will sich von der andern trennen:

    tummeln sich bei jeder Programmieridee ein Engel und ein Teufel auf meinen Schultern und sind im Streit in welcher C++ Version, diese umgesetzt werden sollte.

    So steht der kleine Teufel (littleDevil) für die Umsetzungen der Ideen im ISO C++ und das kleine Engelchen (littleAngel) für die Umsetzungen in C++/CLI.

    Ich versuche sofern die Zeit es zulässt, alles in beiden Richtungen umzusetzen, allein um nicht einzurosten.

    Ich wünsche viel Spaß beim Erlernen und viele Ideen und die damit verbundene Lust diese Umzusetzen. Sowie viel Spaß bei dem Zwiestreit zwischen den zwei Seelen in meiner Brust …

    Eure Sandra Schmidt