Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 48
Текст из файла (страница 48)
Как правило, значение, возвращаемое методом маъп ( ), указывает иа нормальное завершеиие программы или же аварийное ее завершение из-за сложившихся ненормальных условий выполнения. Условно пулевое возвращаемое значение обычно указывает иа нормальное завершение программы, а все остальные значения обозначают тип возникшей ошибки. Передача аргументов методу махп () Многие программы принимают так называемые аргуменшьт командной плроюг, т.е. ииформацию, которая указывается в командной строке непосредственно после имени программы при ее запуске иа выполнение. В программах иа С() такие аргументы передаются затем методу Маъп () .
Для получения аргументов служит одна из приведенных ниже форм метода Ма].п () . всасгс нога Ма1в(всг1вп( ] агдв) всас1с гвс Ма1в(всг1вд( ] агпв) В первой форме метод ма1о () возвращает значение типа чо1г(, а во второй — целое значение, как пояснялось выше.
Но в обеих формах аргументы командной строки сохраияются в виде символьных строк в массиве типа зсгъпд, который передается методу Глава 8. Подробнее о методах и классах 241 Мафп () . Длина этого массива (агав) должна быть равна числу аргументов командной строки, которое может быть и нулевым. В качестве примера ниже приведена программа, выводящая все аргументы командной строки, вместе с которыми она вызывается. // Вывести все аргументы командной строки.
ня1пс Яузсешт с1аяя Сьоешо ( зсасфс чохе Ма1п(згг1пп[] агся) ( Сопзо1е.нгфгеьапе("Командная строка содержит " т агдз.ьепдГП + " аргумента."); Сопзо1е.нгасеььпе("Вот они: "); Гог(1пс 1 0; 1 < агся.ьепьсн) 1++) Сопяо1е.нг1сеььпе(атея[1])т Если программа СЕПешо запускается из командной строки следующим образом: СХЮено один два ври то ее выполнение дает такой результат: Командная строка содержит 3 аргумента.
Вот они: один два три Для того чтобы стало понятнее, каким образом используются аргументы командной строки, рассмотрим еще один пример программы, в которой используется простой подстановочиый шифр для шифровки или расшифровки сообщений. Шифруемое или расшифровываемое сообщение указывается в командной строке.
Используемый шифр действует довольно просто. Для шифровки слова значение каждой его буквы инкрементируется на 1. Следовательно, Буква "А" становится буквой "Б" и т.д. А для расшифровки слова значение каждой его буквы декрементируется на 1. Разумеется, такой шифр не имеет никакой практической ценности, поскольку его нетрудно разгадать. Тем не менее он может стать приятным развлечением для детей. // Зашифровать и расшифровать соседение, используя // простой подстановочный шифр. пагод Яуясешт с1аяя С1роег ( згаггс 1пг магп(ягггпя[] агчз) ( // Проверить наличие аргументов.
1Г(агпя.ьепсгн < 2) ( Сопяо1е.нггсепхпе("ПРИМЕНЕНИЕ: "слово1: <зашифровать>/<расшифровать> " + 242 часть (. язык сз "[слозо2... слозои]")т гегигп 1) // возвратить код неудачного завершения программы // Если аргументы присутствуют, то первым // аргументом должно быть слово <зашифровать> // или <расшифровать>. 11(агпз[0) != "зашифровать" ь агдз[0] != "расшифровать") ( Сопзо1е.Игзсеввпе("Первьак аргументом должно быть слово " + "<зашифровать> ипи <расшифровать>."); гегигп 1) // возвратить код неудачного завершения программы ) // Зашифровать или расшифровать сообщение.
Гог(1пс п=1т и < агдз.ьепдсвт пьь) ( гог(1пг 1=От 1 < агцз[п].ьепдгьт Ьь+) ( 10(агчз[0] = "зашифровать") Сопзо1е.Игьге((сваг) (агдз[п][].] + 1) ); е1зе сопзо1е.игзге((сьаг) (агцз[п][1] — 1) )т ) Сопзо1е.Иггсе(" ")) ) Сопзо1е. ИггсеЬ1пе (); гегпгп От ) ) Для того чтобы воспользоваться этой программой, укажите в командной строке имя программы, затем командное слово "зашифровать" или "расшифровать" и далее сообщение, которое требуется зашифровать или расшифровать. Ниже приведены два примера выполнения данной программы, при условии, что она называется С1р)тег.
С т'ьс1риег зашифровать один два пейо егб Ст1С1рнег расшифровать пейо егб один два Данная программа отличается двумя интересными свойствами. Во-первых, обратите внимание на то, как в ней проверяется наличие аргументов командной строки перед тем, как продолжить выполнение. Это очень важное свойство, которое можно обобшить. Если в программе принимается во внимание наличие одного или более аргументов командной строки, то в ней должна быть непременно организована проверка факта передачи ей предполагаемых аргументов, иначе программа будет работать неправильно.
Кроме того, в программе должна быть организована проверка самих аргументов перед тем, как продолжить выполнение. Так, в рассматриваемой здесь программе проверяется наличие командного слова "зашифровать" или "расшифровать" в качестве первого аргумента командной строки. Глава 8. Подробнее о методах н классах 243 И во-вторых, обратите внимание на то, как программа возвращает код своего завершения. Если предполагаемые аргументы командной строки отсутствуют или указаны неправильно, программа возвращает код 1, указывающий на ее аварийное завершение.
В противном случае возвращается код О, когда программа завершается нормально. Рекурсия В языке С№ допускается, чтобы метод вызывал самого себя. Этот процесс называется рекурсией, а метод, вызывающий самого себя, — рекурсивным. Вообще, рекурсия представляет собой процесс, в ходе которого нечто определяет самое себя. В этом отношении она чем-то напоминает циклическое определение. Рекурсивный метод отличается главным образом тем, что он содержит оператор, в котором этот метод вызывает самого себя.
Рекурсия является эффективным механизмом управления программой. Классическим примером рекурсии служит вычисление факториала числа. Факториал числа М представляет собой произведение всех целых чисел от 1 до И. Например, факториал числа 3 равен 1к2кЗ, или 6. В приведенном ниже примере программы демонстрируется. рекурсивный способ вычисления факториала числа. Для сравнения в эту программу включен также нерекурсивный вариант вычисления факториала числа.
// Простой пример рекурсии. из1пи Яуякеаи с1аяя Гаскотха1 ( // Это рекурсивный метод. риьттс Ьпс раста(тпс и) ( Ьпк хези1С; ЬГ(п==1) гекитп 1; тези1С = Газка(п-1) * и) текитп кззи1ст ) // Это итерационный метод. рип11с Ьпк Гаск1(1пк и) ( 1пи С, геяи1кт тези1С = 1; сот(С=1) С <= и; С+т) тези1С *= С) гевикп теяи1кт ) ) с1аяя йесикзтоп ( якакес иовп Мвтп() ( Гаскотта1 Г = пен Гаскотва1()т Сопяо1е.нх1кеЬ1пе("'Факторизлы, рассчитанные рекурсивным методом.") Сопяо1е.нк1сеЬ1пе("Факториал числа 3 равен " т Г.Гасив(3))т 244 часть (.
язык сз Сопао1е.Ик1сеььпе("Факториал числа 4 равен " + Г.Гаскк(4))т Сопво1е.игккеиьпе("Факториал числа 5 равен " + й.гапки(5)); Сопво1е.икькевьпе()т Сопво1е.игьсеигпе("Факториалы, рассчитанные итерационным методом."); Сопво1е.иг1кеи1пе("Факториал числа 3 равен " + й.гаскк(3)); Сопзо1е.Икькеиьпе("Факториал числа 4 равен " + Г.гасеп(4))> Сопзо1е.нк1сеььпе("Факториал числа 5 равен " ь й.гаека(5))к ) ) При выполнении этой программы получается следующий результат: Факториалы, рассчитанные рекурсивным методом. Факториал числа 3 равен б Факториал числа 4 равен 24 Факториал числа 5 равен 120 Факториалы, рассчитанные итерационньм методом. Факториал числа 3 равен б Факториал числа 4 равен 24 Факториал числа 5 равен 120 Принцип действия нерекурсивного метода Гасе1() вполне очевиден.
В нем используется цикл, в котором числа, начиная с 1, последовательно умножаются друг на друга, постепенно образуя произведение, дающее факториал. А рекурсивный метод Гасгп () действует по более сложному принципу. Если метод Гассн () вызывается с аргументом 1, то он возвращает значение 1. В противном случае он возвращает произведение расеи (и-1) *и. Для вычисления этого произведения метод расеи () вызывается с аргументом п-1. Этот процесс повторяется до тех пор, пока значение аргумента и не станет равным 1, после чего из предыдущих вызовов данного метода начнут возвращаться полученные значения. Например, когда вычисляется факториал числа 2, то при'первом вызове метода Гасан () происходит второй его вызов с аргументом 1. Из этого вызова возвращается значение 1, которое затем умножается на 2 (первоначальное значение аргумента п).