Softwaretechnologie I C++ Erste Sitzung

14.10.2016 12:31 Uhr

Aufgaben

Aufgaben finden Sie hier.

Raumwechsel

Bitte erinnern: Dienstag 25. Oktober und Dienstag 8. November in WISO 210.

Klips 1 und 2

= alte und neue Studienordnung. Man muss in Klips registriert sein. Besonders wichtig für Klips 2 Studierende.

Wenn nicht registriert:  Dritte Phase anwenden! 17. Oktober bis 10. November
Einteilung der Seminargruppen

Die Veranstaltung ist im WiSe 16/17 als ein gesamtes Seminar und zwei Übungsgruppen organisiert.

Das Seminar findet im Hörsaal Frauenklinik Dienstags von 10:00 bis 11:30 statt.

Die Übungsgruppen:

  • Donnerstag 14:00-15:30 Philosophikum S91 (großer Raum)
  • Donnerstag 16:00-17:30 RRZK Kursraum 3 -1.01 UG (kleiner Raum)

Hausarbeiten senden Sie uns zur Korrektur bitte über WoMS.

Literatur

Leider gibt es kein Lehrbuch, das für unsere Zwecke ideal wäre – in den Geisteswissenschaften stehen nun mal Texte im Vordergrund und in den Medien grosse Datenmengen, die effektiv gehandhabt werden sollen. Auch wenn bei den folgenden Einzelbeschreibungen ein Buch dem gewählten Vorgehen als „ähnlich“ bezeichnet wird, ist es daher nicht mit der von mir verwendeten Abfolge der Lehreinheiten identisch.

Es ist dennoch sehr zu empfehlen, dass Sie sich eines der Lehrbücher beschaffen – nach den mündlichen Bemerkungen in der Veranstaltung: Nicht, ohne es vorher gründlich angesehen zu haben!

Hinweise auf neuer Lehrbücher

Ohne sie „getestet“ zu haben, machen die folgenden Lehrbücher einen recht guten Eindruck auf mich.

  • Ulrich Breymann: Der C++ Programmierer, Hanser: München, 2011. (E 49,90)
  • Ulla Kirch und Peter Prinz: C++ Lernen und professionell anwenden, mitp: Heidelberg etc., 2012. (E 44,95)
  • Arnold Willemer: Einstieg in C++, Galileo Computing: Bonn, 2012. (E 24,90)

Der Weg zum Compiler

In dem von uns während des Semesters benutzten Übungsraum steht uns der QT Creator als Entwicklungsumgebung zur Verfügung.
Installations DVDs dazu werden ggf. während der ersten Praktikumsstunde verteilt, prinzipiell kann man den Compiler aber auch aus dem Internet runterladen. Herr Wira-Alam wird in dieser Stunde Beratung zur Installation anbieten. In späteren Veranstaltungen wird erwartet, dass Sie wissen, wie man Software installiert … also versuchen Sie das als Beratung, nicht als Dienstleistung zu sehen.

Dokumentation zum System ist unter http://qt-project.org/ verfügbar.

Streng genommen können Sie auch jeden anderen Compiler verwenden: Allerdings werden wir im Laufe des Sommersemesters Aufgabenstellungen bearbeiten, die die GUI Komponenten der integrierten Entwicklungsumgebung voraussetzen. Mit anderen Worten: Bis dahin können Sie auch jeden anderen C++ Compiler verwenden, insbesonders auch solche Compiler, die mit C++ Lehrbüchern meist mitgeliefert werden.

Online Resourcen

