Skip to content

CPP01 – Einführung in die Programmierung mit C/C++

cpp01

Das Modul CPP01 sollte nicht unterschätzt werden. Der Aufwand hängt enorm von den vorhandenen oder den nicht vorhanden Vorkenntnissen ab. CPP01 gehört neben Java und FMI zu den schwersten Klausuren im Grundstudium. Seit Ende 2010 hat die AKAD die Unterlagen ausgetauscht. Statt 5x AKAD Heften und dem Buch “C++ für Dummies” gibt es nur noch ein AKAD Heft und das Buch “Einstieg in C++” von Galileo Computing. Ich fand das Buch recht gut, auch wenn es nicht fehlerfrei ist (z.B. steht auf der Seite 127 folgende Definition für mehrdimensionale Matrizen: “double matrix [MAXSPALTEN, MAXZEILEN];”, das ist falsch! Richtig wäre: “double matrix [MAXZEILEN, MAXSPALTEN];”.

Seminar:

Ich würde niemandem ohne Programmierkenntnisse empfehlen, das Seminar ohne Vorbereitung zu besuchen. Aufgrund des Umfangs prügelt man die Themen drei Tage lang straff durch und wer noch nie programmiert hat, wird schnell auf der Strecke bleiben. Zudem wäre die Vorbereitung von zwei Wochen bis zur Klausur ziemlich knapp. Sinnvollerweise sollte man auch sein Notebook mitbringen, darauf schon eine Entwicklungsumgebung installiert haben und damit zumindest grundlegend umgehen können.

Ich hatte mein Seminar bei Frau Schröder in Pinneberg, Sie ist sehr nett, aber stellenweise etwas hektisch. Da der Dozent normalerweise der Klausursteller ist, wurden die Themen eingegrenzt (wirklich viel ist aber nicht rausgefallen) und es gab Tipps zur Klausurvorbereitung.

Grundlagen wie Variablen, Arrays, Schleifen, Inkrementierung (beliebt: Unterschied ++a und a++) und Casting werden zwar angesprochen, aber recht schnell durchgearbeitet. Mindestens diese sollte man zum Seminar beherrschen. Am zweiten und dritten Tag geht es um Pointer und Objektorientierung.

Schwerpunkte bei uns waren: Pointerarithmetik, string-Funktionen, int/float Arrays, char-Arrays (natürlich inkl. Pointer), Operatorüberladung, heap & stack, Objektorientierung (also Klassen, Unterklassen, Vererbung, Vektoren, Assoziation 1:1 und 1:n, Konstruktor / Destruktor und weiterhin Pointer bis zum Erbrechen). Bei Frau Schröder sollen grundsätzlich alle Klassen als “private” deklariert werden, deshalb sollte man in der Lage sein, entsprechende Methoden zu kodieren. Da wir uns ausreichend dämlich angestellt haben, haben wir es nicht geschafft, die Polymorphie vollständig durchzuarbeiten. Diese ist dadurch als Klausurschwerpunkt entfallen. Wie man sieht, trotzdem jede Menge Lernstoff.

Vollständig gefehlt haben nur Strukturen und der “hübsche” goto – Sprung! *g

Die Seminarzeit wird aufgrund des Stoffumfangs vollständig ausgereizt, die Pausen sind kurz und abends ist man völlig platt. Am letzten Tag konnten wir aufgrund der kurzen Pausen ca. 30min früher gehen.

Klausur:

Die Klausur ist wirklich sehr sportlich. Die 3h sind schnell rum, man hat wenig Zeit zum nachdenken, deshalb müssen einige Dinge einfach sitzen. In der Regel müssen Ein- und Ausgaben nicht kodiert werden, es sei den, es steht explizit da. Weiterhin reicht es die main-Funktion zu kodieren, Einbinden der Bibliotheken ist ebenfalls nicht erforderlich. Leider existiert für dieses Modul auch keine Musterklausur, deshalb ein paar Beispiele Aufgabenbeispiele.

Detailaufgaben:

1. Schreiben Sie ein Programm welches zur Eingabe einer dez. Zahl zw. 1 und 100 auffordert, prüfen Sie ob die Zahl tatsächlich zw. 1 und 100 liegt und fragen Sie anschliessend nach, ob die Zahl korrekt eingegeben wurde. Rechnen Sie die Zahl in das binäre Zahlensystem und geben Sie das Ergebnis aus. (3 Punkte {entspricht 9min})

Hier sollte man den Ansatz sofort erkennen. Ich habe in der Klausur den folgenden Weg gewählt:

  • zwei bool-Variablen mit false initialisiert (eine für “ob Zahl von 1-100″, zweite ob Eingabe korrekt)
  • IF-Abfragen in einer fussgesteuerten Schleife, wenn beide “true” gehts raus
  • anschliessend zweite Schleife mit Modulo-Rechnung
  • Ergebnis wurde als 1 und 0 in ein char-Array geschrieben und entspr. ausgegeben

2. Länge der Zeichenketten ermitteln, dabei mit Indices ansprechen (manchmal sollen die Zeichenketten auch mit Pointern angesprochen werden oder beides).
Beispielcode als Funktionen:

int strlen_1 ( char *p_zeichenkette )
{
    // Elemente mit Zeigern ansprechen
    int zaehler = 0;
    while ( *p_zeichenkette != 0 )
    {
        cout << p_zeichenkette << endl;
          p_zeichenkette ++;
          zaehler ++;
    }
    return zaehler;
}

int strlen_2 ( char *p_zeichenkette )
{
    // Elemente mit Indices ansprechen
    int zaehler = 0;
    while ( p_zeichenkette [ zaehler] != ‘\0′ )
    {
          zaehler ++;
    }
    return zaehler;
}

3. Es wird ein Array mit drei Zeilen auf heap angelegt. Auf Position 0 wird ein Wert gesetzt. Das Ganze soll unter Berücksichtigung des Pointers auf dem Stack und des Arrays auf dem heap skizziert werden (das sind mal paar geschenkte Punkte!)

Komplex

Die Geschichte drum herum ist egal, mal sind es Möbel, dann Autos oder Konten. Es geht immer darum, Klassen zu definieren (mit Vererbung und Beziehungen), sowie Methoden, Konstruktoren und Destruktoren zu kodieren. Manchmal wird auch die main-Funktion mit Ein-/Ausgabe verlangt.

Die Punkteverteilung ist sehr granular, als Beispiel: Kodieren Sie einen Standardkostruktor (2 P.) oder kodieren Sie einen Destruktor (1 P.).

Gelegentlich kommen auch String-Aufgaben oder Char-Arrays als Komplexaufgaben vor.

Vorbereitung:

Es gibt zwar eine Eingrenzung der Themen beim Seminar, aber das meisste muss man können. Dinge die in jedem Fall sitzen sollten:

  • Ein- / Ausgabe
  • Schleifen und IF-Abfragen
  • Variablendeklaration (int, float…) und Konstanten
  • Pointer, Pointerarithmetik (p, &p, *p)
  • Arrays
  • Strings (einfach, in der Klausur gibts die Stringfunktionen als Anhang)
  • Vektoren
  • Klassendefinition (niemals public), Methoden, Konstruktoren, Destruktoren
  • Operatorüberladung (ostream)

Wenn man Polymorphie oder Beziehungen nicht abschliessend verstanden hat, wird man mit den o.g. Punkten und etwas Glück dennoch eine 3 bis 4 schreiben können.

Studienbriefe:

  • Einführung in die Programmierung mit C++
  • Buch “Einstieg in C++” (ISBN 978-3-8362-1385-1)

Credits: 7
Durchfallsquote 2009: 26%
Durchfallsquote 2011: 26%

Zeitaufwand: hoch
Schwierigkeit: hoch

Tipps: Es hilft nur Übung. Ich habe als Vorbereitung ca. 40 Programme geschrieben. Von den o.g. Punkten zur Vorbereitung, sollte man die ersten 7 aus dem Effeff können und ohne nachdenken kodieren können.

Manchmal lohnt es sich, ein paar zusätzliche Funktionen, die nicht Inhalt des Moduls sind, zu kennen. Als Beispiel ein Programm zur Umwandlung von binär zu dezimal, welches ebenfalls als Klausuraufgabe vorstellbar wäre.

Kennt man die “pow” Funktion, spart man sich das fehleranfällige Kodieren der Schleife.

#include <iostream>
#include <string>
#include <math.h>
using namespace std;

int main()
{
    const double bas = 2;
    string strBin;
    int laenge, i;
    char z;
    double sum1 = 0, sum2 = 0, faktor;

    cout << “Geben Sie ihre Zahl binär ein (0 und 1): “;
    cin >> strBin;

    laenge = strBin.size();
    faktor = laenge – 1;

    //Abarbeitung von links nach rechts!
    for (i = 0; i < laenge; i++)
    {
        z = strBin [i];

        if (z == ‘1’)
        {
            sum2 = pow (bas,faktor); //statt pow aus <math.h> könnte man auch eine Schleife bauen, müsste aber ^0 & ^1 abfangen
            sum1 = sum1 + sum2;
            sum2 = 0;
        }
        faktor–;

    }

    cout << “Ergebnis Dec: ” << sum1 << endl;

    system (“pause”);
    return 0;
}

2 Comments Post a comment
  1. Tom #

    Hallo Dmitrij,

    welche Entwicklungsumgebung verwdendet die AKAD?
    VS 2010/2012?

    Danke und Gruß

    Tom

    Dezember 4, 2013
    • Dmitrij #

      Aktuell wird von AKAD Code::Blocks empfohlen. Ich habe damals Microsoft Visual Studio verwendet. Man kann eigentlich nehmen, was man will. Benötigt man Tipps vom Professor zur Entwicklungsumgebung, sollte man sich an die Empfehlung halten.

      Dezember 4, 2013

Leave a comment to Dmitrij Antworten abbrechen

You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS