Reihe berechnen nur mit Arithmetik und Logik



  • 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



  • Ich glaube ich habe es geschafft. 😃 juhu 😃
    Vielen Dank für die große Hilfe!



  • Hallo .. ein kleiner Programmier Contest mit SeppJ und Volkard, da darf mein Beitrag nicht fehlen:

    #include <iostream>
    #include <cmath> // std::acos (nur zur Kontrolle)
    #include <numeric> // accumulate
    
    #include <boost/iterator/iterator_adaptor.hpp>
    
    // --   Folge: 1/(2*m+1)^2
    class A : public boost::iterator_adaptor< A, int, double, boost::bidirectional_traversal_tag, const double >
    {
    public:
        explicit A( int m = 0 ) 
            : iterator_adaptor_( m )
        {}
        double dereference() const 
        { 
            int z = 2 * base() + 1;
            return 1.0 / (double(z) * z); // double(z) sonst integer-overflow!
        }
    };
    
    namespace { const double PI = std::acos(-1.0); }
    
    int main () 
    {
        using namespace std;
    
        cout.precision( 8 ); // zeigt den Unterschied zwischen s[n] und s[unendlich]
        const int nn[] = { 0, 1, 2, /*n=*/ 530947 }; // .. zeigen Se das Ergebnis der ersten drei Teilsummen und das Ergebnis für n
        double sum = 0;
        A a(0);
        for( const int* n = nn; n != nn+sizeof(nn)/sizeof(*nn); a = A(*n++ + 1) )
            cout << "n=" << *n << "; sum=" << (sum = accumulate( a, A(*n + 1), sum )) << endl;
    
        cout << "n=unendlich; sum = " << (PI*PI/8) << endl;
        return 0;
    }
    

    Gruß
    Werner



  • [0, 1, 2, 530947].each { |n| puts (0..n).inject(0) { |sum, i| sum + 1.0 / (2*i+1)**2 } }
    

    🤡



  • sum [1/(2*x+1)^2 | x <- [0..530947]]

    🤡


Anmelden zum Antworten