Страница 110 из 502
<b> return 1; // возвратить код неудачного завершения программы</b>
<b> }</b>
<b> // Если аргументы присутствуют, то первым аргументом должно быть </b>
<b> // слово <зашифровать> или же слово <расшифровать>.</b>
<b> if (args[0] != "зашифровать" & args[0] != "расшифровать") {</b>
<b> Console.WriteLine("Первым аргументом должно быть слово "</b>
<b> + "<зашифровать> или <расшифровать>.");</b>
<b> return 1; // возвратить код неудачного завершения программы</b>
<b> }</b>
<b> // Encode or decode message. </b>
<b> for (int n = 1; n < args.Length; n++) {</b>
<b> for (int i = 0; i < args[n].Length; i++) {</b>
<b> if (args[0] == "зашифровать")</b>
<b> Console.Write((char)(args[n][i] + 1));</b>
<b> else</b>
<b> Console.Write((char)(args[n][i] - 1));</b>
<b> }</b>
<b> Console.Write(" ");</b>
<b> }</b>
<b> Console.WriteLine();</b>
<b> return 0;</b>
<b> }</b>
<b>}</b>
Для того чтобы воспользоваться этой программой, укажите в командной строке имя программы, затем командное слово "зашифровать" или "расшифровать" и далее сообщение, которое требуется зашифровать или расшифровать. Ниже приведены два примера выполнения данной программы, при условии, что она называется Cipher.
<b>C:Cipher зашифровать один два</b>
<b>пейо егб</b>
<b>C:Cipher расшифровать пейо егб</b>
<b>один два</b>
Данная программа отличается двумя интересными свойствами. Во-первых, обратите внимание на то, как в ней проверяется наличие аргументов командной строки перед тем, как продолжить выполнение. Это очень важное свойство, которое можно обобщить. Если в программе принимается во внимание наличие одного или более аргументов командной строки, то в ней должна быть непременно организована проверка факта передачи ей предполагаемых аргументов, иначе программа будет работать неправильно. Кроме того, в программе должна быть организована проверка самих аргументов перед тем, как продолжить выполнение. Так, в рассматриваемой здесь программе проверяется наличие командного слова "зашифровать" или "расшифровать" в качестве первого аргумента командной строки.
И во-вторых, обратите внимание на то, как программа возвращает код своего завершения. Если предполагаемые аргументы командной строки отсутствуют или указаны неправильно, программа возвращает код 1, указывающий на ее аварийное завершение. В противном случае возвращается код 0, когда программа завершается нормально.
Рекурсия
В C# допускается, чтобы метод вызывал самого себя. Этот процесс называется рекурсией, а метод, вызывающий самого себя, — рекурсивным. Вообще, рекурсия представляет собой процесс, в ходе которого нечто определяет самое себя. В этом отношении она чем-то напоминает циклическое определение. Рекурсивный метод отличается главным образом тем, что он содержит оператор, в котором этот метод вызывает самого себя. Рекурсия является эффективным механизмом управления программой.
Классическим примером рекурсии служит вычисление факториала числа. Факториал числа N представляет собой произведение всех целых чисел от 1 до N. Например, факториал числа 3 равен 1х2x3, или 6. В приведенном ниже примере программы демонстрируется рекурсивный способ вычисления факториала числа. Для сравнения в эту программу включен также нерекурсивный вариант вычисления факториала числа.
<b>// Простой пример рекурсии.</b>
<b>using System;</b>
<b>class Factorial {</b>
<b> // Это рекурсивный метод. </b>
<b> public int FactR(int n) {</b>
<b> int result;</b>
<b> if (n == 1) return 1;</b>
<b> result = FactR(n - 1) * n;</b>
<b> return result;</b>
<b> }</b>
<b> // Это итерационный метод. </b>
<b> public int FactI(int n) {</b>
<b> int t, result;</b>
<b> result = 1;</b>
<b> for (t = 1; t <= n; t++) result *= t;</b>
<b> return result;</b>
<b> }</b>
<b>}</b>
<b>class Recursion {</b>
<b> static void Main() {</b>
Factorial f = new Factorial();
<b> Console.WriteLine("Факториалы, рассчитанные рекурсивным методом.");</b>
<b> Console.WriteLine("Факториал числа 3 равен " + f.FactR(3));</b>
<b> Console.WriteLine("Факториал числа 4 равен " + f.FactR(4));</b>