Частотность вхождения букв в текст — первый шаг в расшифровке сообщения

Автор Евгений К., 9 класс

Постановка задачи

Есть некоторое сообщение, закодированное простой заменой символов (один на один с помощью некоторой таблицы). Известно, что в различных языках частотность появления букв разная. Если отсортировать буквы по их частотности в тексте, то можно попробовать и расшифровать сообщение.

Решение

// Определить частотность букв (в %) в строке текста stroka, алфавит задан строкой buk.
using System;
namespace Частотность_Букв_в_тексте
{
class Program
{
   static void Main()
   {
      // ввод текста (любые символы)
      Console.WriteLine("Введите текст.");
      string stroka = Console.ReadLine().ToUpper(); // перевод в прописные
      long all = stroka.Length; // число символов
      // алфавит - русский. Можно изменять!
      string buk = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
      int kol = buk.Length; // число букв          
      // массив счетчиков букв
      double[] m = new double[buk.Length];
      // Циклы для подсчетов
      for (int i = 0; i < all; i++)   // по тексту
         for (int j = 0; j < kol; j++)   // по буквам
           if (stroka[i] == buk[j])
           {
              m[j]++;
              break;  // досрочный выход, если найден
           }
      // Число букв в тексте: n <= all
      double n = 0;
      for (int j = 0; j < kol; j++)
         n += m[j];
      // Парная сортировка массивов m[] и buk[]
      double c;
      char b1;
      char b2;
      char b3 = ' ';
      for (int i = 1; i < buk.Length - 1; i++)
         for (int j = 0; j < buk.Length - 1; j++)
            if (m[j] < m[j + 1])
            {
               // перестановка в m[]
               c = m[j];
               m[j] = m[j + 1];
               m[j + 1] = c;
               // перестановка в buk[]
               b1 = buk[j];
               b2 = buk[j + 1];
               buk=buk.Replace(b1, b3);    // важно buk=buk.Replace(), 
               buk=buk.Replace(b2, b1);    // НО не buk.Replace();
               buk =buk.Replace(b3, b2);   
            }
            // Вывод результата
            if (n < 1)
               Console.WriteLine("Вы не ввели ни одну букву алфавита в Вашем тексте!");
            else
            {
               Console.WriteLine("Проценты содержания каждой из букв в тексте:");
               for (int i = 0; i < buk.Length; i++) 
               { 
                  if (m[i] > 0)
                  {
                     m[i] = Math.Round(m[i] / n * 100, 2);
                     Console.WriteLine("{0}:\t{1}%", buk[i], m[i]);
                  }
               }
         }
         Сonsole.ReadKey();
     }
  }
}

 


NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.


Помощь проекту:

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
1 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Важно: Вы можете поддержать проект и автора.
1
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x