Неверная вещественная операция и деление на ноль, как исправить? - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Есть задача: Вычислить и вывести значение функции при изменении значения аргумента от А до В с шагом С и определить минимальное и максимальное значение функции на отрезке. Использовать в одной программе три различных типа простых циклов (IF THEN GOTO, WHILE-DO, REPEAT-UNTIL). Мой вариант задачи на скриншоте, а=-2, b=2, шаг с=0.2.

В строке 30

пишет: Неверная вещественная операция,

в строке 82

деление на ноль, как исправить? Вот код:
Листинг программы
  1. program laba2;
  2. uses crt;
  3. label lp1;
  4. var y,ymax,ymin,fx,a,b,c,x:real;
  5. N:integer;
  6. begin
  7. writeln('1. if then goto');
  8. writeln('2. while do');
  9. writeln('3. repeat until');
  10. writeln('Your choose:');
  11. readln(N);
  12. Case N of 1:
  13. begin
  14. writeln('Ведите значение a,b і шаг c');
  15. write('a=');
  16. readln(a);
  17. write('b=');
  18. readln(b);
  19. write('c=');
  20. readln(c);
  21. begin
  22. x:=a;
  23. y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
  24. ymax:=y;
  25. ymin:=y;
  26. lp1:if x<=b then
  27. begin
  28. if x<=-0.5 then y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
  29. if (x>-0.5) and (x<=0.5) then y:=cos(exp(ln(abs(x+ln(abs(x))*(1/5)))));
  30. if x>0.5 then y:=exp(ln(x+exp(x)*sqrt(x+1)-pi)*(1/3));
  31. if y>ymax then ymax:=y;
  32. if y<ymin then ymin:=y;
  33. writeln('x=',x:1:1,' y=',y:1:1);
  34. writeln('Максимальне=',ymax:3:3,' Мінімальне=',ymin:3:3);
  35. writeln;
  36. x:=x+c; goto lp1;
  37. end;
  38. end;
  39. end;
  40. end;
  41. Case N of 2:
  42. begin
  43. writeln('Ввести значення a,b і крок c');
  44. write('a=');
  45. readln(a);
  46. write('b=');
  47. readln(b);
  48. write('c=');
  49. readln(c);
  50. begin
  51. x:=a;
  52. y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
  53. ymax:=y;
  54. ymin:=y;
  55. while x<=b do
  56. begin
  57. if x<=-0.5 then y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
  58. if (x>-0.5) and (x<=0.5) then y:=cos(exp(ln(abs(x+ln(abs(x))*(1/5)))));
  59. if x>0.5 then y:=exp(ln(x+exp(x)*sqrt(x+1)-pi)*(1/3));
  60. if y>ymax then ymax:=y;
  61. if y<ymin then ymin:=y;
  62. writeln('x=',x:1:1,' y=',y:1:1);
  63. writeln('Максимльне=',ymax:3:3,' Мінімальне=',ymin:3:3);
  64. writeln;
  65. x:=x+c;
  66. end;
  67. end;
  68. end;
  69. end;
  70. Case N of 3:
  71. begin
  72. writeln('Ввести значення a,b і крок c');
  73. write('a=');
  74. readln(a);
  75. write('b=');
  76. readln(b);
  77. write('c=');
  78. readln(c);
  79. begin
  80. repeat
  81. if x<=-0.5 then y:=sqr(x)+sin(sqr(x))/cos(sqr(x))*(x+pi/2);
  82. if (x>-0.5) and (x<=0.5) then y:=cos(exp(ln(abs(x+ln(abs(x))*(1/5)))));
  83. if x>0.5 then y:=exp(ln(x+exp(x)*sqrt(x+1)-pi)*(1/3));
  84. if y>ymax then ymax:=y;
  85. if y<ymin then ymin:=y;
  86. writeln('x=',x:1:1,' y=',y:1:1);
  87. writeln('Максимльне=',ymax:1:2,' Мінімальне=',ymin:1:2);
  88. writeln;
  89. x:=x+c;
  90. until x<b;
  91. end;
  92. end;
  93. end;
  94. end.

Решение задачи: «Неверная вещественная операция и деление на ноль, как исправить?»

textual
Листинг программы
  1. const a=-2;
  2.       b=2;
  3.       c=0.2;
  4. var x,y,max,min:real;
  5. begin
  6.   x:=a;
  7.   y:=x*x+sqr(sin((x+pi)/2)/cos((x+pi)/2));
  8.   max:=y;
  9.   min:=y;
  10.   repeat
  11.     if x<=-0.5 then y:=x*x+sqr(sin((x+pi)/2)/cos((x+pi)/2))
  12.     else if x<=0.5 then y:=cos(exp(ln(abs(x+ln(abs(x))))/5))
  13.          else if x+exp(x)*sqrt(x+1)-pi<0 then y:=exp(ln(-(x+exp(x)*sqrt(x+1)-pi))/3)
  14.               else y:=exp(ln(x+exp(x)*sqrt(x+1)-pi)/3);
  15.     if y>max then max:=y
  16.     else if y<min then min:=y;
  17.     writeln('y(',x:0:1,') = ',y:0:5);
  18.     x:=x+c;
  19.   until x>=b;
  20.   writeln('max = ',max:0:5,', min = ',min:0:5);
  21.   readln
  22. end.

Объяснение кода листинга программы

  1. В начале кода объявлены константы и переменные: — a, b — целочисленные константы со значениями -2 и 2 соответственно; — c — вещественная константа со значением 0.2; — x, y, max, min — переменные типа real.
  2. Далее в блоке begin происходит инициализация переменной x значением a.
  3. Затем в блоке begin происходит вычисление значения переменной y по формуле x*x+sqr(sin((x+pi)/2)/cos((x+pi)/2)).
  4. Значения переменных max и min инициализируются значением переменной y.
  5. Далее в цикле 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).
  6. В каждой итерации цикла проверяется, является ли значение переменной y больше max, если да, то max присваивается значение переменной y, иначе проверяется, является ли значение переменной y меньше min, если да, то min присваивается значение переменной y.
  7. Выводится значение переменной y с шагом 0.1, значение переменной x увеличивается на c.
  8. После окончания цикла repeat выводится значение переменных max и min.
  9. В конце программы ожидается ввод данных с помощью функции readln.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.615 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы