Ошибка шифрования/дешифрования

Мне нужно написать программу "шифрования" для моего вводного класса С#. Я сталкиваюсь с 2 проблемами:

  1. При вводе отрицательного значения или вычислении отрицательного значения в процессе расшифровки происходит сбой. - он возвращает ошибку необработанного исключения: System.FormatException: Входная строка имеет неправильный формат.
  2. Дешифрование должно быть обратным шифрованию без использования исходной переменной. Как отменить расчет остатка?

Я знаю, что это часть цикла do while, в котором проблема, я просто не уверен, как продолжать запрашивать значение, если введено отрицательное значение и если оно встречается во время расчета расшифровки, чтобы предотвратить его сбой. Любое руководство будет высоко оценено. Спасибо, что заглянули!

public class MainClass
{
  public static void Main(string[] args)
    {
    int num = 0;
    int dnum = 0;
      do
      {
      Console.Write("Please enter a non-negative integer to encrypt: ");
  num = Convert.ToInt32(Console.ReadLine());
      string numstr = Convert.ToString(num);
      string num1 = Convert.ToString(numstr.Substring(0, 1));
      string num2 = Convert.ToString(numstr.Substring(1, 1));
      string num3 = Convert.ToString(numstr.Substring(2, 1));
      string num4 = Convert.ToString(numstr.Substring(3, 1));
      int enum1 = ((Convert.ToInt32(num1) + 7) % 10);
      int enum2 = ((Convert.ToInt32(num2) + 7) % 10);
      int enum3 = ((Convert.ToInt32(num3) + 7) % 10);
      int enum4 = ((Convert.ToInt32(num4) + 7) % 10);
      Console.WriteLine("Encrypted Integer: {0:D4}", (1000 * enum3 + 100 * enum4 + 10 * enum1 + enum2));

      Console.Write("Please enter a non-negative integer to decrypt: ");
      dnum = Convert.ToInt32(Console.ReadLine());
      string dnumstr = Convert.ToString(dnum);
      string num1d = Convert.ToString(dnumstr.Substring(0, 1));
      string num2d = Convert.ToString(dnumstr.Substring(1, 1));
      string num3d = Convert.ToString(dnumstr.Substring(2, 1));
      string num4d = Convert.ToString(dnumstr.Substring(3, 1));
      int dnum1 = ((Convert.ToInt32(num1d) - 7) * 10);
      int dnum2 = ((Convert.ToInt32(num2d) - 7) * 10);
      int dnum3 = ((Convert.ToInt32(num3d) - 7) * 10);
      int dnum4 = ((Convert.ToInt32(num4d) - 7) * 10);
      Console.WriteLine("Decrypted Integer: {0:D4}", (1000 * dnum1 + 100 * dnum2 + 10 * dnum3 + dnum4));
        } while (num > 0);
   } // end Main
}// end class

person Heather    schedule 24.09.2014    source источник
comment
Просто проверьте отрицательное число и сообщите пользователю, что он не знает, как читать ваши инструкции - конечно, вежливо.   -  person Wjdavis5    schedule 24.09.2014
comment
@Heather, когда он падает, никогда не является достаточным объяснением вашей проблемы. Вам необходимо предоставить дополнительную информацию о сбое. Вы должны запускать свою программу под отладчиком, который даст вам много полезной информации о сбое (например, стек вызовов), которую вы должны воспроизвести в своем вопросе. Когда вы включаете такую ​​информацию, получить хороший ответ на ваш вопрос значительно легче.   -  person spender    schedule 24.09.2014
comment
@spender - Хороший вопрос! Извините, я новичок на этом сайте и прошу помощи в этой области. Если введено -, возвращается ошибка необработанного исключения: System.FormatException: Входная строка имеет неправильный формат. Проблема, с которой я сталкиваюсь, заключается в том, что я должен учитывать негатив, даже если это, вероятно, не реальный мир.   -  person Heather    schedule 24.09.2014


Ответы (1)


Политика такова: не продолжать, пока пользователь не введет «правильный» ввод. Вот пример кода, обратите внимание, что я использую numstr[0] - индекс для получения первого символа вместо numstr.Substring(0, 1), поэтому код выглядит чище.

        int num = 0;
        bool isValid = false;
        do
        {
            Console.Write("Please enter 4 digits to encrypt: ");
            string numstr = Console.ReadLine();
            if (numstr.Length == 4)
            {
                isValid = Char.IsDigit(numstr[0]) && Char.IsDigit(numstr[1]) 
                       && Char.IsDigit(numstr[2]) && Char.IsDigit(numstr[3]);
            }
            if (isValid)
                num = Convert.ToInt32(input);
        }
        while (!isValid);

Что касается вашего второго вопроса, вы не можете использовать умножение для обратного вычисления остатка ((d+7)%10), вы должны снова использовать оператор остатка (d+10-7)%10, дополнительные 10 добавляются, чтобы он не получил отрицательного результата.

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

person kennyzx    schedule 24.09.2014