Wie schreibe ich Summen in C++



  • Servus,

    ich muss hier ne Aufgabe beareiten, in der Summen berechnet werden müssen.

    wie schreibe ich eine Summe in C++ ?

    [n]Sigma[i=0] x^4 * [n]Sigma[i=0] (yi * xi)^2 = S1 (S1 ist das Produkt der beiden Summen)

    Ich habe einen Ansatz :

    # include <iostream>
    # include <cmath>
    using namespace std ;
    void main (void)
    {
    int i=0 ;
    int n= i + 1 ;
    doble x , y, S1 ;

    cout << "Eingabe der Werte von x und y: " ;
    cin >> x und y >> endl ;

    S1 = sum(int i, n) * x^4 * (yi * xi)^2 ;

    cout << "S1 = " << S1 ;

    }

    Ich weiß, Freitagabend Männers und Fussball, aber vielleicht hockt ja hier einer der mir helfen kann und will... ich hab keinen Plan und mir dampft der Schädel 😃 😃 😃 😃 😃 😃 because its summer



  • Wieso fragst du wie man in C++ Summen schreibt im C#-Forum? Naja egal, die Antwort ist gleich: Man "schreibt" keine Summen, man berechnet sie. Indem man Schritt für Schritt die einzelnen Summanden aufaddiert, typischerweise in einer Schleife:

    // sum(i = 1..100) i
    int sum = 0;
    int (int i = 1; i <= 100; ++i)
      sum += i;
    


  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Dein Code formatiert und in Tags:

    # include <iostream>
    # include <cmath>
    
    using namespace std;
    
    int main()
    {
    	int i=0 ;
    	int n= i + 1 ;
    	doble x , y, S1 ; /// Du meinst wohl double?
    
    	cout << "Eingabe der Werte von x und y: ";
    	cin >> x und y >> endl ;
    
    	S1 = sum(int i, n) * x^4 * (yi * xi)^2;
    
    	cout << "S1 = " << S1;
    }
    
    void main (void)
    

    Das ist keine standardkonforme main()-Funktion - und zudem ist das void in der Parameterliste überflüssig.

    cin >> x und y >> endl ;
    

    Das endl ist hier übeflüssig - bzw. was soll es überhaupt machen? Das newline überspringen? Je nachdem was du als nächstes einliest ist das überflüssig.
    So liest man zwei Variablen hintereinander ein:

    cin >> x >> y;
    

    Nun zu deiner Summenformel: Du kannst Euler-Maclaurin verwenden um die erste Summe (x=0Nx4\sum_{x=0}^N x^4)in O(1) zu berechnen, für die zweite brauchst du ja eine Reihe. Ich schlage vor

    #include <iostream>
    #include <vector>  // vector
    #include <iterator> // istream_iterator
    
    using namespace std;
    
    struct XYPair // @volkard: Zu viel?
    {
    	double x, y;
    
    	XYPair( double x, double y ) :
    		x{x}, y{y} {}
    };
    
    /// Ermöglicht ein XYPair einzulesen, als ob es ein arithmetischer Typ wie int ist.
    istream& operator>>( istream& is, XYPair& p )
    {
    	return is >> p.x >> p.y;
    }
    
    int main()
    {
    	vector<XYPair> data{ istream_iterator<XYPair>{cin}, {} }; 
    	/* Diese Zeile ist wichtig - Es wird so lange ein Paar eingelesen und in den vector gepackt bis es einen Fehler bei der Eingabe gibt.
    	   Gib' immer zwei Zahlen getrennt durch ein Whitespace ein, und zum beenden der Eingabe gib' bspw. einen Buchstaben ein. */
    
    	double S1 = 0;
            // In dieser Schleife einfach durch jedes Paar durchgehen und das Produkt auf die Summe addieren
    	for( auto p : data )
    		S1 += p.x*p.y;
    
    	cout << "S1 = " << S1;
    }
    


  • Hallo und vielen Dank für die rasche Antwort.
    Das ich in dem falschen Unterforum meine Frage gestellt hatte, wurde mir erst jetzt - durch Deine Antwort - bewusst.
    Ich bin leider noch nicht sehr vertraut mit der Sprache C++ und dem ganzen Drumherum.
    Der Korrektheit meiner Fragestellung wegen:
    Wie schreibe ich in C++ ein Programm, das mir Summen berechnet bzw. das Produkt S1 aus zwei Summen berechnet.

    Es wäre schön, wenn der Antwortende und auch andere - die eventuell auf dieses Thema (im Englischen auch unter dem Word Thread bekannt) mir auf weitere und folgende Fragen eine Antwort liefern könnte bzw. könnten (Um die Summanten meiner Einträge n hier, die von meiner IP ausgehen, so gering wie mählich zu halten).

    Kleiner Spaß :p 😉 😃 🙂 🙂
    Viele Grüße und Danke vorab



  • Hi Arcoth,

    danke für Deine sehr ausfürliche Erklärung!!! Echt Mega, dass Du mir so tolle Tipps gepostet hast!

    Aber ich verstehe nur sehr wenig bzw. sibd mir die Präprozessoranweisungen für die Aufgabe iostream und cmath bekannt.

    Ich studiere Maschinenbau und keine Informatik, das nur zur Info.

    Aber echt ein Dankeschön, vorallem an DICH!

    Liebe Grüße


  • Mod

    Aber ich verstehe nur sehr wenig bzw. sibd mir die Präprozessoranweisungen für die Aufgabe iostream und cmath bekannt.

    Verständlich. Meine Antwort ist auch äußerst allgemein gehalten.

    Hier mal eine primitivere Variante obigem:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    /// Definiert eine Datenstruktur die x und y speichern soll.
    struct XYPair
    {
    	double x, y;
    
    	// Der Konstruktor initialisiert die Elemente.
    	XYPair( double x, double y ) :
    		x{x}, y{y} {}
    };
    
    int main()
    {
    	/** Diese Datenstruktur kann eine dynamische Anzahl von Elementen beliebigen Typs speichern.
    	   (Mannt nennt solche Datenstrukturen aus der Standardbibliothek Container - andere Beispiele sind list (doppelt verkettete Liste)
    	    und set (speichert eine sortierte Menge ohne doppelte Vorkommen in einem Tree)).
    	    Und weil sie mit beliebigen Typen arbeiten kann, nennt man sie ein Template (engl. für Schablone). Zur Terminologie:
    	    vector ist ein (Klassen)Template und vector<XYPair> ist eine Spezialisierung selbigen Templates für den entsprechenden Typ.
    	    (Den Prozess des Generierens einer Klasse aus einer solchen Schablone für einen Typ nennt man im Übrigen Instantiierung)
    	    vector ist der #1-Container den du ab sofort verwenden solltest.
    	    Du kannst Elemente an beliebigen Positionen (am Ende ist üblich) einfügen oder löschen und auf alle über [] zugreifen,
    	    wie gewohnt mit Arrays.
    	*/
    	vector<XYPair> data;
    	double x, y;
    	while( cin >> x >> y ) /// Während das Extrahieren von zwei Fließkommazahlen erfolgreich war,
    		data.emplace_back(x, y); /* Füge ein Element in data ein - dabei sind die Funktionsargumente von emplace_back
    		                            gleichzeitig die Argumente an den Konstruktor des neuen Elements. */
    
    	double S1 = 0; /* Variable S1 definieren und mit 0 initialisieren.
    	                  (Nebenbei: Das Literal 0 hat Typ int, 0.0 oder .0 ist double */
    	for( XYPair p : data ) /* Dieses Statement ist eine for-Schleife, man nennt es range-based for weil
    	                          es über alle Elemente einer Range, also bspw. eines Arrays oder vectors, läuft.
    	                          Im Prinzip ist es als "für jedes p in data" zu verstehen,
    	                          wobei p eine Kopie(!) des Elements des vectors ist. */
    		S1 += p.x*p.y; // Diese Zeile solle selbsterklärend sein
    
    	cout << "S1 = " << S1; // .. dito.
    }
    

Log in to reply