Неверная вещественная операция и деление на ноль, как исправить? - Pascal ABC
Формулировка задачи:
Есть задача: Вычислить и вывести значение функции при изменении значения аргумента от А до В с шагом С и определить минимальное и максимальное значение функции на отрезке. Использовать в одной программе три различных типа простых циклов (IF THEN GOTO, WHILE-DO, REPEAT-UNTIL). Мой вариант задачи на скриншоте, а=-2, b=2, шаг с=0.2.
В строке 30
пишет: Неверная вещественная операция,в строке 82
деление на ноль, как исправить? Вот код:
Листинг программы
- program laba2;
- uses crt;
- label lp1;
- var y,ymax,ymin,fx,a,b,c,x:real;
- N:integer;
- begin
- writeln('1. if then goto');
- writeln('2. while do');
- writeln('3. repeat until');
- writeln('Your choose:');
- readln(N);
- Case N of 1:
- begin
- writeln('Ведите значение a,b і шаг c');
- write('a=');
- readln(a);
- write('b=');
- readln(b);
- write('c=');
- readln(c);
- begin
- x:=a;
- y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
- ymax:=y;
- ymin:=y;
- lp1:if x<=b then
- begin
- if x<=-0.5 then y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
- if (x>-0.5) and (x<=0.5) then y:=cos(exp(ln(abs(x+ln(abs(x))*(1/5)))));
- if x>0.5 then y:=exp(ln(x+exp(x)*sqrt(x+1)-pi)*(1/3));
- if y>ymax then ymax:=y;
- if y<ymin then ymin:=y;
- writeln('x=',x:1:1,' y=',y:1:1);
- writeln('Максимальне=',ymax:3:3,' Мінімальне=',ymin:3:3);
- writeln;
- x:=x+c; goto lp1;
- end;
- end;
- end;
- end;
- Case N of 2:
- begin
- writeln('Ввести значення a,b і крок c');
- write('a=');
- readln(a);
- write('b=');
- readln(b);
- write('c=');
- readln(c);
- begin
- x:=a;
- y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
- ymax:=y;
- ymin:=y;
- while x<=b do
- begin
- if x<=-0.5 then y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
- if (x>-0.5) and (x<=0.5) then y:=cos(exp(ln(abs(x+ln(abs(x))*(1/5)))));
- if x>0.5 then y:=exp(ln(x+exp(x)*sqrt(x+1)-pi)*(1/3));
- if y>ymax then ymax:=y;
- if y<ymin then ymin:=y;
- writeln('x=',x:1:1,' y=',y:1:1);
- writeln('Максимльне=',ymax:3:3,' Мінімальне=',ymin:3:3);
- writeln;
- x:=x+c;
- end;
- end;
- end;
- end;
- Case N of 3:
- begin
- writeln('Ввести значення a,b і крок c');
- write('a=');
- readln(a);
- write('b=');
- readln(b);
- write('c=');
- readln(c);
- begin
- repeat
- if x<=-0.5 then y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
- if (x>-0.5) and (x<=0.5) then y:=cos(exp(ln(abs(x+ln(abs(x))*(1/5)))));
- if x>0.5 then y:=exp(ln(x+exp(x)*sqrt(x+1)-pi)*(1/3));
- if y>ymax then ymax:=y;
- if y<ymin then ymin:=y;
- writeln('x=',x:1:1,' y=',y:1:1);
- writeln('Максимльне=',ymax:1:2,' Мінімальне=',ymin:1:2);
- writeln;
- x:=x+c;
- until x<b;
- end;
- end;
- end;
- end.
Решение задачи: «Неверная вещественная операция и деление на ноль, как исправить?»
textual
Листинг программы
- const a=-2;
- b=2;
- c=0.2;
- var x,y,max,min:real;
- begin
- x:=a;
- y:=x*x+sqr(sin((x+pi)/2)/cos((x+pi)/2));
- max:=y;
- min:=y;
- repeat
- if x<=-0.5 then y:=x*x+sqr(sin((x+pi)/2)/cos((x+pi)/2))
- else if x<=0.5 then y:=cos(exp(ln(abs(x+ln(abs(x))))/5))
- else if x+exp(x)*sqrt(x+1)-pi<0 then y:=exp(ln(-(x+exp(x)*sqrt(x+1)-pi))/3)
- else y:=exp(ln(x+exp(x)*sqrt(x+1)-pi)/3);
- if y>max then max:=y
- else if y<min then min:=y;
- writeln('y(',x:0:1,') = ',y:0:5);
- x:=x+c;
- until x>=b;
- writeln('max = ',max:0:5,', min = ',min:0:5);
- readln
- end.
Объяснение кода листинга программы
- В начале кода объявлены константы и переменные: — a, b — целочисленные константы со значениями -2 и 2 соответственно; — c — вещественная константа со значением 0.2; — x, y, max, min — переменные типа real.
- Далее в блоке begin происходит инициализация переменной x значением a.
- Затем в блоке begin происходит вычисление значения переменной y по формуле x*x+sqr(sin((x+pi)/2)/cos((x+pi)/2)).
- Значения переменных max и min инициализируются значением переменной y.
- Далее в цикле repeat выполняется проверка значения переменной x и в зависимости от этого значения переменной y присваивается одно из трех возможных значений: — если x<=-0.5, то y = xx+sqr(sin((x+pi)/2)/cos((x+pi)/2)); — если x<=0.5, то y = cos(exp(ln(abs(x+ln(abs(x))))/5)); — если x+exp(x)sqrt(x+1)-pi<0, то y = exp(ln(-(x+exp(x)sqrt(x+1)-pi))/3); — если x+exp(x)sqrt(x+1)-pi>=0, то y = exp(ln(x+exp(x)*sqrt(x+1)-pi)/3).
- В каждой итерации цикла проверяется, является ли значение переменной y больше max, если да, то max присваивается значение переменной y, иначе проверяется, является ли значение переменной y меньше min, если да, то min присваивается значение переменной y.
- Выводится значение переменной y с шагом 0.1, значение переменной x увеличивается на c.
- После окончания цикла repeat выводится значение переменных max и min.
- В конце программы ожидается ввод данных с помощью функции readln.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д