Добавить в цитаты Настройки чтения

Страница 54 из 188

static void Main(string[] args)static int Main(string[] args)В первой форме метод Main() возвращает значение типа void, а во второй — целое значение, как пояснялось выше. Но в обеих формах аргументы командной строкисохраняются в виде символьных строк в массиве типа string, который передается методу Main(). Длина этого массива (args) должна быть равна числу аргументов командной строки, которое может быть и нулевым.В качестве примера ниже приведена программа, выводящая все аргументы командной строки, вместе с которыми она вызывается.

// Вывести все аргументы командной строки.using System;class CLDemo { static void Main(string[] args) { Console.WriteLine("Командная строка содержит " + args.Length + " аргумента."); Console.WriteLine("Вот они: "); for(int i=0; i < args.Length; i++) Console.WriteLine(args[i]); }}Если программа CLDemo запускается из командной строки следующим образом:

CLDemo один два трито ее выполнение дает такой результат.Командная строка содержит 3 аргумента.Вот они:одиндватриДля того чтобы стало понятнее, каким образом используются аргументы команднойстроки, рассмотрим еще один пример программы, в которой применяется простойподстановочный шифр для шифровки или расшифровки сообщений. Шифруемоеили расшифровываемое сообщение указывается в командной строке. Применяемыйшифр действует довольно просто. Для шифровки слова значение каждой его буквыинкрементируется на 1. Следовательно, Буква "А" становится буквой "Б" и т.д. А длярасшифровки слова значение каждой его буквы декрементируется на 1. Разумеется,такой шифр не имеет никакой практической ценности, поскольку его нетрудно разгадать. Тем не менее он может стать приятным развлечением для детей.

// Зашифровать и расшифровать сообщение, используя// простой подстановочный шифр.using System;

