C++ gibt seltsame Ergebnisse?

... komplette Frage anzeigen

5 Antworten

Ich habe deine Frage und die bisherigen Antworten jetzt zwar nur grob überflogen, aber du solltest dir vielleicht mal anschauen, was man alles mit dem "Satz des Pythagoras" machen kann.

Wenn du die Strecke zwischen zwei Punkten ausrechnen willst, solltest du vielleicht mal Folgendes probieren:

double w = std::abs(p1.x - p2.x);
double h = std::abs(p1.y - p2.y);

double l = std::sqrt(w*w + h*h);

Die Länge der Strecke steht danach in "l".

Da du dabei fast niemals eine gerade Zahl erhalten wirst, habe ich mal einen Gleitpunktwert gewählt.

Viel Spaß damit! :)

Also wenn ich meine (verstaubten) c++ Kentnisse hervorkrame:

1.)die for-schleife sollte bei 1 beginnen
Wenn Du nur zwei Koordinatenpaare eingegeben hast, ist anzahl = 2 (Arrayplätze 0 und1 belegt).
In der for-schleife rechnest Du aber beginnend mit i = 0 bis anzahl (3-Wertepaare)

2.)die Strecke s zwischen der aktuellen Koordinate (xi|yi) mit i = n und der vorhergehenden mit i = n-1sollte doch eigentlich mit
s = Wurzel ((x(i)-x(i-1))² + (y(i) – y(i-1))² )
berechnet werden


a) In C, C++ etc. gilt Punktrechnung vor Strichrechnung, d. h.

(x1 - x2)^2

b) Quadrieren entweder mit der pow-Funktion (langsam) oder mit einer sqr-Funktion (aus einer Bibliothek oder selbst geschrieben)

c) Ist die Länge nicht die Wurzel aus (Δx)² + (Δy)²? (sqrt-Funktion)

d) Böse Falle: Buffer-Überlauf in der Additionsschleife, wenn i = anzahl-1.

Kommentar von PWolff
05.12.2015, 20:21

Korrektur

a) In C++ gilt Punktrechnung vor Strichrechnung (wie in praktisch allen Programmiersprachen, die die übliche Infix-Notation verwenden), d. h. du musst Klammern setzen, wie in der Mathematik auch:

(x1-x2)^2

oder für die Differenz eine eigene Variable nehmen.

0
Kommentar von TeeTier
05.12.2015, 22:44

Zum Quadrieren eine Bibliotheksfunktion?!?!

Ist n*n zu einfach, oder wie? :)

0

In der 2. Schleife ist i maximal anzahl - 1. Somit ist 1+i maximal anzahl. Es werden aber nur koordinate von 0 bis einschließlich anzahl -1 gesetzt. Folglich wird im letzen Schreifendurchlauf auf nicht initialisierten Speicher zugegriffen.

Ferner ist ^2 nicht hoch 2 sondern das exclusive oder mit 2.



Kommentar von elektronik007
05.12.2015, 20:43

Danke

aber kanst du mir kurtz ein Beischbiel schreiben ich habs nicht gans getschekt☺.

0

Sqrt(var); // (statt var*var)

Was möchtest Du wissen?