Mehrere (Anfänger-) Fragen zu C# (c sharp)

D

Dunklestoast

Ich arbeite gerade an einem Programm das Pi auf soviele Stellen hinter dem Komma wie man will berechnet (falls möglich).

Das ist mein erstes Problem:
Die variable double speichert, wenn ich mich nicht irre, nur 8 Stellen nach dem Komma ab, ich brauche jedeoch einen Variablen-Typ der mir unbegrenzte Stellen erlaubt.

Ansonsten könnte ich auch PI mit ..... Nachkommastellen kopieren. Da kommt es zu meiner nächsten Frage:
Kann ich eine Zahl (in dem Fall die Nachkommastellen von PI) in einer externen Datei speichern? Und wie kann ich sie in mein anderes Dokument einfügen? (Windows Forms)
Ich möchste das es dann so ausgegeben wird:
(Variablentyp) pi = 3, (externe Datei);

Frage 3:
Falls das oben funktioniert, möchte ich das man die Zahl runden kann. Ich weis nicht wie es funktioniert, allerdings soll die oben gezeigte Variable aufgerufen werden, und die externe Datei auf soviele Stelllen gerundet werden, wie die Variable "anzahl" angibt.

Es währe shön wenn mir jemand helfen könnte. Und da ich noch ein Anfänger bin, würde ich mich auch über Erläuterrungen freuen :)
 
Mehr als 15 bis 16 Stellen Genauigkeit solltest du nie benötigen in deinem Algorithmus, da praktisch keine Rechnung unterhalb 10^-16 numerisch genau ist. Unbeschränkte Stellen gibt es nicht. Finde einen Algorithmus der das umgehen kann indem du nicht mehr Genauigkeit auf einmal brauchst und einfach sequentiell die nächste Kommastelle berechnest.

2.
Ja, du kannst das über System::IO::FileStream einlesen und auslesen. Du kannst dann einen string erstellen mit string strvar = "3." + inhalt; und über double.TryParse umwandeln. Aber auch da: mehr als 16 Stellen Genauigkeit wirst du nicht bekommen.

3.
Da du sowieso schon einen anderen Weg für grosse Nachstellenzahl finden musst wird das auch nicht in einer Variabeln gespeichert, daher kann man das dann später noch genauer anschauen.
 
So, ich habe jetzt mal etwas aus Java in C# übersetzt, womit man, nach wikipedia, einigermaßen pi berechnen kann.

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
                berechne_pi();
                Console.ReadLine();
        }
                public static double berechne_pi(int tropfenzahl)
        {
            double pi = 0;
            int innerhalb = 0;
            int gesamt = tropfenzahl;

            while (tropfenzahl > 0)
            { // generiere Tropfen und addiere je nach Zugehörigkeit
                double dotx = Convert.ToDouble(new Random());
                double doty = Convert.ToDouble(new Random());

                if (dotx * dotx + doty * doty <= 1)
                {
                    // Punkt liegt innerhalb des Kreises
                    innerhalb++;
                }
                else
                {
                    // Punkt liegt außerhalb des Kreises
                }

                tropfenzahl--;
            }

            pi = 4 * (double)innerhalb / gesamt;
            return pi;
        }
    }
}
http://de.wikipedia.org/wiki/Kreiszahl <--- statische Bestimmungen
Aber irgendwie bekomme ich kein Ergebnis, sondern nur eine Fehlermeldung: "Keine Überladung für die berechne_pi-Methode nimmt 0 Argumente an."
Ich weiß leider nicht was ich falsch gemacht habe, hoffentlich kann jemand helfen :S

PS: Thx @ Cromon für die vorherigen Antworten ;)
 
Da du deine Methode berechni_pi mit einem Int-Parameter deklariert hast, musst du in deiner Main natürlich der Methode einen Parameter mitgeben.
 
Kannst du vllt genauer erläutern was du meinst? ich verstehe icht so recht :S
 
Deine Methodendeklaration sieht wie folgt aus:


public static double berechne_pi(int tropfenzahl) <----- (hier hast du angegeben, dass eine Zahl als Parameter übergeben werden soll)
{
double pi = 0;
//Verarbeitung deiner Methode
....
return pi;
}


Nun hast du die oben genannte Methode wie folgt in deiner Main aufgerufen:

berechne_pi(); <--- da hier KEIN Parameter übergeben wurde, haut dir der Compiler auf die Finger


Deshalb musst du eine Zahl beim Methodenaufruf mitgeben:


static void Main(string[] args)
{
Console.WriteLine("Geben Sie eine Zahl ein");
int zahl = Int32.Parse(Console.ReadLine());
//jetzt könntest du noch überprüfen, ob es auch wirklich eine Zahl ist, etc

// und die eingegebene Zahl übergibst du jetzt der Methode

//Rückgabewert abspeichern
double ergebnis = berechne_pi(zahl);

//jetzt kannst du mit dem Ergebnis machen was du willst, beispielsweise auf der Konsole ausgeben:
Console.WriteLine("PI: " + ergebnis);
}
 
Zuletzt bearbeitet:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int zahl = Convert.ToInt32("1");
            berechne_pi(zahl);
            Console.ReadLine();
        }
        public static double berechne_pi(int tropfenzahl)
        {
            double pi = 0;
            int innerhalb = 0;
            int gesamt = tropfenzahl;

            while (tropfenzahl > 0)
            { // generiere Tropfen und addiere je nach Zugehörigkeit
                double dotx = Convert.ToDouble(new Random());
                double doty = Convert.ToDouble(new Random());

                if (dotx * dotx + doty * doty <= 1)
                {
                    // Punkt liegt innerhalb des Kreises
                    innerhalb++;
                }
                else
                {
                    // Punkt liegt außerhalb des Kreises
                }

                tropfenzahl--;
            }

            pi = 4 * (double)innerhalb / gesamt;
            return pi;
        }
    }
}
"Das Objekt des Typs "System.Random" kann nicht in Typ "System.IConvertible" umgewandelt werden."

Eine neue Fehlermeldung. Erscheint beim Compilern...
 
C#:
(new Random()).Next()
könnte funktionieren (habe es nicht getestet)
Mit "new Random" erstellst du ein neues Objekt, welches dir Zufallszahlen generiert. Mit der Next-Methode lässt du dir dann aber erst die Zufallszahl ausgeben. Es wäre übrigens sinnvoller, nur ein einziges Random-Objekt zu erzeugen und dann immer die Next-Methode aufzurufen, anstatt bei jedem Mal ein neues Objekt zu erstellen.
Die Next-Methode gibt dir aber Integer-Zahlen aus; was du willst ist aber eine Zahl zwischen 0 und 1. --> Pi wird bei dir nicht korrekt berchnet werden.
Du müsstest also sowas schreiben:
C#:
Random.Next() / Integer.MaxValue
 
Zurück