Übungen zu Kapitel 2

17-08-2011 13:00 von NachoMan

In diesem Kapitel geht es um Variablen. Da es ein sehr großes Thema ist, sind mehrere Übungen sinnvoll.

Aufgabe nach Kapitel 2.3 (Voraussetzung: Variablen): 
Anmerkungen:
In dem Buch werden wichtige Begriffe durcheinander gebracht. Diese Zeile:
int Leben;
wird im Buch als Deklaration bezeichnet. Dabei ist es eine Definition. Jetzt fragst du sicher wie man eine solche Anweisung nennt:
Leben = 100;
Wurde der Variable vorher kein Wert zugewissen, ist es eine Initialisierung. Ansonsten ist es eine Zuweisung.
Es Spricht erstmal nichts dagegen, die Variable sofort zu initialisieren.
int Leben = 100;
Jetzt ist es eine Definition und Initialisierung in einer Anweisung.
Ich werde Variablen bei der Ausgabe mit *Variablename* markieren. Soll ein * ausgegeben werden, setze ich ein Schrägstrich davor.
Aufgabe:
Definiere zwei Integer mit den Namen positionX und positionY, initialisiere sie mit beliebigen Werten ungleich Null und gebe sie dann wie folgt aus.
PositionX: *positionX*
PositionY: *positionY*
Versuch dabei nicht ins Buch zu schauen. Wenn du es nicht ohne schaffst, kannst du die Übung morgen wiederholen.
Mein Lösungsvorschlag:

Link

Erklärung:

Hier ist nicht viel neues passiert. Es ist nur wichtig, dass du Variablen definieren, Initialisieren und ausgaben kannst. Bitte lösch deinen Code nicht, du sollst ihn in der nächsten Übung erweitern.

Aufgabe nach Kapitel 2.4.1 (Voraussetzung: einfache Rechenoperatoren):
Anmerkungen:

Hier wird der Code aus der vorherigen Übung benötigt.

Du wirst merken, dass ich stehts englische Namen für meine Variablen nutze. Das hat den Vorteil, dass man den Code auch Programmierern zeigen kann, die die deutsche Sprache nicht beherrschen und man nie Probleme mit Umlauten bekommt. Wenn du überhaupt kein Englisch kannst, dann solltest du es lernen oder aufhören deine Zeit damit zu verschwenden Programmieren zu lernen. Ohne Englisch kommst du leider nicht weit.

Aufgabe:
Quadriere die Werte der beiden Positionen, Speichere sie in den zwei neuen Variablen, squareX und squareY, zwischen und gebe sie wie folgt aus:
PositionX: *positionX*
PositionY: *positionY*
QuadratX: *squareX*
QuadratY: *squareY*
Auch hier gilt:  Wenn du es nicht ohne Buch schaffst, kannst du heute rein schauen und die Übung morgen wiederholen.
Mein Lösungsvorschlag:

Link

Erklärung:

Hier ist ebenfalls nichts neues passiert. Bitte lösch deinen Code nicht, du sollst ihn in der nächsten Übung erweitern.

Aufgabe nach Kapitel 2.9 (Voraussetzung: Benutzereingaben mit std::cin): 
Anmerkungen:

Hier wird der Code aus der vorherigen Übung benötigt.

cin(console input) befindet sich genau wie cout(console output) im namespace std. Versuche die Übungen ebenfalls ohne "using namespace std;" zu schreiben.

Nachdem du mit std::cin eine Eingabe entgegen genommen hast, kann es passieren, dass sich noch ein Zeichen im Eingabestream befindet. Dieses Zeichen wird von std::cin.get(); als Eingabe gedeutet. Das wollen wir aber nicht. Mit std::cin.ingore(); leerst du den Eingabestream und kannst wieder std::cin.get(); verwenden um das Programm zu pausieren.

Dir wird vielleicht auffallen, dass dein Programm sich merkwürdig verhält wenn du eine Eingabe machst, die nicht zum Datentypen passt. Wenn std::cin zum Beispiel eine Ganzzahl(z.B. int) erwartet und du eine Kommazahl eintippst. Es gibt natürlich wege um das zu verhindern und nur die Eingabe des richtigen Datentyps zu erlauben. Das wirst du aber leider noch nicht verstehen, deswegen verschieben wir es in spätere Kapitel und gehen erstmal von einem User aus, der weiß was er tun(meistens bist ja du selbst der User).

Aufgabe:
Lass den User den Wert von positionX und positionY bestimmen, indem du die Werte mit std::cin einliest. Berechne das Quadrat wie in der letzten Übung. Die Ausgabe sollte in etwa so aussehen:
Gebe PositionX ein: 5
Gebe PositionY ein: 10
QuadratX: *squareX*
QuadratY: *squareY*
Auch hier gilt: Wenn du es nicht ohne Buch schaffst, kannst du heute rein schauen und die Übung morgen wiederholen.
Mein Lösungsvorschlag:

Link

Erklärung:

Alles Wichtige steht in den Anmerkungen. Bitte lösch deinen Code nicht, du sollst ihn in der nächsten Übung erweitern.

Aufgabe 1 nach Kapitel 2.11:
Anmerkungen:

Hier wird der Code aus der vorherigen Übung benötigt.

Wenn du Probleme hast, kannst du versuchen dir das Problem aufzuzeichnen oder wenigstens bildlich vorzustellen. Das wirst du später sehr oft benötigen und kannst jetzt schon gut üben.

Aufgabe:

