Программирование алгоритмов циклической структуры
Пример. Вычислить значение функции
, где
при а, изменяющемся от ан до ак,
с шагом Δа
aн=2, ак=3, Δа=0,2
а) с использованием оператора цикла с предусловием while
Блок-схема алгоритма
Паскаль-программа
Program prim31;
var an,ak,da,a,x,y:real;
begin
write(‘Введите an,ak,da=’);
|
a:=an;
while a<=ak+0.0001 do
begin
нет x:=ln(a);
y:=exp(1/3*ln(abs(sin(x))));
да writeln(‘a=’,a:3:1,’ x=’,
|
a:=a+da;
end;
end.
Результаты
|
a=2.0 x=0.693 y=0.861
a=2.2 x=0.788 y=0.892
a=2.4 x=0.875 y=0.916
a=2.6 x=0.956 y=0.935
a=2.8 x=1.030 y=0.950
a=3.0 x=1.099 y=0.962
б) с использованием оператора цикла с постусловием repeat-until
Блок-схема алгоритма Паскаль-программа
Program prim32;
var an,ak,da,a,x,y:real;
begin
write(‘Введите an,ak,da=’);
readln(an,ak,da);
a:=an;
|
x:=ln(a);
y:=exp(1/3*ln(abs(sin(x))));
|
‘ y=’,y:5:3);
|
until a>ak;
end.
Результаты
|
a=2.0 x=0.693 y=0.861
a=2.2 x=0.788 y=0.892
нет a=2.4 x=0.875 y=0.916
a=2.6 x=0.956 y=0.935
да a=2.8 x=1.030 y=0.950
a=3.0 x=1.099 y=0.962
в) с использованием оператора цикла с параметром for
Блок-схема алгоритма
Паскаль-программа
Program prim33;
|
i,n:integer;
begin
write(‘Введите an,ak,da=’);
|
n:=trunc((ak-an)/da)+1;
a:=an;
for i:=1 to n do
begin
x:=ln(a);
y:=exp(1/3*ln(abs(sin(x))));
|
‘ x=’,x:5:3,’ y=’,y:5:3);
a:=a+da;
end;
|
Результаты
Введите an,ak,da=2 3 0.2
a=2.0 x=0.693 y=0.861
|
a=2.4 x=0.875 y=0.916
a=2.6 x=0.956 y=0.935
a=2.8 x=1.030 y=0.950
a=3.0 x=1.099 y=0.962
Программирование алгоритмов разветвляющейся структуры
Пример. Вычислить значение функции.
если
а) с использованием условного оператора if-then-else
Паскаль-программа
Program prim21;
var a,b,c,x,y:real;
n:integer;
begin
|
x:=ln(abs(a-cos(a)));
c:=x*a; b:=x+a;
|
begin y:=-10.5; n:=1; end
else
if c>3.5 then
да begin y:=c+ln(b); n:=3; end
else
нет begin y:=exp(c)+2*b; n:=2; end;
writeln(‘x=’,x:1:3,’ c=’,c:1:3,’ y=’,
да y:1:3,’ n=’,n);
end.
нет
|
|
|
Введите а=7.35
x=1.927 c=14.162 y=16.389 n=3
б) c использованием оператора выбора case
Паскаль-программа
Program prim22;
var a,b,c,x,y:real;
k:integer;
|
write(‘Введите а=’); readln(a);
x:=ln(abs(a-cos(a)));
c:=x*a; b:=x+a;
|
if c<=3.5 then k:=2 else k:=3;
case k of
1: y:=-10.5;
да 2: y:=exp(c)+2*b;
3: y:=c+ln(b);
нет end;
да writeln(‘x=’,x:1:3,’ c=’,c:1:3,’
=’,y:1:3,’ k=’,k);
|
|
|
Введите а=7.35
x=1.927 c=14.162
y=16.389 k=3
нет
|
k=2
|
k=3
Суммирование рядов
Задача. Разработать программу вычисления точного Y и прибли-женного S значений функции при изменении её аргумента от xн до xк
с шагом Δx.
Приближенное значение функции, представленной бесконечным рядом , вычислять путем суммирования членов ряда до достижения требуемой точности = . То есть прибавлять очередной член ряда до тех пор, пока его значение по абсолютной величине не станет меньше . Для предотвращения зацикливания предусмотреть завершение процесса суммирования членов ряда по заданному максимальному номеру члена ряда =1000.
Ниже рассмотрены примеры суммирования бесконечных рядов трех типов:
а) текущий член ряда ai вычисляется непосредственно;
б) текущий член ряда ai вычисляется по рекуррентной формуле
,
где ;
в) текущий член ряда ai является произведением двух сомножителей , где вычисляется непосредственно, а -по рекуррентной формуле. Формула итерации для текущего члена находится в виде: ,
где .
Примеры
а) рассматривается вариант вычисления суммы бесконечного ряда, текущий член ai которого вычисляется непосредственно и имеет вид, например,
и т.д.
Пример 1.
; ;
;
- вычисляется непосредственно;
| |||||
| |||||
б) рассматривается вариант вычисления суммы бесконечного ряда, текущий член ai которого содержит степенные выражения, факториалы и имеет вид, например.
и т.д.
Пример 2.
; ;
- вычисляется по рекуррентной формуле в виде:
, ;
Рекуррентная формула
;
Проверка
- формула верна;
| |||||
| |||||
в) рассматривается вариант вычисления суммы бесконечного ряда, текущий член ai которого содержит выражения, вычисляемые непосредственно, и выражения с факториалами и степенями и имеет вид, например,
и т.д.
Пример 3
;
.
Решение
Вывод формулы итерации:
1. Определение типа члена ряда. - смешанный тип
,где
– вычисляется непосредственно, а
- по рекуррентной формуле.
2. Определение формулы итерации в виде:
, ,
,
Формула итерации: , , .
3. Проверка: , - формула верна.
Блок-схема алгоритма Паскаль-программа
Program prim43;
const n=1000; e=0.0001
label met;
var x,y,s,xn,xk,dx,c,a: real;
i:integer;
|
write(‘Введите xn,xk,dx=’);
readln(xn,xk,dx);
x:=xn;
while x<=xk do
нет begin
y:=arctan(x); s:=x; c:=x;
for i:=1 to n do
|
a:=c/(2*i+1);
if abs(a)<e then goto
met; s:=s+a;
|
met: writeln(‘x=’,x:3:1,
‘ y=’y:8:5,’ s=’,s:8:5,
’ i=’,i);
x:=x+dx;
end
end.
|
Результаты
Введите xn,xk,dx=0.2 0.8 0.2
x=0.2 y=0.19740 s=0.19733 i=2
x=0.4 y=0.38051 s=0.38048 i=4
да x=0.6 y=0.54042 s=0.54044 i=7
x=0.8 y=0.67474 s=0.67480 i=13
нет
5. Работа с массивами
Задача. Разработать программу решения 4-х взаимосвязанных задач
1) расчёт элементов квадратной матрицы A=a(i,j), i,j=1,2,…
по заданной формуле;
2) вычисление элементов вектора X=x(i) i=1,2,…
по заданному правилу;
3) упорядочение элементов матрицы А или вектора Х;
4) вычисление значения функции y по заданной формуле.
Пример.
1) ; ;
2) ; ;
3) упорядочить элементы второго столбца матрицы А по
убыванию значений;
4) ; .
Задание выполнить для n=6.
Замечание. Предварительно провести отладку программы при n=3, для чего получить решение задачи вручную (или с помощью калькулятора) и проверить полученные данные на компьютере.
Блок-схема алгоритма
нет
| |||||
да
| |||||
нет
|
|
да
Паскаль-программа
program prim5;
var a:array[1..10,1..10] of real;
x:array [1..10] of real;
i,j,k,n:integer;
y,s,c:real;
begin
writeln(‘Введите n’); read(n);
{---------------------------------------часть 1-----------------------------------}
for i:=1 to n do
for j:=1 to n do
a[i,j]:=(2*j*i+4*i)/j;
writeln(‘ ‘:20,’МАТРИЦА А’);
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:8:3);
writeln;
end;
{---------------------------------------часть 2-----------------------------------}
for i:=1 to n do
begin
s:=0;
for j:=1 to n do s:=s+sqr(a[i,j]);
x[i]:=sqrt(s)/n;
end;
writeln(‘ ‘:20,’ВЕКТОР Х’);
for i:=1 to n do write(x[i]:8:3);
{---------------------------------------часть 3-----------------------------------}
for i:=1 to n-1 do
begin
k:=i;
for j:=i+1 to n do
if a[j,2]>a[k,2] then k:=j;
if i<>k then
begin
c:=a[i,2]; a[i,2]:=a[k,2]; a[k,2]:=c;
end;
end;
writeln(‘ ‘:14,’УПОРЯДОЧЕННАЯ МАТРИЦА’);
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:8:3);
writeln;
end;
{---------------------------------------часть 4-----------------------------------}
y:=1;
for i:=1 to n do
begin
s:=0;
for k:=1 to n do s:=s+x[k];
if x[i]<>0 then y:=y*x[i]*s;
end;
writeln(‘ЗНАЧЕНИЕ ФУНКЦИИ У=’,y:1:3);
end.
Результаты
Введите n=6
МАТРИЦА А
6.000 4.000 3.333 3.000 2.800 2.667
12.000 8.000 6.667 6.000 5.600 5.333
18.000 12.000 10.000 9.000 8.400 8.000
24.000 16.000 13.333 12.000 11.200 10.667
30.000 20.000 16.667 15.000 14.000 13.333
36.000 24.000 20.000 18.000 16.800 16.000
ВЕКТОР X
1.555 3.110 4.665 6.220 7.776 9.331
УПОРЯДОЧЕННАЯ МАТРИЦА А
6.000 24.000 3.333 3.000 2.800 2.667
12.000 20.000 6.667 6.000 5.600 5.333
18.000 16.000 10.000 9.000 8.400 8.000
24.000 12.000 13.333 12.000 11.200 10.667
30.000 8.000 16.667 15.000 14.000 13.333
36.000 4.000 20.000 18.000 16.800 16.000
ЗНАЧЕНИЕ ФУНКЦИИ Y=123454118108000.000
МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