Основы программирования на языке Паскаль
Методическое пособие - Компьютеры, программирование
Другие методички по предмету Компьютеры, программирование
алось бы, правильно написанная программа дает результат 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 разбиений и т.д. рано или п?/p>