c++ mathematik :rolleyes:
-
Hallo!
Ich bräuchte ein wenig Hilfe. folgende Aufgabenstellung versuche ich vergebens in C++ umzusetzen aber es kommen die falschen Ergebnisse raus:http://www7.pic-upload.de/29.11.13/k3414rwev3tg.jpg
#include <iostream> #include <cmath> using namespace std; void main (void) { double A, B; int n; int i; do { cout << "Geben Sie die Anzahl der Messpunkte ein!"<<endl; cin >> n; if(n < 2 || n > 1000) { cout << "Falsche Eingabe; Anzahl muss zwischen 2 und 1000 liegen" << endl; } }while(n < 2 || n > 1000); double x[1000]; double y[1000]; cout << "Geben Sie " << n << " Messpunkte ein! \nErstmal NUR die X-Koordinaten in numerischer Reihenfolge:\n"; for ( i=0; i<n; i++ ) cin >> x[i]; cout << "Nun die zugeh\x94rigen Y-Koordinaten:\n"; for ( i=0; i<n; i++ ) cin >> y[i]; for ( i=0; i<n; i++ ) double summex2 = x[i] * x[i]; for ( i=0; i<n; i++ ) double summex = x[i]; for ( i=0; i<n; i++ ) double summexy = x[i] * y[i]; for ( i=0; i<n; i++ ) double summey = y[i]; double summex2 = x[i] * x[i]; double summex = x[i]; double summexy = x[i] * y[i]; double summey = y[i]; A= (summex2*summey - summex*summexy) / (n*summex2-summex*summex); B= (n*summexy - summex*summey) / (n*summex2 - summex*summex); cout << "y = " << A << " + " << B << " * x" << endl; }Die Eingabe der X/Y Koordinaten lässt sich schöner gestalten. Das weiß ich, aber das ist erstmal nicht relevant. Hoffe ihr könnt mir bei der Funktion helfen

-
bis auf das einlesrn machen alle deine for schleifen nichts
-
helpmeman schrieb:
for ( i=0; i<n; i++ ) double summex2 = x[i] * x[i];Das hier und die folgenden Zeilen sind alle kaputt. Du legst in jedem Schleifendurchgang eine neue lokale Variable an, summierst aber nichts auf.
Das hier wäre z.b. die Summe aller Quadrate des x-Vektors:
double sum = 0; for(int i=0; i<n; ++i) sum += x[i]*x[i];
-
Aufgabenstellung schrieb:
Fordern Sie zur Eingabe von n Messpunkten auf, wobei die Messpunkte in nummerisch aufsteigender Reihenfolge eingegeben werden sollen
Warum?

Aufgabenstellung schrieb:
Verwenden Sie für x und y eindimensionale Felder mit jeweils maximal 1000 Elementen

