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


  • Mod

    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 ein int herauskommen. Caste mindestens einen Typen vor der Division oder benutze float -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 3

    Mein 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


Log in to reply