Главная » Просмотр файлов » Г. Шилдт - С#4.0 Полное руководство

Г. Шилдт - С#4.0 Полное руководство (1160795), страница 49

Файл №1160795 Г. Шилдт - С#4.0 Полное руководство (Г. Шилдт - С#4.0 Полное руководство) 49 страницаГ. Шилдт - С#4.0 Полное руководство (1160795) страница 492019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 49)

Так, в рассматриваемой здесь программе проверяется наличие командного слова "зашифровать"' или "расшифровать" в качестве первого аргумента командной строки. И во-вторых, обратите внимание на то, как программа возвращает код своего завершения. Если предполагаемые аргументы командной строки отсутствуют или указаны неправильно, программа возвращает код 1, указывающий на ее аварийное завершение.

В противном случае возвращается код О, когда программа завершается нормально. Рекурсия В С() допускается, чтобы метод вызывал самого себя. Этот процесс называется рекурсиеи, а метод вызывающий самого себя, — рекурсивным. Вообще, рекурсия представляет собой процесс, в ходе которого нечто определяет самое себя. В этом отношении она чем-то напоминает циклическое определение.

Рекурсивный метод отличается главным образом тем, что он содержит оператор, в котором этот метод вызывает самого себя. Рекурсия является эффективным механизмом управления программой. Классическим примером рекурсии служит вычисление факториала числа. Факториал числа М представляет собой произведение всех целых чисел от 1 до ))). Например, факториал числа 3 равен 1к2к3, или 6. В приведенном ниже примере программы демонстрируется рекурсивный способ вычисления факториала числа.

Для сравнения в эту программу включен также нерекурсивный вариант вычисления факториала числа. Простой пример рекурсии. ця1пэ Яуясегн с1аяя Гассог1а1 ( Это рекурсивный метод. рц)яггс гпг Гаева(1пс и) гпг геяц1С( 11(о==1) гесцгп 1) геяц1Г =- Гасся(п-1) * и; гегцгп геяц1г.; Это итерационный метод.

рц)о11с ьпс Гасс1(гпс и) ( гпг г, геяц1г; геяц1Г = 1) Гог(Г=1; Г <= и; Г++) геяц1Г *= Г; гесцгп геяц1Г; ) ) 288 Часть!. Язык С() с1аяя Кесцгягоп ( ягагьс чо1г) Магп() ( Гасгогга1 Г = пен Гассогга1(); Сопяо1е.иг1геь1пе("Факториалы, рассчитанные рекурсивным методом."); Сопяо1е.иг1сей1пе("Факториал числа 3 равен " 4 Г.Гассд(3)); Сопяо1е.иггсепьпе("Факториал числа 4 равен " + Г.гассд(4)); Сопяо1е.иг1сеь1пе("Факториал числа 5 равен " е Г.гассд(5))4 Сопяо1е.иггсепьпе(); Сопяо1е.Иггсевьпе("Факториалы, рассчитанные итерационным методом.") Сопяо1е.нггсеэьпе("Факториал числа 3 равен " + Г.гассд(3))4 Сопяо1е.иг1сепьпе("Факториал числа 4 равен " е Г.гасгд(4)); Сопяо1е.иггсеюпе("Факториал числа 5 равен " е Г.гасов(5))) ) ) При выполнении этой программы получается следующий результат. Факториалы, рассчитанные рекурсивным методом.

Факториал числа 3 равен б Факториал числа 4 равен 24 Факториал числа 5 равен 120 Факториалы, рассчитанные итерационным методом. Факториал числа 3 равен б Факториал числа 4 равен 24 Факториал числа 5 равен 120 Принцип действия нерекурсивного метода Гасг1 () вполне очевиден. В нем используется цикл, в котором числа, начиная с 1, последовательно умножаются друг на друга, постепенно образуя произведение, дающее факториал. А рекурсивный метод Гасгй () действует по более сложному принципу. Если метод Гасгй () вызывается с аргументом 1, то он возвращает значение 1.

