Hilfe bei eindimensionalen Feldern

cwriter

Erfahrenes Mitglied
Geschrieben wurde ja schon das ich es mit einer For-Schleife mache aber wie muss die aussehen das immer x1,y1 dann x2, y2 usw. genommen wird?
Ich verstehe diese Frage nicht so ganz.

Nehmen wir als Beispiel die Formel für A.
Dort ist im Zähler ja als erstes die Summe von x_i^2 aufgelistet.
Dieser Teil der Gleichung lässt sich als
C:
double sum = 0.0;
for(size_t i = 0; i < anzahln; i++)
{
    sum += nx[i] * nx[i];
}
ausdrücken, wobei "sum" hier einfach die Teilsumme darstellt.
Man könnte so eine Summenfunktion folgendermassen schreiben:
C++:
#include <functional>

double sum(double* data, size_t start, size_t end, std::function<double(double)>& func)
{
    double ret = 0.;
    for(size_t i = start; i < end; i++)
    {
        ret += func(data[i]);
    }
    return ret;
}

//Aufruf für das Beispiel oben:
sum(&nx, 0, anzahln, [](double val){ return val * val; });
Das ist aber schon eher für Fortgeschrittene, allerdings würde es dir ersparen, sehr viele Loops zu schreiben (oder einen schnelleren, aber unübersichtlicheren Code zu erschaffen).
Falls dich das Thema interessiert: Suche nach "Lambda-Funktionen".

Diese einzelnen Summenblöcke kannst du nun im Voraus berechnen und dann in die eigentlichen Gleichungen einsetzen.

Konkreter:
Geschrieben wurde ja schon das ich es mit einer For-Schleife mache aber wie muss die aussehen das immer x1,y1 dann x2, y2 usw. genommen wird?
Falls du auf das letzte Summenkonstrukt im A-Zähler ansprichst:
C:
double sum = 0.0;
for(size_t i = 0; i < anzahln; i++) //anzahln ist immer gleich für nx und ny
{
    sum += nx[i] * ny[i];
}
Schlussendlich ist das eigentlich nur eine Umsetzung der Mathematik dieser Formeln... Ist dir denn etwas an den Formeln selbst unklar oder weisst du nur nicht, wie du die Formeln in C++-Code umwandeln kannst?

Gruss
cwriter
 

Thaelisin

Mitglied
Ja genau, es scheitert an der Umsetzung der Mathematik in Code, also zumindest als ersteres. Muss ich für Jedes Summenkonstrukt eine eigene Schleife bauen? Und falls ja, wie werden dann die Ergebnisse der einzelnen schleifen zusammengerechnet?
 

cwriter

Erfahrenes Mitglied
Muss ich für Jedes Summenkonstrukt eine eigene Schleife bauen?
Nein, du kannst alle Teilsummen in einer einzelnen Schleife bauen, da alle Summenkonstrukte dieselben Start- und Endpunkte haben.

Und falls ja, wie werden dann die Ergebnisse der einzelnen schleifen zusammengerechnet?
Die Antwort war zwar "nein", aber die Resultate werden ganz normal mathematisch zusammengerechnet...

Du kannst ja sowas machen:
C:
double SummeXQuadrat = 0.0;
double SummeX = 0.0;
double SummeY = 0.0;
//usw
for(size_t i = 0; i < anzahln; i++)
{
SummeXQuadrat += nx[i] * nx[i];
SummeX += nx[i];
SummeY += ny[i];
//usw
}
Und dann kannst du diese Summen einfach als Variablen einsetzen.

Gruss
cwriter
 

Thaelisin

Mitglied
Juhu die Rechnung klappt schon mal! Vielen Dank!
Jetzt muss ich noch die Nenner prüfen. Hier schon mal wie es jetzt aussieht:

C++:
#include <iostream>
#include <cmath>

using namespace std;

void main(void)

