Programmieren in C++

Als Werkzeuge, um gemeinsam Programmieren in C++ zu lernen sollen der Editor Geany und später die IDE Code::Blocks dienen. Im Menü von Geany finden wir Erstellen und darunter Compile und Build. Eine Datei mit der Endung .cpp wird als C++ Datei erkannt und Geany lädt die Kommandos zum Erstellen automatisch. Man kann unter dem gleichnamigen Menüpunkt sehen, dass der Compiler GCC (g++) geladen wurde.

Mit Compile wird der C++ Code kompiliert und mit Build eine ausführbare Datei erstellt. Danach kann diese mit Execute getestet werden. In Geany ist unter Ansicht das Häkchen bei Meldungsfenster anzeigen zu setzen, damit beim Kompilieren auftretende Fehler unten angezeigt und analysiert werden können.

Linux mit Geany und Code::Blocks kann auf einem USB-Stick installiert und genutzt werden. Wer Interesse am gemeinsamen Lernen und Fragen dazu hat kann unter Kontakt eine Nachricht senden. Gelöste Aufgaben und Programmideen werden auf Wunsch hier veröffentlicht.


Ein erstes Programm

#include <iostream>
using namespace std;

int main() {
    int Zahl;
    int Quadrat;
    cout << "Geben Sie eine Zahl ein: ";
    cin >> Zahl;
    Quadrat = Zahl * Zahl;
    cout << "Die Quadratzahl lautet " << Quadrat << endl;
}

 

Der include-Befehl in der ersten Zeile dient zum Einbinden von externen Bibliotheken, hier iostream für die Ein- und Ausgabe. Die jeweilige Funktionalität wird mit dem Compiler in Standardbibliotheken mitgeliefert.

Mit using namespace std; wird der Standard-Namensraum std in den globalen Namensraum eingebunden. Auf die Bibliothek kann nun ohne diesen Präfix zugegriffen werden (statt std::cout genügt cout).
int main() ist die Hauptfunktion des Programms.

Programmcode kann markiert und kopiert werden.

In den geschweiften Klammern { } stehen die Anweisungen einer Funktion. Die öffnende geschweifte Klammer kann, die schließende Klammer sollte immer in einer eigenen Zeile stehen.

int Zahl; definiert eine Variable des Typs Integer (Ganzzahl). Sie hat noch keinen Wert, im Prinzip wird im Arbeitsspeicher lediglich Platz für einen Integer-Wert namens Zahl reserviert. Das Gleiche gilt für die Variable Quadrat in der nächsten Zeile.

Mit cout << "Geben Sie eine Zahl ein: "; wird der Bildschirmausgabe cout ein Text übergeben. Dabei steht cout links, es folgt der Operator für die Umleitung << und dann der Text, der in Anführungszeichen eingeschlossen werden muss. Dieser wird auf den Bildschirm im Terminal ausgegeben. In diesem Fall ist es die Aufforderung, eine Zahl eizugeben.

In der nächsten Zeile folgt das Eingabeobjekt cin. Die Daten von der Eingabe im Terminal werden mit >> in eine Variable umgeleitet. Auf diese Weise erhält die Variable Zahl den Wert, den der Benutzer mit der Tastatur eingibt. In der nächsten Zeile folgt die Anweisung:
Quadrat = Zahl * Zahl; In diesem Falle ist die Anweisung eine Berechnung. Der Operator * steht für Multiplikation, das Ergebnis wird der Variablen Quadrat zugewiesen.

Die letzte Zeile bringt das Ergebnis mit cout << "Die Quadratzahl lautet " << Quadrat << endl; auf den Bildschirm. Wieder ist der auszugebende Text in Anführungszeichen gesetzt, die Variable Quadrat jedoch nicht, weil sie sonst als Text und nicht als Variable angesehen würde. Die zweite Umleitung mit << endl; erzeugt einen Zeilenabschluss.

Erstellen und Ausführen

Terminal Bild

 