Das im WWW erhältliche Material zu C++ ist überwiegend in Englisch und meist entweder sehr fragmentarisch oder nicht wirklich an den Anfänger gewandt.
Trotzdem: Hier stehen natürlich kostenlose Lehrbehelfe bereit. Ein paar Hinweise:

  • Einführungen
    • Vorzüglich ist diese Quelle … allerdings überwiegend wohl auf einem Niveau, das den Anfänger eher verwirrt.
  • C++ als Sprache bei Vorliegen von Kenntnissen in einer anderen Programmiersprache:
    • Bei vorliegenden C, Perl oder Java Kenntnissen. Ganz gut geeignet als Nachschlagewerk.
  • Sonstiges
    • Das folgende Material habe ich NICHT durchgesehen; wenig davon dürfte für den absoluten Anfang sinnvoll sein. Insbesonders gegen Ende des Semesters, wenn wir über Ihre Projekte sprechen, wäre es sinnvoll, die Dinge hier durchzusehen.
  • In späteren Stadien der Veranstaltung gehen wir auch noch auch weitere WWW Ressourcen ein.

Beispiel 1

#include <iostream>
using namespace std;

int main()
{
cout << "Willkommen beim C++ Kurs!" << endl;

return 0;
}

Beispiel 1: Erläuterungen I

Die Headerdatei <iostream.h> wird durch die Präprozessordirektive #include in das Programm eingeschlossen.

Sie sorgt dafür, daß vordefinierte Werkzeuge zur Verfügung stehen. using namespace std; sorgt dafür, dass Sie auch ein Programm compilieren können, das dem internationalen Standard von C++ folgt. (Standardmässig versuchen die Microsoftcompiler Sie an ein Verhalten zu gewöhnen, das es Ihnen unmöglich macht, je wieder ein Produkt eines anderen Herstellers einzusetzen.)

cout „Leitet Zeichen an den Bildschirm weiter“.

endl „Repräsentiert eine neue Zeile“.

Beispiel 1: Erläuterungen II

Unsere Datei enthält eine Funktion.
Diese heißt main.

Als Funktion ist sie an dem Klammerpaar (()) erkennbar.

Sie liefert eine ganze Zahl (int) an das aufrufende Programm – In diesem Falle Windows – zurück.

Sie hat einen Rumpf, der durch ein Paar geschweifter Klammern { } umgeben ist.

Beispiel 1: Erläuterungen III

Der Rumpf der Funktion besteht aus Anweisungen oder statements.
Dies sind Sequenzen aus den Bestandteilen der Kommandosprache, die jeweils durch ein Semicolon abgeschlossen werden. das Semicolon darf nie fehlen. Unsere Funktion besteht also aus genau einer Anweisung.

Diese Anweisung besteht aus:

  • Vordefinierten Objekten (cout und endl) und
  • einer Konstante des Typs „Zeichenkette“ (an den Anführungszeichen erkennbar) – „Willkommen beim C++ Kurs!“.

Diese Bestandteile sind durch den Operator << miteinander verbunden, der den dahinter stehenden Teil der Anweisung auf den davor stehenden überträgt.


(Wir ignorieren bis auf weiteres die Zeile return 0;,
schreiben Sie aber vorerst stets vor dem Ende der „main()“ Funktion um uns eine
Compilerwarnung zu ersparen. Später werden wir schlampig und ignorieren die Warnung, da das Statement nicht unbedingt notwendig ist … erstmal sind wir aber tugendhaft.)

Hinweise zum kompilieren

Verwendung des Compilers Qt Creator

„Kochbuch“ zum Ausführen eines Programmes aus den vorbereiteten Beispielen.

  1. Datei ==> Neu ==> Projekt
  2. „Anderes Projekt“ wählen (dritter Eintrag von oben) ==> „Qt Konsolenanwendung“ (oberste Zeile).
    1. Bei „Name“ einen frei gewählten Namen eingeben.
    2. Bei „Erzeugen in“: merken, wo das Ganze gespeichert wird. (Ggf. Directory Ihrer Wahl wählen.)
    3. Nächster Screen: Ziel „Desktop“ wählen.
  3. Aus der WWW Seite „Speichern unter“ aufrufen.
    1. Beispielsdatei in das im vorigen Schritt erzeugte directory speichern UND main.cpp ÜBERSCHREIBEN!
    2. Meldung „Datei main.cpp wurde überschrieben …“ bestätigen.
  4. In der linken Toolzeile das dritte Symbol von unten (grünes Dreieck) aktivieren.

Beispiel 2

#include <iostream>
using namespace std;

