MINT lernen

Übungen: C++-Grundlagen

cout statt printf, string statt char-Array, Referenz statt Zeiger — hier prüfst du, ob der Umstieg sitzt.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zu Ein- und Ausgabe mit cout und cin, std::string, bool und Referenzen — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du nicht weiterkommst, helfen die gestuften Tipps.

A1
Aus C wird C++
AFB I

Jede C-Schreibweise links hat in C++ ein typisches Gegenstück. Ordne die Paare zu.

Ansatz: Suche zuerst die Paare für Ausgabe und Eingabe: << schiebt zur Ausgabe hin, >> holt aus der Eingabe.
Weiter: Bei std::string sind Länge und Vergleich eingebaut.
A2
Stimmt’s? — C++-Grundlagen
AFB I

Nenne zu jeder Aussage, ob sie stimmt.

Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Die Header-Aussage klingt praktisch, ist aber die gefährlichste: Ein using namespace std; im Header wirkt in jeder Datei, die ihn einbindet — auch dort, wo es zu Namenskonflikten führt.
Ansatz: Denk daran, was << ausgibt: jedes Teil direkt hinter das vorige.
Weiter: Überlege bei der Header-Aussage, wer alles einen Header mit #include einbindet.
A3
Strings zusammensetzen
AFB I
C++ · wort.cpp
string vor = "Mo", nach = "bil";
string s = vor + nach + "e";
cout << s.length() + nach.length() << endl;

Gib die Ausgabe an.

Überlege selbst und trage das Ergebnis ein — Enter prüft direkt.
s ist „Mobile“ mit 6 Zeichen, nach hat 3 Zeichen: 6 + 3 = 9. Das Endezeichen zählt length() nicht mit — wie strlen. Typischer Fehler: 10 oder 11, weil man wie bei sizeof ein '\0' dazuzählt.
Ansatz: Setze zuerst s zusammen und zähle dann die Zeichen.
Weiter: Mo + bil + e = Mobile.
A4
Referenz umhängen?
AFB II Trick
C++ · referenz.cpp
int a = 4, b = 10;
int &r = a;       // Zeile 2
r = r + b;        // Zeile 3
r = b;            // Zeile 4
b = b + 1;        // Zeile 5
cout << a << " " << b << " " << r << endl;

Ermittle die Werte Schritt für Schritt.

Arbeite die Kette Schritt für Schritt ab: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. a nach Zeile 3
  2. a nach Zeile 4
  3. b nach Zeile 5
  4. r in der Ausgabe
Zeile 4 ist die Falle: Eine Referenz lässt sich nicht umhängen. r = b; heißt a = b; — a wird 10, r bleibt ein zweiter Name für a. Deshalb ändert Zeile 5 nur b, und r ist am Ende 10, nicht 11. Ausgabe: 10 11 10.
Ansatz: Ersetze in jeder Zeile r durch a.
Weiter: Eine Referenz wird nur bei der Deklaration festgelegt — danach ist jede Zuweisung an r eine Zuweisung an a.
A5
Satz verlängern
AFB II

anhaengen soll ein Wort mit Leerzeichen an einen vorhandenen Satz hängen — der Satz in main soll sich dabei ändern. Ergänze die Lücken.

Wähle in jedem Menü den passenden Eintrag und prüfe dann alle auf einmal.
C++ · satz.cpp
#include <>
#include <string>
using namespace std;

void anhaengen(string , string wort) {
    text = text + " " + wort;
}

int main() {
    string satz = "Ich";
    anhaengen(satz, "lerne");
    anhaengen(satz, "C++");
    cout << satz << ;              // Ich lerne C++
    cout << satz.() << endl;      // 13
    return 0;
}
Nur mit dem Referenzparameter string &text arbeitet die Funktion direkt auf satz. Ohne & bekäme sie eine Kopie, und satz bliebe „Ich“ (Länge 3). Typischer Fehler: *text wie bei Zeigern — dann müsste der Aufruf &satz lauten. „Ich lerne C++“ hat 13 Zeichen, Leerzeichen mitgezählt.
Ansatz: Die Funktion soll die Variable des Aufrufers ändern — ohne dass beim Aufruf ein & steht.
Weiter: length ist eine Methode des string-Objekts, deshalb mit Punkt und Klammern.
A6
C, C++ oder keins von beiden?
AFB II

Du kennst schon Python und Java. Ordne jede Zeile ein: Wo wird sie so übersetzt?

Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1nur C++
2C und C++
3weder C noch C++
C++ hat C fast vollständig übernommen — printf, char-Arrays und strcmp funktionieren in beiden Sprachen. print stammt aus Python, System.out.println aus Java. Tückisch: 'Hi' in einfachen Anführungszeichen ist in C/C++ kein Text — einfache Anführungszeichen umschließen genau ein Zeichen.
Ansatz: Frage bei jeder Zeile: Gab es das schon in C (Kapitel 2.1 und 2.2)?
Weiter: Einfache Anführungszeichen stehen in C und C++ nur um ein einzelnes Zeichen.
A7
Zeiger gegen Referenz
AFB II Mix