Nachdem wir das Programm in Geany eingegeben*) und als test.cpp im Ordner Dokumente gespeichert haben, muss es in zwei Schritten kompiliert werden. Im Menü Erstellen zunächst auf Compile klicken. Wenn sich keine Fehler eingeschlichen haben, erscheint im Meldungsfenster Kompilierung erfolgreich beendet, danach im Menü Erstellen noch Build ausführen. Haben wir unser Programm als test.cpp gespeichert, sind nun die Dateien test.o und die ausführbare Datei test erstellt worden.

Nun können wir in Geany unter Erstellen mit Klick auf den Eintrag Execute unser Programm starten und es sollte ein Terminal erscheinen. Wir folgen der Aufforderung, eine Zahl einzugeben und erhalten das Ergebnis. *) Code kann oben markiert u. kopiert werden

Das Beispiel stammt aus dem Buch Einstieg in C++ von Arnold Willemer und ist auf der Seite   C++ für Hektiker   ausführlich erklärt.

Aufgaben(1) Gut, wenn es funktioniert hat. Aber wir haben es nicht selbst programmiert. Die erste Aufgabe besteht nun darin, das Programm zu verändern und zu erweitern. Zum Beispiel, indem wir zur Eingabe einer weiteren Variable, (Zahl2) auffordern. Dann können wir zusätzlich zum Ergebnis Quadrat noch die Variable Produkt definieren und auch dieses Ergebnis (Zahl*Zahl2) ausgeben lassen. Wenn wir noch eine weitere Variable (Summe) anlegen, könnten wir zusätzlich Zahl und Zahl2 addieren und das als drittes Ergebnis ausgeben. Und was müssten wir tun, um schließlich Summe vom Produkt abzuziehen und als viertes Ergebnis ausgeben zu können? Wenn das Programm zwei Zahlen anfordert und vier Ergebnisse liefert sind die ersten Aufgaben erfüllt.

Aufgaben(2) Berechnungen mit ganzen Zahlen (int) sind in der Praxis selten. Deshalb stellen wir unser erweitertes Programm nun auf Fließkommazahlen (double) um. Beginnend bei int Eingabe ändern wir alle int Definationen in double. Der restliche Code bleibt unverändert. Wir speichern das Programm als test-d.cpp und können unsere Berechnungen nach Compile und Build mit der Eingabe von Fließkommazahlen erneut testen, wobei ein Punkt als Dezimaltrenner eingegeben werden muss. Das Programm funktioniert auch, wenn ganze Zahlen eingegeben werden, sie werden als double interpretiert. Da int main() die Hauptfunktion und somit keine Variablen-Defination ist, darf dieses int nicht geändert werden. Es definiert den Rückgabewert 0 der Funktion, wenn kein Fehler auftritt, andere Werte führen zu Fehlermeldungen. Wenn wir das zweite Programm als test-d.cpp gespeichert und kompiliert haben und es nach Eingabe von zwei Zahlen die vier Ergebnisse mit entspechenden Kommastellen liefert ist auch die zweite Gruppe von Aufgaben erfüllt.


Unser zweites Programm

#include <iostream>
#include <string>
using namespace std;
int main() {
  double DM;
  double UM;
  double KF;
  const double PI {3.1415926535897932};
  string ME;
  string ME2;
  cout << "Bitte den Kreisdurchmesser eingeben: ";
  cin >> DM;
  cout << "Maßeinheit (mm, cm, m) eingeben: ";
  cin >> ME;
  ME2 = ME+"²";
  if (DM <= 0) {
    cout << "Fehler: falsche Eingabe!" << endl;
    return 0;
    }
  UM = PI * DM;
  KF = (PI/4 * (DM*DM));
  cout << "Kreis-Umfang: " << UM << " " << ME << endl;
  cout << "Kreis-Fläche: " << KF << " " << ME2 << endl;
}

 

