Главная » Просмотр файлов » 1629295407-c61bfe4caba98380ea3e7cdae6295416

1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 41

Файл №846200 1629295407-c61bfe4caba98380ea3e7cdae6295416 (Шилдт Герберт - Полный справочник по C#) 41 страница1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200) страница 412021-08-18СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Отсутствие такой проверки может привести к сбоюпрограммы. Кроме того, поскольку первым аргументом командной строки должно бытьслово “закодировать” или “раскодировать”, то, прежде чем выполнять кодирование илираскодирование текста, необходимо убедиться в наличии этого ключевого слова.Во-вторых, обратите внимание на то, как программа возвращает код своегозавершения.

Если командная строка не записана должным образом, возвращается значение1, которое свидетельствует о нештатной ситуации и аварийном завершении программы.Возвращаемое значение, равное 0, — признак нормальной работы программы иблагополучного ее завершения.РекурсияВ C# метод может вызвать сам себя. Этот процесс называется рекурсией, а метод,который вызывает себя, называют рекурсивным.

В общем случае рекурсия — это процессопределения чего-либо с использованием самого себя. Ключевым компонентомГлава 8. Подробнее о методах и классах215рекурсивного метода является обязательное включение им инструкции обращения к самомусебе. Рекурсия — это мощный механизм управления.Классическим примером рекурсии является вычисление факториала числа. Факториалчисла N представляет собой произведение целых чисел от 1 до N. Например, факториалчисла 3 равен 1x2x3, или 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 {public 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.factI(3));Console.WriteLine("Факториал числа 4 равен "f.factI(4));Console.WriteLine("Факториал числа 5 равен "f.factI(5));}}216++++++Часть I.

Язык C#Вот результаты выполнения этой программы:Факториалы, вычисленные с использованием рекурсивного метода.Факториал числа 3 равен 6Факториал числа 4 равен 24Факториал числа 5 равен 120Факториалы, вычисленные с использованием итеративного метода.Факториал числа 3 равен 6Факториал числа 4 равен 24Факториал числа 5 равен 120Нерекурсивный метод factI() довольно прост. В нем используется цикл, в котороморганизовано перемножение последовательных чисел, начиная с 1 (поэтому начальноезначение управляющей переменной равно 1) и заканчивая числом, заданным в качествепараметра метода.Рекурсивный метод factR() несколько сложнее. Если он вызывается с аргументом,равным 1, то сразу возвращает значение 1.

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

Второй вызов метода factR()возвратит значение 1, которое будет умножено на 2 (исходное значение параметра n).Возможно, вам будет интересно вставить в метод factR() инструкции с вызовом методаWriteLine(), чтобы показать уровень каждого вызова и промежуточные результаты.Когда метод вызывает сам себя, в системном стеке выделяется память для новыхлокальных переменных и параметров, и код метода с самого начала выполняется с новымипеременными. Рекурсивный вызов не создает новой копии метода. Новыми являютсятолько аргументы. При возвращении каждого рекурсивного вызова из стека извлекаютсястарые локальные переменные и параметры, и выполнение метода возобновляется с“внутренней” точки вызова этого метода.Рассмотрим еще один пример рекурсии. Метод displayRev() используетрекурсию для отображения его строкового аргумента в обратном порядке.// Отображение строки в обратном порядке с помощью рекурсии.using System;class RevStr {// Отображение строки в обратном порядке.public void displayRev(string str) {}}if(str.Length > 0)displayRev(str.Substring(1, str.Length-1));else return;Console.Write(str[0]);class RevStrDemo {public static void Main() {string s = "Этот тест";RevStr rsOb = new RevStr();Глава 8.

Подробнее о методах и классах217}}Console.WriteLine("Исходная строка: " + s);Console.Write("Перевернутая строка: ");rsOb.displayRev(s);Console.WriteLine();Вот результаты выполнения этой программы:Исходная строка: Этот тестПеревернутая строка: тсет тотЭЕсли при каждом вызове метода displayRev() проверка показывает, что длинастроки str больше нуля, то выполняется рекурсивный вызов displayRev() с новымаргументом-строкой, которая состоит из предыдущей строки str без ее первого символа.Этот процесс повторяется до тех пор, пока тому же методу не будет передана строканулевой длины. После этого вызванные ранее методы начнут возвращать значения, икаждый возврат будет сопровождаться довыполнением метода, т.е.

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

