Esempio n. 1
0
        public void Provaznik()
        {
            StreamReader file;
            string       line;
            //var path = "C:/Users/janpr/Downloads/kalibrace_frekvence_data.txt";
            var path = "data.txt";

            // hashset poskytuje dobrou prumernou casovou slozitost na pridani prvku a test zda je prvek pritomen Theta(1)
            System.Collections.Generic.HashSet <int> frequencies = new System.Collections.Generic.HashSet <int>();
            int currentFrequency = 0;
            int?doubleFrequency  = null;

            try
            {
                file = new StreamReader(path); //neni nutne mit cely soubor v RAM
            }
            catch (FileNotFoundException)
            {
                throw new FileNotFoundException("Soubor neexistuje.");
            }
            frequencies.Add(currentFrequency); //pocatecni frekvence se take muze zopakovat
            while ((line = file.ReadLine()) != null)
            {
                int change;
                if (!int.TryParse(line, out change))
                {
                    throw new Exception("Chyba ve vstupnim souboru.");
                }
                currentFrequency += change;
                if (doubleFrequency == null)
                {
                    if (frequencies.Contains(currentFrequency))
                    {
                        doubleFrequency = currentFrequency;
                    }
                    else
                    {
                        frequencies.Add(currentFrequency);
                    }
                }
            }
            if (doubleFrequency != null)
            {
                // Console.WriteLine($"Vysledna frekvence je {currentFrequency}, prvni frekvence ktera se zopakovala je {doubleFrequency}");
            }
            else
            {
                int   fullLoop         = currentFrequency;
                int[] frequenciesArray = new int[frequencies.Count];
                frequencies.CopyTo(frequenciesArray);
                int i = 1;
                while (doubleFrequency == null && i < 1000) // aby to nebezelo vecne (neprisel jsem na jednoznacnou podminku, ktera vyhodnoti nekonecny beh)
                {
                    foreach (var f in frequenciesArray)
                    {
                        if (f == 0) // vzorec nize nepocita s pocatecni frekvenci
                        {
                            continue;
                        }
                        int newFrequency = f + i * fullLoop; // kazda dosazena frekvence je zmenena o vysledek po cele kalibraci

                        if (frequencies.Contains(newFrequency))
                        {
                            doubleFrequency = newFrequency;
                            break;
                        }
                        else
                        {
                            frequencies.Add(newFrequency);
                        }
                    }
                    i++;
                }

                if (doubleFrequency != null)
                {
                    // Console.WriteLine($"Vysledna frekvence je {currentFrequency}, prvni frekvence ktera se zopakovala je {doubleFrequency}");
                }
                else
                {
                    // Console.WriteLine($"Vysledna frekvence je {currentFrequency}, zadna frekvence se nezopakuje (nebo to nelze spocitat v rozumnem case).");
                }
            }
        }