In diesem kleinen Programm wollen wir Kreisberechnungen ausführen. Auf den include-Befehl für die Ein- und Ausgabe (iostream) folgt in der zweiten Zeile das Einbinden der Bibliothek für Strings. Bisher haben wir die Datentypen int für Ganzzahl und double für Fließkommazahl genutzt. Mit string kommt nun der Datentyp für Zeichenketten dazu. Einzelne Zeichen haben den Datentyp char und die Bibliothek string enthält die Defination von Zeichenketten aus einer Mehrzahl von char.

Mit double DM wird die Variable DM für den Durchmesser definiert, darauf folgen UM und KF für Umfang und Kreisfläche. Mit const double PI definieren wir einen double-Wert als Konstante. Es folgen die Zeichenketten (string) für die Basis-Maßeinheit ME und die Flächen-Maßeinheit ME2.

Nach der Aufforderung cout << Bitte den Kreisdurchmesser eingeben wird die Eingabe der Variable DM zugewiesen. Der Variablen ME für Maßeinheit wird im nächsten Schritt die eingegebene Zeichenkette zugewiesen, um daraus mit ME2 = ME+"²" die passenden Zeichen für den Flächeninhalt abzuleiten. Es folgt eine Prüfung der Durchmesser-Eingabe mit if, erkennt C++ keinen double-Wert gibt es 0 zurück und die Fehlermeldung erscheint, z.B. wenn man Buchstaben statt Zahlen eingibt.

Es folgen die Berechnungen, mit UM = PI * DM wird der Umfang und mit (PI/4 * (DM*DM)) die Kreisfläche berechnet. Gängiger ist die Kreisflächen-Formel A = r² * PI, aber wir verwenden die Formel mit dem Durchmesser. Die Ausgabe der Ergebnisse mit cout steht in den letzten beiden Zeilen. Dort werden zunächst die errechneten double-Werte (UM, KF), dann eine Leerstelle (" ") und als drittes die Maßeinheit (ME, ME2) nacheinander der Ausgabe zugeleitet.

Aufgaben(3)Berechnungen von Umfang und Kreisfläche sind schon sehr praxisnah. Die Erweiterung unseres dritten Programms besteht im Hinzufügen einer weiteren Variable ZH, das H steht für Höhe, was aus einem Kreis einen Zylinder macht. Wir stellen uns vor, der Durchmesser wäre der eines Topfes und wir wollen wissen, wieviel Liter da hineinpassen. Also müssen wir eine Variable ZH definieren und diese noch vor der Maßeinheit abfragen. Für die Berechnung des Rauminhaltes benötigen wir zudem die Variable ZI für Zylinderinhalt. Dann können wir die Formel zur Berechnung hinzufügen und schließlich noch eine Zeile für das Ergebnis. Und da merken wir, dass wir auch noch die String-Variable ME3 brauchen, um das Ergebnis richtig ausgeben zu können. Wer zum Schluss auch noch das Ergebnis in Litern ausgeben will, bekommt ein Problem. Je nach eingegebener Maßeinheit (Reagenzglas:mm, Topf:cm, Pool:m) wird eine andere Formel zur Umrechnung benötigt. Das kann über eine Verzweigung mit if gelöst werden. Mehr dazu auf dieser ⇒⇒ Webseite.    Als Empfehlung: if (ME == "mm") {Berechnung;} und dann zweimal else if für cm und m verwenden. Es steht jedem frei noch einen else Zweig für den Fall einzufügen, dass irgendeine andere Maßeinheit eingegeben wurde. Sind diese Aufgaben alle gelöst, haben wir eine gute Grundlage zum Weitermachen.


Drittes Programm: Schleife mit while

#include <iostream>
using namespace std;

int main() {

int JHR;
int SPM;
int SPJ;
int SPG;

cout << "Sparen (oder Einsparen) pro Monat: " << endl;
cin >> SPM;
cout << "Ergebnis anzeigen für, Anzahl Jahre: " << endl;
cin >> JHR;

SPJ = (SPM*12);

    int i = 1; 
    // while loop from 1 to Anz. Jahre
    while (i <= JHR) {
        SPG = (i * SPJ);
        cout << i << ". Jahr, Betrag: " << SPG << endl;
        ++i;
    }
    
    return 0;
}

 

