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>
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.
-
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