На заданном отрезке найти все корни уравнения с заданной точностью - Free Pascal
Формулировка задачи:
На заданном отрезке найти все корни уравнения f(x)=0 с точностью . . Вот код, но при вводе "" программа виснет. Помогите исправить.
const h=0.1;
var a,b,C,D,e,XN,XK,S: real;
K : integer;
function F(x: real): real;
begin
F:= exp(x)- cos(x)*cos(x)-0.1
end;
begin
repeat
write('a=');
readln(A);
write('b>a b=');
readln(B);
readln(E)
until (A<B);
K:=0; C:=A;
repeat
D:=C+H;
if F(C)*F(D)<=0 then
begin
XN:=C; XK:=D; K:=1;
while ABS(XK-XN)>E do
begin S:=(XN+XK)/2;
if F(XN)*F(S)<=0 then XK:=S
else XN:=S
end;
write((XK+XN)/2:10:6);
end;
C:=D
until C+H>B;
if K=0 then writeln('korney net') ;
readln
end.Решение задачи: «На заданном отрезке найти все корни уравнения с заданной точностью»
textual
Листинг программы
const h=0.1;
var a,b,C,D,e,XN,XK,S: extended;
K : integer;
function F(x: extended): extended;
begin
F:= exp(x)- cos(x)*cos(x)-0.1
end;
begin
repeat
write('a=');
readln(A);
write('b>a b=');
readln(B);
write('epsilon=');
readln(E)
until (A<B);
K:=0; C:=A;
repeat
D:=C+H;
if F(C)*F(D)<=(1e-32) then
begin
XN:=C; XK:=D; K:=1;
while ABS(XK-XN)>E do
begin S:=(XN+XK)/2;
if F(XN)*F(S)<=(1e-32) then XK:=S
else XN:=S
end;
write((XK+XN)/2:10:6);
end;
C:=D
until C+H>B;
if K<(1e-32) then writeln('korney net') ;
readln
end.
Объяснение кода листинга программы
- Объявлены константы и переменные:
- h = 0.1 (поиск корней осуществляется с точностью 0.1)
- a, b, C, D, e, XN, XK, S: extended (это тип данных, подобный float, но с большей точностью)
- K: integer (счетчик, увеличиваемый на 1 при каждом найденном корне)
- F(x): extended (функция, значение которой будет приближенно равно 0 при нахождении корня)
- Задаются начальные значения a и b (с помощью функции readln вводится значение a, затем с помощью функции readln вводится значение b)
- Задается точность e (с помощью функции readln вводится значение e)
- Пока a < b выполняется цикл:
- Задаются значения C и D (C = a, D = a + h)
- Если значение функции F(C) * F(D) меньше или равно 1e-32 (это очень маленькое число, близкое к нулю), то это означает, что между точками C и D находится корень, и цикл изменяет значения C и D, чтобы они стали равными XN и XK соответственно
- Если значение функции F(C) * F(D) больше 1e-32, то значение C заменяется на значение D, и цикл продолжает работу с новыми значениями C и D
- Если корни не найдены (т.е. K < 1e-32), то выводится сообщение
korney net - Ввод/вывод осуществляется с помощью функции readln (для ввода) и функции writeln (для вывода)