Код Фано - нужен исходник - C#

Узнай цену своей работы

Формулировка задачи:

Может у кого-то есть прога с кодом Фано. Скиньте или подскажте как реализовать

Решение задачи: «Код Фано - нужен исходник»

textual
Листинг программы
class Program
    {
static void ShakerSort(List<KeyValuePair<double, char>> List)
        {
            int beg, end;
            int count = 0;
 
            for (int i = 0; i < List.Count / 2; i++)
            {
                beg = 0;
                end = List.Count - 1;
 
                do
                {
                    count += 2;
                    if (List[beg].Key < List[beg + 1].Key)
                        Swap(List, beg, beg + 1);
                    beg++;
 
 
                    if (List[end - 1].Key < List[end].Key)
                        Swap(List, end - 1, end);
                    end--;
 
                }
                while (beg <= end);
            }
        }
 
        static void Swap(List<KeyValuePair<double, char>> List, int i, int j)
        {
            KeyValuePair<double, char> temp;
            temp = List[i];
            List[i] = List[j];
            List[j] = temp;
        }
 
        static void WriteArray(List<KeyValuePair<double, char>> List)
        {
            foreach (KeyValuePair<double, char> a in List)
                Console.WriteLine("{0}: {1}", a.Value, a.Key);
            Console.WriteLine("\n\n\n");
        }
 
        static int Dividing(List<KeyValuePair<double, char>> List, int L, int R)
        {
            double HalfProb = 0, PieceProb = 0;
            for (int j = L; j <= R; j++)
            {
                HalfProb += List[j].Key;
            }
 
            HalfProb /= 2;
 
            int i = 0;
            for (i = L; PieceProb < HalfProb && i <= R; i++)
            {
                PieceProb += List[i].Key;
            }
 
            return i - 1;
        }
 
        static void Fano(List<KeyValuePair<double, char>> Pairs, Dictionary<char, string> Codes, int L, int R)
        {
            try
            {
                if (R - L > 0)
                {
                    int index = Dividing(Pairs, L, R);
 
                    for (int i = L; i <= index; i++)
                    {
                        if (Codes.ContainsKey(Pairs[i].Value))
                            Codes[Pairs[i].Value] += "1";
                        else
                            Codes.Add(Pairs[i].Value, "1");
                    }
 
                    for (int i = index + 1; i <= R; i++)
                    {
                        if (Codes.ContainsKey(Pairs[i].Value))
                            Codes[Pairs[i].Value] += "0";
                        else
                            Codes.Add(Pairs[i].Value, "0");
                    }
 
                    Fano(Pairs, Codes, L, index);
                    Fano(Pairs, Codes, index + 1, R);
                }
            }
            catch (Exception ex) { Console.WriteLine(ex.ToString()); }
        }
 
        static void Main(string[] args)
        {
            Console.WriteLine("Введите Сообщение:");
            string message = Console.ReadLine();
            Dictionary<char, int> CharsAndProbs = new Dictionary<char, int>(); //считаем сюда сколько раз попадается каждый символ
            List<KeyValuePair<double, char>> List = new List<KeyValuePair<double, char>>();//Массив с парами вероятность&символ
            Dictionary<char, string> Codes = new Dictionary<char, string>(); //Тут результат работы алгоритма
 
            int MessageLength = 0;
            foreach (char a in message)
            {
                MessageLength++;
                if (CharsAndProbs.ContainsKey(a))
                    CharsAndProbs[a]++;
                else
                    CharsAndProbs.Add(a, 1);
            }
 
            foreach (KeyValuePair<char, int> a in CharsAndProbs)
            {
                List.Add(new KeyValuePair<double, char>(a.Value, a.Key));
            }
 
            WriteArray(List);
            ShakerSort(List);
            
            WriteArray(List);
            Fano(List, Codes, 0, List.Count - 1);
 
            foreach (KeyValuePair<char, string> a in Codes)
                Console.WriteLine("{0}: {1}", a.Key, a.Value);
 
            string Code = "";
            foreach (char a in message)
            {
                Code += Codes[a];
            }
            Console.WriteLine("\nКод:\n" + Code);
 
            string Decoded = "";
            for (int i = 0; i < Code.Length; i++)
            {
                foreach (KeyValuePair<char, string> a in Codes)
                {
                    try
                    {
                        if (Code.Substring(i, a.Value.Length) == a.Value)
                        {
                            Decoded += a.Key;
                            i += a.Value.Length - 1;
                            break;
                        }
                    }
                    catch { }
                }
            }
 
            Console.WriteLine("\nДекодировка:\n" + Decoded);
            Console.ReadKey();
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.583 из 5