Frage den Benutzter auf welcher Position er sich momentan befindet und wohin er möchte. Berechne anschließend wieviele Felder er sich auf der X Achse und auf der Y Achse bewegen muss. (Nun haben wir einen sogenannten Bewegungsvektor, deswegen nenn ich ihn moveVector im Code.) Gebe diese Werte und ihr Quadrat aus.
Gebe PositionX ein: 4
Gebe PositionY ein: 13
Gebe ZielX ein: 10
Gebe ZielY ein: 5
BewegungX: *moveVectorX*
BewegungY: *moveVectorY*
QuadratX: *squareX*
QuadratY: *squareY*
Bei dieser Eingabe sollte *moveVectorX* den Wert 6 und *moveVectorY* den Wert -8 haben.
Mein Lösungsvorschlag:

Link

Erklärung:

Um den Bewegungsvektor zu berechnen, machen wir uns zunutze, dass sich die Positionen relativ zueinander nicht ändern, wenn wir beide um den gleichen Wert verschieben. Das fällt erst nicht auf, weil wir eigentlich nur einen Wert verändern (das Ziel). Auf dem zweiten Blick fällt aber auf, dass PositionX - PositionX = 0 und PositionY - PositionY = 0 wäre. So verschieben wir unsere aktuelle Position auf 0|0 und brauchen nichtmehr abzählen wieviele Felder wir uns bewegen müssen, weil wir es aus dem neuen Wert vom Ziel einfach ablesen können. Zeichne es dir am besten auf wenn du es noch nicht verstanden hast.

Aufgabe 2 nach Kapitel 2.11:
Anmerkungen:

Hier wird der Code aus der vorherigen Übung benötigt.

Nun wirds Interessant (hoffe ich als Autor zumindest). Stell dir vor der Benutzer könnte nicht nur nach Rechts, Links, Oben und Unten gehen, sondern in jede Richtung die er will. Nun haben wir ein Problem, weil wir meistens wissen wollen in welche Richtung er sich bewegt, welche Distanz er dabei zurück legen muss und besonders wichtig, wieviel Zeit er für den Weg benötigt.

Dafür benötigten wir den Satz des Pythagoras. Wenn du noch nie davon gehört hast kannst du mal deinen Mathematiklehrer fragen, dich über das Web informieren oder ihn einfach Anwenden. Das ist nämlich die Aufgabe, aber keine Sorge, es klingt auf Wikipedia komplizierter als es ist. Wenn du dich fragst was unser Problem mit Dreiecken zutun hat solltest du wieder die Zeichnung zur Hand nehmen und dir einen der beiden Wege einzeichnen, die der User gehen kann, wenn er sich nur nach Rechts, Links, Oben und Unten bewegen kann. Nun verbindest du die Punkte direkt miteinander. Welch Überraschung: Es ist ein Dreieck mit rechtem Winkel! Davon interessiert uns die Seite, die gegenüber vom rechten Winkel liegt(die Hypotenuse). Die länge der anderen Seiten(der Katheten) kennen wir ja glücklicherweise.

Da das Ergebniss dieser Berechnung sehr selten eine Ganzzahl ist benötigen wir einen static_cast<float> für den Parameter und müssen es in einer floatvariable speichern.

Aufgabe:

Addiere beide Quadrate des Bewegungsvektors. Such dir eine Funktion zum Wurzel ziehen im Web (kleiner Tip: die Quadratwurzel heißt auf englisch squareroot abgekürzt: sqrt). Ziehe die Wurzel der Summe und gebe sie aus.
Gebe PositionX ein: 4
Gebe PositionY ein: 14
Gebe ZielX ein: 10
Gebe ZielY ein: 5
BewegungX: *moveVectorX*
BewegungY: *moveVectorY*
QuadratX: *squareX*
QuadratY: *squareY*
Distanz: *distance*
Bei dieser Eingabe sollte *moveVectorX* den Wert 6 und *moveVectorY* den Wert -9 haben. Die Distanz beträgt 10,8167.
Mein Lösungsvorschlag:

Link

Erklärung:

Du hast sicher mit großer Überraschung festgestellt, dass die Funktion zum Wurzelziehen sqrt heißt. Davon gibt es mehrere Versionen (für float, double und long double), wenn wir eine Ganzzahl übergeben weiß der Compiler nicht welche Funktion er nutzen soll. Deshalb ist es zwingend erforderlich die Summe der Quadrate in einen dieser Datentypen zu casten. Die Funktion gibt auch genau diesen Typ zurück.

Zurück

Einen Kommentar schreiben

Kommentar von Hymza | 26-10-2011

Hallo NachoMan, auch diese Aufgaben konnte ich ohne grössere Hürden meistern, das einzige was mich ein bisschen ins schwitzen gebracht hat, war das Wurzelziehen, wie ich dann aber gesehen habe ist mein Problem bei deiner Erklärung dann geschildert worden. Etwas habe ich aber noch festgestellt, das Ergebnis bei der Aufgabe mit dem Wurzelziehen ist hier glaube ich falsch, 14.5602 ist meiner Meinung nach richtig. Ansonsten ist es TOP und hat freude gemacht.

Kommentar von NachoMan | 26-10-2011

Danke, für die Rückmeldung.
Du hast die die Distanz zwischen dem Ursprung(0|0 im Koordinatensystem) und der Position(4|14) ausgerechnet. Gefragt war aber die "luftlinie" zwischen Position und Ziel, also die Länge des Bewegungsvektors.