Pi ermitteln
-
Hallo zusammen,
Nun ich bin neue hier (C++ Anfänger)und wie aus dem Titel schon ersichtlich habe ich natürlich auch eine Frage bezüglich eines C++ Programmes.
Es funktioniert nicht richtig, also gibt immer ganze Zahlen, statt Kommazahlen wie Pi es ist, aus.
Es sollte Pi ermittelt werden, also so: 1/1 - 1/3 + 1/5...
Das dividieren wie oben als Beispiel angegeben hängt von der Eingegebenen Zahl 'a' (im Programm) ab.
Wobei 'n' der Nenner ist, 'i' die Laufvariable in der for-Schleife und e=die Zahl ist.
Hier ist der Code:#include<stdio.h> #include<conio.h> #include<stdlib.h> void main () { int a,n=1,i; float e,pi=0; clrscr(); gotoxy(2,2); printf("GEBEN SIE DIE ANZAHL MIT DER pi ERMITTELT WERDEN SOLL EIN:"); gotoxy(60,2); scanf("%d",&a); for(i=1;i<=a;i++) { e=1/n; n=n+2; pi=pi+e; n=n*(-1); } pi=pi*4; gotoxy(2,10); printf("pi="); gotoxy(7,10); printf("%f",pi); getch(); }
Hoffe Ihr könnt mir helfen.
Mit freundlichen Grüßen, ein verzweifelter C++ Programmierer, Thorsten
-
Wenn in einem Ausdruck nur int Typen vorkommen, wie hier bei 1/n, dann wird auch nur mit ints gerechnet. Das bedeutet, es kommt nur der ganzzahlige Anteil am Ergebnis der Division heraus. Verhindern kann man dies, indem man eine der beiden Zahlen zu einem double macht. Das kann man entweder durch umcasten der Variable machen oder, da hier ein Teil des Ausdrucks ein Literal ist, indem man das Literal als double angibt:
e=1./n;
P.S.: Das hier ist übrigens das C++ Unterforum, du machst reines C. Wenn du mal speziellere Fragen hast, solltest du im C Unterforum fragen, da kann man dir dann besser helfen.
-
Will ja nichts sagen,... aber das ist kein C++.
Das ist reines C.
-
Thorsten C++ schrieb:
Mit freundlichen Grüßen, ein verzweifelter C++ Programmierer, Thorsten
Du meinst wohl verzweifelter C-Programmierer. In deinem Code ist kein Stück C++.
Wenn du zwei
int
dividierst, wird wieder einint
herauskommen. Caste mindestens einen Typen vor der Division oder benutzefloat
-Literale:e = 1.f/n;
Falls du doch C++ und nicht C programmieren willst:
#include <iostream> // du brauchst keine C-Header mehr int main() // main muss int zurückgeben { int a,n=1,i; // Variablen erst dann deklarieren, wenn man sie braucht float e,pi=0; clrscr(); // nicht C++- oder C-Standard gotoxy(2,2); // nicht C++- oder C-Standard printf("GEBEN SIE DIE ANZAHL MIT DER pi ERMITTELT WERDEN SOLL EIN:"); // in C++ ist std::cout normalerweise angebrachter als printf() scanf("%d",&a); // statt scanf() kannst du std::cin verwenden // Statt dieser Schleife... for(i=1;i<=a;i++) { e=1/n; n=n+2; pi=pi+e; n=n*(-1); } // ...nimmst du diese: for (int i = 1; i <= a; ++i) // i erst hier deklarieren { e = 1.f/n; // float verwenden n += 2; // Operator += pi += e; // Operator += n = -n; // Besser Vorzeichen wechseln als multiplizieren } pi *= 4; // Operator *= }
-
Reines C ist es auch nicht
-
Ich weiß nicht ob es schon einer gesagt hat, aber das ist kein C++. Das ist reines C.
-
übrigens schrieb:
Ich weiß nicht ob es schon einer gesagt hat, aber das ist kein C++. Das ist reines C.
ist es eben nicht^^
ist zwar C++ dabei, aber gotoxy, clrscr und getch sind alles dreis imho keine ansi C funktionen
-
Hab irgendwie sowas gehört.
-
Hallo zusammen,
Danke für eure Antworten.
Ach ja ich Programmier im Borland C dort schreibt es, wenn man es öffnet, immer C++ hin, deswegen schrieb ich bei meinen ersten Beitrag C++.OK Danke nochmals, das Prog. rechnet jetzt mit Nachkommastellen
(der Fehler wäre mir überghaupt nicht aufgefallen ,danke nochmals)
doch leider gibt es wenn man z.B. bei 'a' 3 eingibt keine 3,466667 aus.Ist da noch was falsch?
Mit freundlichen Grüßen, ein schlauer gewordener C Programmierer, Thorsten
-
Thorsten C++ schrieb:
leider gibt es wenn man z.B. bei 'a' 3 eingibt keine 3,466667 aus.
Sondern?
Wenn dein Programm in ANSI-C wäre, würd ich's vielleicht ausprobieren, aber Borland hab ich grad nicht da (mein DOS-PC ist schon ein paar Jahre eingemottet).
-
Hallo Bashar,
Er gibt 6.666667 aus, bei Eingabe von 3Mein prog. ist leider nicht in ANSI-C.
mfg Thorsten
-
Ah ich seh schon, dein Algorithmus ist falsch:
for(i=1;i<=a;i++) { e=1/n; n=n+2; pi=pi+e; n=n*(-1); }
Nach dem ersten Durchlauf ist n -3 (richtig), nach dem zweiten Durchlauf ist n -(-3+2) = 1 (falsch). Wenn ich nicht irgendeinen Trick übersehe, muss man das Vorzeichen getrennt vom Nenner verwalten:
int sign = 1; for (i=1; i<=a; ++i) { pi += sign * 1.0 / n; sign = -sign; n += 2; }
-
Heyyyyy, Bashar,
DANKE es funktioniert , du hast recht gehabt, mein Algorithmus war falsch.
D A N K E
sehr nette und gute Grüße, Thorsten