Основы программирования (947332), страница 10
Текст из файла (страница 10)
3.1Задания для самопроверкиЗадание 1. Разработайте программу, которая вводит вещественные числа х, у иопределяет, принадлежит ли точка с координатами (х, у) закрашенной части плоскости (рис. 3.5). Выполните тестирование полученной программы.Задание 2. Заданы целые числа а, Ь, где а < Ь.
Разработайте программу, которая определяет, имеет литочки разрыва функция:(Рис. 3.5. Вид областик заданию 1х^ при X < а;X при а ^ х ^ Ь ;I при X ^Ь.Выполните тестирование полученной программыв точках предполагаемого разрыва.55Часть L Основы алгоритмизации и процедурное программированиеЗадание 3. Периодическая функция f(x) на отрезке [-1, 1] совпадает с функциейx^+l. Разработайте программу, которая определяет значение функции f(x) длязаданного значения XQ. Выполните тестирование полученной профаммы.3.3. Оператор выбораОператор выбора используется для реализации нескольких альтернативных вариантов действий, каждый из которых соответствует своим значениямнекоторого параметра.
Синтаксическая диаграмма этого оператора приведена на рис. 3.6.Пример 3.3. Разработать программу, которая вычисляет значение однойиз заданных функций в указанной точке.Предоставим пользователю возможность выбрать функцию через простейшую имитацию меню, в котором каждой функции соответствует некоторое число (код):Введите код функции:1 - y=sin(x)2 - y=cos(x)3 - у=ехр(х)В зависимости от значения введенного кода выбирается одна из функций.
На рис. 3.7 представлена схема алгоритма программы.Ниже представлена программа, реализующая разработанный алгоритм.Program ex;Var x,y:real; Kod:byte; Key:boolean;BeginWriteLn('Введите код функции:');WriteLn(4 - sin(x)');WriteLnC2 - cos(x) ');WriteLn(*3 - exp(x) *);ReadLn(Kod);—>( case y-A Выражение h*/ of JTAКонстанта/диапазонОператор-ОelseОператор —'Рис. 3.6. Синтаксическая диаграмма <Оператор выбора>56end3. Управляющие операторы языка(НачалоjВыводменюШKod=lKodKod=2 " ^ ^ v - ^ Kod=3другиелз:Xiy:=sin(x)y:=cos(x)y=Q>Key:=false1данетKeyВыводх>УцНеверныйкод J1^(КонецjРис. 3.7.
Алгоритм программы вычисления значения одной из заданных функцийWrite('Beedume значение аргумента:');ReadLn(x);Key:=true; {признак правильности кода}case Kod of1:y:-sin(x);2: y:=cos(x);3: y:=exp(x);else Key:=false; {код не соответствует функции}end;if Key thenWriteLn(^npu x= \x:12:6, y= \y:12:6)elseWriteLnCBeeden неверный код функции,');End57Часть 1. Основы алгоритмизации и процедурноепрограммирование3.4. Операторы организации циклической обработкиДля реализации циклических процессов используют операторы циклов.Как уже пояснялось в параграфе 1.3, в теории программирования выделяют несколько основных видов циклов:• цикл-пока (рис. 3.8, а)\• цикл-до (рис.
3.8, б);• счетный цикл (рис. 3.8, в).В Borland Pascal реализованы все три указанных вида циклов. Цикл-пока и цикл-до используют для реализации итерационных циклических процессов. Счетный цикл -для реализации циклических процессов с заданнымколичеством повторений. Для реализации циклических процессов поискового типа используют циклы-пока или циклы-до со сложными условиями илинеструктурные передачи управления (см. параграф 3.6).Цикл-пока.
Синтаксическая диаграмма оператора «цикл-пока» приведена на рис. 3.9. Условие записывают в виде логического выражения. Оператор тела цикла повторяется, пока условие истинно. Проверка осуществляется на входе. Если при входе в цикл условие не выполняется, то оператор тела цикла игнорируется.Если в тело цикла необходимо поместить несколько операторов, то используют составной оператор.Цикл-до. Операторы тела цикла повторяются до выполнения условия,условие проверяется на выходе, т.е. тело цикла всегда выполняется хотя бынетг - * - <K=nl.n2,h>1Действие11(бвРис. 3.8. Структура циклов, реализованных в Borland Pascal:а - цикл-пока; б - цикл-до; в - счетный цикл—^while V-*^ЛогическоевыражениеdoОператорРис. 3.9. Синтаксическая диафамма <Цикл-пока>583'.
Управляющие операторы— ^repeat У т лОператор\т*\untilязыкаV-*JЛогическоевыражениеОРис. ЗЛО. Синтаксическая диафамма <Цикл-до>один раз. Синтаксическая диаграмма оператора «цикл-до» приведена нарис. 3.10. В тело цикла можно поместить несколько операторов, разделив ихточкой с запятой «;».Счетный цикл. Цикл выполняется, пока переменная (параметр) циклапринимает значения в заданном диапазоне с определенным шагом. Синтаксическая диаграмма оператора приведена на рис. 3.11.
Переменная цикладолжна иметь порядковый тип. Выражение 1 определяет начальное значениепараметра цикла, выражение 2 - конечное значение параметра цикла. Соответственно начальное и конечное значения должны принадлежать к тому жетипу, что и параметр цикла. Если используется служебное слово to, то прикаждом выполнении цикла переменной цикла присваивается следующее значение порядкового типа переменной. Если используется служебное словоdownto, то при каждом выполнении цикла переменной цикла присваиваетсяпредыдущее значение порядкового типа переменной.
Если диапазон значений переменной цикла пуст, то цикл не выполняется.Примечание. По сравнению с теоретическим-представлением оператор счетного цикла,реализованный в Borland Pascal, является менее мощной конструкцией, так как шаг цикла ограничен (фактически только +1 и -1).Пример 3.4. Разработать профамму вычисления суммы п первых натуральных чисел.Сумма определяется методом накопления. Количество суммируемых чисел известно, поэтому используем цикл с заданным количеством повторений.При каждом проходе к сумме будем добавлять переменную цикла, котораябудет изменяться от 1 до п. Перед циклом переменную суммы необходимо*©^Параметрцикла|.(;:>1°"Р7-'К^и°"Т""'ИЯНОператорL^^downtoVРис. 3.11. Синтаксическая диаграмма<Цикл с заданным количеством повторений>59Часть 1.
Основы алгоритмизации и процедурное программирование(обнулить. На рис. 3.12 приведена схема алгоритмапрограммы. Текст программы приведен ниже.Начало jВводпS:=0л:i:=l,n,lS:=S+iТ"Вывод/Program ex;Var/, п, S: integer;BeginWritelnCBeedume n');ReadLn(n);S:=0;for /;=/ to n doS:=SH;WriteLn('Сумма \ n / чисел равна \ S);End,/Пример 3.5. Разработать программу, определяющую сумму ряда 1 - 1/х + 1/х2 - 1/х^ + ... с заданнойточностью S (епсилон).Рис.
3.12. АлгоритмИз соответствующих разделов математики извевычисления суммы стно, что суммой ряда называется предел, к которомуп натуральныхстремится последовательность частичных сумм данчиселного ряда, если он существует. Если такой предел существует, то ряд называется сходящимся^ в противном случае -расходящимся. Также известно, что знакопеременный ряд сходится, еслиIКонец Jгде г„ и Tj^+i ~ соответственно п-й и n+1-й члены ряда.Кроме того, доказано, что|s-sj^kn+iUгде S - сумма ряда, а S^ ~ сумма п членов ряда.Следовательно, для получения требуемого результата будем накапливатьчастичную сумму элементов ряда, пока очередной член ряда не станет меньше заданной погрешности:кп1 < е •На рис. 3.13 представлен алгоритм программы. Анализ алгоритма показывает, что он неструктурный, так как в нем присутствует цикл суммирова603.
Управляющие операторы языкания, который не является ни цикломпока, ни циклом-до, ни циклом с заданным количеством повторений.Для реализации данного алгоритманеобходимо его преобразовать вструктурный, чтобы можно было использовать один из имеющихся операторов цикла.Поскольку количество повторений цикла определить нельзя, попробуем преобразовать неструктурныйцикл к циклу-пока. Для этого необходимо операцию S=S+R продублировать: одну копию поместить доцикла, а вторую ~ в конце цикла.Операторы S=0 и S=S+R, записанные до цикла, заменим операторомS=l, так как в этот момент R=l. Условие выхода из цикла также необходимо заменить на противоположное.Окончательный вариант фрагментаалгоритма с ц и к л о м - п о к апоказан на рис.
3.14, а. Его реализация представлена ниже:Program ex;Рис. 3.13. Алгоритм определенияVar S,R,X,eps:real;суммы ряда с заданной точностьюBeginWriteLnCВведите x и эпсилон: *);ReadLn(X,eps);ifabs(x)>l then {если x > 1, то ищем сумму ряда}beginS:=l;R:=I;while abs(R)>eps dobeginR:='R/X;S:=S+R;end;61Часть I. Основы алгоритмизации и процедурное программированиеРис. 3.14. Структурные варианты алгоритма:а-сиспользованием цикла-пока; б - с использованием цикла-доWriteLnCnpu х= \ х:6:2,' S= \ 3:8:2, \ а /?=', R:8:6)endelse Writeln('PHdрасходится*);End.Тот же алгоритм можно преобразовать так, чтобы цикл можно былореализовать с использованием ц и к л а - д о (рис.
3.14, б). Ниже представлена соответствующая программа.Program ex;var S,R,X,eps:real;BeginWriteLnCВведите значение x и эпсилон:');ReadLn(X,eps);ifx>l thenbeginS:=0;R:-l;repeatS:=S+R;R:='R/Xuntil abs(R ^^x) < =eps;WriteLnCnpu x= \x:6:2,' S= \S:8:2, \ a /?= \R:8:6)end62i. Управляющие операторы языкаelse Writeln(THd расходится');End,Другие способы реализации неструктурных алгоритмов более подробнобудут рассмотрены в параграфе 3.4.3.5.