|
Программирование >> Обработка исключительных ситуаций
области сходимости ряда (данный ряд сходится на всей числовой оси, но существуют ряды Тейлора, которые сходятся только для определенного интервала значений аргумента). Поэтому для надежности программы необходимо предусмотреть аварийный выход из цикла с печатью предупреждающего сообщения по достижении некоторого максимально допустимого количества итераций. Для выхода из цикла применяется оператор break. Прямое вычисление члена ряда по приведенной общей формуле, когда х возводится в степень, вычисляется факториал, а затем числитель делится на знаменатель, имеет два недостатка, которые делают этот способ непригодным. Первый недостаток - большая погрешность вычислений. При возведении в степень и вычислении факториала можно получить очень большие числа, при делении которых друг на друга произойдет потеря точности, поскольку количество значащих цифр, хранимых в ячейке памяти, ограничено . Второй недостаток связан с эффективностью вычислений: как легко заметить, при вычислении очередного члена ряда нам уже известен предыдущий, поэтому вычислять каждый член ряда от печки нерационально. Для уменьшения количества выполняемых действий следует воспользоваться рекуррентной формулой получения последующего члена ряда через предыдущий: C +i = C,i где Т - некоторый множитель. Подставив в эту формулу Сп и С + 1, получим выражение для вычисления Т: т С, 2п\ -х2 = х2 ~Сп х2п- (2(п +1))! (2и + 1)(2я + 2) В листинге 4.8 приведен текст программы с комментариями. Листинг 4.8. Вычисление суммы бесконечного ряда jsing System: aniespace Conso 1 eAppl i cati onl { class Class! { static void MainO double e = le-6; const int Maxlter = 500; ограничитель количества итераций Console.WriteLineC Введите аргумент: ); string buf = Console.ReadLineO; double x = Convert.ToDoubleC buf ); bool done = true; признак достижения точности double ch = 1, у = ch: for ( int n = 0: Math.Abs(ch) > e; n++ ) продолжение Кроме того, большие числа могут переполнить разрядную сетку. ch*=x*x/(2*n + l)/(2*n + 2); у += ch; добавление члена ряда к сумге if ( n > Maxlter ) { done = false; break: } if ( done ) Console.WriteLineC Сумма ряда - + у ); else Console.WriteLineC Ряд расходится ); Получение суммы бесконечного ряда - пример вычислений, которые принципиально невозможно выполнить точно, В данном случае мы задавали желаемую погрешность вычислений с помощью значения е. Это значение не может быть меньше, чем самое малое число, представимое с помощью переменной типа double, но при задании такого значения точность результата фактически будет гораздо ниже из-за погрешностей, возникающих при вычислениях. Они связаны с конеч -ностью разрядной сетки. В общем случае погрешность результата складывается из нескольких части !: погрешность постановки задачи (возникает при упрощении задачи); начальная погрешность (точность представления исходных данных); погрешность метода (при использовании приближенных методов решения задачи); погрешности округления и вычисления (поскольку величины хранятся в ограниченном количестве разрядов). Специфика машинных вычислений состоит в том, что алгоритм, безупречный с точки зрения математики, при реализации без учета возможных погрешностей может привести к получению результатов, не содержащих ни одной верной значащей цифры! Это происходит, например, при вычитании двух близких значений или при работе с очень большими или очень малыми числами. Оператор continue Оператор перехода к следующей итерации текущего цикла continue пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации. Перепишем основной цикл листинга 4.8 с применением оператора continue: for С int n = 0; Math.Abs(ch) > e; n++ ) ch *= x * x / ( 2 * n + 1 ) / ( 2 * n + 2 ); у += ch; if ( n <= Maxlter ) continue; done = false: break; Оператор return Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова. Синтаксис оператора: return [ выражение ]; Тип выражения должен иметь неявное преобразование к типу функции. Если тип возвращаемого функцией значения описан как void, выражение должно отсутствовать. Базовые конструкции структурного программирования Главное требование, которому должна удовлетворять программа, - работать в полном соответствии со спецификацией и адекватно реагировать на любые действия пользователя. Кроме этого, программа должна быть выпущена точно к заявленному сроку и допускать оперативное внесение необходимых изменений н дополнений. 11ными словами, современные критерии качества программы - это, прежде всего, надежность, а также возможность точно планировать производство программы и ее сопровождение. Для достижения этих целей программа должна иметь простую структуру, быть читабельной и легко модифицируемой. Технология структурного программирования позволяет создавать как раз такие программы небольшого и среднего объема. Для разработки более сложных комплексов требуется применять объектно-ориентированное программирование. В С# идеи структурного программирования используются на самом низком уровне - при написании методов объектов. Доказано, что любой алгоритм можно реализовать только из трех структур, называемых базовыми конструкциями структурного программирования, - это следование, ветвление и цикл. Следованием называется конструкция, реализующая последовательное выполнение двух или более операторов (простых или составных). Ветвление задает выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия. Цикл реализует многократное выполнение оператора. Базовые конструкции приведены на рис. 4.5. Следование Цикл Ветвление Рис. 4.5. Базовые конструкции структурного программирования
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |