p align="left"> 58,60,63..76,78,93,100: writeln('y=',sqr(x)-ax+sqr(sin(ax)-exp(x)) /(1-ln(sqr(x)-exp(х/2)))); else writeln('неправильно задано i'); end; readln; END. 4. Селектор знакового типа: Program Prim10; Var name:char; BEGIN writeln('введите шифр'); readln(name); Case name of 'S','s': writeln(' факультет самолето- и вертолетостроения'); 'D','d': writeln(' факультет авиадвигателестороения'); 'Y','y': writeln(' факультет систем управления'); 'L','l': writeln(' факультет летательных аппаратов'); 'R','r': writeln(' факультет радиотехнический '); 'M','m': writeln(' факультет инженерно - менеджерский'); 'Z','z': writeln(' факультет заочного обучения'); else writeln('введенный шифр не соответствует ни одному ', 'из факультетов ХАИ'); end; readln; END. 5. Селектор перечисляемого типа: Program Prim11; Var season:(winter,spring,summer,autumn); rez:integer;BEGIN season:=spring; Writeln('результат ord(season)=',ord(season)); case season of winter: writeln('winter'); spring: writeln('spring'); summer: writeln('summer'); autumn: writeln('autumn'); end; readln; END. 4. Циклические программыНаиболее часто в практике программирования встречаются циклические программы. В циклических программах какой-либо алгоритм повторяется многократно, при этом один из параметров изменяется. Например, описанная в п. 3.3 программа Рrim 4 является классическим примером циклического алгоритма. Операторов цикла в Паскале три: for, repeat, while.
4.1. Оператор for Оператор состоит из заголовка, в котором определяется порядок изменения переменной параметра цикла и тела цикла, являющегося многократно повторяющимся алгоритмом. Общий вид оператора: for - параметр цикла: = начальное значение to, конечное значение do {заголовок}; оператор; {тело цикла}. Этот оператор применяется, если начальное значение < конечного значения; for - параметр цикла:=начальное значение downto, конечное значение do; оператор; применяется, если начальное значение > конечного значения. Пример: найти сумму квадратов целых чисел от 8 до 1.24. Program Prim12; Var i,s:integer; BEGIN s:=0; for i:= 8 to 124 do s:=s+sqr(i); writeln('s=',s); readln; END. Работа программы. В разделе Var выделяется ячейка памяти с именем i и s для хранения величин. Поскольку в S мы должны накапливать сумму, то вначале занесем в S ноль. Затем заголовок цикла присваивает i=8. далее выполняется тело цикла: извлекается содержимое ячейки S (а там у нас 0) и к этому содержимому прибавляется sgr(i), т.е. i2=82. Результат присваивается ячейке S, т.е. в S теперь 82. Проверяется, не стал ли параметр цикла больше конечного значения параметра 128. Это не произошло, поэтому i присваивается следующее значение равное 9 и вновь выполняется тело цикла, т.е. S:=82+92. Можно сказать так: S присвоить тому S, которое было раньше, + следующее i2. Так как цикл еще не закончился, то i станет равным 10, а S присвоится тому S, которое было раньше, т.е. 82+92, и к нему прибавится еще текущее i2, т.е. 102. Этот процесс повторяется до тех пор, пока параметр цикла не станет равным 124. Тогда в последний раз 1242 прибавляется к накапливаемой сумме. Итак: выполнение цикла значения i значения S 1 8 82 2 9 82+92 3 10 82+92+102 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 116 117 82+92+102+…+1232 117 124 82+92+102+…+1232 +1242 При i=125 происходит выход из цикла и переход к оператору writeln ('S=' ,S); Эта, казалось бы, правильно написанная программа дает результат S=-12250. Как может получиться отрицательный результат при суммировании квадратов - заведомо положительных чисел? Такой результат мы получаем путем суммирования и занесения результатов в ячейку S типа integer, а в integer могут быть помещены числа в диапазоне -32768 +32767, поэтому после переполнения ячейки памяти в знаковый разряд переносится 1, которая интерпретируется машиной как '-'. Чтобы этого избежать, можно описать S как longint. Тогда результат работы программы будет правильный и равен 643110. Program Prim12a; Var i,s:longint; BEGIN s:=0; for i:= 8 to 124 do s:=s+sqr(i); writeln('s=',s); readln; END. Можно также описать S как real. Program Prim12b; Var i:integer; s:real; BEGIN s:=0; for i:= 8 to 124 do s:=s+sqr(i); writeln('s=',s); readln; END. Результат работы этой программы будет равен 6.4311000000E+05, что то же самое, что и 643110, если считать, что запись 6.4311000000E+05 равносильна математической записи 6,431110+5. Правила применения оператора цикла for 1.Тело цикла - всегда один оператор. Если нужно, чтобы тело цикла состояло из нескольких операторов, то их объединяют в один с помощью операторных скобок begin, end. for i:=l to n do Begin S:=S+sin(x)/cos(x); x=x+0.01; writeln('S=' ,S) end. Операторы, взятые в операторные скобки begin, end, считаются одним составным оператором. 2. Начальное и конечное значения параметра цикла в общем случае являются выражениями. Тип этих выражений и тип параметра цикла должны совпадать. Здесь допускается применение любых типов, которые упорядочены с каким-либо фиксированным шагом, это может быть любой скалярный тип, кроме вещественного, т.е. байтовый, целый, символьный, перечисляемый, интервальный, булевский. на практике чаще всего применяют целочисленный тип. 3. В теле цикла параметр цикла не должен изменяться. 4. Нельзя с помощью оператора перехода goto войти в тело цикла, минуя заголовок. 5. Выйти из тела цикла в программу можно по if..goto, не дожидаясь полного перебора параметров цикла. Пример: написать программу, выводящую буквы латинского алфавита в одну сторону, с пробелом между ними. Применяем здесь в качестве параметра цикла символьную переменную, в качестве начального значения параметра - константу 'A', конечного - 'Z'. Program Prim13; Var i:char; BEGIN for i:='a' to 'z' do write(' ',i); readln; END. Пример: вычислить значение определенного интеграла на участке a,b для функции cos х, т.е. определить площадь, заштрихованную на рис. 4.1. Применим метод трапеций, суть которого заключается в том, что область делится на ряд трапеций, площади которых вычисляются и суммируются. Чем на большее количество трапеций мы разделим область, тем точнее получим результат (см.рис.4.2). Program Prim14; Var i,n:integer; a,b,x,h,s:real; BEGIN writeln(' введите к-во точек разбиения n и величины а, b'); readln(n,a,b); h:=(b-a)/n; s:=0; x:=a; for i:=1 to n do Begin s:=s+(abs(cos(x))+abs(cos(x+h)))/2*h; x:=x+h; end; writeln('s=',s); readln; END. Замечание: при вычислении S (так как функция пересекает ось OX) часть площадей может иметь отрицательное значение, поэтому мы берем abs(f(x)). Усложним задачу: пусть нужно найти площадь криволинейной трапеции (интеграл), где функция от точки а до b sin(x), а после b до с cos(x). Program Prim15; Var i,n:integer; a,b,c,x,h,s,fxpred,fxposl:real; BEGIN writeln('введите к-во точек разбиения n и величины а, b, c'); readln(n,a,b,c); h:=(c-a)/n; s:=0; x:=a; for i:=1 to n do Begin { определимся, по какой из функций считать стороны трапеций } if (x>=a) and (x<=b) then fxpred:= abs(sin(x)) else fxpred:=abs(cos(x)); if (x+h>=a) and (x+h<=b) then fxposl:= abs(sin(x+h)) else fxposl:=abs(cos(x+h)); s:=s+(fxpred+fxposl)/2*h; x:=x+h; end; writeln('s=',s); readln; END. В последних двух программах мы заменяем площадь криволинейной трапеции (интеграл) суммой трапеций. При этом нам неизвестно, какую ошибку мы допустим; знаем, что чем больше точек разбиения, тем точнее будет результат. Поставим задачу: совершенно точно знать, что мы посчитаем интеграл с точностью не менее заданной, например, что разность между площадью криволинейной трапеции и суммой прямоугольных трапеций будет не больше Е = 0.01. Для этого нам нужно посчитать результат для количества точек, например 10, затем - 100. Сравнить величины площадей, и, если их разность будет меньше Е, то можно с уверенностью сказать, что площадь для разбиения на 100 интервалов будет найдена с точностью не менее Е. Если разность между расчетами на 10 и 100 интервалов больше Е, то следует разбить область интегрирования на 1000 интервалов и сравнить сумму для 100 интервалов с суммой для 1000 интервалов, и если их разница будет меньше Е, то за результат принять площадь, посчитанную для 1000 разбиений и т.д. рано или поздно мы получим искомый результат. Сравнения сумм площадей трапеций будем производить с помощью оператора if.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22
|