class Cipher { static int Main(string[] args) { // Проверить наличие аргументов. if(args.Length < 2) { Console.WriteLine("ПРИМЕНЕНИЕ: " + "слово1: <зашифровать>/<расшифровать> " + "[слово2... словоN]"); return 1; // возвратить код неудачного завершения программы } // Если аргументы присутствуют, то первым аргументом должно быть // слово <зашифровать> или же слово <расшифровать>. if(args[0] != "зашифровать" & args[0] != "расшифровать") { Console.WriteLine("Первым аргументом должно быть слово " + "<зашифровать> или <расшифровать>."); return 1; // возвратить код неудачного завершения программы } // Зашифровать или расшифровать сообщение. for(int n=1; n < args.Length; n++) { for(int i=0; i < args[n].Length; i++) { if(args[0] == "зашифровать") Console.Write((char) (args[n][i] + 1) ); else Console.Write((char) (args[n][i] - 1) ); } Console.Write(" "); } Console.WriteLine(); return 0; }}Для того чтобы воспользоваться этой программой, укажите в командной строкеимя программы, затем командное слово "зашифровать" или "расшифровать" и далеесообщение, которое требуется зашифровать или расшифровать. Ниже приведены двапримера выполнения данной программы, при условии, что она называется Cipher.

С:Cipher зашифровать один двапейо егбС:Cipher расшифровать пейо егбодин дваДанная программа отличается двумя интересными свойствами. Во-первых, обратите внимание на то, как в ней проверяется наличие аргументов командной строкиперед тем, как продолжить выполнение. Это очень важное свойство, которое можнообобщить. Если в программе принимается во внимание наличие одного или более аргументов командной строки, то в ней должна быть непременно организована проверкафакта передачи ей предполагаемых аргументов, иначе программа будет работать неправильно. Кроме того, в программе должна быть организована проверка самих аргументов перед тем, как продолжить выполнение. Так, в рассматриваемой здесь программе проверяется наличие командного слова "зашифровать" или "расшифровать"в качестве первого аргумента командной строки.И во-вторых, обратите внимание на то, как программа возвращает код своего завершения. Если предполагаемые аргументы командной строки отсутствуют или указанынеправильно, программа возвращает код 1, указывающий на ее аварийное завершение.В противном случае возвращается код 0, когда программа завершается нормально.## РекурсияВ C# допускается, чтобы метод вызывал самого себя. Этот процесс называется рекурсией, а метод, вызывающий самого себя, — рекурсивным. Вообще, рекурсия представляет собой процесс, в ходе которого нечто определяет самое себя. В этом отношении оначем-то напоминает циклическое определение. Рекурсивный метод отличается главнымобразом тем, что он содержит оператор, в котором этот метод вызывает самого себя.Рекурсия является эффективным механизмом управления программой.Классическим примером рекурсии служит вычисление факториала числа. Факториал числа N представляет собой произведение всех целых чисел от 1 до N. Например, факториал числа 3 равен 1×2×3, или 6. В приведенном ниже примере программыдемонстрируется рекурсивный способ вычисления факториала числа. Для сравнения вэту программу включен также нерекурсивный вариант вычисления факториала числа.



// Простой пример рекурсии.using System;

class Factorial { // Это рекурсивный метод. public int FactR(int n) { int result; if(n==1) return 1; result = FactR(n-1) n; return result; } // Это итерационный метод. public int FactI(int n) { int t, result; result = 1; for(t=1; t <= n; t++) result = t; return result; }}

class Recursion { static void Main() { Factorial f = new Factorial(); Console.WriteLine("Факториалы, рассчитанные рекурсивным методом."); Console.WriteLine("Факториал числа 3 равен " + f.FactR(3)); Console.WriteLine("Факториал числа 4 равен " + f.FactR(4)); Console.WriteLine("Факториал числа 5 равен " + f.FactR(5)); Console.WriteLine(); Console.WriteLine("Факториалы, рассчитанные итерационным методом."); Console.WriteLine("Факториал числа 3 равен " + f.FactR(3)); Console.WriteLine("Факториал числа 4 равен " + f.FactR(4)); Console.WriteLine("Факториал числа 5 равен " + f.FactR(5));}

}При выполнении этой программы получается следующий результат.

Факториалы, рассчитанные рекурсивным методом.Факториал числа 3 равен 6Факториал числа 4 равен 24Факториал числа 5 равен 120Факториалы, рассчитанные итерационным методом.Факториал числа 3 равен 6Факториал числа 4 равен 24Факториал числа 5 равен 120Принцип действия нерекурсивного метода FactI() вполне очевиден. В нем используется цикл, в котором числа, начиная с 1, последовательно умножаются друг надруга, постепенно образуя произведение, дающее факториал.А рекурсивный метод FactR() действует по более сложному принципу. Если метод FactR() вызывается с аргументом 1, то он возвращает значение 1. В противномслучае он возвращает произведение FactR(n-1)*n. Для вычисления этого произведения метод FactR() вызывается с аргументом n-1. Этот процесс повторяется до техпор, пока значение аргумента n не станет равным 1, после чего из предыдущих вызововданного метода начнут возвращаться полученные значения. Например, когда вычисляется факториал числа 2, то при первом вызове метода FactR() происходит второй еговызов с аргументом 1. Из этого вызова возвращается значение 1, которое затем умножается на 2 (первоначальное значение аргумента n). В итоге возвращается результат 2,равный факториалу числа 2(1×2). Было бы любопытно ввести в метод FactR() операторы, содержащие вызовы метода WriteLine(), чтобы наглядно показать уровеньрекурсии при каждом вызове метода FactR(), а также вывести промежуточные результаты вычисления факториала заданного числа.Когда метод вызывает самого себя, в системном стеке распределяется память дляновых локальных переменных и параметров, и код метода выполняется с этими новыми переменными и параметрами с самого начала. При рекурсивном вызове метода несоздается его новая копия, а лишь используются его новые аргументы. А при возвратеиз каждого рекурсивного вызова старые локальные переменные и параметры извлекаются из стека, и выполнение возобновляется с точки вызова в методе. Рекурсивныеметоды можно сравнить по принципу действия с постепенно сжимающейся и затемраспрямляющейся пружиной.Ниже приведен еще один пример рекурсии для вывода символьной строки в обратном порядке. Эта строка задается в качестве аргумента рекурсивного методаDisplayRev().