0

我在 C# 中有这段代码,但是用于在块内移动的代码会覆盖用于移动d字母的代码。我该如何解决这个问题,以便它们不再相互覆盖?这是代码:

private void Crypt(int n, int m, int d)
{
    // make a block from the string
    string invoerstring = invoer.Text;
    uitvoer.Text = invoerstring;

    // shift d letters
    char[] buffer = invoerstring.ToCharArray();
    for (int i = 0; i < buffer.Length; i++)
    {
        // Letter.
        char letter = buffer[i];
        // Add shift to all.
        letter = (char)(letter + d);
        // Subtract 26 on overflow.
        // Add 26 on underflow.
        if (letter > 'z')
        {
            letter = (char)(letter - 26);
        }   
        else if (letter < 'a')
        {
            letter = (char)(letter + 26);
        }
        // Store.
        buffer[i] = letter;
    }
    uitvoer.Text+=buffer;

    //shift characters inside a block
    var shift = String.Concat(invoerstring.Skip(m).Concat(invoerstring.Take(m)));
    uitvoer.Text = shift;  
}

private void button1_Click(object sender, EventArgs e)
{
        Crypt(8,2,1);
}
4

2 回答 2

0

一些提示:

  • 您的代码正在修改控件Uitvoer。尝试强制阻止这种情况。将 UI 代码(修改 UI 组件)与逻辑(加密某些东西)分开。它认为仅凭此提示您就应该成功,因为现在您正试图将结果写回早期。
  • 您自己说过:第二个操作会覆盖第一个操作的结果。移动块的行使用invoerstringinvoerstring没有被移动字母的代码以任何方式修改。您应该使用最后一次操作的结果:buffer.
  • 我是否纠正了n从未使用过的参数?

尝试这个:

private string Crypt(string input, int m, int d)
{
    string result = "";
    foreach(char ch in input)
    {
        // Add shift to all.
        char letter = (char)(ch + d);
        // Subtract 26 on overflow.
        // Add 26 on underflow.
        if (letter > 'z')
        {
            letter = (char)(letter - 26);
        }   
        else if (letter < 'a')
        {
            letter = (char)(letter + 26);
        }
        // Store.
        result += letter;
    }

    //shift characters inside a block
    result = result.Substring(m) + result.Substring(0, m);
    return result;  
}

private void button1_Click(object sender, EventArgs e)
{
    uitvoer.Text = Crypt(invoer.Text, 2, 1);
}

如果您希望同时显示块移位和字符移位:+在最后一行添加 a:

result += result.Substring(m) + result.Substring(0, m);
于 2013-06-10T16:15:03.363 回答
-1

您正在使用uitvoer.Text+=buffer;我认为是问题所在。char 数组的类型在此处分配为文本“System.Char[]”。

下面修改后的代码将每个字符替换为下一个第 d 个字符(因此 'a' 替换为 'b'),然后将字符向左旋转 m 个字符。

例如,'abcde' 的输入给出了 m = 2 和 d = 1 的 o/p 'defbc' [abcde -> bcdef (替换为下一个字符) -> defbc (向左移动 2)]

private static void Crypt(int n, int m, int d)
{
    // make a block from the string
    string invoerstring = invoer.Text;
    string uitv = "";

    // shift d letters
    char[] buffer = invoerstring.ToCharArray();
    for (int i = 0; i < buffer.Length; i++)
    {
        // Letter.
        char letter = buffer[i];
        // Add shift to all.
        letter = (char)(letter + d);
        // Subtract 26 on overflow.
        // Add 26 on underflow.
        if (letter > 'z')
        {
            letter = (char)(letter - 26);
        }
        else if (letter < 'a')
        {
            letter = (char)(letter + 26);
        }
        // Store.
        buffer[i] = letter;
        uitv += letter;
    }

    //shift characters inside a block
    var shift = String.Concat(uitv.Skip(m).Concat(uitv.Take(m)));
    uitv = shift;
    uitvoer.Text = uitv;
}
于 2013-06-10T16:07:10.320 回答