In diesem Programm geht es um Schleifen, das sind Anweisungen, die bei erfüllten Bedingungen wiederholt werden. Am Beispiel einer while Schleife soll das Prinzip erläutert werden. Bei dieser Schleife wird die Anweisung solange wiederholt, wie die im Schleifenkopf angegebene Bedingung erfüllt ist. Als Beispiel (mit praktischem Nutzen) stellen wir uns vor, wir wollen Sparen, oder etwas Einsparen (z.B.Rauchen abgewöhnen). Als Motivation soll die Berechnung der (ein)gesparten Summe im Verlaufe von x Jahren dienen.

Mit int JHR wird die Variable JHR für Anzahl Jahre definiert, darauf folgen SPM für (ein)gesparten Betrag im Monat, SPJ für den Betrag im Jahr und schließlich SPG für den Gesamtbetrag. Mit
cout << "Sparen (oder Einsparen) pro Monat: " <<endl;
fordern wir zur Eingabe eines monatlichen Betrages auf. Der erfasste Wert wird mit cin >> SPM der Variablen SPM zugewiesen. Dann folgt mit
cout << "Ergebnis anzeigen für, Anzahl Jahre: " <<endl;
die zweite Eingabeaufforderung und dieser Wert wird mit cin >> JHR der Variablen JHR zugewiesen.

Die erste Berechnung, der Jahresbetrag wird mit SPJ = (SPM*12); ermittelt.
Mit int i = 1; wird die Zählervariable i definiert und als Startwert 1 festgelegt. Das i ist als Zählervariable bei Schleifen quasi ein Standard.
Die Zeile while (i <= JHR) { ist die Bedingung: Führe die folgenden Anweisungen aus, solange i kleiner oder gleich der Variablen JHR ist.

Die Berechnung SPG = (i * SPJ); wird ausgeführt und das Ergebnis mit cout << i << ". Jahr, Betrag: " << SPG << endl; ausgegeben. Dann folgt die Erhöhung der Zählervariablen mit dem einfachen ++i; was eine verkürzte Schreibweise von i = i + 1 darstellt. Wird als JHR die Zahl 6 eingegeben, erfolgt die Berechnung und die Ausgabe solange, wie i kleiner oder gleich 6 ist.

Terminal Bild

Wir speichern das Programm in Geany als sparen.cpp, führen wieder die zwei Kompilierungsschritte aus, sollten dann nach Execute Werte eingeben können und ein den Werten entsprechendes Ergebnis wie im Bild links erhalten.

Aufgaben(4) Wenn das Programm sparen funktioniert, sollen Aufgaben mit einer while Schleife gelöst werden. Ein Erweitern des Programms ist hier nicht möglich, aber es gibt zahlreiche Anwendungsfälle, bei denen mit einer while-Schleife ein sinnvolles kleines Programm erstellt werden kann. Pflanzen wir einen Baum, er wächst im Jahr x.x m in die Höhe. Wie hoch ist er in 5, 10, 15 usw. Jahren? Es gilt einiges zu überdenken, um eine Schleife zu bauen, die uns diese Ergebnisse auflistet.

Oder: Ein Bauer hat einen bestimmten Vorrat eines Futtermittels (in dt, 1dt=100kg). Wie lange reicht der Vorrat, wenn er xx dt davon täglich für seine Tiere braucht? Ist hier das Erstellen einer do while Schleife angebracht? Um das zu entscheiden ist empfehlenswert, sich über die Grundlagen der verschiedenen Schleifen und Kontrollanweisungen auf der ⇒⇒ cpluplus Webseite zu informieren. Die Aufgaben in diesem Bereich sind erfüllt, wenn mindestens zwei weitere, funktionierende Schleifen entwickelt worden sind.


Fortsetzung folgt