NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Chyba v programu na odhad pi po druhé

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Regedin the Immortal:14.1.2017 10:57

Už jednou jsem se na fóru ptal ohledně předchozí verze aplikace. Nakonec se ji podařilo zprovoznit a dává celkem reálné hodnoty. Teď jsem se k ní však náhodně vrátil a zkusil ji trochu vylepšit ( základní princip zde ). Zkoušel jsem přidat seznam (list) do kterého by se ukládaly vypočtené hodnoty a z prvků seznamu by se potom určila směrodatná odchylka. Když by směrodatná odchylka poklesla pod pevně stanovenou mez, hodnoty v seznamu by se zprůměrovaly a tento průměr by byl výstupem programu. Někde je ale chyba a sekne se to u řádku ve kterém nevidím chybu. Za každou radu bych byl vděčný

Souradnice souradnice = new Souradnice();
            List<double> hodnoty = new List<double>();
            double s_odchylka = 0;
            int n = 0;
            int h = 0;
            int u = 0;
            double pi;
            double prumer;
            double soucet = 0;
            double soucet_s_odchylka = 0;
            double x;
            double y;
            float pravdepodobnost;
            Console.WriteLine("zadej požadovanou přesnost (přirozené číslo, nesmí překročit rozsah int)");
            int presnost = int.Parse(Console.ReadLine());
            while (Math.Sqrt(s_odchylka) >= 0.01F || (n == 0))
            {
                prumer = 0;
                soucet_s_odchylka = 0;
                u = 0;
                h = 0;
                while (h< presnost)
            {
                x = souradnice.hod();
                y = souradnice.hod();
                if (Math.Sqrt(Math.Pow(x,2)+Math.Pow(y, 2))<=1)
                {
                    u++;
                }
                    h++;
                if (h % (presnost/100) == 0)
                {
                    pravdepodobnost = 100 * (float)u / h;
                    Console.WriteLine("hotovo výpočtu : {0}%     p : " + pravdepodobnost + " %",100 * (float)h/presnost);
                    Console.WriteLine();
                }
                }

            pi = 4 * (double)u / h;
            hodnoty.Add(pi);
                n++;
                Console.WriteLine("předbězně určená hodnota je " + hodnoty[n-1]);
                foreach (int i in hodnoty)
                {
                    soucet = soucet + hodnoty[i];
                }
                prumer = soucet / (double)n;
                foreach(int i in hodnoty)
                {
                    soucet_s_odchylka = soucet_s_odchylka + Math.Pow((prumer - hodnoty[i]),2);
                }
                s_odchylka=soucet_s_odchylka / (double)n;
                Console.WriteLine("určená hodnota pi je " + prumer);
            Console.WriteLine("systémem určená hodnota je " + Math.PI);
            double rozdil = Math.Abs(prumer - Math.PI);
            Console.WriteLine("rozdíl hodnot je " + rozdil);
            }
            Console.WriteLine("aplikace bude ukončena stiskem libovolného tlačítka");
            Console.ReadKey();

A třída souřadnice

class Souradnice
    {
        public double horni_mez;
        private Random random;
        public Souradnice()
        {
            this.horni_mez = 1;
            random = new Random();
        }
        public Souradnice(double horni_mez_a)
        {
            this.horni_mez = horni_mez_a;
            random = new Random();
        }
        public double hod()
        {
            int mezi_cislo = random.Next(1, 1000001);             // dolní mez se dá nastavit odstraněním absolutní hodnoty a přičtením pevné hodnoty
            return (mezi_cislo * horni_mez / 1000000);

        }
    }

Chybu to vyhazuje u toho

soucet = soucet + hodnoty[i];

Ale upřímně nevím co konkrétně je tam špatně.

 
Odpovědět
14.1.2017 10:57
Avatar
Odpovídá na Regedin the Immortal
Roman Havlíček:14.1.2017 14:16

Ahoj, smotal jsi dvě různé věci dohromady, buď použij

for (int i = 0; i< hodnoty.Count)
{
   soucet = soucet + hodnoty[i];
}

nebo

foreach (var hodnota in hodnoty)
{
   soucet = soucet + hodnota;
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
14.1.2017 14:16
Avatar
Odpovídá na Roman Havlíček
Roman Havlíček:14.1.2017 20:25

chybička se mi tam vloudila :)

for (int i = 0; i< hodnoty.Count; i++)
{
   soucet = soucet + hodnoty[i];
}
 
Nahoru Odpovědět
14.1.2017 20:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.