我想先说这是为了评估,所以我不希望你直接给我答案,我希望你指出我正确的方向,稍微调整我的意思已经完成或只是告诉我应该做些什么。
我正在尝试创建一个Caesar Cipher来破译我们给出的文本文档。它需要在控制台中打印所有可能的移位,并将最后一个输出到文本文档。我正在考虑稍后尝试添加频率分析以找到正确的频率分析,但我现在遇到一些问题需要在我能够做到之前解决。
这是我到目前为止所做的:
using System;
using System.IO;
class cipher
{
public static void Main(string[] args)
{
string output = "";
int shift;
bool userright = false;
string cipher = File.ReadAllText("decryptme.txt");
char[] decr = cipher.ToCharArray();
do {
Console.WriteLine("How many times would you like to shift? (Between 0 and 26)");
shift = Convert.ToInt32(Console.ReadLine());
if (shift > 26) {
Console.WriteLine("Over the limit");
userright = false;
}
if (shift < 0) {
Console.WriteLine("Under the limit");
userright = false;
}
if (shift <= 26 && shift >= 0)
{
userright = true;
}
} while (userright == false);
for (int i = 0; i < decr.Length; i++)
{
{
char character = decr[i];
character = (char)(character + shift);
if (character == '\'' || character == ' ')
continue;
if (character > 'Z')
character = (char)(character - 26);
else if (character < 'A')
character = (char)(character + 26);
output = output + character;
}
Console.WriteLine("\nShift {0} \n {1}", i + 1, output);
}
StreamWriter file = new StreamWriter("decryptedtext.txt");
file.WriteLine(output);
file.Close();
}
}
现在它编译并读取文档,但是当它在控制台中运行时,它会从编码文本中将第一个字母打印为1个字母,将2个字母从中移动2,等等。
我不知道我做错了什么,非常感谢任何帮助。我也开始考虑字母的ASCII值,但不知道如何实现它。
请再一次,请不要只给我答案,否则我将不会从中学到任何东西 - 我一直试图自己解决这个问题,但没有运气。
感谢。
答案 0 :(得分:1)
将问题分解成更小的一口大小的块。首先打印一条移动的线,比如移位1。
如果你的部分正常工作(并且只有那时)扩展你的代码打印26行,班次为0,1,2,3 ...... 26.我不确定你的导师是否想要其中一个或两个在开始时移位0,在结束时移位26。你需要问。
再次,让它正常工作,并编写新代码只分析一行,并给它一些分数。让它正常工作。
现在计算所有线的得分并选出得分最高的线。那应该是正确的答案。如果不是,那么您将需要检查您的评分方法。
将一个小的增量更改写入一个非常简单的启动程序通常比尝试直接从空白屏幕到完整,复杂的程序要容易得多。逐渐增加复杂性,一次一件,随时测试。