MINT üben

Was C++ ergänzt

Ein Anmeldeprogramm für die Robotik-AG, das mit gcc nicht linken will, und ein Schrittwettbewerb, bei dem eine Referenz heimlich Schritte verschwinden lässt.

Dein Fortschritt:
0 / 0 Aufgaben
1

Anmeldung zur Robotik-AG

AFB I–II

Für die Anmeldung zur Robotik-AG schreibt Kim ein kleines C++-Programm. Es erzeugt aus Vor- und Nachnamen einen Login für die AG-Rechner und prüft, ob die Person aus Jahrgang 7 oder höher kommt.

C++ · anmeldung.cpp
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string vorname, nachname;
    int jahrgang;
    cout << "Vorname: ";
    cin >> vorname;
    cout << "Nachname: ";
    cin >> nachname;
    cout << "Jahrgang: ";
    cin >> jahrgang;

    string login = vorname + "." + nachname;
    bool darfTeilnehmen = jahrgang >= 7;

    cout << "Login: " << login << " (" << login.length() << " Zeichen)" << endl;
    if (login.length() > 12) {
        cout << "Login zu lang, bitte kuerzen." << endl;
    }
    cout << "Teilnahme: " << darfTeilnehmen << endl;
    return 0;
}

Ihr Freund Levent übersetzt das Programm aus Gewohnheit mit gcc statt mit g++ und erhält viele Zeilen wie diese:

Terminal (Auszug)
$ gcc anmeldung.cpp -o anmeldung
/usr/bin/ld: /tmp/ccaCvnb9.o: in function `main':
/usr/bin/ld: anmeldung.cpp:(.text+0x47): undefined reference to `std::cout'
/usr/bin/ld: anmeldung.cpp:(.text+0x60): undefined reference to `std::cin'
…
collect2: error: ld returned 1 exit status

Außerdem hat Levent im Internet gelesen, man solle using namespace std; lieber weglassen. Seine Fassung beginnt so:

C++ · Levents Fassung (Anfang)
#include <iostream>
#include <string>

int main()
{
    std::string vorname, nachname;
    int jahrgang;
    std::cout << "Vorname: ";
    std::cin >> vorname;
    // ... usw.
    std::cout << "Login: " << login << std::endl;
  1. Wenden Sie das Programm auf die Eingaben Lina Kowalski 9 und Ben Ott 6 an und notieren Sie jeweils die Ausgabe nach den Eingabeaufforderungen.
  2. Interpretieren Sie Levents Fehlermeldung: Welcher Schritt der Übersetzung scheitert, und warum?
  3. Vergleichen Sie Kims Schreibweise mit using namespace std; und Levents Schreibweise mit std:: nach mindestens drei Kriterien.

Hinweise

Hinweis zu Aufgabe a)
+ hängt string-Werte aneinander, .length() zählt alle Zeichen, auch den Punkt. Ein bool wird von cout als Zahl ausgegeben.
Hinweis zu Aufgabe b)
Achten Sie auf ld und undefined reference. Welches Werkzeug hieß in 2.1.1 „Linker“, und was fügt es zum eigenen Code hinzu?
Hinweis zu Aufgabe c)
Mögliche Kriterien: Schreibaufwand, Lesbarkeit (sieht man, woher ein Name stammt?), Gefahr von Namenskonflikten mit eigenen Namen, Einsatz in Header-Dateien.