1. Анализ заданной функции и разработка структурной схемы алгоритма по её вычислению
С огласно заданию необходимо вычислить заданную сложную функцию,
yi =
- a +j, при z<5,sin(b) + j + a, при z≥5;
где j=1,2,3,…,m; i=1,2…,n; ; xi – массив чисел от 1..n; x1=1,2; x2=4; x3=-27*10-2; a=aнач + h;
Значения параметров: m=15; h=0,8; aнач=-2; b=π/3; n=3.
Значение вычислить по подпрограмме.
Данная функция представляет собой сложную функцию, которая вычисляется по одной из двух формул в зависимости от условия. Очевидно, что прежде чем вычислять значение функции необходимо вычислить значение функций:
, a=aнач + h .
При организации циклических процессов рекомендуется выносить за пределы цикла те вычисления, которые достаточно выполнить один раз, что уменьшает затраты времени на решение задачи.
Определив промежуточные переменные необходимо использовать разветвление на два направления, определяющее рабочую формулу на данном шаге. С учётом данных тезисов разрабатывается структурная блок-схема алгоритма программы, которая представлена на рисунке 1.1.
Б
Начало
j:=1,m
x1[j]:=j;
z:=1/(0.5*j)*sumx;
1
4
5
3
4
ЛОК-СХЕМА АЛГОРИТМА ПРОГРАММЫ
А
z>=5
Да
Нет
y1[j]:=sumx-a+j
y1[j]:=sin(b)+j+a
6
7
8
y1[j]:=ln(abs(x1[j]-z[j]))+sumc-b
a:=an+h;
9
2. Программирование отдельных блоков и структур алгоритмов
1) Начало программы, объявление необходимых констант и переменных (блок 1)
{ $n+}
uses graph;
const
m=15;
n=3;
h=0.8;
an=-2;
b=pi/3;
x:array[1..3]of extended=(1.2,4,-0.27);
var
x1,y1:array[1..m]of extended;
i,j:integer;
z,sumx,a:extended;
graphmode,graphdriver:integer;
begin
2 ) Процедура вычисления значения
procedure procx;
begin
sumx:=0;
for i:=1 to n do sumx:=sumx+x[i];
end;
3) Начало основного цикла j для расчета значений массивов x1,y1, расчет необходимых переменных (блоки 4-5)
for j:=1 to m do
begin
x1[j]:=j;
z:=1/(0.5*j)*sumx;
4) Условие для расчета значений массива y1(блоки 6-8)
if z>=5 then y1[j]:=sumx-a+j
else y1[j]:=sin(b)+j+a;
5 ) Расчет переменных a,b (блок 9)
a:=an+h;
6 ) Открытие доступа к файлу вывода и вывод результатов значений массивов x1,y1 в файл. Конец программы. (блоки 10-13)
assign(output,'out.txt');
rewrite(output);
writeln('X':5,'Y':7);
for i:=1 to m do writeln(x1[i]:7:3,' ',y1[i]:7:3);
end.
3. Полная программа в соответствии с алгоритмом
Полная рабочая программа написанная по блок-схеме алгоритма представленного на рисунке 1.1 будет иметь следующий вид:
{$n+}
uses graph;
const
m=15;
n=3;
h=0.8;
an=-2;
b=pi/3;
x:array[1..3]of extended=(1.2,4,-0.27);
var
x1,y1:array[1..m]of extended;
i,j:integer;
z,sumx,a:extended;
graphmode,graphdriver:integer;
procedure procx;
begin
sumx:=0;
for i:=1 to n do sumx:=sumx+x[i];
end;
begin
graphdriver:=detect;
initgraph(graphdriver,graphmode,'d:\bp\bgi');
line(0,240,640,240);
line(630,230,640,240);
line(630,245,640,240);
line(320,0,320,480);
line(315,10,320,0);
line(325,10,320,0);
outtextxy(620,225,'x');
outtextxy(330,15,'y');
outtextxy(410,250,'100');
outtextxy(510,250,'200');
outtextxy(610,250,'300');
outtextxy(210,250,'-100');
outtextxy(110,250,'-200');
outtextxy(10,250,'-300');
outtextxy(280,40,'200');
outtextxy(285,140,'100');
outtextxy(285,340,'-100');
outtextxy(280,440,'-200');
setcolor(4);
x1[1]:=0;
z:=0;
a:=an;
procx;
for j:=1 to m do
begin
x1[j]:=j;
z:=1/(0.5*j)*sumx;
if z>=5 then y1[j]:=sumx-a+j
else y1[j]:=sin(b)+j+a;
a:=an+h;
end;
for j:=2 to m do
begin
line(j-1+320,trunc(-y1[j-1])+240,j+320,trunc(-y1[j])+240);
end;
readln;
assign(output,'out.txt');
rewrite(output);
writeln('X':5,'Y':7);
for i:=1 to m do writeln(x1[i]:7:3,' ',y1[i]:7:3);
end.