Mit so einer Aufgabenstellung, die bereits Teile einer schlechten Lösung einfordert, lernt man weder was über Programmieren im Allgemeinen noch über C++ im Besonderen und schon gar nichts über Mathematik - ganz im Gegenteil.Von welcher FH/Uni/Schule kommt das?
helpmeman schrieb:
... aber es kommen die falschen Ergebnisse raus:
Die Zeilen 50 bis 53 sind überflüssig. Setze alle Summen-Variablen vor(!) den for-Schleifen auf 0.
Mache dann einen Test mit nur zwei Messpunkten und lasse Dir alle Zwischenergebnisse ausgeben.
Beherzige den Hinweis von μ.
-
Helpme wie lange lernst du schon c++ in der Schule?
-
Werner Salomon schrieb:
Mit so einer Aufgabenstellung, die bereits Teile einer schlechten Lösung einfordert, lernt man weder was über Programmieren im Allgemeinen noch über C++ im Besonderen und schon gar nichts über Mathematik - ganz im Gegenteil.
Wie groß muss das Array denn sein, damit man was über Mathematik lernt? Oder muss es dafür variable groß sein? Und wenn ja, inwiefern lernt man dann was über Mathematik?
Findest Du wirklich, dass man mehr über Mathematik lernt, wenn man jetzt hier mit std::vector rumhantiert, statt einfach Arrays zu benutzen, was nun wirklich jeder kann? Ich denke das Lernziel ist an dieser Stelle zu sehen, dass dieses numerische/statistische Verfahren sich, auch wenn die ganzen Summenzeichen in den Formeln erstmal bedrohlich aussehen, in völlig einfache und harmlose Schleifen gießen lassen. Die Aufgabe lehrt genau das und tut das imo auf völlig angemessene Weise. Das bisschen Zucker außenrum kann a) jeder dazu bauen und es lenkt b) vom eigentlich Kern der Aufgabe ab.
Fazit: Für eine mathematische Vorlesung würde ich die Aufgabe bedenkenlos verwenden. Für eine Programmieren-Vorlesung sollte mans schöner machen. Aber das pauschal so zu machen scheint mir das Ziel aus dem Auge zu verlieren.
-
habs jetzt! Vielen Dank. Es fehlte wie gesagt nur das Nullstellen und das Addieren der Variablen zu den Summen.
-
Hallo Jester,
ich gebe ja zu, dass ich nicht genau beschrieben habe, weshalb ich diese Kritik übe. Es geht nicht primär um die Felder und die Begrenzung auf 1000.
Mathematik heißt doch auch aus der Realität ein logisches Modell zu erarbeiten, was man formal beschreiben kann. Und eventuelle Ergebnisse daraus sollten sich dann auch in der Realität wieder finden lassen.
Die kleinste Einheit, um die es hier geht, ist ein Messpunkt. D.h. ein Paar aus einem X- und einem Y-Wert. Und die gehören zusammen - es gibt kein X ohne Y und umgekehrt. Und ein X_i gehört genau zu einem Y_i - nicht zu einem Y_j und auch nicht zu einem anderen X-Wert. Kohäsion ist - glaube ich - der Fachausdruck, der hier eine Rolle spielt.Diese einfache Wahrheit wird hier einfach unterlaufen. Statt dessen:
Aufgabenstellung schrieb:
Fordern Sie zur Eingabe von n Messpunkten auf, wobei die X-Werte in nummerisch aufsteigender Reihenfolge eingegeben werden sollen.
Du und ich wissen, dass die Addition kommutativ ist. Die Reihenfolge der Messpunkte spielt also keine Rolle.
Das allein wäre ja nicht schlimm, aber in Kombination mit
Aufgabenstellung schrieb:
Verwenden Sie für x und y eindimensionale Felder ...
impliziert das die Trennung der X- von den Y-Werten und - wer hät's gedacht - führt das zu diesem Code
helpmeman schrieb:
cout << "Geben Sie " << n << " Messpunkte ein! \nErstmal NUR die X-Koordinaten in numerischer Reihenfolge:\n"; for ( i=0; i<n; i++ ) cin >> x[i]; cout << "Nun die zugeh\x94rigen Y-Koordinaten:\n"; for ( i=0; i<n; i++ ) cin >> y[i];man stelle sich den unbedarften Anwender vor, der die X-Werte brav aufsteigend und anschließend die Y-Werte eingibt .. vielleicht merkt er gar nicht, dass er ein falsches Ergebnis bekommt, wenn er aus Versehen unbewusst einem X_i eine Y_j zuordnet. Das macht das ganze aber auch nur schlimmer.
Und zusammen mit "wir lernen jetzt C++" und
Aufgabestellung schrieb:
.. Felder mit jeweils maximal 1000 Elementen
macht das das Bild rund und zeigt mir, welch Geistes Kind hier am Werke ist. Und wieso überhaupt Felder oder Container - es ginge doch auch ohne!
Das mathematische Modell, welches hier IMHO angebracht ist, wäre eine Menge von Messpunkten und nicht zwei Mengen - einmal mit X- und einmal mit Y-Werten.
Versteht mich bitte nicht falsch - ich kritisiere nicht, wenn ein Lernender in diesem Fall eine Lösung mit eindimensionalen Felder/Container wählt. Ich kritisiere, dass es in der Aufgabenstellung explizit gefordert ist.
Der lernende helpmeman - der nichts dafür kann - bekommt noch ein/zwei Dutzend solcher Aufgaben und wird dann irgendwann auf die wahren Programme los gelassen, wo er nicht mehr 100 sondern 100000'de von Programmzeilen in diesem Stil erzeugt. Ich kenne diese Art von Programmen nur zu gut - ich weiß sehr wohl wie viel Nerven, Zeit und Geld es zusätzlich(!) kostet damit klar zu kommen - und es regt mich auf, wenn dergleichen (immer noch) an Unis oder Schulen gelehrt wird.
In diesem Sinne
Werner
-
Ich bezweifle stark, dass Leute anhand solcher Aufgaben das Programmieren (ver)lernen. Das sind doch letztlich nur Kleinigkeiten. Und mit jeder Rafinesse die man dazufordert verliert man ne Hand voll leute, die nichtmal bis zum eigentlich Kern der Aufgabenatellung vordringen. Insofern macht es durchaus Sinn die Aufgabenstellung so einfach wie möglich zu halten. Das kann auch dadurch geschehen, dass man eben teile der Lösung vorgibt.
Das Argument mit dem Anwender zieht imo nicht, weil im Ernstfall natürlich niemand sie Daten so eingibt, sondern die hoffentlich zu dem Zeitpunkt schon irgendwie im Speicher sind. Nur damit die Übung leicht getestet werden kann gibts halt noch ein bisschen hilfe in der Aufgabenstellung.
-
Für welche Zeilen ist der header cmath notwendig?
-
Werner Salomon schrieb:
Versteht mich bitte nicht falsch - ich kritisiere nicht, wenn ein Lernender in diesem Fall eine Lösung mit eindimensionalen Felder/Container wählt. Ich kritisiere, dass es in der Aufgabenstellung explizit gefordert ist.
Sowas kotzt mich auch immer an. Aber wenigstens wird hier nichts gefordert was wirklich falsch ist.
-
hustbaer schrieb:
Werner Salomon schrieb:
Versteht mich bitte nicht falsch - ich kritisiere nicht, wenn ein Lernender in diesem Fall eine Lösung mit eindimensionalen Felder/Container wählt. Ich kritisiere, dass es in der Aufgabenstellung explizit gefordert ist.
Sowas kotzt mich auch immer an. Aber wenigstens wird hier nichts gefordert was wirklich falsch ist.
Für manche Studenten sind einfache Programme schon eine Tortur! Interessiert sie halt nicht!

Das hier sieht mir nach einer Pflichtvorlesung aus, wo jeder mal was gemacht haben muss. Die, die das nicht interessiert, werden solche praktischen Fächer später sowieso abwählen. Und die, die Freude daran haben, beschäftigen sich eh intensiver damit und programmieren auch entsprechend.
Bei uns (Mathe) war die Aufgabe: Programm muss auf Linux laufen, keine weiteren Bibliotheken ausser den Std Bibliothek nutzen und richtige Ergebnisse liefern.
Bei den Programmen, die abgegeben wurden, war jede Menge Raffinesse oder rohe Gewalt dabei. Je nachdem...
Man muss in einer Pflichtveranstaltung ja nicht jeden erreichen.
Werner Salomon schrieb:
Mathematik heißt doch auch aus der Realität ein logisches Modell zu erarbeiten, was man formal beschreiben kann.
Mit Verlaub! Das ist jetzt aber eine sehr naive Aussage!