В противном случае он возвращает произведение Гассп (и — 1) *и. Для вычисления этого произведения метод Гасгр () вызывается с аргументом и-1. Этот процесс повторяется до тех пор, пока значение аргумента и не станет равным 1, после чего из предыдущих вызовов данного метода начнут возвращаться полученные значения. Например, когда вычисляется факториал числа 2, то при первом вызове метода Гасгр () происходит второй его вызов с аргументом 1. Из этого вызова возвращается значение 1, которое затем умножается на 2 (первоначальное значение аргумента и).

В итоге возвращается результат 2, равный факгориалу числа 2 (1к2). Было бы любопытно ввести в метод Гассп () операторы, содержащие вызовы метода Иг1геЫпе (), чтобы наглядно показать уровень рекурсии при каждом вызове метода Гасой (), а также вывести промежуточные результаты вычисления факториала заданного числа. Когда метод вызывает самого себя, в системном стеке распределяется память для новых локальных переменных и параметров, и код метода выполняется с этими новыми переменными и параметрами с самого начала. При рекурсивном вызове метода не создается его новая копия, а лишь используются его новые аргументы. А при возврате из каждого рекурсивного вызова старые локальные переменные и параметры извлекаются из стека, и выполнение возобновляется с точки вызова в методе.

Рекурсивные методы можно сравнить по принципу действия с постепенно сжимающейся и затем распрямляющейся пружиной. Глава 8. Подробнее о методах и классах 259 Ниже приведен еще один пример рекурсии для вывода символьной строки в обратном порядке. Эта строка задается в качестве аргумента рекурсивного метода Р1зр1ауреч () . О Вывести символьную строку в обратном порядке, используя рекурсию.

