using System;

namespace B_GOP01XX_XX2_K03_Aufgabe_1
{
    class WallisschesProdukt
    {
        public double berechnePi(int n)
        {
            double halfPI = 1.0;
            double step = 1.0;
            for (double i = 1.0; i < Convert.ToDouble(n); i++, step++)
            {
                if (i % 2 == 0)
                {
                    halfPI *= (step / (step + 1));
                }
                else
                {
                    halfPI *= ((step + 1) / step);
                }
            }
            return (halfPI * 2.0);
        }
    }
    class Helfer
    {
        // Zeilenpuffergröße erhöhen um bei MS (Spielzeug) Windows alle 1000 Zeilen der Ausgabe sichtbar zu halten 
        public void zeilenpufferErhoehen()
        {
            Console.BufferHeight = 2020;
        }
        static int tabellenWeite = 69;

        // Linienausgabe f. Tabelle
        public void linieAusgeben()
        {
            Console.WriteLine(new string('-', tabellenWeite));
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            WallisschesProdukt walisschesProdukt = new WallisschesProdukt();
            Helfer helfer = new Helfer();
            helfer.zeilenpufferErhoehen();

            // Gebe die Tabellenkopfzeile auf der Konsole aus
            Console.WriteLine(String.Format("|{0, 4}|{1,-5}|{2, 0}|{3, 0}|", " Faktor: ", " Walis. Produkt: ", " Differenz-Math.PI:", " Abweichung in % "));

            
            for (int i = 2; i <= 1002; i++)
            {
                // Ausgabe vor erstem wp überspringen um bei n = 1 istgleich 2,666666666666670 mit der Ausgabe zu beginnen
                if (i.Equals(2)) continue;

                // Walissches Produkt berechnen und in Variable speichern
                double erg = walisschesProdukt.berechnePi(i);
                
                // Ausgabe der Tabelle aus der Konsole
                helfer.linieAusgeben();
                Console.WriteLine(String.Format("|{0, 4}{1, -5}|{2, 5:F15}|"+"{3, -8:F17}|{4, -5}|"+ "", "n=", i-2, erg, Math.Abs(erg - Math.PI), (Math.Abs(erg - Math.PI)/(Math.PI / 100)) + "%"));
            }
            // Gebe die Tabellenkopfzeile erneut als Fusszeile auf der Konsole aus
            helfer.linieAusgeben();
            Console.WriteLine(String.Format("|{0, 4}|{1,-5}|{2, 0}|{3, 0}|", " Faktor: ", " Walis. Produkt: ", " Differenz-Math.PI:", " Abweichung in % "));

        }
    }
}