2015-12-14 5 views
1

Как указано в заголовке, я пытаюсь заменить буквы в определенной строке с самой высокой частотой соответствующей буквой в алфавите.Попытка заменить буквы в строке соответствующей буквой в алфавите с аналогичной частотой

Например, если строка имеет наибольшее D с в нем, то я бы заменить все D S с E, как это самое обычное письмо в алфавите, я бы тогда продолжать этот процесс идет вниз буквенные частоты ...

Итак, у меня был снимок, но мой результат совершенно неправильный.

Im совершенно новый для progroqamming, поэтому мне жаль, если все это отвратительно, но id все равно нравится делать это в формате, который я уже наблюдал.

Я связал свой код следующим образом, я сделал это несколькими способами, я задавался вопросом, может ли кто-нибудь обнаружить проблему, которую я испытываю.

Я считаю, что это замена неправильного письма, но я действительно понятия не имею, я только сделал простой шифр ceasar раньше, так что это не большой шаг, но я действительно не могу оглянуться, что происходит не так.

Ох и пожалуйста игнорируют имена переменных и т.д. они просто заполнителей:

public class Decode 
{ 
    public static void doDecode() 
    { 
     string decoding = File.ReadAllText(@"thing.txt", Encoding.Default); 
     string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     int counter = 0; 
     int amount = 0; 
     int[] letterAmounts = new int[26]; 

     decoding = decoding.Replace(Environment.NewLine, ""); 
     decoding = decoding.Replace(" ", ""); 

     foreach (char k in alphabet) 
     { 
      amount = Advanced.Adv(decoding, k); 
      letterAmounts[counter] = amount; 
      counter++; 
     } 
     File.WriteAllText(@"stuff.txt", Change.doChange(decoding, letterAmounts)); 
     System.Diagnostics.Process.Start(@"stuff.txt"); 
    } 
} 

Так что это просто вызывает другие классы и присваивает номера, найденные в массиве

public class Advanced 
{ 
    public static int Adv(string test, char c) 
    { 
     int count = 0; 
     foreach (char x in test) 
     { 
      if (x == c) 
      { 
       count = count + 1; 
      } 
     } 

     return count; 
    } 
} 

Это называется ранее и просто подсчитывает сумму, указанную в письме

public class Change 
{ 
    public static string doChange(string test, int[] letterAmounts) 
    { 
     string frequency = "ETAOINSHRDLCUMWFGYPBVKJXQZ"; 
     char[] mostFrequent = frequency.ToCharArray(); 
     string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     char[] abc = alphabet.ToCharArray(); 
     int most = 0; 
     int position = 0; 
     for (int tester = 0; tester < 26; tester++) 
     { 
      most = letterAmounts.Max(); 
      position = Array.IndexOf(letterAmounts, most); 
      test = test.Replace(abc[position], mostFrequent[tester]); 
      letterAmounts[position] = 0; 
     } 
     return test; 
    } 
} 

Это где я считаю, что проблемы лежат, но я не могу понять, почему, снова я знаю, что это беспорядочно, но любая помощь очень ценится.

+0

В чем проблема? Можете ли вы дать ввод, ожидаемый результат и фактический результат, который является неправильным? –

+0

Я не уверен, что вы пытаетесь установить положение в точке в большинстве или в позиции в буквах, где Макс был найден. Если вы пытаетесь установить posiiton на количество букв, вам нужно использовать 'position = letterAmounts.ToList(). IndexOf (most);' – bilpor

+0

@YacoubMassad да, у меня может быть вход, но результат неправильный, думаю, что у меня есть это теперь, хотя спасибо = D –

ответ

0

Похоже, что этот раздел делает что-то странное:

for (int tester = 0; tester < 26; tester++) 
{ 
    most = letterAmounts.Max(); 
    position = Array.IndexOf(letterAmounts, most); 
    test = test.Replace(abc[position], mostFrequent[tester]); 
    letterAmounts[position] = 0; 
} 

Итак, давайте запустим через пример строки «I AM BOB ". Это преобразуется в «IAMBOB», и ваши буквенные параметры приведут к 1,1,1,2,1,2. Ваш выше цикл будет сделать следующее:

most = 2; 
position = 3; //IndexOf reports the zero-based index. 
test = test.Replace(abc[3], mostFrequent[0]); 
letterAmounts[3] = 0; 

На первом контуре через его заменит любую букву «D's с» Е х, из которых их нет. На втором цикле вы получите:

most = 2; //second B. 
position = 5; 
test = test.Replace(abc[5], mostFrequent[1]); 
letterAmounts[5] = 0; 

На этот раз вы будете заменять «Е» на «Т». В принципе, вы не заменяете письмо, которое, как вы думаете. Кроме того, это прекрасно подчеркивает, что вы могли бы заменить замененные ранее замененные буквы новыми (в этом случае вы заменили D на E в первом цикле, но во втором цикле эти E теперь будут заменены на T.

Первая ошибка, по-видимому, использует индекс максимального значения в letterAmounts, чтобы затем найти букву в массиве «abc». Они не обязательно будут соответствовать друг другу.Предположительно, что вы хотите, на самом деле заменить букву наиболее часто, так что B с E в первом цикле? Если это так, вам нужно создать список>, чтобы вы могли рассказывать как букву, так и количество вхождений. Кортеж также позволит вам иметь повторяющиеся записи (в отличие от словаря), что вполне может произойти в соответствии с примером буквы B в этом примере.

Затем верните письмо из списка кортежей и используйте его, чтобы перейти в свою часть abc [] замены. Тем не менее, вам все равно нужно выяснить, как вы хотите продолжить замену букв, которые уже были заменены. Должно ли это происходить, например?

+0

Удивительное спасибо за полное объяснение, только то, что я искал = D –

+0

На стороне записки для кортежа/списка вещей, ив никогда не использовался, вы бы посоветовали сделать список кортежей? –

+0

@Miztingz - список кортежей позволяет дублировать записи в отличие от словаря, что, вероятно, будет необходимо в вашем случае. Итак, да, я думаю, что список кортежей был бы хорошим началом. – sr28

0

просто изменить код, как это и, вероятно, он будет работать

string decoding = File.ReadAllText(@"thing.txt", Encoding.Default);   
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
decoding = decoding.ToUpper(); 
+0

Я вижу, что вы говорите, вход, который я вложил, на самом деле уже заглавными спасибо очень подумал, я положу это в настоящее время = D –