изьпо Яузгею; с1азз Нечзст ( /! Вывести символьную строку в обратном порядке. рпЬ11с чо1с( Рьзр1аунеч(згтлпо згг) ( 1Г(атт.Ьепосп > 0) оьзр1аукеч(асс.япьзгтгпя(1, зст.ьепесь-1)); е1зе лесото; Сопзо1е.нг1ге(зст(О!)) ) ) с1азз НечзггРеюо ( апаггс чола Ма1п() ( атггпЧ а = "Это тест'Р Вечзпг твОЬ = пеы Нечзтг(); сопзо1е.игьсеььпе("исходная строка: " + а) Сопво1е.нггпе("Перевернутая строка: "); таОЬ. Оьзр1аувеч (а); Сопао1е.нт1ге11пе() ) ) Вот к какому результату приводит выполнение этого кода. Исходная строка: Это тест Перевернутая строка: тсет отЭ Всякий раз, когда вызывается метод Рлзр1аунеч ( ), в нем происходит проверка длины символьной строки, представленной аргументом зсг. Если длина строки не равна нулю, то метод Р1ар1ауреч ( ) вызывается рекурсивно с новой строкой, которая меньше исходной строки на один символ.

Этот процесс повторяется до тех пор, пока данному методу не будет передана строка нулевой длины. После этого начнется раскручиваться в обратном порядке механизм всех рекурсивных вызовов метода Р1зр1ауйеч () . При возврате из каждого такого вызова выводится первый символ строки, представленной аргументом з сг, а в итоге вся строка выводится в обратном порядке. Рекурсивные варианты многих процедур могут выполняться немного медленнее, чем их итерационные эквиваленты из-за дополнительных затрат системных ресурсов на неоднократные вызовы метода. Если же таких вызовов окажется слишком много, то в конечном итоге может быть переполнен системный стек.

А поскольку параметры и локальные переменные рекурсивного метода хранятся в системном стеке и при каж- 260 часть (. язык С() дом новом вызове этого метода создается их новая копия, то в какой-то момент стек может оказаться исчерпанным. В этом случае возникает исключительная ситуация, и общеязыковая исполняющая среда (Сгзх) генерирует соответствующее исключение. Но беспокоиться об этом придется лишь в том случае, если рекурсивная процедура выполняется неправильно. Главное преимущество рекурсии заключается в том, что она позволяет реализовать некоторые алгоритмы яснее и проще, чем итерационным способом. Например, алгоритм быстрой сортировки довольно трудно реализовать итерационным способом. А некоторые задачи, например искусственного интеллекта, очевидно, требуют именно рекурсивного решения.

При написании рекурсивных методов следует непременно указать в соответствующем месте условный оператор, например Тг, чтобы организовать возврат из метода без рекурсии. В противном случае возврата из вызванного однажды рекурсивного метода может вообще не произойти. Подобного рода ошибка весьма характерна для реализации рекурсии в практике программирования. В этом случае рекомендуется пользоваться операторами, содержащими вызовы метода Хгз беЬЬпе (), чтобы следить за происходящим в рекурсивном методе и прервать его выполнение, если в нем обнаружится ошибка. Применение ключевого слова в~аМ.с Иногда требуется определить такой член класса, который будет использоваться независимо от всех остальных объектов этого класса.

Как правило, доступ к члену класса организуется посредством объекта этого класса, но в то же время можно созда~ь член класса для самостоятельного применения без ссылки на конкретный экземпляр объекта. Для того чтобы создать такой член класса, достаточно указать в самом начале его объявления ключевое слово з гас з с. Если член класса объявляется как з сасне, то он становится доступным до создания любых объектов своего класса и без ссылки на какой-нибудь объект. С помощью ключевого слова з сает с можно объявлять как переменные, так и методы. Наиболее характерным примером члена типа зсасьс служит метод МаТп (), который объявляется таковым потому, что он должен вызываться операционной системой в самом начале выполняемой программы. Для того чтобы воспользоваться членом типа з с ась с за пределами класса, достаточно указать имя этого класса с оператором-точкой. Но создавать объект для этого не нужно.

В действительности член типа з с а с 1 с оказывается доступным не по ссылке на объект, а по имени своего класса. Так, если требуется присвоить значение Гб переменной сос ос типа з сас Ьс, являющейся членом класса тзвег, то для этой цели можно воспользоваться следующей строкой кода. ттжег,соипг = 10; Эта форма записи подобна той, что используется для доступа к обычным переменным экземпляра посредством объекта, но в ней указывается имя класса, а не объекта.

Аналогичным образом можно вызвать метод типа асасЕс, используя имя класса и оператор-точку., Переменные, объявляемые как зсасзс, по существу, являются глобальными. Когда же объекты, объявляются в своем классе, то копия переменной типа з гас го не создается. Вместо этого все экземпляры класса совместно пользуются одной и той же Глава 8. Подробнее о методах и классах 261 переменной типа ясасъс.

Такая переменная инициализируется перед ее применением в классе. Когда же ее инициализатор не указан явно, то она инициализируется нулевым значением, если относится к числовому типу данных, пустым значением, если относится к ссылочному типу, или же логическим значением Га1яе, если относится к типу )зоо1. Таким образом, переменные типа я СаС1с всегда имеют какое-то значение. Метод типа ясасас отличается от обычного метода тем, что его можно вызывать по имени его класса, не создавая экземпляр объекта этого класса.

Пример такого вызова уже приводился ранее. Это был метод Яс(гС () типа БСаС1с, относящийся к классу Буз Сещ. Наг)г из стандартной библиотеки классов С)). Ниже приведен пример программы, в которой объявляются переменная н метод типа БСаС1с. Использовать модификатор яватьс. ч*гпч Буятещ; с1авв БСаььсРещо ( Переменная типа ясасгс. рп)с11с ясаслс 1пс ча1 = 100( !/ метод типа ясас1с. рио11с ясаслс хпс ча101н2() ( сеСчсп Ча1/2; ) с1аяя 50ещо ( яСаС1с но1с( Нагл() Сопяо1е.иг1Сеьгпе("Исходное значение переменной "БСаС1сРещо.Ча1 равно " + ЯСаСлсОещо.ча1) БСаглсОещо.Ча1 = 8( Сопво1е.исьгеььпе("Текущее значение переменной" "БСаггспещо.на1 равно " + БСагьсОещо.Ча1)г сопяо1е.ис1сеььпе("ясасьсоещо.ча101н2(): " ь БсасьсОещо.ча101н2()) ) Выполнение этой программы приводит к следующему результату.

Характеристики

Тип файла
DJVU-файл
Размер
7,66 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6392
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее