Reihe berechnen nur mit Arithmetik und Logik



  • Koebbe schrieb:

    normal machen wir alles mit
    #include <stdio.h>

    Also lernt ihr C und nicht C++?



  • Koebbe schrieb:

    😃 hört sich erstmal alles ganz nett an.

    Nur haben wir bis jetzt noch nicht mit

    #include <iostream>
    #include<numeric>
    #include<iterator>
    #include<algorithm>
    #include<vector>
    gearbeitet

    normal machen wir alles mit
    #include <stdio.h>

    Bist du sicher, dass du eine C++ und keine C Vorlesung besuchst?



  • SeppJ schrieb:

    So, mit volkards und brotbernds Anmerkungen hier eine neue Version.

    Wenn du das Ergebnis von partial_sum nicht für das anschließende accumulate, benutzt, kannst du doch für partial_sum gleich deinen double_out benutzen.

    template<typename numtype,typename counttype>
    void solve(counttype max_part=3,counttype max_n=530947)
    {
        typedef Addend<numtype,counttype> Ad;
        std::ostream_iterator<numtype> double_out(std::cout, "\n");
        std::cout << "Die ersten " << max_part <<" Teilsummen:\n";
        std::partial_sum(Ad(), Ad(max_part), double_out);
        std::cout << "Summe von n=0 bis n=" << max_n << ": " << std::accumulate(Ad(), Ad(max_n + 1), numtype(0)) << std::endl;
    }
    

  • Mod

    Schöne Verbesserungen 👍 . Eine habe ich auch noch:
    Der Operator++(int) sollte besser so aussehen:

    Addend operator++(int)
      {
        Addend old(*this);
        ++(*this);
        return old;
      }
    

    Dann ist das robust gegen Änderungen an der Inkrementierungsfunktionalität der Klasse.



  • Hmm ne jetzt bin ich mir grade nicht sicher. Bin leider nicht der Fitteste im Programmieren. Habe grade noch einmal geschaut, aber wie ihr es euch denken könnt es ist C 😞

    Da kann ich auch verstehen warum eure Programme anders sind



  • Da hat sich ja schon wieder ein std::endl eingeschlichen. 😮



  • Koebbe schrieb:

    Hmm ne jetzt bin ich mir grade nicht sicher. Bin leider nicht der Fitteste im Programmieren. Habe grade noch einmal geschaut, aber wie ihr es euch denken könnt es ist C 😞

    Dann stell die Frage nochmal im C-Forum. Und schreib dazu, was Du schon hast. Je mehr Du schon hast, desto hilfreicher werden die Antworten.



  • SeppJ schrieb:

    Eine habe ich auch noch:

    Auch noch einen

    friend bool operator!=(Addend lhs, Addend rhs)
    {
      return !(lhs == rhs);
    }
    friend bool operator==(Addend lhs, Addend rhs)
    {
     return lhs.n == rhs.n;
    }
    


  • Ja danke ich versuche mein bestes 😃

    Aber danke euch trotzdem für die schnelle und doch recht Großen Hilfsversuche

    Sorry für die umstände


  • Mod

    volkard schrieb:

    Da hat sich ja schon wieder ein std::endl eingeschlichen. 😮

    Dieses Mal meine ich es auch. Am Ende will ich, dass der Puffer geflusht wird.

    edit: Wobei ich nicht technisch begründen kann, wieso. Jetzt wo ich drüber nachdenke macht es keinen Sinn, da das cout-Objekt am Programmende ja zerstört werden sollte und dabei geflusht wird.



  • SeppJ schrieb:

    Eine habe ich auch noch:
    Der Operator++(int) sollte besser so aussehen:

    Addend operator++(int)
      {
        Addend old(*this);
        ++(*this);
        return old;
      }
    

    brotbernd schrieb:

    Auch noch einen

    friend bool operator!=(Addend lhs, Addend rhs)
    {
      return !(lhs == rhs);
    }
    friend bool operator==(Addend lhs, Addend rhs)
    {
     return lhs.n == rhs.n;
    }
    

    Oder kurz:

    class Addend : public boost::input_iterator_helper<Addend, double>
    {
    private:
      unsigned int n;
    public:
      Addend(unsigned int n=0):n(n){}
      double operator*()
      {
        return 1./((2*n+1)*(2*n+1));
      }
      Addend& operator++()
      {
        ++n;
        return *this;
      } 
      friend bool operator==(Addend lhs, Addend rhs)
      {
        return lhs.n == rhs.n;
      }
    };
    

    - das template von dem abgeleitet wird definiert op!=, op++(int), op-> und die typedefs des std::iterator, die benötigt werden.
    siehe http://www.boost.org/doc/libs/1_39_0/libs/utility/operators.htm#iterator
    und magazin (http://magazin.c-plusplus.net/artikel/�berladung von Operatoren in CPlusPlus (Teil 3) - boost%3A%3Aoperators f�r Fortgeschrittene) 🤡



  • Da ich in dem Selben Semester mit dir an der FH D studiere habe ich auch noch eine kleine Frage zum Thema.

    meine Reihe sieht so aus :
    http://www.bilder-hochladen.net/files/1a0a-7.jpg

    und ich bin so weit:

    #include<stdio.h>
    
    void main()
    {
    	printf("*************************************\n");
    	printf("*         Schleifenaufgabe          *\n");
    	printf("*        Autor: Yannik Baus         *\n");
    	printf("*************************************\n\n");
    
    	int m,n,k;
    	double p;
    
    	printf("Bitte geben Sie n an:\t");
    	scanf_s("%i", &n);
    
    		m=0;
    		p=1;
    		k=0;
    
    		while(m<=n)	
    		{
    		p=p+1/k;
    		k*3;
    		m+1;
    		}
    
    	printf("\nDas Ergebnis lautet: %d\n",p);
    }
    

    BZW. so weit:

    #include<stdio.h>
    
    void main()
    {
    printf("*************************************\n");
    printf("* Schleifenaufgabe *\n");
    printf("* Autor: DisasterMaster *\n");
    printf("*************************************\n\n");
    
    int m,n,k;
    double p;
    
    printf("Bitte geben Sie n an:\t");
    scanf_s("%i", &n);
    
    p=1;
    
    for(m=1 ; m<=n ; m++)
    
    for(k=3 ; k>0 ; k=k*3){
    p+=1/k;
    break;
    }
    
    printf("\nDas Ergebnis lautet: %d\n",p);
    }
    

    Ich kriege jedoch immer nur eine 0 als antwort.
    Bitte schnell um Hilfe.

    /edit pumuckl: cpp-Tags. Demnächst bitte selbst machen!



  • Die Antwort auf die 0 steht bereits in diesem Thread.
    int geteilt durch int ergibt int.



  • DisasterMaster schrieb:

    Ich kriege jedoch immer nur eine 0 als antwort.
    Bitte schnell um Hilfe.

    Lies dir die erste Seite des Threads durch.



  • Dummerweise schnall ich es trotzdem nicht. Was muss ich denn jetzt genau machen?

    #include<stdio.h>

    void main()
    {
    printf("\n");
    printf("
    Schleifenaufgabe \n");
    printf("
    Autor: DisasterMaster \n");
    printf("
    \n\n");

    int m,n,k;
    double p,f;

    printf("Bitte geben Sie n an:\t");
    scanf_s("%i", &n);

    p=1;

    for(m=1 ; m<=n ; m++){

    for(k=3 ; k>0 ; k=k*3){
    f=1.0/k;
    p+=f;
    break;
    }
    }
    printf("\nDas Ergebnis lautet: %d\n",p);
    }

    So zeigt es mir zwar keine 0 mehr an, dafür aber ganz unrealistische Zahlen.


  • Mod

    Du hast auch sonst noch sehr viele Grundlagenfehler drin:

    void main()
    Auch in C heißt dies int main() .

    k*3;
    Dies berechnet was k*3 ist und verwirft den Wert dann. Es wird nicht der Wert von k verdreifacht!

    m+1;
    dito.

    `

    printf("\nDas Ergebnis lautet: %d\n",p); `
    %d ist der Formatstring für Integer, p ist ein double.

    for(k=3 ; k>0 ; k=k*3){
    p+=1/k;
    break;
    }
    

    Was macht das break dort wohl?



  • So ich hoffe ich hab die Kritikpunkte richtig verstanden und umgesetzt, jedoch komm jetzt immer 1 raus 😛

    #include<stdio.h>

    int main()
    {
    printf("\n");
    printf("
    Schleifenaufgabe \n");
    printf("
    Autor: DisasterMaster \n");
    printf("
    \n\n");

    int m,n,k,t;
    double p,f;

    printf("Bitte geben Sie n an:\t");
    scanf_s("%i", &n);

    k=3;
    t=1;
    p=1;
    for(m=t ; m<=n ; m++){

    t=1+1;

    for(k=3; m<=n ; m++){

    f=1/k;
    p=p+f;
    k=3*k;
    }
    }
    printf("\nDas Ergebnis lautet: %f\n",p);
    }
    }



  • Dann halt zum dritten Mal: 1/k = 0. Auch sonst solltest du nochmal überlegen, wie viele Variablen du brauchst und was die genau machen sollen.


  • Mod

    Außerdem ist deine Klammerung glaube ich falsch. Da du es aber selbst beim dritten Anlauf noch nicht hinbekommen hast, deinen Code vernünftig zu formatieren (Benutze den C/C++-Knopf links unter den Smileys), mag ich mir das gerade nicht genauer ansehen.



  • DisasterMaster schrieb:

    #include<stdio.h>
    
    int main()
    {
      int m,n,k,t;
      double p,f;
    
      printf("Bitte geben Sie n an:\t");
      scanf_s("%i", &n);
    
      k=3;
      t=1;
      p=1;
      for(m=t ; m<=n ; m++)
      { 
        t=1+1;
        for(k=3; m<=n ; m++)
        {
          f=1/k;
          p=p+f;
          k=3*k;
        }
      }
      printf("\nDas Ergebnis lautet: %f\n",p);
    }
    

    sind keine fehler korrigiert außer die } zu viel.
    aber vll guckt es sich jz wer an, wo man es auch lesen kann...
    was nen "copyright" in so nem post sucht, werd ich wohl auch niemals verstehen... 😃
    naja - vll falls der lehrer googelt sieht er wenigstens, dass es keine fertig-lösung war...

    for(m=t ; m<=n ; m++)
      { 
        t=1+1;
        for(k=3; m<=n ; m++)
    

    das sieht beim ersten drübergucken aber mehr als falsch aus 😛

    bb


Anmelden zum Antworten