int main()
{
char derBenutzer [80];

cout << "Wie heißen Sie?" << endl;
cin >> derBenutzer;
cout << "Willkommen beim C++ Kurs " << derBenutzer << endl;

return 0;
}

Beispiel 2: Erläuterungen I

Um Information zu verarbeiten, die sich ändert – zum Unterschied von den Konstanten – verwenden wir Variablen.

Sie haben jeweils einen Namen – derBenutzer -, der am besten nur aus Buchstaben des lateinischen Grundalphabets gebildet werden sollte – i.e.: Keine Umlaute! – und möglichst selbsterklärend sein sollte. Ziffern sind erlaubt; das erste Zeichen des Namens muß jedoch ein Buchstabe sein. Der Unterschied zwischen Groß- und Kleinschreibung ist signifikant. „derBenutzer“ ist nicht dasselbe wie „Derbenutzer“!.

Jede Variable hat einen Datentyp; in unserem Beispiel char – „diese Variable soll characters, d.h. Zeichen“, verwalten.

Der Zusatz [80] wird in der nächsten Stunde erläutert.

Jede Variable muß durch eine Anweisung der Form „Datentypbezeichnung Variablenname“ erzeugt oder definiert werden, bevor sie verwendet werden kann.

Beispiel 2: Erläuterungen II

Das Objekt cin repräsentiert die über die Tastatur eingegebenen Zeichen;

der Operator >> transferiert diese Zeichen aus dem Objekt in die Variable.

Beispiel 3

#include <iostream>
using namespace std;

int main()
{
int zahl1, zahl2, resultat;

cout << "Bitte geben Sie eine Zahl ein: ";
cin >> zahl1;
cout << "Bitte geben Sie noch eine Zahl ein: ";
cin >> zahl2;

resultat = zahl1 + zahl2;

cout << "Das Ergebnis lautet: " << resultat << endl;

return 0;
}

Beispiel 3: Erläuterungen I

Mehrere Variable desselben Datentyps können als durch Komma getrennte Liste definiert werden.

Der Datentyp int steht für eine ganze Zahl, was für den Rechner etwas völlig anderes ist, als eine Bruchzahl, d.h., eine Zahl mit Kommastellen.

Beispiel 3: Erläuterungen II

Der wichtigste Operator von C++ ist der Zuweisungsoperator=. Er bedeutet nicht das zwei Teile eines Ausdrucks gleich sein sollen, sondern das das Ergebnis der rechts davon definierten Berechnung in der links angegebenen Variablen gespeichert werden soll.

Die mathematischen Operatoren +* und / entsprechen den Grundrechnungsarten.

Beispiel 4

#include <iostream>
using namespace std;

int main()
{
int zahl1, zahl2, resultat;
char aktion;

cout << "Bitte geben Sie eine Zahl ein: ";
cin >> zahl1;
cout << "Bitte geben Sie noch eine Zahl ein: ";
cin >> zahl2;
cout << "Was soll damit geschehen?" << endl
     << "(+ = Addieren)" << endl
     << "(- = Subtrahieren)" <<endl;
cin >> aktion;

if (aktion=='+') resultat=zahl1+zahl2;
else resultat=zahl1-zahl2;

cout << "Das Ergebnis lautet: " << resultat << endl;

return 0;
}

Beispiel 4: Erläuterungen I

 

Ein wesentliches Mittel für die Steuerung des Ablaufs eines Programmes ist die bedingte Ausführung von Anweisungen oder Gruppen von solchen. Sie wird durch die if Anweisung angeordnet, die folgende Grundform hat:
if (Bedingung) Anweisung 1;
else Anweisung 2;

Beispiel 4: Erläuterungen II

In einfacher Form (wir werden später komplexere kennenlernen) schreibt eine Bedingung eine durch einen Vergleichsoperator ausgedrückte Beziehung zwischen zwei Variablen oder
Konstanten vor, die getestet wird.

