Программирование циклических алгоритмов
Рассмотрим на примерах составление программ, реализующих циклические вычислительные процессы.
1) Найти все делители заданного числа N.
INPUT N
FOR I=1 TO N
IF N\I*I=N THEN PRINT I
NEXT I
END
2) Последовательность задана формулой общего члена Xn=1/(n^2+5n). Найти номер члена последовательности, при котором член последовательности будет меньше числа ε.
INPUT E
N=1
M1:
XN=1/(N^2+5*N)
IF XN<E PRINT N: STOP
N=N+1
GOTO M1
END
3) Сформировать массив положительных значений функции y=(5x-3)/(4*x-1) при изменении x от 0 до 1 с шагом 0,1.
OPTION BASE 1
DIM YP(11)
K=0
FOR X=0 TO 1 STEP 0.1
Y= (5*X-3)/(4*x-1)
IF Y>0 THEN K=K+1: YP(K)=Y
NEXT X
FOR I=1 TO K
PRINT YP(I);
NEXT I
END
4) В двумерном массиве А(5,6), где А(I,J)=(2*I-J)/(1+I) отрицательные элементы заменить нулями.
OPTION BASE 1
DIM A(5.6)
FOR I=1 TO 5
FOR J=1 TO 6
A(I.,J)=(2*I-J)/(1+I)
IF A(I,J)<0 THEN A(I,J)=0
NEXT J
NEXT I
END
Характерные приемы программирования
Рассмотрим приемы, наиболее часто используемые при решении практических задач.
1) Вычисление суммы.
Для вычисления суммы необходимо перед циклом задать начальное значение суммы , как правило, равное нулю, а внутри цикла вычислять слагаемое и накапливать сумму, используя оператор присваивания вида S=S+X, где X-cслагаемое; S-промежуточная сумма . После окончания цикла S будет искомой суммой.
Пример 1.
Составить программу нахождения длины ломанной, заданной координатами своих вершин.
N=6
OPTION BASE 1
DIM X(N),Y(N)
FOR I=1 TO N
READ X(I)
NEXT I
DATA –1.,0.,2.,5.,6.,7.
For I=1 to n
Read y(i)
NEXT I
DATA –2.,1.,-3.,7.,-2.,7.
S=0
FOR I=1 TO N-1
X=SQR((X(I+1)-X(I)^2+((Y(I+1)-Y(I))^2
S =S+X
NEXT I
END
2) Вычисление произведения.
Для решения этой задачи перед циклом задают начальное значение произведения, равным 1 , а внутри цикла накапливать произведение используя оператор присваивания вида p=p*x, где x-сомножитель, P-промежуточное произведение.
Пример 2. Вычислить N!
N=5
NF=1
FOR I=1 TO N
NF=NF*I
NEXT I
PRINT “N1=!”;NF
END
3) Вычисление суммы бесконечного ряда.
Существуют вычислительные процессы , которые содержат циклы, число повторений в которых заранее неизвестно. Циклы, характеризующиеся последовательным приближением вычисляемых величин к искомому значению, называются итерационными. Окончание цикла в этом случае обычно осуществляется при достижении заданной точности вычисления результата. К итерационным циклам приводят различные задачи. Рассмотрим одну из них вычисление суммы бесконечного ряда.
Пример 3.
Вычислить сумму
S=1+x=x^2/2!+…+x^n/n!+…
При x=0.2 c точностью до члена ряда, меньше Е=0.0001. Заметим, что каждый член ряда, начиная со второго, равен предыдущему, умноженному на дробь x/k (k=1,2,…).
Input X,E
S=1:K=1:U=1.
M1:
U=U*X/K
S=S+U
IF X/K<E THEN PRINT S:STOP
K=K+1
GOTO M1
END
Здесь итерационный циклический процесс реализован с помощью условного логического оператора. Рассматриваемый бесконечный ряд представляет собой разложение функции exp(x), значение которой может быть получено с любо степенью точности.
5) Нахождение наибольшего и наименьшего значений.
Нахождение указанных значений функции y=f(x) выполняется в цикле, в котором вычисляется текущее значение функции и сравнивается с наибольшим или наименьшим из всех предыдущих значений этой функции. Если текущее значение функции окажется больше наибольшего из предыдущих значений, то его надо читать новым наибольшим значением. В противном случае наибольшее значение остается прежним. Обычно выбор начального значения зависит от условия задачи.
Программирование циклических алгоритмов
Рассмотрим на примерах составление программ, реализующих циклические вычислительные процессы.
1) Найти все делители заданного числа N.
INPUT N
for i=1 to N
if N\i*1=N then print i
next i
end
2) Последовательность задана формулой общего члена Xn=1/(n^2+5*n). Найти номер члена последовательности, при котором член последовательности будет меньше заданного числа Е.
INPUT E
n=1
m:
Xn=1/(n^2=5*n)
if X n<E print n: stop
n=n+1
goto m1
end
3)Сформировать массив положительных значений функции у=(5х-3)(4х-1) при изменении х от 0 до 1 с шагом 0,1.
OPTION BASE 1
DIMYP (11)
k=0
for x=0 to 1 step 0.1
у=(5*x-3)/(4*x-1)
if у>0 then k=k+1: YP (k)=Y
next x
for i=1 to k
print YP(i) :
next i
end
4) В двумерном массиве А(5,6), где А(i, j)=(2*i-j)/(1+i) отрицательные элементы заменить нулями.
option base 1
dim A(5,6)
for i=1 to 5
for j=5 to 6
A(i, j)=(2*i-j)/(1+i)
if A(i, j)<0 then A(i, j)=0
next j
next i
end
. Характерные приёмы программирования
Рассмотрим приёмы, наиболее часто используемые при решении практических задач.
1)Вычисление суммы
Для вычисления суммы необходимо перед циклом задать начальное значение суммы, как правило, равное нулю, а внутри цикла вычислять слагаемое и накапливать сумму, используя, оператор присваивания вида S+S+X, где Х-слагаемое, S- промежуточная сумма. После окончания цикла S будет искомой суммой.
Пример 1) Составить программу нахождения длины ломаной, заданной координатами вершин.
N=6
option base 1
dim X(N), Y(N)
for i=1 to N
read X(i)
next i
DATA –1.,0.,2.,5.,6.,7.
for i-1 to N
read Y(i)
next i
DATA –2.,1.,-3.,7.,-2.,7.
S=0
for i=1 to N-1
X=SQR((X(i+1)-X(i))^2+((Y(i+1)-Y(i))^2)
S=S+X
next i
end
2) Вычисление произведения.
Для решения этой задачи перед циклом задают начальное значения произведения, равным 1, а внутри цикла накапливать произведение, используя оператор присваивания вида Р=Р*Х, где Х- сомножитель, Р- промежуточное произведение.
Пример 2. Вычислить N!
N=5
NF=1
for i=1 to N
NF=NF*1
next i
print "N!=";NF
end
3) Вычисление суммы бесконечного ряда.
Существуют вычислительные процессы, которые содержат циклы, число повторений в которых заранее не известно. Циклы, характеризующиеся последовательным приближением вычисляемых величин к искомому значению, называются итерационными. Окончание цикла в этом случае обычно осуществляется при достижении заданной точности вычисления результата. К итерационным циклам приводят различные задачи. Рассмотрим одну из них- вычисления суммы бесконечного ряда.
Пример 3. Вычислить сумму
S=1+х+х^2/2!+…+х^n/n!+…
при х=0.2 с точностью до члена ряда, меньшего Е=0.0001. Заметим, что каждый член ряда, начиная со второго, равен предыдущему, умноженному на дробь х/k (k=1,2,…).
INPUT X, E
S=1. k=1: U=1.
m1:
U=U*X/k
S=S+U
IF x/k<E then print S: stop
k=k+1
goto m1
end
Здесь итерационный циклический прогресс реализован с помощью условного логического оператора. Рассматриваемый бесконечный ряд представляет собой разложение функции ЕХР(х), значение которой может быть получено с любой заданной степенью точности.