Reihe berechnen nur mit Arithmetik und Logik
-
SeppJ schrieb:
Ich frage mich, ob man noch ein paar typedefs einführen sollte. Das Wort double kommt für meinen Geschmack recht häufig vor, was wenn man später mal genaueres möchte?
Jo, ich schlage mal vor, die wichtige Funktion per Template-Parameter mit den Typen zu versorgen.
#include<iostream> #include<numeric> #include<iterator> #include<algorithm> #include<vector> template<typename numtype,typename counttype> class Addend: public std::iterator<std::input_iterator_tag, double> { private: counttype n; public: Addend(counttype n=0):n(n) {} numtype operator*() { return numtype(1)/numtype((2*n+1)*(2*n+1)); } Addend& operator++() { ++n; return *this; } Addend operator++(int) { Addend old(*this); ++n; return old; } friend bool operator!=(Addend lhs, Addend rhs) { return lhs.n != rhs.n; } friend bool operator==(Addend lhs, Addend rhs) { return lhs.n == rhs.n; } }; template<typename numtype,typename counttype> void solve(counttype max_part=3,counttype max_n=530947) { typedef Addend<numtype,counttype> Ad; std::vector<numtype> partial_sums(max_part); std::partial_sum(Ad(), Ad(max_part), partial_sums.begin()); std::ostream_iterator<numtype> double_out(std::cout, "\n"); std::cout << "Die ersten " << max_part <<" Teilsummen:\n"; std::copy(partial_sums.begin(), partial_sums.end(), double_out); std::cout << "Summe von n=0 bis n=" << max_n << ": " << std::accumulate(Ad(), Ad(max_n + 1), numtype(0)) << std::endl; } int main() { solve<double,unsigned int>(); }
-
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>
gearbeitetnormal 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; }
-
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
-
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.jpgund 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.
-
Du hast auch sonst noch sehr viele Grundlagenfehler drin:
void main()
Auch in C heißt diesint 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
breakdort 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.
-
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.