Die Vergleichsoperatoren sind:

  • a == b
    • Ist a genau gleich mit b?
    • Zwei Ist-gleich-Zeichen!
  • a != b
    • Ist a nicht gleich mit b?
  • a < b
    • Ist a kleiner als b?
  • a <= b
    • Ist a kleiner als oder gleich b?
  • a > b
    • Ist a größer als b?
  • a >= b
    • Ist a größer als oder gleich b?

Beispiel 4: Erläuterungen III

Konstanten, die einzelnen Zeichen – im Unterschied zu Zeichenketten – entsprechen, erkennen wir am einfachen Anführungszeichen oder ‚Hochkomma‘.

Beispiel 5

#include <iostream>

using namespace std;

int main()
{
int zahl1, zahl2, resultat;
char aktion;

cout << "Bitte geben Sie eine Zahl ein: ";
cin >> zahl1;
cout << "Bitte geben Sie noch eine Zahl ein: ";
cin >> zahl2;
cout << "Was soll damit geschehen?\n(+ = Addieren)\n(- = Subtrahieren)\n";
cin >> aktion;


if (aktion=='+') resultat=zahl1+zahl2;
else
     if (aktion=='-') resultat=zahl1-zahl2;
     else cout << "Was meinen Sie mit '" << aktion << "'?" << endl;

cout << "Das Ergebnis lautet: " << resultat << endl;

return 0;
}

Beispiel 5: Erläuterungen I

Bedingungen können, wie gesagt, komplexer aufgebaut sein: Eine wichtige Erweiterung der Grundform ist, daß jede der bedingten Anweisungen wieder eine Bedingung sein kann, in unserem Beispiel also:

if (Bedingung 1) Anweisung 1;

else if (Bedingung 2) Anweisung 2;

else Anweisung 3;

Derartige geschachtelte Bedingungen werden sehr schnell sehr unübersichtlich – es wird also dringend empfohlen, die geplante Ausführung durch gut lesbare Einrückung hervorzuheben.

Beispiel 6

#include <iostream>

using namespace std;

int main()
{
int zahl1, zahl2, resultat=0;
char aktion;

cout << "Bitte geben Sie eine Zahl ein: ";
cin >> zahl1;
cout << "Bitte geben Sie noch eine Zahl ein: ";
cin >> zahl2;
cout << "Was soll damit geschehen?" << endl
     << "(+ = Addieren)" << endl
     << "(- = Subtrahieren)" <<endl;
cin >> aktion;


if (aktion=='+') resultat=zahl1+zahl2;
else
     if (aktion=='-') resultat=zahl1-zahl2;
     else cout << "Was meinen Sie mit '" << aktion << "'?" << endl;

cout << "Das Ergebnis lautet: " << resultat << endl;

return 0;
}

Beispiel 6: Erläuterungen I

Variablen kann ein Anfangswert zugewiesen werden. Das führt dazu, daß man sich darauf „verlassen“ kann, daß eine Variable einen bestimmten Wert hat – in unserem Beispiel etwa von Interesse, wen der Benutzer ein nicht definiertes Zeichen als Operator eingibt.

Beispiel 7

#include <iostream>

using namespace std;

int main()
{
int zahl1, zahl2, resultat=0, aktiv;
char aktion;


aktiv=1;
while (aktiv==1)
   {
   cout << "Bitte geben Sie eine Zahl ein: ";
   cin >> zahl1;
   cout << "Bitte geben Sie noch eine Zahl ein: ";
   cin >> zahl2;
   cout << "Was soll damit geschehen?" << endl
        << "(+ = Addieren)" << endl
        << "(- = Subtrahieren)" <<endl;
   cin >> aktion;


   if (aktion=='+') resultat=zahl1+zahl2;
   else
        if (aktion=='-') resultat=zahl1-zahl2;
        else cout << "Was meinen Sie mit '" << aktion << "'?" << endl;

   cout << "Das Ergebnis lautet: " << resultat << endl;

   if (zahl1 == 0) aktiv=0;
   }

return 0;
}

Beispiel 7: Erläuterungen I

Ein ganz wesentliches Element für die Kontrolle von Programmen ist schließlich die Anordnung der mehrfachen Ausführung von Anweisungen oder Anweisungsgruppen.

