Основы программирования (947332), страница 9
Текст из файла (страница 9)
Основы алгоритмизации и процедурное программированиеу2:=(ехр(х) - ехр('Х))/2;y:=^sqr(yl) - sqr(y2):WriteLnCyl^\yl:13:ll):WnteLn(y2=\y2:13:ll);WriteLn(y=^\y:13:ll);End.Последовательно вводя x = 5, 6, 7, ..., 14, получаем, что у = 1, хотя погрешность результата растет. Однако при х=15 у=0 (!!!). Попробуем понять,почему такое происходит, для чего сведем результаты при х = О, 5, 10, 14, 15,20 в табл. 2.4 и рассчитаем абсолютную и относительную погрешности результата. Из таблицы видно, что значения функций ch х и sh х с увеличением X быстро растут. А чем больше число, тем длиннее запись его мантиссы.И, наконец, при х=15 разрядной сетки для записи мантиссы числа перестаетхватать. При этом младшие разряды мантиссы, которые различны для ch х иsh X, отбрасываются, и при возведении чисел в квадрат мы получаем одинаковые результаты.Для того чтобы избежать подобных ситуаций, в каждом конкретном случае используют разные приемы, например, в данном примере можно использовать тип данных с большим количеством значащих цифр (см.
табл. 2.2) иливычислять результат преобразованного выражения:ch^ X - sh^ X = (ch X - sh x)(ch x + sh x ) ,в котором значения уменьшаемого и вычитаемого растут не так быстро.Т а б л и ц а 2.40У1,У2у1=1.00000000000у2=0.000000000005у 1=74.2099485248у2=74.203210577810у 1=11013.2329201у2=11013.2328747у 1=601302.142083у2=601302.142082X14152048у 1=1634508.68623у2= 1634508.68623у 1=242582597.704у2=242582597.704УА, 51.00000000000А=0,6=0%0.99999999989Л=0.000000000115=0.000000011%1.00008608813А=0.000086088136=0. 008608813 %А=0.146892815836=14.689281583%А=16=100 %А=16=100 %1.146892815830.000000000000.000000000002 Простейшие конструкции языкаТема оценки погрешностей вычислений будет продолжена в параграфе3.5.Задания для самопроверкиЗадание 1.
Измените в программе примера 2.3 тип х на double. Объяснитеполученные результаты.Задание 2. Разработайте программу, которая «проверяет» формулуsin^ X + cos2x= 1.Убедитесь, что при любых допустимых значениях х мы получаем правильныерезультаты. Почему?3. УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ ЯЗЫКАПрограммы, содержащие в разделе операторов только операторы ввода-вывода иоператоры присваивания, выполняются последовательно оператор за оператором. Такиепрограммы ндзыътогт линейными, они реализуют линейный процесс вычислений.
Для организации разветвленных и циклических процессов вычислений используют управляющие операторы языка, определяющие последовательность выполнения операторов программы. В данной главе мы рассмотрим управляющие операторы языка Borland Pascal, ккоторым относятг опсратор условной передачи управления, оператор выбора, операторыорганизации циклов, а также неструктурные операторы и процедуры передачи управления.3.1.
Оператор условной передачи управленияОператор условной передачи управления (рис. 3.1) используют для программирования ветвлений, т. е. ситуаций, когда возникает необходимостьпри выполнении условия реализовывать одни действия, а при нарушении другие. Условие записывают в виде логического выражения, в зависимостиот результата которого осуществляется выбор одной из ветвей: если результат true, то выполняется оператор, следующий за служебным словом then,иначе - оператор, следующий за служебным словом else.В каждой ветви допускается запись одного оператора (в том числе и другого jf) или составного оператора.Составным оператором в Borland Pascal называют последовательностьоператоров, заключенную в операторные скобки begin...end.
Операторы последовательности отделяют друг от друга точкой с запятой «;». Перед endточку с запятой можно не ставить. Перед else точка с запятой не ставитсяникогда, так как в этом случае запись условного оператора продолжается.ifЛогическоевыражениеthenОператорelseОператоргРис.
3.1. Синтаксическая диаграмма <Оператор условной передачи управления>50i. Управляющие операторы языкаДействие 1Действие 2Действие 1Действие 2Рис. 3.2. Фрагменты алгоритмовВ соответствии с синтаксической диаграммой допускается использоватьоператор условной передачи управления с неуказанной (пустой) ветвью else.В некоторых случаях использование укороченных конструкций может привести к неоднозначности, например, не понятно, какому из двух вариантовсхем алгоритма (рис. 3.2) соответствует фрагмент:[/'<условие1> thenif <условие 2> then<действие ]>else <действие 2>;В этих случаях используется так называемое правило вложенности: альтернатива else всегда относится к блиэюайшему if, что соответствует варианту алгоритма на рис.
3.2, а. Если необходимо реализовать вариант алгоритма, изображенный на рис. 3.2, б, то используют операторные скобки://'<условие1> thenbeginif <условие 2> then<действие 1>endelse <действие 2>;Пример 3.1. Разработать программу, которая вычисляет значение функции, заданной следующим образом:У =при |х| < 1;• при 1 < |х| < 2;4иначе.1I А ^'Программа должна начинаться с ввода значения аргумента. Затем в зависимости от того, в какой интервал попадает введенное значение, вычисля51Часть 1.
Основы алгоритмизации и процедурное программированиеРис. 3.3. Схема алгоритма программы вычисленияфункции, заданной на отрезках, в заданной точкеем значение функции по одному из заданных выражений. Алгоритм решенияданной задачи представлен на рис. 3.3. Текст программы имеет следующийвид:Program ex;Var x,y:real;BeginWriteLnCВведите значение аргумента.');ReadLn(x);ifabs(x)<=l then y:=abs(x){первый отрезок}elseifabs(x)<=2 theny:=sqr(x){второй отрезок}else y:-4;{третий отрезок}WriteLnCTIpu x= \ x:8:5, * y=^ \ y:8:5);End.3.2, Практикум.
Тестирование программКак уже упоминалось в параграфе 1.4, тестированием называют процессвыполнения программы с различными исходными данными, для которых заранее известны результаты. Интуитивно начинающие программисты обычно523, Управляющие операторы языкацелью тестирования считают проверку правильности программы, что совершенно не верно. В большинстве случаев перебрать все возможные комбинации данных невозможно, а выборочное тестирование не доказывает правильности программы, так как то, что программа работает на десяти наборах данных, не означает, что она будет давать правильные результаты на одиннадцатом наборе. Поэтому целью тестирования является обнаружение ошибок.Соответственно хорошим следует считать тест, обнаруживающий ошибку. Для формирования таких тестов определены две стратегии:• «белого» или «прозрачного ящика» (тестирование маршрутов);• «черного ящика».При тестировании с использованием стратегии «белого ящика» тестыстараются подобрать так, чтобы хотя бы один раз пройти по каэюдой ветвиалгоритма.
Стратегия имеет существенный недостаток: по ней принципиально невозможно обнаружить пропущенный маршрут.При тестировании с использованием стратегии «черного ящика» структура программы считается неизвестной, и тесты подбирают так, чтобы проверить выполнение всех функций программы, а затем отследить реакцию наввод некорректных данных.На практике лучшие результаты получают, используя при разработке тестов обе стратегии.Пример 3,2. Даны длины сторон треугольника, определить вид треугольника и его площадь. Выполнить контроль вводимых чисел.Сама задача решается просто.
Вид треугольника определим, сравниваястороны, а площадь вычислим по формуле Герона. Задание «выполнить контроль вводимых чисел» означает, что программа в случае ввода чисел, которые не могут интерпретироваться как стороны треугольника, должна выдавать сообщение об ошибках данных. Три числа нельзя интерпретировать какстороны треугольника, если хотя бы одно из них меньше или равно О, илисумма двух любых чисел больше третьего.На рис.
3.4 представлена схема алгоритма данной программы, а самапрограмма имеет следующий вид:Program ex;Var АЛС,РЛ'геа1;BeginWrite СВведите длины сторон треугольника: *);ReadLn(A,B,C);if (A<=0)or(B<^0)or(C<^0) thenWriteLn('Числа долэюны быть полоэюителъными.')elseif(A+B<=C) or (A+C<^B) or (B+C<^A) thenWriteLn(Треугольник с такими сторонами не существует.
*)53Часть 1. Основы алгоритмизации и процедурное программированиеА ^ О или В < О или С ^ ОL"Числаменьше О" iА+В <. С или А+С < В или В+С <. АА=ВиВ=СА = В илиВ = С илиЛ =С^"Равнобедренный/ /"Разностороннийтреугольник" / / треугольник" /P:=(A+B-fC)/2IS:=\/P(P.A){P.B)(PnC)IВывод//{КонецjРис. 3.4. Схема алгоритма программы определения вида треугольникаelsebegintf(A^B)and(B=C)thenWriteLn(Треугольник равносторонний,')elseif(A^B)or(A=C)or(B^C)thenWriteLn(Треугольник равнобедренный, *)else WriteLn(Треугольник разносторонний, *);P-(A+B+C)/2;S:=sqrt(P*(P'A) ""(P-B) ""(P-C));54J.
Управляющие операторы языкаТаблица1 АВСОжидаемый результатОбъект проверки111Равносторонний, 8=0.43Маршрут223Равнобедренный, S=1.98Маршрут434Равнобедренный, S~5.56Маршрут2.52.54Равнобедренный, 8=3.00Тип данных и результата1 3.142.6Разносторонний, 8=4.03Тип данных и результата'000Числа должны быть >0Недопустимые данные1-1.51Числа должны быть >0Недопустимые данные011Числа должны быть >0Недопустимые данные120Числа должны быть >0Недопустимые данные843Тр^гольник не существует.Недопустимые данные225Треугольник не существуетНедопустимые данные394Треугольник не существуетНедопустимые данные3.1|WriteLnCwioufadbтреугольника: \S:8:2, 'единиц/);endEndПримерный набор тестов для обнаружения ошибок в рассматриваемойпрограмме приведен в табл.