{

    int anzahln;
    int i = 0;
    double nx[1000], ny[1000];
    double A, B;

    cout << "Bitte geben sie die Anzahl der x und y Werte ein: " << endl;

    do
    {
        cin >> anzahln;
       
    }while (!(anzahln >= 2 && anzahln <= 1000));
    cout << "Anzahln ist: " << anzahln << endl;
        for (i = 0; i < anzahln; i++)
        {
            cout << "Geben sie die x Werte ein: " << endl;
            cin >> nx[i];
            cout << "Geben sie die y Werte ein; " << endl;
            cin >> ny[i];
        }

        double sumXQuadrat = 0.0;
        double sumX = 0.0;
        double sumY = 0.0;
        double sumXmalY = 0.0;
        for (size_t i = 0; i < anzahln; i++)
        {
            sumXQuadrat += nx[i] * nx[i];
            sumX += nx[i];
            sumY += ny[i];
            sumXmalY += nx[i] * ny[i];
        }
       
        A = (sumXQuadrat*sumY - sumX*sumXmalY) / (anzahln*sumXQuadrat - sumX*sumX);
        B = (anzahln*sumXmalY - sumX*sumY) / (anzahln*sumXQuadrat - sumX*sumX);

        cout << "y = " << A << "+" << B << "*x" << endl;
   
}
 

Thaelisin

Mitglied
Ich glaub ich hab´s tatsächlich geschafft! hier mein kompletter Code!
Und gleich noch eine Frage: Ich muss noch ein paar weitere Aufgabe durcharbeiten, besser gesagt eine Weitere, worauf der Rest aufbaut. Dazu öffne ich einen neuen Thread, oder? Es behandelt mehrdimensionale Felder, Zeichenfolgen und Sortierungen.

C++:
#include <iostream>
#include <cmath>

using namespace std;

void main(void)

{

    int anzahln;
    int i = 0;
    double nx[1000], ny[1000];
    double A, B, Aa,Ab,Ba,Bb;

    cout << "Bitte geben sie die Anzahl der x und y Werte ein: " << endl;

    do
    {
        cin >> anzahln;
       
    }while (!(anzahln >= 2 && anzahln <= 1000));
    cout << "Anzahln ist: " << anzahln << endl;
        for (i = 0; i < anzahln; i++)
        {
            cout << "Geben sie die x Werte ein: " << endl;
            cin >> nx[i];
            cout << "Geben sie die y Werte ein; " << endl;
            cin >> ny[i];
        }

        double sumXQuadrat = 0.0;
        double sumX = 0.0;
        double sumY = 0.0;
        double sumXmalY = 0.0;
        for (size_t i = 0; i < anzahln; i++)
        {
            sumXQuadrat += nx[i] * nx[i];
            sumX += nx[i];
            sumY += ny[i];
            sumXmalY += nx[i] * ny[i];
        }
        Aa = (sumXQuadrat*sumY - sumX*sumXmalY);
        Ab = (anzahln*sumXQuadrat - sumX*sumX);

        if (Ab <= 0)
        {
            cout << "Ihr Nenner ist kleiner oder gleich Null!" << endl;
            return;
        }

        Ba = (anzahln*sumXmalY - sumX*sumY);
        Bb = (anzahln*sumXQuadrat - sumX*sumX);

        if (Bb <= 0)
        {
            cout << "Ihr Nenner ist kleiner oder gleich Null!" << endl;
            return;
        }

        A = Aa / Ab;
        B = Ba / Bb;

        cout << "y = " << A << " + " << B << "* x" << endl;
   
}
 

cwriter

Erfahrenes Mitglied
Dazu öffne ich einen neuen Thread, oder?
Ja, wäre wohl am übersichtlichsten.

Ich würde nicht auf 0, sondern auf (double)0 (also auf eines von 0.0, 0., .0) überprüfen. Man sollte sich früh angewöhnen, doubles nicht mit ints zu vermischen (Rundungsfehler).
Zudem müsstest du nur auf == 0.0 überprüfen (kann je nach System ein bisschen schneller gehen, kommt hier aber nicht wirklich drauf an. Ausser, dass die Aufgabenstellung (nur) die Prüfung auf 0.0 verlangt).

Ansonsten scheint der Code beim Überfliegen korrekt.

Gruss
cwriter