Dies kann z.B. durch die while Anweisung geschehen.
Diese hat einen Rumpf, der in der Praxis fast immer, wie bei einer Funktion aus mehreren, durch geschweifte Klammern zusammengefassten Einzelanweisungen besteht.

Rein syntaktisch hat sie aber einfach die Grundform:

while (Bedingung) Anweisung;

d.h, Ihre Syntax gibt ein „mehrfach durchzuführendes „if“ wieder.

Zum Verständnis erweitern wir unsere Definition einer Anweisung:

Unsere bisherigen Anweisungen – eine Folge von Bestandteilen, die durch ein Semicolon abgeschlossen wird – sind einfache Anweisungen.

Werden mehrere Anweisungen durch ein paar geschweifter Klammern zu einem Block zusammengefaßt, so ist dieser Block eine zusammengesetzte Anweisung.

Beispiel 7: Erläuterungen II

Konstruktionen, die zur mehrfachen Abarbeitung eines Programmteils führen, heißen ganz allgemein „Schleifen“. While-Schleifen, wie alle Arten von Schleifen bestehen aus drei Teilen:

Der Initialisierung eines Anfangszustandes,

einer regelmässig überprüften Endbedingung und

einer Anweisung, die in der Lage ist, diese

Endbedingung herbeizuführen. Fehlt diese, endet das Programm nie!

Die Variable, die diese drei Teile miteiander verbindet – „aktiv“ in unserem Beispiel – heißt Kontrollvariable der Schleife.

Beispiel 8

#include <iostream>

using namespace std;

int main()
{
int zahl1, zahl2, resultat=0;
char aktion;


for (int i=0; i < 5; i++)
   {
   cout << "Bitte geben Sie eine Zahl ein: ";
   cin >> zahl1;
   cout << "Bitte geben Sie noch eine Zahl ein: ";
   cin >> zahl2;
   cout << "Was soll damit geschehen?" << endl
        << "(+ = Addieren)" << endl
        << "(- = Subtrahieren)" <<endl;
   cin >> aktion;


   if (aktion=='+') resultat=zahl1+zahl2;
   else
        if (aktion=='-') resultat=zahl1-zahl2;
        else cout << "Was meinen Sie mit '" << aktion << "'?" << endl;

   cout << "Das Ergebnis lautet: " << resultat << endl;
   }

return 0;
}

Beispiel 8: Erläuterungen I

Die for-Schleife faßt diese drei Komponenten in eine Anweisung zusammen, die innerhalb eines Klammerpaares durch zweimaliges Semicolon getrennt sind: Die erste Teilanweisung initialisiert (und definiert) die Kontrollvariable i, die zweite definiert die
Endbedingung und die dritte verändert die Kontrollvariable, sodaß schließlich die
Endbedingung herbeigeführt wird.

Faustregel: Verwende „for“, wenn die Anzahl der gewünschten Ausführungen bekannt ist, „while“ wenn dies nicht der Fall ist.

Beispiel 9

#include <iostream>

using namespace std;

int main()
{
int zahl1, zahl2, resultat=0, aktiv;
char aktion;


aktiv=1;
while (aktiv==1)
   {
   cout << "Bitte geben Sie eine Zahl ein: ";
   cin >> zahl1;
   cout << "Bitte geben Sie noch eine Zahl ein: ";
   cin >> zahl2;
   cout << "Was soll damit geschehen?" << endl << "(+-*/)" << endl;
   cin >> aktion;

   switch(aktion)
      {
   case '+':
      resultat=zahl1 + zahl2;
      break;
   case '-':
      resultat=zahl1 - zahl2;
      break;
   case '*':
      resultat=zahl1 * zahl2;
      break;
   case '/':
      resultat=zahl1 / zahl2;
      break;
   default:
      cout << "Was meinen Sie mit '" << aktion << endl << "'?" << endl;
      }

   cout << "Das Ergebnis lautet: " << resultat << endl;

   if (zahl1 == 0) aktiv=0;
   }

return 0;
}

