Ü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.
PositionX: *positionX*PositionY: *positionY*
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.
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.
PositionX: *positionX*PositionY: *positionY*QuadratX: *squareX*QuadratY: *squareY*
Hier ist ebenfalls nichts neues passiert. Bitte lösch deinen Code nicht, du sollst ihn in der nächsten Übung erweitern.
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).
Gebe PositionX ein: 5
Gebe PositionY ein: 10QuadratX: *squareX*QuadratY: *squareY*
Alles Wichtige steht in den Anmerkungen. Bitte lösch deinen Code nicht, du sollst ihn in der nächsten Übung erweitern.
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:
Gebe PositionX ein: 4
Gebe PositionY ein: 13Gebe ZielX ein: 10Gebe ZielY ein: 5BewegungX: *moveVectorX*BewegungY: *moveVectorY*QuadratX: *squareX*QuadratY: *squareY*
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.
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:
Gebe PositionX ein: 4
Gebe PositionY ein: 14Gebe ZielX ein: 10Gebe ZielY ein: 5BewegungX: *moveVectorX*BewegungY: *moveVectorY*QuadratX: *squareX*QuadratY: *squareY*Distanz: *distance*
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.
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.