Adrian Dymorz

1-0.

Compilieren, starten und testen Sie die Programme in diesem Kapitel!

#include <iostream>
#include <string>
int
main () {
    std::cout << "Bitte geben Sie Ihren Vornamen ein: ";
    std::string name;
    std::cin >> name;
    // die Grussmeldung der Ausgabe vorbereiten
    const std::string gruss = "Hello, " + name + "!";
    // die zweite und vierte Ausgabezeile erzeugen
    const std::string leerzeichen(gruss.size(), ' ');
    const std::string zweite = "* " + leerzeichen + " *";
    // die erste und fünfte Ausgabezeile erzeugen
    const std::string erste(zweite.size(), '*');
    // alles ausgeben
    std::cout << std::endl;
    std::cout << erste << std::endl;
    std::cout << zweite << std::endl;
    std::cout << "* " << gruss << " *" << std::endl;
    std::cout << zweite << std::endl;
    std::cout << erste << std::endl;
    return 0;
}

Keine Schwierigkeiten.

1-1.

Sind die folgenden Definitionen gültig? Warum oder warum nicht?

const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";

Ja, der + -Operator ist links-assoziativ und verarbeitet daher zuerst den String mit dem Namen "hello" und das Stringliteral ", world" zu einem String, bevor er dass zweite Stringliteral verarbeitet.

1-2.

Sind die folgenden Definitionen gültig? Warum oder warum nicht?

const std::string ruf = "!";
const std::string message = "Hello" + ", world" + ruf;

Nein, der links-assoziative Operator + versucht hier zuerst, zwei Stringliterale zu verarbeiten, was zu einem Fehler führt.

1-3.

Ist das folgende Programm gültig? Wenn ja, was tut es? Wenn nicht, warum nicht?

#include <iostream>
#include <string>

int main()
{
    {    const std::string s = "Ein String";
        std::cout << s << std::endl; }
    {    const std::string s = "Ein anderer String";
        std::cout << s << std::endl; }
    return 0;
}

Es ist gültig. Es definiert und initialisiert jeweils innerhalb eines Blocks einen String s konstant und gibt diesen über die Standart-Ausgabe aus.

1-4.

Wie sieht es mit diesem aus? Was passiert, wenn wir in der dritten Zeile von unten}} in };} ändern?

#include <iostream>
#include <string>

int main()
{
    {    const std::string s = "Ein String";
        std::cout << s << std::endl;
    {    const std::string s = "Ein anderer String";
        std::cout << s << std::endl; }}
    return 0;
}

Es gibt sowohl mit }} wie auch mit };} folgendes aus:

Ein String
Ein anderer String

1-5.

Ist dieses Programm gültig? Wenn ja, was tut es? Wenn nein, warum nicht, und wie kann es umgeschrieben werden, damit es gültig wird?

#include <iostream>
#include <string>

int main()
{
    {    std::string s = "Ein String";
    {    std::string x = s + ", wirklich";
        std::cout << s << std::endl; }
        std::cout << x << std::endl;
    }
    return 0;
}

Es ist nicht gültig. Der Zugriff auf die Variable x bei der Ausgabe schlägt fehl. x ist innerhalb eines zu eng gesetzten Block definiert.

Lösung:

#include <iostream>
#include <string>

int main()
{
    {    std::string s = "Ein String";
    {    std::string x = s + ", wirklich";
        std::cout << s << std::endl;
        std::cout << x << std::endl; }
    }
    return 0;
}

1-6.

Was tut das folgende Programm, wenn Sie nach der Eingabeaufforderung zwei Namen (zum Beispiel Samuel Beckett) eingeben? Sagen Sie das Verhalten vorher, bevor Sie das Programm laufen lassen und probieren Sie es dann aus!

#include <iostream>
#include <string>

int main()
{
    std::cout << "Wie heissen Sie? ";
    std::string name;
    std::cin >> name;
    std::cout << "Hello, " << name
        << std::endl << "Und wie heissen Sie? ";
    std::cin >> name;
    std::cout << "Hello, " << name
        << "; freut mich, Sie kennen zu lernen!"
        << std::endl;
}

(Hinweis: Überzählige Semikolon in der Aufgabenstellung entfernt)

Es gibt folgendes aus:

Wie heissen Sie?
Hello, <eingabe1>
Und wie heissen Sie?
Hello, <eingabe2>; freut mich, Sie kennen zu lernen!"