В этом случае C#системой будет сгенерировано соответствующее исключение. Но если рекурсия построенакорректно, об этом вряд ли стоит волноваться.Основное достоинство рекурсии состоит в том, что некоторые типы алгоритмоврекурсивно реализуются проще, чем их итеративные эквиваленты. Например, алгоритмсортировки Quicksort довольно трудно реализовать итеративным способом. Кроме того,некоторые задачи просто созданы для рекурсивных решений.При написании рекурсивных методов необходимо включить в них инструкциюпроверки условия (например, if-инструкцию), которая бы заставила вернуться из методабез выполнения рекурсивного вызова.

Если этого не будет сделано, то, вызвав однаждыметод, из него уже нельзя будет вернуться. При работе с рекурсией это самыйраспространенный тип ошибки. Поэтому при ее разработке не стоит скупиться наинструкции вызова метода WriteLine(), чтобы быть в курсе того, что происходит вметоде, и прервать его работу в случае обнаружения ошибки.Использование модификатора типа staticИногда требуется определить член класса, который должен использоватьсянезависимо от объекта этого класса.

Обычно к члену класса доступ предоставляется черезобъект этого класса. Однако можно создать член, который заведомо разрешеноиспользовать сам по себе, т.е. без ссылки на конкретный экземпляр. Чтобы создать такойчлен, предварите его объявление ключевым словом static. Если член объявлен какstatic, к нему можно получить доступ до создания объектов этого класса и без ссылки наобъект. С использованием ключевого слова static можно объявлять как методы, так ипеременные. В качестве первого примера static-члена приведем метод Main(), которыйдолжен быть вызван операционной системой в начале работы программы.218Часть I.

Язык C#При использовании static-члена вне класса необходимо указать имя класса иследующий за ним оператор “точка”. Объект при этом не нужно создавать. К staticчлену получают доступ не через экземпляр класса, а с помощью имени класса. Например,чтобы присвоить число 10 static-переменной с именем count, которая является членомкласса Timer, используйте следующую строку кода:Timer.count = 10;Этот формат подобен тому, что используется для доступа к обычной переменнойэкземпляра через объект, но здесь вместо имени объекта необходимо указать имя класса.Аналогично можно вызвать и static-метод, т.е. с помощью оператора “точка” послеимени класса.Переменные, объявленные как static-члены, являются по сути глобальнымипеременными. При объявлении объектов класса копии static-переменной не создаются,причем все экземпляры класса совместно используют одну и ту же static-переменную.Инициализация static-переменной происходит при загрузке класса.

Если инициализаторявно не указан, static-переменная, предназначенная для хранения числовых значений,инициализируется нулем; объектные ссылки — null-значениями, а переменные типа bool— значением false. Таким образом, static-переменная всегда имеет значение.Различие между static- и обычным методом состоит в том, что static-методможно вызвать посредством имени класса, без необходимости создания объекта этогокласса. Выше вы уже имели возможность рассмотреть пример такого вызова, когдаобращались к static-методу Sqrt(), принадлежащему классу System.Math,Теперь рассмотрим пример создания static-переменной и static-метода.// Использование модификатора типа static.using System;class StaticDemo {// Объявление статической переменной.public static int val = 100;}// Объявление статического метода.public static int valDiv2() {return val/2;}class SDemo {public static void Main() {Console.WriteLine("Начальное значение переменной StaticDemo.val равно " +StaticDemo.val);StaticDemo.val = 8;}}Console.WriteLine("Значение переменной StaticDemo.val равно " +StaticDemo.val);Console.WriteLine("StaticDemo.valDiv2(): " +StaticDemo.valDiv2());При выполнении эта программа генерирует следующие результаты:Глава 8.

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

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

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

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