Beispiel 9: Erläuterungen I

Ein letztes sehr wichtiges Mittel für die Strukturierung von Programmen für heute ist schließlich die switch Anweisung.

Ihr Rumpf ist in mehrere Teile gegleidert, die jeweils durch eine

case Anweisung beginnen und durch eine
break Anweisung beendet werden.

Sie wählt jenen Case-Block zur Ausführung aus, bei dem der Wert der nach dem Kommandowort case angegebenen Konstante – eine ganze Zahl oder ein einzelnes Zeichen – mit dem Wert der
Kontrollvariable in der switch-Anweisungübereinstimmt.

Aufgaben

Abgeben Sie Ihre Lösungen zu den folgenden Aufgaben bitte bis vor Beginn der nächsten Stunde in WoMS.

I.

Korrigieren Sie die Fehler in den folgenden C++ Programmen.

#include <iostream>
using namespace std;

int main()
{
cout << "Wie heißen Sie? << endl;
}
#include <iostream>

int main()
{
int i

for (i=0;i<10;i++);
{
cout << "Nächste Zahl:" << i endl;
}

Sinngemäß sind das alles Aufgaben zum Tag 1 – nachdem wir den Stoff aber bisher noch nie in der ersten Stunde bewältigt haben, bezieht sich folgendes Beispiel erst auf die Aufgabenstellung der nächsten Stunde!

II.

Mittelalterliche Währungen wurden meist in „Pfund“, Shilling“ und „Pfennig“ angegeben.

Dabei gilt: 1 Pfund = 20 Shilling = 240 Pfennig.

  1. Schreiben Sie ein Programm, das den Benutzer nach zwei derartigen Beträgen
    frägt, also jeweils nach „Pfund“, Shilling“ und „Pfennig“ und die
    Summe in Pfennigen ausgibt.
  2. Modifizieren Sie dieses Programm so, daß es den Betrag wieder in
    „Pfund“, Shilling“ und „Pfennig“ ausgibt.

Hinweis: C++ kennt einen Modulo-Operator „%“, der den Rest einer Zahl nach
einer Division ergibt.

10 % 10 ergibt 0.

11 % 10 ergibt 1.

12 % 10 ergibt 2.

etc.

III.

Schreiben Sie ein Programm, das das kleine Einmaleins am Bildschirm ausgibt.

Hinweis: Der Rumpf von for-Schleifen kann alle besprochenen Anweisungen enthalten.

Bewertung

Die als Semesterarbeit gestellte Aufgabe besteht aus zwei Aufgabenstellungen, von denen die erste eine Minimallösung definiert, die zweite erweitert diese grundlegende Aufgabenstellung ein wenig.

  • Basisbewertung
    • Genügend (4): Voll funktionsfähige Lösung der Aufgabenstellung I.
    • Befriedigend (3): Funktionsfähige Lösung der Aufgabenstellung II. (Kleine Fehler, die die Ausführung im Rahmen der Testbeispiele nicht beeinträchtigen, werden akzeptiert.)
    • Gut (2): Voll funktionsfähige, d.h. völlig fehlerfreie Lösung von Aufgabenstellung II.
    • Sehr Gut (1): Voll funktionsfähige Lösung von Aufgabenstellung II, mit erkennbaren Anstrengungen zur Kontrolle von Benutzerfehlern u.ä.
  • Berücksichtigung der Hausarbeiten
    • Weniger als zwei Drittel der Arbeiten wurden abgeliefert: Basisnote plus 1.(I.e.: „Gut“ wird zu „befriedigend“.)
    • Weniger als ein Drittel der Arbeiten wurde abgeliefert: Basisnote plus 2.(I.e.: „Gut“ wird zu „genügend“.)

Klips 1 und 2

  • Klips 1: 2 Prüfungen
    • Hausarbeit für C++ 1 (WiSe)
    • Hausarbeit für C++ 2 (SoSe)
  • Klips 2: Modulprüfung, 2 Teilen
    • Hausarbeit für C++ 1 (WiSe)
    • Hausarbeit für C++ 2 (SoSe)