Workshop von Zerd und XBelt

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo zusammen, ich nutze diesen ersten Teil des Workshops um zu sehen wie groß das Interesse ist. Also alle die den Workshop bis zuende gelesen haben mögen dies bitte hier drunter posten :)

    Inhalt des Wokshops
    1. 1. Teil
      • Was brauche ich?
        • Visual C++ 2005 Express
        • Platform SDK

      • Beispielprogramm

    2. 2. Teil
      • Das erste Programm
        • Bildschirmausgabe mit cout
        • Was macht das std:: vor dem cout?
        • Wie funktioniert cout?
        • Wie starte ich mein Programm?


    3. 3. Teil
      • Standard Datentypen
        • Standard Datentypen nach dem C99er Standard
        • Definition von Variablen
        • Tastatureingabe mit cin
        • Übungsaufgabe


    4. Teil 4
      • Strings in C++
      • Strukturierte Programmierung
      • Kommentare

    5. Teil 5
      • Kontrollstrukturen
        • If Abfrage
        • Aufgabe
        • Switch-Case Anweisung
        • Aufgabe


    6. Teil 6
      • Schleifen
        • while-Schleife
        • do-while-Schleife
        • for-Schleife


    7. Teil 7
      • Funktionen
        • Beispiel
        • Erklärung
        • Übung

      • Rekursion
        • Beispiel
        • Übung


    8. Teil 8
      • Call By Value
      • Zeiger
        • Was sind Zeiger?
        • Wie benutze ich Zeiger?

      • Zeigervariablen übergeben

    9. Teil 9
      • Der Präprozessor
      • Bedingte Kompilierung
      • Makros




    Was brauche ich?
    Visual C++ 2005 Express
    Ich benutze für den Workshop die IDE "Microsoft Visual C++ 2005 Express" welche es freundlicherweise bei Microsoft kostenlos zum download gibt. Für die meisten Anwendungen gerade am Anfang reicht diese Version. Um trotzdem auf die Nachteile zu den Kostenpflichtigen Versionen einzugehen unterstützt die Express Version beispielsweise keine MFC anwendungen (Vermutlich geht das den Programmieranfängern schon ein stück zu weit, aber ist nicht schlimm, ignoriert es einfach :) ).

    Hier gibt es die Kostenlose Version der Visual C++ 2005 IDE
    http://http://msdn.microsoft.com/vstudio/express/downloads/default.aspx
    (VisualStudio 2005 Express Edition auswählen)

    Platform SDK
    Neben der IDE benötigen wir noch das Platform SDK. Dieses SDK beinhaltet diverse bibliotheken die nicht mit der Express version ausgeliefert werden.
    Download details: Windows® Server 2003 R2 Platform SDK Full Download
    Bei problemen mit dem Download könnt ihr auch die ISO runterladen: Download details: Windows® Server 2003 R2 Platform SDK ISO Download

    Die Downloads werden denke ich einige Zeit brauchen, also heißt es jetzt erstmal abwarten...
    ...
    Nachdem die Downloads abgeschlossen sind könnt ihr schonmal Visual C++ installieren. (Ich erinner mich grade nich ob es bei der installation was zu beachten gab, wenn ja meldet euch, dann werde ich es nochmal nachsehen und ergänzen). Ach ja.. eine Sache gabs da noch :) Soweit ich mich richtig erinner muss man das Visual Studio bei Microsoft registrieren. Da es aber kostenlos ist kann man das ruhig machen.

    Okay, weiter im Programm. Die Installation ist abgeschlossen und nun kommt das Platform SDK. Installiert es und merkt euch den Pfad wohin ihr es installiert habt.

    Startet das Visual Studio und navigiert zu den Optionen:


    Klickt jetzt auf "Projekte und Projektmappen" und dann auf "VC++ Verzeichnisse"


    Dort seht ihr jetzt eine Liste in denen einige Pfade angezeigt werden. Über der Liste gibt es 2 Combo boxen. Die erste ("Plattform"), ist nicht relevant. Die zweite brauchen wir um durch die verschiedenen Verzeichnislisten zu navigieren. In der ersten Liste (Ausführbare Dateien) legt ihr eine neue Zeile an in der ihr dann das Bin verzeichnis der Plattform SDK angebt (z.B.: "C:\programme\plattform SDK 2003...\Bin"

    Dementsprechend navigiert ihr oben in der Verzeichnisliste zu "Includedateien" und fügt eine neue Zeile ein: "C:\programme\plattform SDK 2003...\Include"

    Und zu guter letzt das selbe nochmal für "Bibliothelsdateien":
    "C:\programme\plattform SDK 2003...\Lib"

    Das war es soweit mit den Einstellungen der IDE. (Wenn ich nichts vergessen habe sollte sie nun für unsere Zwecke einsatzbereit sein)

    Beispielprogramm
    Damit ihr nicht völlig unbefriedigt zurück gelassen werden schreiben wir nun noch ein kurzen Programm damit ihr seht wie ihr die IDE benutzt.

    Navigiert "Datei->Neu->Projekt". In dem Dialog wählt ihr Win32 und Win32-Konsolenanwendung. Gebt dem Projekt noch einen Namen und klickt auf OK.


    Als nächstes Klickt ihr auf Weiter und wählt im nächsten Dialog "Leeres Projekt"

    -> Fertig Stellen

    Jetzt seht ihr am linken Bildschirmrand den Projektmappen explorer. Um nun eine neue Datei hinzu zufügen klickt ihr mit der rechten Maustaste auf "Quelldateien -> Hinzufügen -> Neues Element" und wählt C++-Datei. Gebt ihr wieder einen Namen und drückt auf Hinzufügen.

    Als letztes kopiert ihr den Quellcode den ich jetzt hier hinschreibe und versucht ihn zu kompilieren. (Ich gehe hier nicht auf das Programm ein weil das nur zu testzwecken genutzt wird)

    Quellcode

    1. #include <iostream>
    2. int main() {
    3. std::cout << "Hallo Welt";
    4. return 0;
    5. }


    Zum kompilieren drückt ihr F7 oder navigiert "Erstellen -> Projektmappe erstellen"



    Wie schon erwähnt gilt dieser erste "Workshop" erstens um denen die interesse haben zu erklären was benötigt wird und um zu sehen wie viele wirklich interesse haben. Außerdem sind verbesserungsvorschläge erwünscht :). Also wenns gut ist, fehler vorhanden sind, etwas unklar ist oder sonst was, einfach antworten. Wenn genug feedback ist überlege ich ob es sich lohnt den Spaß weiter zu führen :)

    Gruß Zerd

    Das erste Programm
    Nachdem wir nun die IDE eingerichtet haben wollen wir langsam mit den ersten kleinen Programmen anfangen.

    Ich beginne mit dem kleinst-möglichen C++ Programm und ergänze dieses im laufe dieser Lektion. Startet hierzu genau wie ich es in dem Programmbeispiel in der letzten Lektion erklärt habe und erstellt ein neues Projekt.

    Das kleinste C++ Programm: (Ich benutze PHP codetags weil der code dann schöner formatiert wird)

    PHP-Quellcode

    1. void main() {
    2. }
    Kleine Anmerkung zu diesem Programm: void main() entspricht nicht dem standard. Daher sollte stattdessen immer int main() mit dem entsprechenden Rückgabewert benutzt werden.

    Das Programm macht garnichts. Trotzdem kann man schon etwas lernen. Die funktion die ich gerade dargestellt habe ist die Hauptfunktion eines jeden C++ Programms. Ihr werdet (zumindest am Anfang) immer diese Funktion nutzen um eure Programme zu schreiben.

    Damit nun etwas passiert fangen wir einfach mal mit einer einfachen Bildschirmausgabe an.

    Bildschirmausgabe mit cout
    Schauen wir uns zunächst das folgende Programm an:

    PHP-Quellcode

    1. #include <iostream>
    2. int main() {
    3. std::cout << "Hello World" << std::endl;
    4. return 0;
    5. }

    Die #include Anweisung ist eine so genannte Präprozessor anweisung. Der Präprozessor verarbeitet den quelltext bevor er dann an den eigentlichen compiler gesendet wird.
    Was macht #include jetzt also genau? Mit dieser Anweisung kann man externe Bibliotheken dem aktuellen quelltext "bekannt" machen. In der 3. Zeile des Programmes steht die Zeile "std::cout << "Hello World" << std::endl;". Ihr könnt testen was passiert wenn ihr die #include anweisung löscht. Ihr werdet einen Compilerfehler bekommen die besagt das die Anweisung "cout" nicht bekannt ist. Dadurch das die headerdatei "iostream" includiert wird wird dem compiler die anweisung cout bekannt gemacht.

    Was macht das std:: vor dem cout?
    std gibt an, in welchem namespace die anweisung steht. Ein namespace ist im Prinzip nur eine definition von einem Bereich indem verschiedene Klassen oder Funktionen gespeichert sind. Wenn ihr nicht immer std:: vor die Anweisungen schreiben möchtet könnt ihr direkt über die main() funktion folgendes schreiben: using namespace std;
    Habt ihr diese Zeile eingefügt könnt ihr euch die std:: anweisungen for cout und endl sparen.

    Wie funktionier cout?
    cout ist ein objekt welches funktionen zur Textausgabe in der Konsole zur Verfügung stellt. Durch den Operator << wird die Zeichenkette an das Objekt weitergegeben und dann in der Konsole ausgegeben. Man hat die Möglichkeit Zeichenketten über den Befehl << miteinander zu verknüpfen:

    PHP-Quellcode

    1. cout << "Hello " << "World!" << endl;

    Wahrscheinlich ist euch mitlerweile der Begriff endl aufgefallen. Mit endl wird der Cursor in der Konsole an den Anfang der nächsten Zeile gesetzt. Es entspricht also quasi dem Drücken der Entertaste.

    Wie starte ich mein Programm?
    Nachdem ihr das Programm kompiliert habt (F7 oder über "Erstellen->Projektmappe erstellen") wollt ihr sicher das Programm starten :)
    Die exe datei findet ihr im Projektverzeichnis (wo ihr das Projekt gespeichert habt) und dann im Unterordner Debug oder Release. (vermutlich Debug)
    Wenn ihr die exe einfach mit Doppelklick startet öffnet sich ein Konsolenfenster, schließt sich aber auch direkt wieder. Nunja, die main() funktion wir aufgerufen und das Programm wird direkt nach der Ausgabe beendet. Um eine Ausgabe zu sehen startet ihr das Programm am besten in der Komandozeile, dazu: Start->Ausführen ... Dann "cmd" und enter eingeben. Jetzt navigiert ihr zu dem Verzeichnis mit der exe datei und startet diese.

    Es gäbe noch diverse Möglichkeiten das Programm daran zu hindern das Fenster zu schließen. Für den Anfang soll das aber erstmal reichen, damit ihr auch noch was zu tun habt ;)

    Ich merke grade das ich hunger bekomme, also mache ich hier erstmal schluss :) Zumindest habt ihr jetzt die "Mittel" um etwas auf dem Bildschirm auszugeben. Probiert ruhig etwas damit herum, in der nächsten Lektion fange ich mit Variablen und dem einlesen von Texten an.

    Wie schon erwähnt meldet euch wenn ihr Fehler findet oder Fragen habt.
    Hier ist der Diskussionsthread

    Standard Datentypen
    Bevor ich mit den Variablen und dem Einlesen der Tastatur beginnen kann müssen wir zunächst die Standard-Datentypen behandeln damit ihr wisst was ich in dem danach folgenden Beispiel mache.

    Standard Datentypen nach dem C99er Standard
    Integer Datentypen:

    Quellcode

    1. char 1 byte Character, Integer-Typ ohne Vorzeichen
    2. signed char 1 byte Character mit Vorzeichen
    3. unsigned char 1 byte Character ohne Vorzeichen, identisch zu char
    4. short 2 byte 2 byte Integer-Typ mit Vorzeichen.
    5. unsigned short 2 byte 2 byte Integer-Typ ohne Vorzeichen.
    6. int 4 byte 4 byte Integer-Typ mit Vorzeichen.
    7. unsigned 4 byte 4 byte Integer-Typ ohne Vorzeichen.
    8. long 8 byte 8 byte Integer-Typ mit Vorzeichen.
    9. unsigned long 8 byte 8 byte Integer-Typ ohne Vorzeichen.
    10. long long 8 byte 8 byte Integer-Typ mit Vorzeichen.
    11. unsigned long long 8 byte 8 byte Integer-Typ ohne Vorzeichen.
    Alles anzeigen

    Integer Datentypen sind Typen die nur ganzzahlige Werte speichern können. Die größe der Daten die gespeichert werden können hängt vom jeweiligen System ab, daher werde ich da nicht genauer drauf eingehen. unsigned bedeutet dabei das die Variablen nur Positive Werte speichern können. signed definiert dementsprechend einen positiven und einen negativen Wertebereich.

    Fließkomma Datentypen:

    Quellcode

    1. float 4 byte 4 byte Fließkomma-Typ mit 3 byte Mantisse und 1 byte Exponenten.
    2. double 8 byte 8 byte Fließkomma-Typ mit 53 bit Mantisse und 11 bit Exponenten.
    3. long double 10 byte 10 byte Fließkomma-Typ mit 8 byte Mantisse und 2 byte Exponenten.

    Die genauen größen der einzelnen Datentypen sind für den Anfang nicht so wichtig. Wenn ihr sie doch mal brauchen solltet könnt ihr sie hier nachlesen :)

    Definition von Variablen
    Hier ein kleines beispiel wie variablen definiert und inizialisiert werden können:

    PHP-Quellcode

    1. int intVariable = 5;
    2. char charVariable = 'a';
    3. float floatVariable = 1.5f;

    Das f bei der zuweisung der float Variable definiert das es sich dabei um eine Gleitkommazahl handelt.

    Tastatureingabe mit cin
    Schaut euch zuerst einmal den folgenden code an:

    PHP-Quellcode

    1. #include <iostream>
    2. int main() {
    3. int eingabe;
    4. std::cout << "Bitte geben Sie eine Zahl ein: ";
    5. std::cin >> eingabe;
    6. std::cout << "Ihre Eingabe war: " << eingabe;
    7. return 0;
    8. }

    In der ersten Zeile definiere ich die Variable eingabe vom Typ char. Das sagt uns schonmal das wir in dieser Variable nur ein Zeichen speichern können.
    In der 3. Zeile wird dann cin aufgerufen und mit dem operator >> die Tastatureingabe in der Variable eingabe gespeichert.
    Zum schluss gebe ich die Variable mit cout wieder aus.

    Bevor ich dieses kleine Kapitel abschließe gebe ich noch eine kleine Übungsaufgabe. Mit dem was ihr bisher gelernt habt solltet ihr in der Lage sein folgende Aufgabe zu lösen:

    Übungsaufgabe
    Lies 3 Zahlen hintereinander ein, addiere sie und gib die Lösung wieder aus.
    Tipp: Das Ergebnis eurer Berechnung kann in einer neuen Variable gespeichert werden. Berechnungen werden dabei in folgender Form gemacht: Wert = wert (+ - * /) wert;

    Es ist ein recht kleines und einfaches Programm, wer will kann gerne seine Lösung posten um (falls nötig) Verbesserungsvorschläge zu bekommen. Benutzt dazu bitte wie gehabt Diesen Thread

    Strings in C++
    Im letzten Kapitel bin ich auf die Standard-Datentypen eingegangen. Natürlich sind das nicht alle Typen die man verwenden kann. Man hat in C++ die möglichkeit vorhandene Klassen zu verwenden oder sich eigene Typen oder Klassen zu definieren.

    Ein Beispiel für solch einen Datentyp ist der Typ string. Da wir uns für den C++ Workshop entschieden haben werde ich nicht auf die C variante von strings eingehen.

    der Typ string befindet sich genau wie cin und cout in dem namespace std und kann somit wie folgt definiert werden:

    PHP-Quellcode

    1. std::string name
    Damit dieser Typ dem programm bekannt gemacht werden kann muss zusätzlich die header datei string eingefügt werden.

    PHP-Quellcode

    1. #include <string>

    Schauen wir uns ein Beispiel an, indem wir einen String (also eine Zeichenkette) einlesen und in einer Variable speichern:

    PHP-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. int main() {
    4. std::string nachname;
    5. std::cout << "Bitte geben Sie Ihren Nachname ein: ";
    6. std::cin >> nachname;
    7. std::cout << "Ihre Eingabe: " << nachname;
    8. return 0;
    9. }


    Ich denke ihr braucht keine große erklärung für diesen Programmcode. Das einzige was neu ist, ist die Verwendung von std::string.

    Bevor ich dieses Kapitel so kurz lasse mache ich noch einen kurzen Exkurs um auf strukturierte Programmierung einzugehen.

    Strukturierte Programmierung
    Was ich versuchen möchte euch schon von anfang an in diesem Workshop zu vermitteln, ist das ihr euren Quelltext gut und vor allem konsistent formatiert. Schaut euch die folgenden Beispiele an:
    Schlechtes Beispiel:

    PHP-Quellcode

    1. #include <iostream>
    2. int main(){
    3. std::string nachname;
    4. std::cout<<"bitte geben sie ihren namen ein:";
    5. std::cin>>nachname;
    6. std::cout<<"ihr name: "<<nachname;
    7. return 0; }

    Gutes Beispiel:

    PHP-Quellcode

    1. #include <iostream>
    2. int main() {
    3. std::string nachname;
    4. std::cout << "bitte geben sie ihren namen ein:";
    5. std::cin >> nachname;
    6. std::cout << "ihr name: " << nachname;
    7. return 0;
    8. }

    Wenn ihr die beiden (inhaltlich identischen) listings anschaut werdet ihr (hoffentlich) erkennen das der 2. Quellcode um einiges besser lesbar ist. Durch solche (oder ähnliche) Formatierung kann man quellcode leserlich und strukturiert gestalten. Eine gute Strukturierung ist bei großen Projekten unverzichtbar.

    Ihr mögt vielleicht jetzt denken: "Ja aber wie machen doch noch keine großen Projekte". Ja das stimmt schon, aber wenn man es direkt ordentlich und richtig lernt muss man es später nicht ändern ;)

    Kommentare
    Wo ich grade bei Strukturierter Programmierung bin... Da fällt mir auf das ich noch kein bisschen erwähnt habe wie nützlich Kommentare sind :)
    Es gibt 2 Möglichkeiten Kommentare im Quellcode zu hinterlassen:

    PHP-Quellcode

    1. // Kommentar in einer Spalte
    2. /* Kommentar über mehrere Spalten
    3. Noch mehr Kommentar
    4. */


    Kommentare sind bei großen Projekten genauso wichtig wie eine gute Struktur. Gerade Funktionen und Klassenvariablen sollten gut kommentiert werden. Dazu kommen wir aber später :)
    Kommentare werden beim Kompilieren des Quellcodes Ignoriert, also macht es nichts aus wenn man viele Kommentare schreibt. Das wirkt sich nicht auf die Größe des Programmes am Ende aus.

    Ich werde leider über das Wochenende keine Zeit haben am Workshop weiterzumachen. Montag gehts denke ich dann weiter. Ich würde mich mal über etwas mehr feedback freuen, damit ich weiß das ich den Workshop nicht nur für 2 Leute schreibe :)
    Also wie immer Hier könnt ihr Fragen stellen, verbessern oder einfach nur diskutieren.

    Im nächsten Teil wird es dann etwas spannender. Dort werde ich dann auf Kontrollstrukturen und Schleifen eingehen womit dann die Programme endlich etwas sinnvoller werden :)

    Kontrollstrukturen
    Kommen wir mal zu etwas nützlichem... (Nicht das ihr jetzt denkt das vorher war sinnlos ;) )
    Mit Kontrollstrukturen wie if Abfragen oder switch-case Anweisungen lässt sich der Programmfluss durch angaben von Bedingungen kontrollieren. In diesem Teil werdet ihr lernen wie solche Abfragen funktionieren.
    If-Abfrage
    Syntax:

    PHP-Quellcode

    1. if(<bedingung>) {
    2. Anweisung1..
    3. Anweisung2..
    4. ...
    5. }

    Die if-Abfrage ist immer so aufgebaut wie in der Syntax beschrieben. Die Bedingung ist ein eine Logische Abfrage die entweder true (wahr) oder false (falsch) ergibt.

    Beispiel:

    PHP-Quellcode

    1. if(wert==1) {
    2. std::cout << "Der Wert war 1" << std::endl;
    3. }

    In diesem beispiel wird der Text "Der Wert war 1" ausgegeben wenn die Variable wert wirklich den Wert 1 beinhaltet. Ist das nicht der Fall wird die Ausgabe einfach übersprungen.

    if kann durch eine else anweisung verknüpft werden:

    PHP-Quellcode

    1. if(<bedingung>) {
    2. Anweisungen...
    3. } else {
    4. Alternative Anweisungen...
    5. }

    So hat man die möglichkeit alternativ-anweisungen auszuführen falls die Bedingung nicht true ergibt.

    Beispiel:

    PHP-Quellcode

    1. if(wert==1) {
    2. std::cout << "der Wert war 1" << std::endl;
    3. } else {
    4. std::cout << "der Wert war " << wert << std::endl;
    5. }


    Mit dieser Information solltet ihr beispielsweise schon in der Lage sein folgendes Programm zu lösen:
    Aufgabe
    Schreibt einen Taschenrechner der zunächst 2 Zahlen einliest, danach eine Ausgabe in der Art macht:

    Quellcode

    1. Bitte wählen Sie eine Rechenart [+, -, *, /]:

    Dort lest ihr nun eines der Zeichen ein und entscheidet mit hilfe der eben gelernten if abfrage welche Berechnung ihr ausführt. Zum schluss gebt ihr das Ergebnis auf dem Bildschirm aus.

    Switch-Case Anweisung
    Neben der if abfrage gibt es speziell für integer bzw. char werte die Switch-Case Anweisung.
    Mit dieser Anweisung kann man eine Variable nach verschiedenen inhalten überprüfen und dem entsprechend eine andere aktion ausführen.

    Syntax:

    PHP-Quellcode

    1. switch(variable) {
    2. case <wert>:
    3. Anweisung..
    4. break;
    5. case <wert2>:
    6. Anweisung...
    7. break;
    8. default:
    9. Anweisung
    10. }

    Zur Veranschaulichung hier noch ein kleines Beispiel:

    PHP-Quellcode

    1. switch(variable) {
    2. case 1:
    3. std::cout << "1 gedrückt" << std::endl;
    4. break;
    5. case 2:
    6. std::cout << "2 gedrückt" << std::endl;
    7. break;
    8. default:
    9. std::cout << "Was anderes" << std::endl;
    10. }

    Diese Anweisung "schaut" also in die Variable und überprüft den Inhalt und entscheidet so in jedem case-block was gemacht wird. der break befehl ist wichtig, da sonst nicht aus dem switch-case rausgesprungen wird, sondern jede der case-blöcke abgearbeitet wird. default ist im Prinzip nichts anderes als das else bei der if anweisung. Wenn nichts von den oberen Werten in der Variable enthalten ist wird die default-anweisung ausgeführt.

    Aufgabe
    Versucht die Aufgabe von oben mit der Switch-Case Anweisung zu lösen.

    Sollte es noch Fragen zu dem thema geben bitte einfach wie immer in diesem Thread melden. Ich bin mir nicht sicher ob das alles so gut erklärt ist, hab mich evtl. insgesammt etwas kurz gefasst... Aber vielleicht reichts ja auch ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Broken Sword ()

  • Schleifen
    Kommen wir zu einer neuen wichtigen Sache des programmierens: Schleifen.
    Schleifen werden genutzt um gewisse Programmabschnitte mehrfach durchlaufen zu lassen ohne sie mehrfach hinschreiben zu müssen.

    Es gibt in C++ drei verschiedene Schleifenarten:
    while-Schleife
    Syntax:

    Quellcode

    1. Initialisierung;
    2. while(bedingung) {
    3. Befehle;
    4. }

    Beispiel:

    PHP-Quellcode

    1. #include <iostream>
    2. int main() {
    3. int i=1;
    4. while(i <= 10) {
    5. std::cout << "I hat den Wert: " << i << std::endl;
    6. i = i+1;
    7. };
    8. return 0;
    9. }

    Diese Schleife läuft so lange bis i kleiner oder gleich 10 ist. Also wird die Schleife nicht mehr ausgeführt sobald i den Wert 11 annimmt.
    Bei dieser Schleife wird erst die Bedingung geprüft und wenn die Bedingung erfüllt wird wird die Schleife ausgeführt.

    do-while-Schleife
    Syntax:

    Quellcode

    1. initialisierung;
    2. do{
    3. befehle;
    4. } while(bedingung);

    Beispiel:

    PHP-Quellcode

    1. #include <iostream>
    2. int main() {
    3. int eingabe;
    4. int summe=0;
    5. do {
    6. std::cout << "Bitte geben Sie eine Zahl ein: ";
    7. std::cin >> eingabe;
    8. summe = summe + eingabe;
    9. } while(eingabe != 0);
    10. std::cout << "Die Summe dieser Zahlen ist: " << summe << std::endl;
    11. return 0;
    12. }
    Alles anzeigen

    Im vergleich zur while-Schleife wird die do-while schleife mindestens einmal ausgeführt. D.h. die BEdingung wird erst am ende geprüft. Die Schleife läuft also einmal durch und danach wird die eingabe überprüft. Ist die zuletzt eingegebene Zahl nicht 0 wird die Schleife nochmal durchlaufen und die zahl zu dem ergebnis addiert.

    for-Schleife
    Syntax:

    Quellcode

    1. for(initialisierung; bedingung; weiter) {
    2. befehle;
    3. }

    Beispiel:

    PHP-Quellcode

    1. #include <iostream>
    2. int main() {
    3. int i;
    4. for(i=1; i <= 10; i=i+1)
    5. {
    6. std::cout << "Schleifendurchlauf Nummer " << i << std::endl;
    7. };
    8. return 0
    9. }

    Die for schleife nutze ich persönlich am meisten, da sie meiner meinung nach die kürzeste und übersichtlichste ist, da die initialisierung des zählers im Schleifenkopf passiert.

    Als Übung fällt mir gerade nicht wirklich was ein :)
    Aber ihr könntet z.B. so ein programm schreiben:
    Lies eine Zahl ein die als obere Grenze gilt.
    Schreibt nun eine Schleife die von 0 bis zu dieser oberen Grenze läuft und alle Primzahlen ausgibt die bis zu dieser oberen Grenze vorkommen.

    Bei Fragen, Problemen, Anregungen wie immer Hier melden :)

    *edit*
    Kleine Info: Ich versuch am Wochenende weiter zu machen, hab aber im Moment wenig zeit, ansonsten gehts nächste Woche weiter!

    Funktionen
    Ab einer gewissen programmgrösse kann es leicht unübersichlich werden. Eine möglichkeit das zu verhindern ist die verwendung von Funktionen.
    Dabei werden gewisse Programmteile in Funktionen "ausgelagert".
    Beispiel:

    PHP-Quellcode

    1. #include<iostream>
    2. /** Funktion zum addieren von zwei Zahlen */
    3. int addiere(int a, int b) {
    4. return a+b;
    5. }
    6. /** Main funktion */
    7. int main() {
    8. int eingabe1, eingabe2;
    9. std::cout << "Bitte geben Sie die erste Zahl ein: ";
    10. std::cin >> eingabe1;
    11. std::cout << "Bitte geben Sie die zweite Zahl ein: ";
    12. std::cin >> eingabe2;
    13. std::cout << "Das Ergebnis von " << eingabe 1 << " + " << eingabe2 << "ist: " << addiere(eingabe1, eingabe2);
    14. return 0;
    15. }
    Alles anzeigen

    Dieses Beispiel ist relativ bescheiden, verdeutlicht aber die funktionsweise von Funktionen. Die funktion addiere ist recht klein und man hätte die Addition auch direkt in der main funktion durchführen können, aber um so komplexer die berechnungen werden umso sinnvoller wird es diese in funktionen auszulagern.

    Erklärung zum funktionsaufbau:
    int addiere(int a, int b)
    ist der Funktionskopf. Er gibt an welchen Rückgabetyp die Funktion hat (int) wie die funktion heisst (addiere) und welche übergabe parameter die funktion hat (int a, int b).
    Also sieht die Syntax so aus:

    Quellcode

    1. Rückgabeparameter Name(Übergabeparameter1, Übergabeparameter2, ...)

    Die Übergabeparameter sind kopien der Werte die beim Funktionsaufruf in der main funktion übergeben werden. Diese Art der parameterübergabe nennt man "Call by Value". Es gibt neben dieser Variante auch noch "Call by reference" darauf werde ich aber erst später eingehen wenn wir zu Zeigern und Referenzen kommen.
    Mögliche Übungsaufgabe:
    Taschenrechner um Funktionen erweitern. neben den standard berechnungen könnten noch eine Funktion zum potenzieren und zum Berechnen der Fakultät implementiert werden.

    Rekursion
    Eine Rekursive Funktion ist eine Funktion die sich zum lösen eines Problems selber aufruft. Eine normale Funktion heisst im vergleich Iterativ.
    Beispiel:

    PHP-Quellcode

    1. /** Summe der zahlen von n - 0
    2. also bei z.B. n = 5 würde die berechnung 5+4+3+2+1 lauten */
    3. int sum(int n)
    4. {
    5. if(n==0)
    6. return 0;
    7. else
    8. return n+sum(n-1);
    9. }
    10. /** Main funktion: Berechnet 5+4+3+2+1 */
    11. int main() {
    12. std::cout << "sum(5) = " << sum(5);
    13. return 0;
    14. }
    Alles anzeigen

    Die Rekursion wird so lange gestartet bis am Ende der Rekursion n = 0 ist. Dann geht die Rekursion zurück und die ergebnisse werden in jedem Rekursionsschritt addiert. Es ist unter umständen etwas schwer das zu verstehen, ich hoffe die Beispielaufgabe ist verständlich...

    Mögliche Übungsaufgaben:
    - Implementiert die Fakultätsfunktion rekursiv
    - Achtung, Schwer: Berechnung der Fibonacci Zahlen
    Definition der Fibonacci zahlen:
    F(1)=1
    F(2)=1
    F(n)=F(n-1)+F(n-2)
    Daraus ergibt sich eine Folge von 1, 1, 2, 3, 5, 8...
    Implementiert die Funktion Rekursiv und Iterativ

    Call by Value
    "Call by Value" nenn man den Funktionsaufruf den wir bisher verwendet haben. Beim Aufruf der Funktion wird eine Kopie der Parameter an die Funktion übergeben. Werden diese in der Funktion verändert wirkt sich das nicht auf die Original Variablen auf:

    PHP-Quellcode

    1. void test(int a, int b) {
    2. b = a;
    3. a = 5;
    4. }
    5. int main() {
    6. int varA = 1, varB = 2;
    7. test(varA, varB);
    8. std::cout << "VarA: " << varA << " - VarB: " << varB << std::endl;
    9. return 0;
    10. }
    Alles anzeigen

    Das beispiel Zeigt das sich die Original werte nicht verändern. Um mit den originalvariablen arbeiten zu können brauchen wir Zeiger.

    Zeiger
    So nun wirds mal etwas komplizierter :)
    Vielleicht ist es nicht so klever mit so einem Satz ein neues Kapitel zu beginnen, aber hey, Ihr lasst euch sicher nicht einschüchtern!!

    Was sind Zeiger?
    Na mal sehen ob ich die richtigen Worte finde um Zeiger zu erklären...

    Wie ihr vielleicht wisst wird der Speicher im Rechner in Byte eingeteilt. Jedes Byte hat eine eindeutige Speicheradresse. Wird einer Variablen eine Zahl zugewiesen so wird diese Zahl an einer bestimmten Adresse im Speicher abgelegt. Im vergleich zu dieser Art des speicherns von Daten speichert ein Zeiger nicht den Inhalt der Variable, sondern die Speicheradresse.


    "Zeiger" zeigt auf die Adresse der Variable A

    Belegt eine Variable mehr als einen Byte wird die Adresse des Zeigers auf das erste Byte gesetzt.

    Wie benutze ich Zeiger?
    Zum Anlegen von Zeigern wird der Dereferenzierungsoperator * verwendet:

    PHP-Quellcode

    1. int variable; // Normale Variable
    2. int *pVariable; // Zeigervariable

    Um an die Adresse einer Variable zu kommen benutzt man den Adressoperator &

    PHP-Quellcode

    1. int variable;
    2. int *pVariable = &variable;

    In diesem "zeigt" der Zeiger pVariable auf die Adresse von variable. (p vor dem pVariable steht für pointer)

    Folgendes Beispiel soll die Funktionsweise noch etwas verdeutlichen:

    PHP-Quellcode

    1. int zahl;
    2. int *pZahl = &zahl;
    3. *pZahl = 5;
    4. std::cout << zahl << std::endl;

    Im prinzip folgen wir durch Angabe des * (Dereferenzierungsoperators) dem Zeiger und speichern am ende des Zeigers den Wert 5. Wenn wir nun die Variable zahl ausgeben werdet ihr sehen das der Wert 5 ausgegeben wird obwohl wir die variable zahl nicht direkt verwendet haben.

    Zeigervariablen übergeben
    Um das "call by value" Beispiel mit hilfe von Zeigern so zu verändern das die originalwerte tatsächlich verändert werden muss es wie folgt verändert werden:

    PHP-Quellcode

    1. void test(int *a, int *b) {
    2. *b = *a;
    3. *a = 5;
    4. }
    5. int main() {
    6. int varA = 1, varB = 2;
    7. test(&varA, &varB); // Übergabe der Adressen der Variablen
    8. std::cout << "VarA: " << varA << " - VarB: " << varB << std::endl;
    9. return 0;
    10. }
    Alles anzeigen

    Die variablen varA und varB werden nun in der funktion test() verändert da die adressen der Variablen übergeben wurden.

    Anmerkung:
    Eigentlich sollten nun auch Referenzen erklärt werden... Ich werde das aber erstmal weglassen, da es nur eine andere (meiner meinung nach unschöne) möglichkeit ist Zeigeradressen zu übergeben. Vielleicht erweitere ich den Part hier irgendwann mal :) Oder vielleicht kommen ja auch beschwerden das das fehlt, dann mach ich da vielleicht noch was ;)

    Übung:
    1. Schreibt eine Funktion die zwei Zahlen miteinander vertauscht. Dabei soll ein Zeigeraufruf verwendet werden.

    PHP-Quellcode

    1. int a = 4;
    2. int b = 8;
    3. swap(&a, &b);
    4. ...

    Nach dem funktionsaufruf sollte also in a der Wert 8 und in b der Wert 4 gespeichert sein.

    2. Schreibt eine Funktion die 3 Zahlen sortiert:

    PHP-Quellcode

    1. int a = 8;
    2. int b = 4;
    3. int c = 5;
    4. sort(&a, &b, &c);
    5. ...

    Nach dem Funktionsaufruf sollte also in a der wert 4, in b der wert 5 und in c der Wert 8 abgespeichert sein.

    Sorry das meine Übungsaufgaben nicht so kreativ sind, aber vielleicht fallen euch ja noch ein paar ein :)

    Probleme, Fragen und Anregungen bitte wie immer hier: freesoft-board.to/f155/diskuss…shop-von-zerd-205639.html

    P.S. Ich habe keine der programmzeilen die ich da oben geschrieben habe ausprobiert, von daher bitte ich Tippfehler zu entschuldigen ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Broken Sword ()

  • Danke an Zerd, dass ich sein Tut weiterschreiben darf

    Bisher haben wir nur Angeschaut was man in C++ standardmässig benutzen kann, doch vielleicht wollt ihr auch einmal den Code auf mehrere Dateien aufteilen. Genau hier kommen die Präprozessor-Direktiven zum Einsatz.

    Der Präprozessor
    Bevor ein C++-Quellcode vom Compiler übersetzt wird, fasst der Präprozessor String-Literale zusammen, entfernt Zeilenumbrüche, löscht Kommentare, sowie alle Leerzeichen. Der Programmiere kann dem Präprozessor jedoch Anweisungen geben. Diese nennt man Präprozessor-Direktiven. Zeilen, welche für den P (präprozessor) bestimmt sind, beginnen mit dem Hash-Zeichen „#“. Eine Spezialität der PD (Präprozessor-Direktiven) ist, dass die Zeilen nicht mit einem Semikolon abgeschlossen werden.
    So genug gelabert. Was kann man nun damit tun?

    Bedingte Kompilierung
    Wenn man eine Anwendung schreibt, welche Platformunabhängig ist, muss man unter Umständen verschiedene Header Dateien einbinden. Oder wenn man eine Anwendung erstellen will, welche je nach Sprache andere Header braucht, benutzt man folgende Befehle:
    #if, #ifdef, #ifndef, #elif, #else, #endif
    Nun anhand von den Namen kann man schon auf die Funktion der verschiedenen Befehle schliessen.
    #if und #else sind meiner Meinung nach selbsterklärend, ebenso wie #endif.
    #ifdef überprüft, ob der Ausdruck danach dem Präprozessor schon bekannt ist. #ifndef bewirkt genau das Gegenteil.
    Schliesslich noch #elif. #elif entspricht dem Befehl else if.

    Einbinden von weiteren Quellcodedateien
    Eine weitere PD haben wir schon von Anfang an benutzt:

    PHP-Quellcode

    1. #include <iostream> //Die Include-Anweisung bindet eine weitere Quellcodedatei ein


    Das Beispiel der Header Datei
    Wenn wir nun eine eigene Headerdatei geschrieben haben, z.B. myheader.h, müssen wir diese in der main.cpp einbinden um deren Inhalt zu benutzen. Weiter wird in der Header Datei überprüft ob dieses schon eingebunden wurde um ein doppeltes einbinden zu verhindern. Das ganze würde dann so aussehen:

    PHP-Quellcode

    1. //myheader.h
    2. #ifndef MYHEADER_H_
    3. #define MYHEADER_H_
    4. … irgendwas
    5. #endif

    PHP-Quellcode

    1. //main.cpp
    2. #include “myheader.h” // Wenn wir den Headernamen in “” angeben, sucht der Compiler die Datei im Arbeitsverzeichniss.
    3. #include <iostream>


    Überprüfung des aktuellen Betriebsystems
    Diesen Code werde ich nicht weiter erläutern, denn er sollte eigentlich klar sein.

    PHP-Quellcode

    1. #include <iostream>
    2. #ifdef __WIN32__
    3. #define BS "Windows"
    4. #elif __linux__
    5. #define BS "Linux"
    6. #else
    7. #define BS "Unbekanntes Betriebssystem"
    8. int main(){
    9. std::cout << "Das BS ist: " << BS;
    10. return 0;
    11. }
    Alles anzeigen

    Hier noch die weiteren Konstanten und für welches BS diese stehen:

    Quellcode

    1. __WIN32__ | Windows ab 95
    2. __OS2__ | OS2
    3. _Windows | Zielsystem Windows
    4. __NT__ | Windows NT
    5. __linux__ | Linux
    6. __FreeBSD__ | FreeBSD
    7. __OpenBSD__ | OpenBSD
    8. _SGI_SOURCE | SGI-IRIX mit Extension *.sgi
    9. _MIPS_ISA | SGI-IRIX
    10. __hpux | HP-UX

    Diese Konstanten sind nicht im C ++ Standard definiert sondern in speziellen Windows- bzw. Linux Headern oder in den IDE-Project settings. (Bei Visual C++ Express Edition sind diese in die IDE integriert)


    Makros

    PHP-Quellcode

    1. #define Zahl 5
    2. int main(){
    3. int i;
    4. i = 5 + Zahl;
    5. std::cout << i; // i hat den Wert 10;
    6. #undef Zahl
    7. i = i – Zahl; //Fehler, da Zahl nicht mehr existent
    8. return 0;
    9. }


    Weiter können auch Makros Parameter enthalten:

    PHP-Quellcode

    1. #include <iostream>
    2. #define ADD(x,y) (x+y)
    3. usw.


    weiter kann man auch Makros über mehrere Zeilen hinweg schreiben:

    Quellcode

    1. #define Tausche(x,y) {\
    2. int j; \
    3. j=x; \
    4. x=y;\
    5. y=j;\
    6. }

    wichtig ist einfach, dass man jede Zeile mit einem "\" abschliessen muss (darum habe ich kein php codes verwendet, da diese "\" ignorieren).

    ich habe keinen Quellcode ausprobiert. Fehler bitte bei mir melden.

    Übungen:
    1. Versucht einmal die climits einzubinden und die Konstante LONG_MIN und LONG_MAX auszugeben. (cout << LONG_MIN; )
    2. Versucht einen Code zu schreiben, der je nach BS andere Header einbindet(welche ist eigentlich egal).
    3. Schreibt ein Makro, welches eine Zahl mit sich selbst multipliziert und auch so aufgerufen werden kann:
    SQRE(x+1)
    Schwierig:
    4. Schreibt ein Makro, welches die grössere von 2 Zahlen herausfindet und dies mit nur 1ner Anweisung. Informiert euch über ternäre Operatoren
    Noch ein paar Übungen aus einem Buch:
    1. Bestimmt und korrigiert die Fehler in folgenden #define- Direktiven:
    a) define BEGIN {
    b) #define LIMIT 1000
    c) #define START = 1
    d) #define CUBE(n) (n * n * n)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword ()

  • Hallo Zerd,
    danke für die Hilfe, mit der Image Datei hat die Installation der SDK Plattform funktioniert. Hab dann gleich mal die Programme aus deinem Workshop ausprobiert und versucht die Übungsaufgabe zu lösen:

    #include <iostream>

    int main() {
    int eingabe1;
    int eingabe2;
    int eingabe3;
    int ergebnis;
    std::cout << "Bitte geben Sie nacheinander 3 Zahlen ein, die erste: ";
    std::cin >> eingabe1;
    std::cout << "die zweite: ";
    std::cin >> eingabe2;
    std::cout << "die dritte: ";
    std::cin >> eingabe3;
    ergebnis = eingabe1 + eingabe2 + eingabe3;
    std::cout << "Die Summe der drei Zahlen betraegt: " << ergebnis;
    return 0;
    }

    Ich freue mich schon auf die Fortsetzung
    Gruß ro2000
  • Hi ro2000,
    spontan sieht der quellcode gut aus. Was man optimieren kann (muss man aber nicht) ist folgendes:

    Quellcode

    1. int eingabe1;
    2. int eingabe2;
    3. int eingabe3;
    4. int ergebnis;

    kann man in eine Zeile schreiben:

    Quellcode

    1. int eingabe1, eingabe2, eingabe 3, ergebnis;

    Solange alle Variablen den selben Typ haben sollen (in dem Fall int) können alle definitionen der Variablen in eine Zeile geschrieben werden.

    Außerdem solltest du wenn du quellcode postest die [ php] [/ php] tags verwenden damit die Formatierung nicht verloren geht. (auch wenn wir nicht in PHP programmieren ist die Formatierung schöner)

    Tut mir leid das ich dieses Wochenende nicht weitermachen kann, dafür wirds ab nächster Woche umso interessanter.
  • Hallo Zerd,
    danke für die bisherigen Beiträge im Workshop. Ich denke das im Hintergrund einige deinen Workshop verfolgen. Lass dich nicht entmutigen und mach bitte weiter. 1 bis 2 Beiträge pro Woche reichen sicherlich aus um nicht in Stress zu geraten und um den Anschluss nicht zu verlieren.:)
    Gruß ro2000
  • Sensationell!!!
    Zuerst hilft er einem bei den Delphi-Hausaufgaben, dann schreibt er einen grandiosen Einstieg in C++ und bald hat er schon seine eigene Programmiersprache entwickelt!
    Ich verehre dich Zerd!

    mfg
  • Hallo Zerd,
    ich habe da ein Problem, wenn ich das nachfolgene Programm von dir kompiliere,

    PHP-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. int main() {
    4. std::string nachName;
    5. cout << "Bitte geben Sie Ihren Nachname ein: ";
    6. cin >> nachName;
    7. cout << "Ihre Eingabe: " << nachName;
    8. return 0;
    9. }


    erhalte ich diese Fehlermeldungen:

    error C2065: 'cout': nichtdeklarierter Bezeichner
    error C2065: 'cin': nichtdeklarierter Bezeichner

    setze ich aber vor cout u. cin das std:: dann läuft es ohne Fehler durch. Woran liegt das?
    Gruß
    ro2000
  • Oh, danke für den Hinweis :)
    Das passiert wenn man die Programme die man in einem Kurs veröffentlicht nicht testet sondern nur as dem Gedächtnis aufschreibt ;)

    du hast recht das in dem fall std:: davor muss, weil genau wie string cin und cout in dem namespace std definiert sind.

    Wenn du nicht jedes mal std:: davor schreiben möchtest musst du unter die #include anweisungen
    using namespace std;

    schreiben. Dadurch definierst du das der compiler automatisch im namespace std nachschaut. Ich habe den fehler im workshop berichtigt.. danke für die Anmerkung :)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Hallo Zerd,
    aller Anfang ist schwer. Ich hänge mal wieder, und zwar habe ich folgendes Problem in der Zeile mit der if Anweisung:

    test1.cpp(15) : error C2059: Syntaxfehler: ')'

    Ich wollte das Programm mit dem Taschenrechner schreiben aber beim kompilieren taucht ein Fehler auf mit dem ich nichts anfangen kann. Habe schon alles mögliche ausprobiert, aber ich komme nicht drauf. Den Rest vom Programm habe ich erst mal als Kommentar markiert. Wenn ich das Semikolon nach der Klammer nicht setze, habe ich eine Fehlermeldung mehr.

    PHP-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. int main() {
    5. int eingabe1, eingabe2, ergebnis;
    6. string Rechenart;
    7. cout << "Bitte geben Sie nacheinander 2 Zahlen ein, die erste: ";
    8. cin >> eingabe1;
    9. cout << "die zweite: ";
    10. cin >> eingabe2;
    11. cout << "Bitte wählen Sie eine Rechenart [+, -, *, /]aus: ";
    12. cin >> Rechenart;
    13. if (Rechenart==+);
    14. {
    15. ergebnis = eingabe1 + eingabe2;
    16. }
    17. /*if(Rechenart==-) {
    18. ergebnis = eingabe1 - eingabe2;
    19. }
    20. if(Rechenart==*) {
    21. ergebnis = eingabe1 * eingabe2;
    22. }
    23. if(Rechenart==/) {
    24. ergebnis = eingabe1 / eingabe2;
    25. }*/
    26. cout << "Das Ergebnis beträgt:" << ergebnis << endl;
    27. return 0;
    28. }
    Alles anzeigen

    Ich hoffe du kannst mir weiterhelfen
    gruß
    ro2000
  • Hey, kein Problem, dafür ist der Thread doch da ;) Und wenigstens seh ich dann das immerhin einer meinen workshop verfolgt ;) Danke dafür schonmal!

    Das Problem ist folgendes:
    C++ sieht die zeichen + - * / als operatoren. d.h. der compiler schaut sich deine syntax an und merkt das etwas nicht stimmt weil er den operator ==+ nicht kennt bzw. ein zweites Argument fehlt. (In dem fall kennt er den operator ==+ nicht weil es ihn einfach nicht gibt.)

    Was du machen möchtest ist ein einzelnes Zeichen überprüfen was du vorher eingegeben hast. Einzelnes Zeichen = Character = char. Ein char wird so definiert:

    PHP-Quellcode

    1. char variable = 'a';

    was du also machen musst um deine Eingabe zu überprüfen ist statt

    PHP-Quellcode

    1. if(Rechenart==+)

    musst du

    PHP-Quellcode

    1. if(Rechenart=='+')

    benutzen.

    Das semikolon was du hinter der if abfrage stehen hast muss ebenfalls weg, da das soviel beduetet wie "keine Anweisung". Durch das semikolon wird die if abfrage quasi ignoriert und die nachfolgenden anweisungen in jedem Fall ausgeführt.

    Ich hoffe die erklärung war ausreichend ;)
    Gruß Zerd
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Danke für deine Hilfe Zerd,
    habe es mit deinen Hinweisen nach einiger Zeit geschafft, dass das Programm so läuft wie ich es mir vorgestellt habe. Mit der Anwendung der char Variablen hatte ich etwas Verständnissprobleme gehabt, aber jetzt habe ich es kappiert. Manchmal steht man einfach auf der Leitung.
    Bei den Übungsaufgaben merkt man erstmal wo der Hund begraben liegt.
    Jetzt gehe ich mal weiter im Text von deinem Workshop, damit ich aufs Laufende komme.
  • Hi
    ich muss auch dringend mal C++ proggen (wegen Studium und so)
    und bräuchte noch das Windows Platform SDK.
    Hab aber keine gültige WGA um das bei MS zu laden.
    Könnte einer vielleicht das Iso mal uppen?

    Ich könnte es dann bei Bedarf auf mehr Usern zur Verfügung stellen
    dank RS Prem. Acc.

    Megamen :cool:

    Ok, da ich das SDK noch nicht laden konnte, benutze ich erst einmal
    Dev-C++ zum programmieren.

    Ich hab mich an dem Taschenrechner versucht, aber es will sich nicht
    kompilieren lassen! ;)
    Vielleicht weiß einer wo das Problem liegt.

    PHP-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. using namespace std;
    4. int main(int argc, char *argv[])
    5. {
    6. int a,b,c;
    7. char operator;
    8. std::count << "Zahl 1 bitte: " <<;
    9. std::cin >> a;
    10. std::count << "Zahl 2 bitte: " <<;
    11. std::cin >> b;
    12. std::count << "Welche Operation? ( + - * / ) " <<;
    13. std::cin >> operator;
    14. if (operator=='+'){c=a+b};
    15. if (operator=='-'){c=a-b};
    16. if (operator=='*'){c=a*b};
    17. if (operator=='/'){c=a/b};
    18. std::cout << "Ergebnis: " << c << std::endl;
    19. return (0);
    20. }
    Alles anzeigen


    An der Zeile char operator gibt er ein Problem aus.



    Noch eine Frage:
    Kann man zur Absicherung gegen falsche Eingaben dann noch so etwas
    hinzufügen?

    PHP-Quellcode

    1. if (operator <> '+' or '-' or '*' or '/')
    2. {std::cout << "Bitte nur zwischen den Operatoren + - * / wählen!";};

    Ich glaube das ist noch nicht sehr schlau umgesetzt, aber ihr versteht bestimmt was ich meine.


    Megamen :cool:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword () aus folgendem Grund: Doppelpost

  • PHP-Quellcode

    1. std::count << "Welche Operation? ( + - * / ) " <<;


    An der Zeile char operator gibt er ein Problem aus.

    Das << am ende der Zeile ist zu viel. Der Compiler erwartet einen weiteren operanden den du ihm nicht lieferst. Außerdem heißt der Befehl cout und nicht count ;)
    Richtig wäre:
    std::cout << "Welche Operation? ( + - * / ) ";


    Noch eine Frage:
    Kann man zur Absicherung gegen falsche Eingaben dann noch so etwas
    hinzufügen?

    PHP-Quellcode

    1. if (operator <> '+' or '-' or '*' or '/')
    2. {std::cout << "Bitte nur zwischen den Operatoren + - * / wählen!";};


    Du könntest in dem fall mit if-else blöcken arbeiten und in dem letzten else Block die Ausgabe machen. Des weiteren darfst du operator nicht als variablen namen nehmen weil das ein reservierter bezeichner ist der in C++ bei Klassen benutzt wird. Dazu komme ich im Workshop bald. Du hast aber auch das Semikolon hinter die geschweifte klammer gesetzt, das muss immer direkt hinter die Anweisung, also so:

    PHP-Quellcode

    1. if (op=='+'){ c=a+b; }
    2. else if (op=='-'){ c=a-b; }
    3. else if (op=='*'){ c=a*b; }
    4. else if (op=='/'){ c=a/b; }
    5. else { std::cout << "Bitte nur zwischen den Operatoren + - * / wählen!"; }

    Das ganze lässt sich mit der switch-case anweisung etwas eleganter lösen, da es da den default-block gibt.

    Du solltest deine Formatierung vielleicht nochmal überdenken, ist etwas unübersichtlich... Aber lass dich nicht entmutigen, bleib am Ball, dann gehts bald besser!

    Also viel spaß weiterhin :)
    Zerd
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Das mit der case anweisung mach ich gleich, erstmal if testen. ;)
    Das mit dem count hab ich übersehen, sry.

    Das Semikolon hinter der geschweiften klammer hab ich auch nicht erkannt.
    Das mit der variable operator war scheinbar unglücklich gewählt. :rolleyes:
    Danke.

    Aber wenn ich einen falschen Operator eingebe wird der alternativ Satz
    ausgegeben, aber dahinter gleich das Ergebnis. Außerdem ist
    das Erbegnis trotzdem eine große Zahl.

    PHP-Quellcode

    1. else { std::cout << "Bitte nur zwischen den Operatoren + - * / wählen!"; };
    2. std::cout << "Ergebnis: " << c << std::endl;


    Bei falscher Eingabe kommt also:
    Bitte nur zwischen den Operatoren + - * / wählen!
    Ergebnis: 2293672



    Megamen :cool:

    PS: ok, hab das mit std::endl; erst jetzt kapiert. Das ganze steht also nicht mehr auf einer Zeile.
  • Bei falscher Eingabe kommt also:
    Bitte nur zwischen den Operatoren + - * / wählen!
    Ergebnis: 2293672


    Oh sorry das hab ich übersehen :)
    Du könntest entweder das Ergebins am anfang mit 0 initialisieren:
    int c = 0;

    Dann steht bei einer falschen Eingabe eben immer:
    Ergebnis = 0

    Oder du machst es zusätzlich so wie du schon am Anfang machen wolltest:

    PHP-Quellcode

    1. if(op == '-' || op == '+' || op == '*' || op == '/')
    2. std::cout << "Ergebnis: " << c << std::endl;
    3. else
    4. std::cout << "Bitte nur zwischen den Operatoren + - * / wählen!";


    Es gibt eigentlich immer verschiedene Lösungen.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • hallo, ich habe auch viel intersse an dem tutorial, das du dankenswerter weise schreibst, nun aber mein pronblem, ich kann das Windows Platform SDK aber genau wie megamen nicht downloaden, ich hoffe das es noch jemand uppen kann THX.

    rebell
  • Ich hab leider nicht eher geschafft danach zu suchen, aber der Download der platform SDK funktioniert ohne Validation:

    h++p://www.microsoft.com/downloads/details.aspx?FamilyID=d8eecd75-1fc4-49e5-bc66-9da2b03d9b92&displayLang=en

    Im moment ist es zeitlich was eng bei mir, aber der workshop wird bald weitergehen!
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Toll !

    du hast mein Weltbild zerstört:

    1. ich dachte es gibt keine netten, hilfsbereiten Menschen mehr.
    2. es gibt nix gutes umsonst.

    ich bin echt sprachlos! so ein gutes tut auf deutsch hab ich schon lange gesucht!!! zeugt schon von echten Kenntnissen!!

    VIELEN DANK für diese Klasse Arbeit! Mach weiter so!

    mfg
    Alex
    [COLOR="LemonChiffon"]Wer das lesen kann, hat den Kontrast zu hoch eingestellt![/color]
  • Danke für die netten Worte. Leider gab es auch negativ feedback (allerdings nur per PM - KA, vielleicht zu feige), war aber nicht der Rede wert.

    Mir ist grad aufgefallen das schon ein Monat vergangen ist seit dem ich am workshop weitergemacht hab. Die Zeit vergeht echt mal schnell wenn man viel zu tun hat... Ich versuche bald weiter zumachen. Ich weiß allerdings auch nicht wirklich ob die leute die am Workshop teilnehmen überhaupt schon alles durch haben, hat schon jemand die letzte Aufgabe gelöst?? :)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • ich hab deine workshop zwar erst vor kurzem entdeckt, aber schon alles durchgelesen ....

    die letzte Aufgabe konnte ich leider nicht lösen, da mir nie jemand was über die Fibunacci Folge erzählt hat (leider nur Mathe Grundkurs). Wikipedia hat mir da auch nicht wirklich weitergeholfen :( .

    aber ich hab mich mal an der rekursiven fakultät hab ich mich mal versucht:

    PHP-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. int fak(int n){
    4. if (n==1)
    5. return 1;
    6. else
    7. return n*fak(n-1);
    8. }
    9. int main(int argc, char *argv[])
    10. {
    11. int x;
    12. std::cout << "bitte eingeben";
    13. std::cin >> x;
    14. std::cout << " n! = " << fak(x) <<std::endl;
    15. system("PAUSE");
    16. return EXIT_SUCCESS;
    17. }
    Alles anzeigen


    außerdem habe ich (glaube ich) einen kleinen Fehler bei dir entdeckt: bei dem Beispiel für Rekursion hast du in der Zeile: std::cout << "sum(5) = " sum(5); die << vor der Funktion vergessen.

    herzlichen Dank für die bisherigen Kapitel!

    ich würde mich riesig freuen, wenn du ein bischen Zeit für weitere Kapitel finden könntest!

    mfg
    Alex
    [COLOR="LemonChiffon"]Wer das lesen kann, hat den Kontrast zu hoch eingestellt![/color]
  • Danke für den Hinweis, ich habe den Fehler berichtigt!

    Falls du interesse hast die letzte Aufgabe von mir zu lösen ein kleiner Hinweis:

    Ich habe ja schon bei der Aufgabenstellung die Regeln der Fibonacci Folge hingeschrieben:
    F(1)=1
    F(2)=1
    F(n)=F(n-1)+F(n-2)

    F ist dann wie man vielleicht vermuten kann die Funktion und das in Klammern dahinter ist der Parameter.

    Diese Fibonacci folge recht nett durch rekursion zu lösen.

    Also prinzipiell musst du in der funktion F den wert N prüfen
    Wenn F(1) -> return 1
    Wenn F(2) -> return 1
    sonst -> return F(n-1) + F(n-2)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Hallo,
    ich mache auch deinen Workshop und finde es super, dass du das machst! Vielen Dank!

    Ich habe jetzt nur leider auch beim Taschenrechner Probleme. Indem ich versucht habe, am Anfang char-Variablen einzufügen, habe ich die Fehler von 87 auf 1 verringert, aber dann sagt er mir, er finde keine Datei namens char/character:

    PHP-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. #include <character>
    4. using namespace std;
    5. int main() {
    6. int eingabe1, eingabe2, ergebnis;
    7. char '+', '-', '*', '/';
    8. string Rechenart;
    9. cout << "Bitte geben sie die erste Zahl ein: ";
    10. cin >> eingabe1;
    11. cout << "Bitte geben sie die zweite Zahl ein: ";
    12. cin >> eingabe2;
    13. cout << "Bitte wählen sie eine Rechenart [+ - * /]: ";
    14. cin >> Rechenart;
    15. if(Rechenart=='+') {
    16. ergebnis = eingabe1 + eingabe2;
    17. }
    18. if(Rechenart=='-') {
    19. ergebnis = eingabe1 - eingabe2;
    20. }
    21. if(Rechenart=='*') {
    22. ergebnis = eingabe1 * eingabe2;
    23. }
    24. if(Rechenart=='/') {
    25. ergebnis = eingabe1 / eingabe2;
    26. }
    27. cout << "Das Ergebnis ist: "; << ergebnis << endl;
    28. return 0;
    29. }
    Alles anzeigen


    Habe da schon so einiges ausprobiert, ich glaube so kommt es der Lösung am nächsten...
    Wär cool, wenn du mir da helfen könntest.

    Mfg
    Black