Ü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.
Jede C-Schreibweise links hat in C++ ein typisches Gegenstück. Ordne die Paare zu.
cin >> n; mit &n kombinieren wollen. cin braucht kein & und keinen Formatstring — es erkennt den Typ von n selbst. Und == vergleicht Texte nur bei std::string korrekt, nicht bei char-Arrays.<< schiebt zur Ausgabe hin, >> holt aus der Eingabe.std::string sind Länge und Vergleich eingebaut.Nenne zu jeder Aussage, ob sie stimmt.
using namespace std; im Header wirkt in jeder Datei, die ihn einbindet — auch dort, wo es zu Namenskonflikten führt.<< ausgibt: jedes Teil direkt hinter das vorige.#include einbindet.string vor = "Mo", nach = "bil"; string s = vor + nach + "e"; cout << s.length() + nach.length() << endl;
Gib die Ausgabe an.
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.s zusammen und zähle dann die Zeichen.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.
-
anach Zeile 3 -
anach Zeile 4 -
bnach Zeile 5 -
rin der Ausgabe
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.r durch a.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.
#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; }
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.& steht.length ist eine Methode des string-Objekts, deshalb mit Punkt und Klammern.Du kennst schon Python und Java. Ordne jede Zeile ein: Wo wird sie so übersetzt?
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.Aus 2.2.2 kennst du Zeigerparameter. Hier stehen beide Varianten nebeneinander:
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.
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.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.
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.cout <<, aber cin >>.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.
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.main definiert sein.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.
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.
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.#include genau macht: Es kopiert den Header-Text in die Datei.count und std::count hätten dann denselben Namen.