Aus 2.2.2 kennst du Zeigerparameter. Hier stehen beide Varianten nebeneinander:

C++ · plus.cpp
void plusZ(int *p) { *p = *p + 1; }
void plusR(int &r) { r = r + 1; }

int main() {
    int n = 5;
    plusZ(&n);
    plusR(n);
    cout << n << endl;
    return 0;
}

Vergleiche die beiden Varianten und markiere alle zutreffenden Aussagen.

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Beide Funktionen ändern n, also 5 → 6 → 7. Der Unterschied liegt in der Schreibweise: Beim Zeiger steht & beim Aufruf und * in der Funktion, bei der Referenz steht nur ein & im Parameter. g++ meldet bei plusZ(n) „invalid conversion from int to int*“. Eine Referenz ist immer an eine Variable gebunden — NULL gibt es für sie nicht.
Ansatz: Verfolge n durch beide Aufrufe.
Weiter: Die Referenz muss bei ihrer Entstehung wissen, wofür sie steht.
A8
Fehlersuche: Passwortprüfung
AFB III

Das Programm liest ein Passwort ein, meldet bei tulpe7 „Zugang frei“, bei weniger als 6 Zeichen „Zu kurz“ mit der Länge und sonst „Falsch“. Überprüfe den Code — drei Zeilen lassen sich nicht übersetzen.

In diesem Code stecken Fehler. Klicke genau die fehlerhaften Zeilen an — die richtigen musst du stehen lassen.
Zeile 9 ist korrekt: Bei std::string vergleicht == den Inhalt — in C wäre hier strcmp nötig gewesen. Die drei echten Fehler sind typische Umsteigerfehler: Pfeilrichtung bei cin, fehlende Klammern bei Methoden und Tippfehler bei endl.
Ansatz: Achte auf die Richtung der Pfeile: cout <<, aber cin >>.
Weiter: Ein Fehler steckt in der Eingabe, einer bei einem Methodenaufruf, einer bei der Ausgabe.
A9
Alle Teiler ausgeben
AFB III

Das Programm soll eine Zahl einlesen und alle ihre Teiler in einer Zeile ausgeben — für 18 also 1 2 3 6 9 18. Die Zeile #include <iostream> steht schon ganz oben; statt using namespace std; wird std:: ausgeschrieben. Implementiere das Programm, indem du die Zeilen ordnest.

Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1bool teilbar(int zahl, int t) { return zahl % t == 0; }
2int main() {
3 int n;
4 std::cin >> n;
5 for (int t = 1; t <= n; t++) {
6 if (teilbar(n, t)) std::cout << t << " ";
7 }
8 std::cout << std::endl;
9 return 0;
10}
Wichtig ist die Grenze t <= n, sonst fehlt die Zahl selbst, und der Start bei 1, sonst würde durch 0 geteilt. std::endl gehört hinter die Schleife — in der Schleife stünde jeder Teiler in einer eigenen Zeile. Und teilbar muss vor main stehen, weil es keinen Prototyp gibt.
Ansatz: Ohne Prototyp muss die Funktion vor main definiert sein.
Weiter: Erst einlesen, dann die Schleife, danach einmal die Zeile beenden.
A10
using namespace std im Header?
AFB III

Leon schreibt using namespace std; in seine Header-Datei werkzeug.h, die er in vielen .cpp-Dateien einbindet. Beurteile seine Entscheidung, indem du den Text vervollständigst — zwei Wörter bleiben übrig.

Wort anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Ein Klick auf eine gefüllte Lücke legt das Wort zurück.

Jede Datei, die werkzeug.h , übernimmt auch using namespace std; — ob sie will oder nicht. Dann sind alle Namen aus std, etwa , ohne Präfix sichtbar und können mit eigenen Funktionen gleichen Namens . Im Header schreibt man deshalb besser aus. In einer einzelnen .cpp-Datei ist using namespace std; dagegen , weil es nur dort wirkt.

Leons Entscheidung ist ungünstig: Der Header „verteilt“ die Abkürzung in fremde Dateien. Ablenker: using macht das Programm nicht schneller — es ändert nur, welche Namen sichtbar sind. Und string.h ist der C-Header für strlen und Co., nicht der Typ std::string.
Ansatz: Überlege, was #include genau macht: Es kopiert den Header-Text in die Datei.
Weiter: Eine eigene Funktion count und std::count hätten dann denselben Namen.